]> granicus.if.org Git - python/commitdiff
Issue #13454: Fix a crash when deleting an iterator created by itertools.tee()
authorSerhiy Storchaka <storchaka@gmail.com>
Fri, 25 Jan 2013 11:24:47 +0000 (13:24 +0200)
committerSerhiy Storchaka <storchaka@gmail.com>
Fri, 25 Jan 2013 11:24:47 +0000 (13:24 +0200)
if all other iterators were very advanced before.

1  2 
Lib/test/test_itertools.py
Misc/NEWS
Modules/itertoolsmodule.c

index 90e85a9b25d2dc17fc0d58be52faa8f692fecfc3,66e307da5a9321441557d030673ff6be58386def..efd50bae10e41cee76dffd5a1b8b4380cf26f3bb
@@@ -1206,67 -930,14 +1206,75 @@@ class TestBasicOps(unittest.TestCase)
          del a
          self.assertRaises(ReferenceError, getattr, p, '__class__')
  
 +        ans = list('abc')
 +        long_ans = list(range(10000))
 +
 +        # check copy
 +        a, b = tee('abc')
 +        self.assertEqual(list(copy.copy(a)), ans)
 +        self.assertEqual(list(copy.copy(b)), ans)
 +        a, b = tee(list(range(10000)))
 +        self.assertEqual(list(copy.copy(a)), long_ans)
 +        self.assertEqual(list(copy.copy(b)), long_ans)
 +
 +        # check partially consumed copy
 +        a, b = tee('abc')
 +        take(2, a)
 +        take(1, b)
 +        self.assertEqual(list(copy.copy(a)), ans[2:])
 +        self.assertEqual(list(copy.copy(b)), ans[1:])
 +        self.assertEqual(list(a), ans[2:])
 +        self.assertEqual(list(b), ans[1:])
 +        a, b = tee(range(10000))
 +        take(100, a)
 +        take(60, b)
 +        self.assertEqual(list(copy.copy(a)), long_ans[100:])
 +        self.assertEqual(list(copy.copy(b)), long_ans[60:])
 +        self.assertEqual(list(a), long_ans[100:])
 +        self.assertEqual(list(b), long_ans[60:])
 +
 +        # check deepcopy
 +        a, b = tee('abc')
 +        self.assertEqual(list(copy.deepcopy(a)), ans)
 +        self.assertEqual(list(copy.deepcopy(b)), ans)
 +        self.assertEqual(list(a), ans)
 +        self.assertEqual(list(b), ans)
 +        a, b = tee(range(10000))
 +        self.assertEqual(list(copy.deepcopy(a)), long_ans)
 +        self.assertEqual(list(copy.deepcopy(b)), long_ans)
 +        self.assertEqual(list(a), long_ans)
 +        self.assertEqual(list(b), long_ans)
 +
 +        # check partially consumed deepcopy
 +        a, b = tee('abc')
 +        take(2, a)
 +        take(1, b)
 +        self.assertEqual(list(copy.deepcopy(a)), ans[2:])
 +        self.assertEqual(list(copy.deepcopy(b)), ans[1:])
 +        self.assertEqual(list(a), ans[2:])
 +        self.assertEqual(list(b), ans[1:])
 +        a, b = tee(range(10000))
 +        take(100, a)
 +        take(60, b)
 +        self.assertEqual(list(copy.deepcopy(a)), long_ans[100:])
 +        self.assertEqual(list(copy.deepcopy(b)), long_ans[60:])
 +        self.assertEqual(list(a), long_ans[100:])
 +        self.assertEqual(list(b), long_ans[60:])
 +
 +        # check pickle
 +        self.pickletest(iter(tee('abc')))
 +        a, b = tee('abc')
 +        self.pickletest(a, compare=ans)
 +        self.pickletest(b, compare=ans)
 +
+     # Issue 13454: Crash when deleting backward iterator from tee()
+     def test_tee_del_backward(self):
+         forward, backward = tee(range(20000000))
+         for i in forward:
+             pass
+         del backward
      def test_StopIteration(self):
          self.assertRaises(StopIteration, next, zip())
  
diff --cc Misc/NEWS
Simple merge
Simple merge