diff Objects/typeobject.c @ 35610:1f236e598ae9 legacy-trunk

- 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.)
author Guido van Rossum <guido@python.org>
date Tue, 20 Sep 2005 18:49:54 +0000
parents 8880d91cdb09
children 7dd4e6cb9d27
line wrap: on
line diff
--- a/Objects/typeobject.c	Tue Sep 20 18:34:01 2005 +0000
+++ b/Objects/typeobject.c	Tue Sep 20 18:49:54 2005 +0000
@@ -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");