]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Validate that __length_hint__ returns a usable result.
authorRaymond Hettinger <python@rcn.com>
Tue, 3 Feb 2009 02:28:00 +0000 (02:28 +0000)
committerRaymond Hettinger <python@rcn.com>
Tue, 3 Feb 2009 02:28:00 +0000 (02:28 +0000)
Lib/test/test_iterlen.py
Objects/abstract.c

index 91873c2af4a07cf515fa0f1f18579c8bcc4d6bed..ab5466ecf99078202311728650ee6ff5607ae955 100644 (file)
@@ -208,6 +208,11 @@ class BadLengthHint(object):
     def __length_hint__(self):
         raise RuntimeError('hello')
 
+class NoneLengthHint(object):
+    def __iter__(self): return iter(range(10))
+    def __length_hint__(self):
+        return None
+
 class TestLengthHintExceptions(unittest.TestCase):
 
     def test_issue1242657(self):
@@ -225,6 +230,11 @@ class TestLengthHintExceptions(unittest.TestCase):
         self.assertRaises(RuntimeError, b.extend, BadLen())
         self.assertRaises(RuntimeError, b.extend, BadLengthHint())
 
+    def test_invalid_hint(self):
+        # Make sure an invalid result doesn't muck-up the works
+        self.assertEqual(list(NoneLengthHint()), list(range(10)))
+
+
 def test_main():
     unittests = [
         TestRepeat,
index c10f4ca4f95eac83ea77bcd0ba183a6b74edf7c2..b47b1c9772fa8f0b03d0997ca1b324c02b371cc7 100644 (file)
@@ -123,7 +123,7 @@ _PyObject_LengthHint(PyObject *o, Py_ssize_t defaultvalue)
                PyErr_Clear();
                return defaultvalue;
        }
-       rv = PyInt_AsLong(ro);
+       rv = rv = PyLong_Check(ro) ? PyLong_AsSsize_t(ro) : defaultvalue;
        Py_DECREF(ro);
        return rv;
 }