Issue #22653: Fix an assertion failure in debug mode when doing a reentrant dict insertion in debug mode.

This commit is contained in:
Antoine Pitrou 2014-10-18 00:35:00 +02:00
parent baa6d3a01f
commit d696732025
3 changed files with 35 additions and 3 deletions

View file

@ -906,6 +906,35 @@ class DictTest(unittest.TestCase):
f.a = 'a'
self.assertEqual(f.__dict__, {1:1, 'a':'a'})
def check_reentrant_insertion(self, mutate):
# This object will trigger mutation of the dict when replaced
# by another value. Note this relies on refcounting: the test
# won't achieve its purpose on fully-GCed Python implementations.
class Mutating:
def __del__(self):
mutate(d)
d = {k: Mutating() for k in 'abcdefghijklmnopqr'}
for k in list(d):
d[k] = k
def test_reentrant_insertion(self):
# Reentrant insertion shouldn't crash (see issue #22653)
def mutate(d):
d['b'] = 5
self.check_reentrant_insertion(mutate)
def mutate(d):
d.update(self.__dict__)
d.clear()
self.check_reentrant_insertion(mutate)
def mutate(d):
while d:
d.popitem()
self.check_reentrant_insertion(mutate)
from test import mapping_tests
class GeneralMappingTests(mapping_tests.BasicTestMappingProtocol):