]> granicus.if.org Git - python/commitdiff
A minor fix for 64-bit platforms: when __len__() returns Python int
authorGuido van Rossum <guido@python.org>
Mon, 19 Sep 2005 22:42:41 +0000 (22:42 +0000)
committerGuido van Rossum <guido@python.org>
Mon, 19 Sep 2005 22:42:41 +0000 (22:42 +0000)
containing a value that doesn't fit in a C int, raise OverflowError
rather than truncating silently (and having 50% chance of hitting the
"it should be >= 0" error).

Objects/classobject.c

index ce2c073db9601c64ff84cae17f88fb9c180c00b8..f778387567211803e972d093bebdbc071a77478f 100644 (file)
@@ -1013,7 +1013,17 @@ instance_length(PyInstanceObject *inst)
        if (res == NULL)
                return -1;
        if (PyInt_Check(res)) {
-               outcome = PyInt_AsLong(res);
+               long temp = PyInt_AsLong(res);
+               outcome = (int)temp;
+#if SIZEOF_INT < SIZEOF_LONG
+               /* Overflow check -- range of PyInt is more than C int */
+               if (outcome != temp) {
+                       PyErr_SetString(PyExc_OverflowError,
+                        "__len__() should return 0 <= outcome < 2**32");
+                       outcome = -1;
+               }
+               else
+#endif
                if (outcome < 0)
                        PyErr_SetString(PyExc_ValueError,
                                        "__len__() should return >= 0");