mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
[3.11] gh-109786: Fix leaks and crash when re-enter itertools.pairwise.__next__() (GH-109788) (GH-112700)
(cherry picked from commit 6ca9d3e017
)
Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
This commit is contained in:
parent
28afd8ddad
commit
e3d380ded6
3 changed files with 85 additions and 2 deletions
|
@ -1079,6 +1079,78 @@ class TestBasicOps(unittest.TestCase):
|
|||
with self.assertRaises(TypeError):
|
||||
pairwise(None) # non-iterable argument
|
||||
|
||||
def test_pairwise_reenter(self):
|
||||
def check(reenter_at, expected):
|
||||
class I:
|
||||
count = 0
|
||||
def __iter__(self):
|
||||
return self
|
||||
def __next__(self):
|
||||
self.count +=1
|
||||
if self.count in reenter_at:
|
||||
return next(it)
|
||||
return [self.count] # new object
|
||||
|
||||
it = pairwise(I())
|
||||
for item in expected:
|
||||
self.assertEqual(next(it), item)
|
||||
|
||||
check({1}, [
|
||||
(([2], [3]), [4]),
|
||||
([4], [5]),
|
||||
])
|
||||
check({2}, [
|
||||
([1], ([1], [3])),
|
||||
(([1], [3]), [4]),
|
||||
([4], [5]),
|
||||
])
|
||||
check({3}, [
|
||||
([1], [2]),
|
||||
([2], ([2], [4])),
|
||||
(([2], [4]), [5]),
|
||||
([5], [6]),
|
||||
])
|
||||
check({1, 2}, [
|
||||
((([3], [4]), [5]), [6]),
|
||||
([6], [7]),
|
||||
])
|
||||
check({1, 3}, [
|
||||
(([2], ([2], [4])), [5]),
|
||||
([5], [6]),
|
||||
])
|
||||
check({1, 4}, [
|
||||
(([2], [3]), (([2], [3]), [5])),
|
||||
((([2], [3]), [5]), [6]),
|
||||
([6], [7]),
|
||||
])
|
||||
check({2, 3}, [
|
||||
([1], ([1], ([1], [4]))),
|
||||
(([1], ([1], [4])), [5]),
|
||||
([5], [6]),
|
||||
])
|
||||
|
||||
def test_pairwise_reenter2(self):
|
||||
def check(maxcount, expected):
|
||||
class I:
|
||||
count = 0
|
||||
def __iter__(self):
|
||||
return self
|
||||
def __next__(self):
|
||||
if self.count >= maxcount:
|
||||
raise StopIteration
|
||||
self.count +=1
|
||||
if self.count == 1:
|
||||
return next(it, None)
|
||||
return [self.count] # new object
|
||||
|
||||
it = pairwise(I())
|
||||
self.assertEqual(list(it), expected)
|
||||
|
||||
check(1, [])
|
||||
check(2, [])
|
||||
check(3, [])
|
||||
check(4, [(([2], [3]), [4])])
|
||||
|
||||
def test_product(self):
|
||||
for args, result in [
|
||||
([], [()]), # zero iterables
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue