diff options
author | Amaury Forgeot d'Arc <amauryfa@gmail.com> | 2009-01-12 23:58:21 (GMT) |
---|---|---|
committer | Amaury Forgeot d'Arc <amauryfa@gmail.com> | 2009-01-12 23:58:21 (GMT) |
commit | f343e01c170b3f63eafac4568d905be91b676254 (patch) | |
tree | 1c3aa5615718e7ccc70be59a5fbd72b7497869ae /Lib | |
parent | e5e298f8755c475e78f8cfc71ee0ea03c6674406 (diff) | |
download | cpython-f343e01c170b3f63eafac4568d905be91b676254.zip cpython-f343e01c170b3f63eafac4568d905be91b676254.tar.gz cpython-f343e01c170b3f63eafac4568d905be91b676254.tar.bz2 |
Merged revisions 68560 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r68560 | amaury.forgeotdarc | 2009-01-13 00:36:55 +0100 (mar., 13 janv. 2009) | 6 lines
#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.
........
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/test/crashers/iter.py | 53 | ||||
-rw-r--r-- | Lib/test/test_iter.py | 22 |
2 files changed, 22 insertions, 53 deletions
diff --git a/Lib/test/crashers/iter.py b/Lib/test/crashers/iter.py deleted file mode 100644 index 0d8540e..0000000 --- a/Lib/test/crashers/iter.py +++ /dev/null @@ -1,53 +0,0 @@ -# Calls to PyIter_Next, or direct calls to tp_iternext, on an object -# which might no longer be an iterable because its 'next' method was -# removed. These are all variants of Issue3720. - -""" -Run this script with an argument between 1 and <N> to test for -different crashes. -""" -N = 8 - -import sys - -class Foo(object): - def __iter__(self): - return self - def next(self): - del Foo.next - return (1, 2) - -def case1(): - list(enumerate(Foo())) - -def case2(): - x, y = Foo() - -def case3(): - filter(None, Foo()) - -def case4(): - map(None, Foo(), Foo()) - -def case5(): - max(Foo()) - -def case6(): - sum(Foo(), ()) - -def case7(): - dict(Foo()) - -def case8(): - sys.stdout.writelines(Foo()) - -# etc... - - -if __name__ == '__main__': - if len(sys.argv) < 2: - print(__doc__.replace('<N>', str(N))) - else: - n = int(sys.argv[1]) - func = globals()['case%d' % n] - func() diff --git a/Lib/test/test_iter.py b/Lib/test/test_iter.py index eba9728..7788502 100644 --- a/Lib/test/test_iter.py +++ b/Lib/test/test_iter.py @@ -120,6 +120,13 @@ class TestCase(unittest.TestCase): def test_seq_class_iter(self): self.check_iterator(iter(SequenceClass(10)), list(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: @@ -853,6 +860,21 @@ class TestCase(unittest.TestCase): self.assertEqual(list(b), list(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) |