Skip to content

Commit b139ac7

Browse files
author
raymond.hettinger
committed
Validate that __length_hint__ returns a usable result.
git-svn-id: http://svn.python.org/projects/python/trunk@69237 6015fed2-1504-0410-9fe1-9d1591cc4771
1 parent 329487d commit b139ac7

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):
@@ -225,6 +230,11 @@ def test_issue1242657(self):
225230
self.assertRaises(RuntimeError, b.extend, BadLen())
226231
self.assertRaises(RuntimeError, b.extend, BadLengthHint())
227232

233+
def test_invalid_hint(self):
234+
# Make sure an invalid result doesn't muck-up the works
235+
self.assertEqual(list(NoneLengthHint()), list(range(10)))
236+
237+
228238
def test_main():
229239
unittests = [
230240
TestRepeat,

Objects/abstract.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ _PyObject_LengthHint(PyObject *o, Py_ssize_t defaultvalue)
123123
PyErr_Clear();
124124
return defaultvalue;
125125
}
126-
rv = PyInt_AsLong(ro);
126+
rv = rv = PyLong_Check(ro) ? PyLong_AsSsize_t(ro) : defaultvalue;
127127
Py_DECREF(ro);
128128
return rv;
129129
}

0 commit comments

Comments
 (0)