| # 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() |