Skip to content

Commit adcd11e

Browse files
author
raymond.hettinger
committed
Validate that __length_hint__ returns a usable result.
git-svn-id: http://svn.python.org/projects/python/branches/py3k@69234 6015fed2-1504-0410-9fe1-9d1591cc4771
1 parent 478c0d3 commit adcd11e

2 files changed

Lines changed: 11 additions & 1 deletion

File tree

Lib/test/test_iterlen.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,11 @@ def __iter__(self): return iter(range(10))
208208
def __length_hint__(self):
209209
raise RuntimeError('hello')
210210

211+
class NoneLengthHint(object):
212+
def __iter__(self): return iter(range(10))
213+
def __length_hint__(self):
214+
return None
215+
211216
class TestLengthHintExceptions(unittest.TestCase):
212217

213218
def test_issue1242657(self):
@@ -219,6 +224,11 @@ def test_issue1242657(self):
219224
self.assertRaises(RuntimeError, b.extend, BadLen())
220225
self.assertRaises(RuntimeError, b.extend, BadLengthHint())
221226

227+
def test_invalid_hint(self):
228+
# Make sure an invalid result doesn't muck-up the works
229+
self.assertEqual(list(NoneLengthHint()), list(range(10)))
230+
231+
222232
def test_main():
223233
unittests = [
224234
TestRepeat,

Objects/abstract.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ _PyObject_LengthHint(PyObject *o, Py_ssize_t defaultvalue)
105105
PyErr_Clear();
106106
return defaultvalue;
107107
}
108-
rv = PyLong_AsSsize_t(ro);
108+
rv = PyLong_Check(ro) ? PyLong_AsSsize_t(ro) : defaultvalue;
109109
Py_DECREF(ro);
110110
return rv;
111111
}

0 commit comments

Comments
 (0)