- 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:
parent
1c2d7e5363
commit
630db60a55
@ -12,6 +12,9 @@ What's New in Python 2.5 alpha 1?
|
|||||||
Core and builtins
|
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
|
- test__locale is skipped on OS X < 10.4 (only partial locale support is
|
||||||
present).
|
present).
|
||||||
|
|
||||||
|
@ -1019,7 +1019,7 @@ instance_length(PyInstanceObject *inst)
|
|||||||
/* Overflow check -- range of PyInt is more than C int */
|
/* Overflow check -- range of PyInt is more than C int */
|
||||||
if (outcome != temp) {
|
if (outcome != temp) {
|
||||||
PyErr_SetString(PyExc_OverflowError,
|
PyErr_SetString(PyExc_OverflowError,
|
||||||
"__len__() should return 0 <= outcome < 2**32");
|
"__len__() should return 0 <= outcome < 2**31");
|
||||||
outcome = -1;
|
outcome = -1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -4071,14 +4071,24 @@ slot_sq_length(PyObject *self)
|
|||||||
{
|
{
|
||||||
static PyObject *len_str;
|
static PyObject *len_str;
|
||||||
PyObject *res = call_method(self, "__len__", &len_str, "()");
|
PyObject *res = call_method(self, "__len__", &len_str, "()");
|
||||||
|
long temp;
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
if (res == NULL)
|
if (res == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
len = (int)PyInt_AsLong(res);
|
temp = PyInt_AsLong(res);
|
||||||
|
len = (int)temp;
|
||||||
Py_DECREF(res);
|
Py_DECREF(res);
|
||||||
if (len == -1 && PyErr_Occurred())
|
if (len == -1 && PyErr_Occurred())
|
||||||
return -1;
|
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) {
|
if (len < 0) {
|
||||||
PyErr_SetString(PyExc_ValueError,
|
PyErr_SetString(PyExc_ValueError,
|
||||||
"__len__() should return >= 0");
|
"__len__() should return >= 0");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user