- On 64-bit platforms, when __len__() returns a value that cannot be

represented as a C int, raise OverflowError.

(Forward port from 2.4.2; the patch to classobject.c was already in
but needed a correction in the error message text.)
This commit is contained in:
Guido van Rossum 2005-09-20 18:49:54 +00:00
parent 1c2d7e5363
commit 630db60a55
3 changed files with 15 additions and 2 deletions

View File

@ -12,6 +12,9 @@ What's New in Python 2.5 alpha 1?
Core and builtins
-----------------
- On 64-bit platforms, when __len__() returns a value that cannot be
represented as a C int, raise OverflowError.
- test__locale is skipped on OS X < 10.4 (only partial locale support is
present).

View File

@ -1019,7 +1019,7 @@ instance_length(PyInstanceObject *inst)
/* Overflow check -- range of PyInt is more than C int */
if (outcome != temp) {
PyErr_SetString(PyExc_OverflowError,
"__len__() should return 0 <= outcome < 2**32");
"__len__() should return 0 <= outcome < 2**31");
outcome = -1;
}
else

View File

@ -4071,14 +4071,24 @@ slot_sq_length(PyObject *self)
{
static PyObject *len_str;
PyObject *res = call_method(self, "__len__", &len_str, "()");
long temp;
int len;
if (res == NULL)
return -1;
len = (int)PyInt_AsLong(res);
temp = PyInt_AsLong(res);
len = (int)temp;
Py_DECREF(res);
if (len == -1 && PyErr_Occurred())
return -1;
#if SIZEOF_INT < SIZEOF_LONG
/* Overflow check -- range of PyInt is more than C int */
if (len != temp) {
PyErr_SetString(PyExc_OverflowError,
"__len__() should return 0 <= outcome < 2**31");
return -1;
}
#endif
if (len < 0) {
PyErr_SetString(PyExc_ValueError,
"__len__() should return >= 0");