Fix a couple of bugs exposed by the new __index__ code. The 64-bit buildbots

were failing due to inappropriate clipping of numbers larger than 2**31
with new-style classes. (typeobject.c)  In reviewing the code for classic
classes, there were 2 problems.  Any negative value return could be returned.
Always return -1 if there was an error.  Also make the checks similar
with the new-style classes.  I believe this is correct for 32 and 64 bit
boxes, including Windows64.

Add a test of classic classes too.
This commit is contained in:
Neal Norwitz 2006-08-12 18:44:06 +00:00
parent 8a87f5d37e
commit 1872b1c01f
4 changed files with 25 additions and 13 deletions

View file

@ -974,24 +974,25 @@ instance_length(PyInstanceObject *inst)
if (res == NULL)
return -1;
if (PyInt_Check(res)) {
Py_ssize_t temp = PyInt_AsSsize_t(res);
if (temp == -1 && PyErr_Occurred()) {
outcome = PyInt_AsSsize_t(res);
if (outcome == -1 && PyErr_Occurred()) {
Py_DECREF(res);
return -1;
}
outcome = (Py_ssize_t)temp;
#if SIZEOF_SIZE_T < SIZEOF_LONG
#if SIZEOF_SIZE_T < SIZEOF_INT
/* Overflow check -- range of PyInt is more than C int */
if (outcome != temp) {
if (outcome != (int)outcome) {
PyErr_SetString(PyExc_OverflowError,
"__len__() should return 0 <= outcome < 2**31");
outcome = -1;
}
else
#endif
if (outcome < 0)
if (outcome < 0) {
PyErr_SetString(PyExc_ValueError,
"__len__() should return >= 0");
outcome = -1;
}
}
else {
PyErr_SetString(PyExc_TypeError,