diff options
author | Mark Shannon <mark@hotpy.org> | 2024-04-15 13:45:05 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-04-15 13:45:05 (GMT) |
commit | 784e076a10e828f383282df8a4b993a1b821f547 (patch) | |
tree | 99e2a6c34d7634279fab36aa03842e9c7e19ef26 /Objects | |
parent | 7d0be7aea569b3bc9a3936501d7d32af87c70e73 (diff) | |
download | cpython-784e076a10e828f383282df8a4b993a1b821f547.zip cpython-784e076a10e828f383282df8a4b993a1b821f547.tar.gz cpython-784e076a10e828f383282df8a4b993a1b821f547.tar.bz2 |
GH-117750: When clearing object's dict, clear inline values but leave dict attached (GH-117808)
Diffstat (limited to 'Objects')
-rw-r--r-- | Objects/dictobject.c | 33 |
1 files changed, 18 insertions, 15 deletions
diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 9c38ef2..003a03f 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -2681,25 +2681,28 @@ clear_lock_held(PyObject *op) interp, PyDict_EVENT_CLEARED, mp, NULL, NULL); // We don't inc ref empty keys because they're immortal ensure_shared_on_resize(mp); - - set_keys(mp, Py_EMPTY_KEYS); - set_values(mp, NULL); - mp->ma_used = 0; mp->ma_version_tag = new_version; - /* ...then clear the keys and values */ - if (oldvalues != NULL) { - if (!oldvalues->embedded) { - n = oldkeys->dk_nentries; - for (i = 0; i < n; i++) - Py_CLEAR(oldvalues->values[i]); - free_values(oldvalues, IS_DICT_SHARED(mp)); - } - dictkeys_decref(interp, oldkeys, false); - } - else { + mp->ma_used = 0; + if (oldvalues == NULL) { + set_keys(mp, Py_EMPTY_KEYS); assert(oldkeys->dk_refcnt == 1); dictkeys_decref(interp, oldkeys, IS_DICT_SHARED(mp)); } + else { + n = oldkeys->dk_nentries; + for (i = 0; i < n; i++) { + Py_CLEAR(oldvalues->values[i]); + } + if (oldvalues->embedded) { + oldvalues->size = 0; + } + else { + set_values(mp, NULL); + set_keys(mp, Py_EMPTY_KEYS); + free_values(oldvalues, IS_DICT_SHARED(mp)); + dictkeys_decref(interp, oldkeys, false); + } + } ASSERT_CONSISTENT(mp); } |