mirror of
https://github.com/python/cpython.git
synced 2025-11-02 11:08:57 +00:00
Issue #22653: Fix an assertion failure in debug mode when doing a reentrant dict insertion in debug mode.
This commit is contained in:
parent
baa6d3a01f
commit
d696732025
3 changed files with 35 additions and 3 deletions
|
|
@ -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):
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue