https://github.com/python/cpython/commit/c8f5ca6810aeb13f9f43d17d3f0befd550a77dba
commit: c8f5ca6810aeb13f9f43d17d3f0befd550a77dba
branch: 3.12
author: Dino Viehland <[email protected]>
committer: DinoV <[email protected]>
date: 2024-07-30T09:13:40-07:00
summary:
[3.12] gh-122208: Don't delivery PyDict_EVENT_ADDED until it can't fail
(#122327)
Don't delivery PyDict_EVENT_ADDED until it can't fail
files:
A
Misc/NEWS.d/next/Core_and_Builtins/2024-07-26-21-38-47.gh-issue-122208.z8KHsY.rst
M Objects/dictobject.c
diff --git
a/Misc/NEWS.d/next/Core_and_Builtins/2024-07-26-21-38-47.gh-issue-122208.z8KHsY.rst
b/Misc/NEWS.d/next/Core_and_Builtins/2024-07-26-21-38-47.gh-issue-122208.z8KHsY.rst
new file mode 100644
index 00000000000000..e4a89d137ede0e
--- /dev/null
+++
b/Misc/NEWS.d/next/Core_and_Builtins/2024-07-26-21-38-47.gh-issue-122208.z8KHsY.rst
@@ -0,0 +1 @@
+Dictionary watchers now only deliver the PyDict_EVENT_ADDED event when the
insertion is in a known good state to succeed.
diff --git a/Objects/dictobject.c b/Objects/dictobject.c
index 254cd9ad2f9bda..a99f32a9c84c95 100644
--- a/Objects/dictobject.c
+++ b/Objects/dictobject.c
@@ -1251,10 +1251,6 @@ insertdict(PyInterpreterState *interp, PyDictObject *mp,
MAINTAIN_TRACKING(mp, key, value);
if (ix == DKIX_EMPTY) {
- uint64_t new_version = _PyDict_NotifyEvent(
- interp, PyDict_EVENT_ADDED, mp, key, value);
- /* Insert into new slot. */
- mp->ma_keys->dk_version = 0;
assert(old_value == NULL);
if (mp->ma_keys->dk_usable <= 0) {
/* Need to resize. */
@@ -1262,6 +1258,11 @@ insertdict(PyInterpreterState *interp, PyDictObject *mp,
goto Fail;
}
+ uint64_t new_version = _PyDict_NotifyEvent(
+ interp, PyDict_EVENT_ADDED, mp, key, value);
+ /* Insert into new slot. */
+ mp->ma_keys->dk_version = 0;
+
Py_ssize_t hashpos = find_empty_slot(mp->ma_keys, hash);
dictkeys_set_index(mp->ma_keys, hashpos, mp->ma_keys->dk_nentries);
@@ -1335,9 +1336,6 @@ insert_to_emptydict(PyInterpreterState *interp,
PyDictObject *mp,
{
assert(mp->ma_keys == Py_EMPTY_KEYS);
- uint64_t new_version = _PyDict_NotifyEvent(
- interp, PyDict_EVENT_ADDED, mp, key, value);
-
int unicode = PyUnicode_CheckExact(key);
PyDictKeysObject *newkeys = new_keys_object(
interp, PyDict_LOG_MINSIZE, unicode);
@@ -1346,6 +1344,9 @@ insert_to_emptydict(PyInterpreterState *interp,
PyDictObject *mp,
Py_DECREF(value);
return -1;
}
+ uint64_t new_version = _PyDict_NotifyEvent(
+ interp, PyDict_EVENT_ADDED, mp, key, value);
+
/* We don't decref Py_EMPTY_KEYS here because it is immortal. */
mp->ma_keys = newkeys;
mp->ma_values = NULL;
@@ -3324,15 +3325,15 @@ PyDict_SetDefault(PyObject *d, PyObject *key, PyObject
*defaultobj)
return NULL;
if (ix == DKIX_EMPTY) {
- uint64_t new_version = _PyDict_NotifyEvent(
- interp, PyDict_EVENT_ADDED, mp, key, defaultobj);
- mp->ma_keys->dk_version = 0;
value = defaultobj;
if (mp->ma_keys->dk_usable <= 0) {
if (insertion_resize(interp, mp, 1) < 0) {
return NULL;
}
}
+ uint64_t new_version = _PyDict_NotifyEvent(
+ interp, PyDict_EVENT_ADDED, mp, key, defaultobj);
+ mp->ma_keys->dk_version = 0;
Py_ssize_t hashpos = find_empty_slot(mp->ma_keys, hash);
dictkeys_set_index(mp->ma_keys, hashpos, mp->ma_keys->dk_nentries);
if (DK_IS_UNICODE(mp->ma_keys)) {
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]