#3720: Interpreter crashes when an evil iterator removes its own next function.
Now the slot is filled with a function that always raises.
Will not backport: extensions compiled with 2.6.x would not run on 2.6.0.
diff --git a/Lib/test/test_iter.py b/Lib/test/test_iter.py
index f83de78..e847018 100644
--- a/Lib/test/test_iter.py
+++ b/Lib/test/test_iter.py
@@ -120,6 +120,13 @@
def test_seq_class_iter(self):
self.check_iterator(iter(SequenceClass(10)), range(10))
+ # Test a new_style class with __iter__ but no next() method
+ def test_new_style_iter_class(self):
+ class IterClass(object):
+ def __iter__(self):
+ return self
+ self.assertRaises(TypeError, iter, IterClass())
+
# Test two-argument iter() with callable instance
def test_iter_callable(self):
class C:
@@ -877,6 +884,21 @@
self.assertEqual(list(b), zip(range(5), range(5)))
self.assertEqual(list(b), [])
+ def test_3720(self):
+ # Avoid a crash, when an iterator deletes its next() method.
+ class BadIterator(object):
+ def __iter__(self):
+ return self
+ def next(self):
+ del BadIterator.next
+ return 1
+
+ try:
+ for i in BadIterator() :
+ pass
+ except TypeError:
+ pass
+
def test_main():
run_unittest(TestCase)