From: Andrew M. Kuchling Date: Wed, 23 Feb 2000 22:18:48 +0000 (+0000) Subject: Allow using long integers as slice indexes X-Git-Tag: v1.6a1~367 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=2194b165db0e04a68acff21f3e873c376a7f4767;p=thirdparty%2FPython%2Fcpython.git Allow using long integers as slice indexes --- diff --git a/Python/ceval.c b/Python/ceval.c index 930b1bc16d7e..46a60f1173c9 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;