mirror of
https://github.com/python/cpython.git
synced 2025-09-27 02:39:58 +00:00
[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
This commit is contained in:
parent
ca2275025b
commit
c8f5ca6810
2 changed files with 12 additions and 10 deletions
|
@ -0,0 +1 @@
|
||||||
|
Dictionary watchers now only deliver the PyDict_EVENT_ADDED event when the insertion is in a known good state to succeed.
|
|
@ -1251,10 +1251,6 @@ insertdict(PyInterpreterState *interp, PyDictObject *mp,
|
||||||
MAINTAIN_TRACKING(mp, key, value);
|
MAINTAIN_TRACKING(mp, key, value);
|
||||||
|
|
||||||
if (ix == DKIX_EMPTY) {
|
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);
|
assert(old_value == NULL);
|
||||||
if (mp->ma_keys->dk_usable <= 0) {
|
if (mp->ma_keys->dk_usable <= 0) {
|
||||||
/* Need to resize. */
|
/* Need to resize. */
|
||||||
|
@ -1262,6 +1258,11 @@ insertdict(PyInterpreterState *interp, PyDictObject *mp,
|
||||||
goto Fail;
|
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);
|
Py_ssize_t hashpos = find_empty_slot(mp->ma_keys, hash);
|
||||||
dictkeys_set_index(mp->ma_keys, hashpos, mp->ma_keys->dk_nentries);
|
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);
|
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);
|
int unicode = PyUnicode_CheckExact(key);
|
||||||
PyDictKeysObject *newkeys = new_keys_object(
|
PyDictKeysObject *newkeys = new_keys_object(
|
||||||
interp, PyDict_LOG_MINSIZE, unicode);
|
interp, PyDict_LOG_MINSIZE, unicode);
|
||||||
|
@ -1346,6 +1344,9 @@ insert_to_emptydict(PyInterpreterState *interp, PyDictObject *mp,
|
||||||
Py_DECREF(value);
|
Py_DECREF(value);
|
||||||
return -1;
|
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. */
|
/* We don't decref Py_EMPTY_KEYS here because it is immortal. */
|
||||||
mp->ma_keys = newkeys;
|
mp->ma_keys = newkeys;
|
||||||
mp->ma_values = NULL;
|
mp->ma_values = NULL;
|
||||||
|
@ -3324,15 +3325,15 @@ PyDict_SetDefault(PyObject *d, PyObject *key, PyObject *defaultobj)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (ix == DKIX_EMPTY) {
|
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;
|
value = defaultobj;
|
||||||
if (mp->ma_keys->dk_usable <= 0) {
|
if (mp->ma_keys->dk_usable <= 0) {
|
||||||
if (insertion_resize(interp, mp, 1) < 0) {
|
if (insertion_resize(interp, mp, 1) < 0) {
|
||||||
return NULL;
|
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);
|
Py_ssize_t hashpos = find_empty_slot(mp->ma_keys, hash);
|
||||||
dictkeys_set_index(mp->ma_keys, hashpos, mp->ma_keys->dk_nentries);
|
dictkeys_set_index(mp->ma_keys, hashpos, mp->ma_keys->dk_nentries);
|
||||||
if (DK_IS_UNICODE(mp->ma_keys)) {
|
if (DK_IS_UNICODE(mp->ma_keys)) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue