Commit 8895a32b authored by Raymond Hettinger's avatar Raymond Hettinger

Validate that __length_hint__ returns a usable result.

parent 10c295dc
...@@ -208,6 +208,11 @@ class BadLengthHint(object): ...@@ -208,6 +208,11 @@ class BadLengthHint(object):
def __length_hint__(self): def __length_hint__(self):
raise RuntimeError('hello') raise RuntimeError('hello')
class NoneLengthHint(object):
def __iter__(self): return iter(range(10))
def __length_hint__(self):
return None
class TestLengthHintExceptions(unittest.TestCase): class TestLengthHintExceptions(unittest.TestCase):
def test_issue1242657(self): def test_issue1242657(self):
...@@ -219,6 +224,11 @@ class TestLengthHintExceptions(unittest.TestCase): ...@@ -219,6 +224,11 @@ class TestLengthHintExceptions(unittest.TestCase):
self.assertRaises(RuntimeError, b.extend, BadLen()) self.assertRaises(RuntimeError, b.extend, BadLen())
self.assertRaises(RuntimeError, b.extend, BadLengthHint()) 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(): def test_main():
unittests = [ unittests = [
TestRepeat, TestRepeat,
......
...@@ -105,7 +105,7 @@ _PyObject_LengthHint(PyObject *o, Py_ssize_t defaultvalue) ...@@ -105,7 +105,7 @@ _PyObject_LengthHint(PyObject *o, Py_ssize_t defaultvalue)
PyErr_Clear(); PyErr_Clear();
return defaultvalue; return defaultvalue;
} }
rv = PyLong_AsSsize_t(ro); rv = PyLong_Check(ro) ? PyLong_AsSsize_t(ro) : defaultvalue;
Py_DECREF(ro); Py_DECREF(ro);
return rv; return rv;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment