mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
SF bug #793826: using itertools.izip to mutate tuples
Avoid Armin Rigo's dastardly exercise in re-entrancy.
This commit is contained in:
parent
b738041c5d
commit
a56f6b6600
2 changed files with 36 additions and 3 deletions
|
@ -427,6 +427,36 @@ class TestVariousIteratorArgs(unittest.TestCase):
|
|||
self.assertRaises(TypeError, list, dropwhile(isOdd, N(s)))
|
||||
self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s)))
|
||||
|
||||
class RegressionTests(unittest.TestCase):
|
||||
|
||||
def test_sf_793826(self):
|
||||
# Fix Armin Rigo's successful efforts to wreak havoc
|
||||
|
||||
def mutatingtuple(tuple1, f, tuple2):
|
||||
# this builds a tuple t which is a copy of tuple1,
|
||||
# then calls f(t), then mutates t to be equal to tuple2
|
||||
# (needs len(tuple1) == len(tuple2)).
|
||||
def g(value, first=[1]):
|
||||
if first:
|
||||
del first[:]
|
||||
f(z.next())
|
||||
return value
|
||||
items = list(tuple2)
|
||||
items[1:1] = list(tuple1)
|
||||
gen = imap(g, items)
|
||||
z = izip(*[gen]*len(tuple1))
|
||||
z.next()
|
||||
|
||||
def f(t):
|
||||
global T
|
||||
T = t
|
||||
first[:] = list(T)
|
||||
|
||||
first = []
|
||||
mutatingtuple((1,2,3), f, (4,5,6))
|
||||
second = list(T)
|
||||
self.assertEqual(first, second)
|
||||
|
||||
|
||||
libreftest = """ Doctest for examples in the library reference: libitertools.tex
|
||||
|
||||
|
@ -568,7 +598,8 @@ False
|
|||
__test__ = {'libreftest' : libreftest}
|
||||
|
||||
def test_main(verbose=None):
|
||||
test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC)
|
||||
test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC,
|
||||
RegressionTests)
|
||||
test_support.run_unittest(*test_classes)
|
||||
|
||||
# verify reference counting
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue