From: Mark Shannon Date: Mon, 2 Aug 2021 13:54:23 +0000 (+0100) Subject: bpo-44206: Make sure that dict-keys's version is set to zero when value is popped... X-Git-Tag: v3.11.0a1~493 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e06ae75e16dbf46b6626b6a41b62391ea1fdb319;p=thirdparty%2FPython%2Fcpython.git bpo-44206: Make sure that dict-keys's version is set to zero when value is popped (GH-27542) --- diff --git a/Lib/test/test_module.py b/Lib/test/test_module.py index 6608dbc8a5a7..619348e0e40c 100644 --- a/Lib/test/test_module.py +++ b/Lib/test/test_module.py @@ -332,6 +332,18 @@ a = A(destroyed)""" self.assertFalse("__annotations__" in ann_module4.__dict__) + def test_repeated_attribute_pops(self): + # Repeated accesses to module attribute will be specialized + # Check that popping the attribute doesn't break it + m = ModuleType("test") + d = m.__dict__ + count = 0 + for _ in range(100): + m.attr = 1 + count += m.attr # Might be specialized + d.pop("attr") + self.assertEqual(count, 100) + # frozen and namespace module reprs are tested in importlib. diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 7f1d38dd5f43..5fb9d0156123 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -1798,6 +1798,7 @@ _PyDict_Pop_KnownHash(PyObject *dict, PyObject *key, Py_hash_t hash, PyObject *d assert(old_value != NULL); mp->ma_used--; mp->ma_version_tag = DICT_NEXT_VERSION(); + mp->ma_keys->dk_version = 0; dictkeys_set_index(mp->ma_keys, hashpos, DKIX_DUMMY); ep = &DK_ENTRIES(mp->ma_keys)[ix]; mp->ma_keys->dk_version = 0;