]> granicus.if.org Git - python/commitdiff
Validate that __length_hint__ returns a usable result.
authorRaymond Hettinger <python@rcn.com>
Tue, 3 Feb 2009 02:23:19 +0000 (02:23 +0000)
committerRaymond Hettinger <python@rcn.com>
Tue, 3 Feb 2009 02:23:19 +0000 (02:23 +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 1ac4ac95b51c7f24eb1c5cd1a82bedc93a3e59c8..d601288458ceb049ad2caf759d0284e07163e10a 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;
 }