[Python-checkins] python/dist/src/Objects classobject.c, 2.179, 2.180 typeobject.c, 2.267, 2.268
gvanrossum@users.sourceforge.net
gvanrossum at users.sourceforge.net
Tue Sep 20 20:49:58 CEST 2005
Update of /cvsroot/python/python/dist/src/Objects
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv26848/Objects
Modified Files:
classobject.c typeobject.c
Log Message:
- 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.)
Index: classobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/classobject.c,v
retrieving revision 2.179
retrieving revision 2.180
diff -u -d -r2.179 -r2.180
--- classobject.c 19 Sep 2005 22:42:41 -0000 2.179
+++ classobject.c 20 Sep 2005 18:49:54 -0000 2.180
@@ -1019,7 +1019,7 @@
/* 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
Index: typeobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/typeobject.c,v
retrieving revision 2.267
retrieving revision 2.268
diff -u -d -r2.267 -r2.268
--- typeobject.c 3 Jun 2005 14:12:21 -0000 2.267
+++ typeobject.c 20 Sep 2005 18:49:54 -0000 2.268
@@ -4071,14 +4071,24 @@
{
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");
More information about the Python-checkins
mailing list