mirror of
https://github.com/python/cpython.git
synced 2025-11-25 21:11:09 +00:00
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:
parent
8a87f5d37e
commit
1872b1c01f
4 changed files with 25 additions and 13 deletions
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue