summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
authorMark Shannon <mark@hotpy.org>2024-04-15 13:45:05 (GMT)
committerGitHub <noreply@github.com>2024-04-15 13:45:05 (GMT)
commit784e076a10e828f383282df8a4b993a1b821f547 (patch)
tree99e2a6c34d7634279fab36aa03842e9c7e19ef26 /Objects
parent7d0be7aea569b3bc9a3936501d7d32af87c70e73 (diff)
downloadcpython-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.c33
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);
}