mirror of
https://github.com/python/cpython.git
synced 2025-08-01 07:33:08 +00:00
[3.13] gh-122208: Don't delivery PyDict_EVENT_ADDED until it can't fail (#122326)
Don't delivery PyDict_EVENT_ADDED until it can't fail
This commit is contained in:
parent
0d6324c6b3
commit
11292ab935
2 changed files with 9 additions and 11 deletions
|
@ -1686,6 +1686,10 @@ insert_combined_dict(PyInterpreterState *interp, PyDictObject *mp,
|
|||
}
|
||||
}
|
||||
|
||||
uint64_t new_version = _PyDict_NotifyEvent(
|
||||
interp, PyDict_EVENT_ADDED, mp, key, value);
|
||||
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);
|
||||
|
||||
|
@ -1702,6 +1706,7 @@ insert_combined_dict(PyInterpreterState *interp, PyDictObject *mp,
|
|||
STORE_VALUE(ep, value);
|
||||
STORE_HASH(ep, hash);
|
||||
}
|
||||
mp->ma_version_tag = new_version;
|
||||
STORE_KEYS_USABLE(mp->ma_keys, mp->ma_keys->dk_usable - 1);
|
||||
STORE_KEYS_NENTRIES(mp->ma_keys, mp->ma_keys->dk_nentries + 1);
|
||||
assert(mp->ma_keys->dk_usable >= 0);
|
||||
|
@ -1805,15 +1810,11 @@ insertdict(PyInterpreterState *interp, PyDictObject *mp,
|
|||
|
||||
if (ix == DKIX_EMPTY) {
|
||||
assert(!_PyDict_HasSplitTable(mp));
|
||||
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 (insert_combined_dict(interp, mp, hash, key, value) < 0) {
|
||||
goto Fail;
|
||||
}
|
||||
mp->ma_version_tag = new_version;
|
||||
STORE_USED(mp, mp->ma_used + 1);
|
||||
ASSERT_CONSISTENT(mp);
|
||||
return 0;
|
||||
|
@ -1854,9 +1855,6 @@ insert_to_emptydict(PyInterpreterState *interp, PyDictObject *mp,
|
|||
assert(mp->ma_keys == Py_EMPTY_KEYS);
|
||||
ASSERT_DICT_LOCKED(mp);
|
||||
|
||||
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);
|
||||
|
@ -1865,6 +1863,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. */
|
||||
assert(mp->ma_values == NULL);
|
||||
|
||||
|
@ -4264,9 +4265,6 @@ dict_setdefault_ref_lock_held(PyObject *d, PyObject *key, PyObject *default_valu
|
|||
|
||||
if (ix == DKIX_EMPTY) {
|
||||
assert(!_PyDict_HasSplitTable(mp));
|
||||
uint64_t new_version = _PyDict_NotifyEvent(
|
||||
interp, PyDict_EVENT_ADDED, mp, key, default_value);
|
||||
mp->ma_keys->dk_version = 0;
|
||||
value = default_value;
|
||||
|
||||
if (insert_combined_dict(interp, mp, hash, Py_NewRef(key), Py_NewRef(value)) < 0) {
|
||||
|
@ -4279,7 +4277,6 @@ dict_setdefault_ref_lock_held(PyObject *d, PyObject *key, PyObject *default_valu
|
|||
|
||||
MAINTAIN_TRACKING(mp, key, value);
|
||||
STORE_USED(mp, mp->ma_used + 1);
|
||||
mp->ma_version_tag = new_version;
|
||||
assert(mp->ma_keys->dk_usable >= 0);
|
||||
ASSERT_CONSISTENT(mp);
|
||||
if (result) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue