summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Python/ceval.c36
1 files changed, 34 insertions, 2 deletions
diff --git a/Python/ceval.c b/Python/ceval.c
index 930b1bc..46a60f1 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -2535,12 +2535,44 @@ slice_index(v, pi)
{
if (v != NULL) {
long x;
- if (!PyInt_Check(v)) {
+ if (PyInt_Check(v)) {
+ x = PyInt_AsLong(v);
+ } else if (PyLong_Check(v)) {
+ x = PyLong_AsLong(v);
+ if (x==-1 && PyErr_Occurred()) {
+ PyObject *long_zero;
+
+ if (!PyErr_ExceptionMatches( PyExc_OverflowError ) ) {
+ /* It's not an overflow error, so just
+ signal an error */
+ return -1;
+ }
+
+ /* It's an overflow error, so we need to
+ check the sign of the long integer,
+ set the value to INT_MAX or 0, and clear
+ the error. */
+
+ /* Create a long integer with a value of 0 */
+ long_zero = PyLong_FromLong( 0L );
+ if (long_zero == NULL) return -1;
+
+ /* Check sign */
+ if (PyObject_Compare(long_zero, v) < 0)
+ x = INT_MAX;
+ else
+ x = 0;
+
+ /* Free the long integer we created, and clear the
+ OverflowError */
+ Py_DECREF(long_zero);
+ PyErr_Clear();
+ }
+ } else {
PyErr_SetString(PyExc_TypeError,
"slice index must be int");
return -1;
}
- x = PyInt_AsLong(v);
/* Truncate -- very long indices are truncated anyway */
if (x > INT_MAX)
x = INT_MAX;