Skip to content

Commit 991098e

Browse files
committed
Don't delivery PyDict_EVENT_ADDED until it can't fail
1 parent e91ef13 commit 991098e

File tree

1 file changed

+8
-12
lines changed

1 file changed

+8
-12
lines changed

Objects/dictobject.c

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1627,6 +1627,10 @@ insert_combined_dict(PyInterpreterState *interp, PyDictObject *mp,
16271627
}
16281628
}
16291629

1630+
uint64_t new_version = _PyDict_NotifyEvent(
1631+
interp, PyDict_EVENT_ADDED, mp, key, value);
1632+
mp->ma_keys->dk_version = 0;
1633+
16301634
Py_ssize_t hashpos = find_empty_slot(mp->ma_keys, hash);
16311635
dictkeys_set_index(mp->ma_keys, hashpos, mp->ma_keys->dk_nentries);
16321636

@@ -1643,6 +1647,7 @@ insert_combined_dict(PyInterpreterState *interp, PyDictObject *mp,
16431647
STORE_VALUE(ep, value);
16441648
STORE_HASH(ep, hash);
16451649
}
1650+
mp->ma_version_tag = new_version;
16461651
STORE_KEYS_USABLE(mp->ma_keys, mp->ma_keys->dk_usable - 1);
16471652
STORE_KEYS_NENTRIES(mp->ma_keys, mp->ma_keys->dk_nentries + 1);
16481653
assert(mp->ma_keys->dk_usable >= 0);
@@ -1745,16 +1750,11 @@ insertdict(PyInterpreterState *interp, PyDictObject *mp,
17451750
MAINTAIN_TRACKING(mp, key, value);
17461751

17471752
if (ix == DKIX_EMPTY) {
1748-
assert(!_PyDict_HasSplitTable(mp));
1749-
uint64_t new_version = _PyDict_NotifyEvent(
1750-
interp, PyDict_EVENT_ADDED, mp, key, value);
17511753
/* Insert into new slot. */
1752-
mp->ma_keys->dk_version = 0;
17531754
assert(old_value == NULL);
17541755
if (insert_combined_dict(interp, mp, hash, key, value) < 0) {
17551756
goto Fail;
17561757
}
1757-
mp->ma_version_tag = new_version;
17581758
STORE_USED(mp, mp->ma_used + 1);
17591759
ASSERT_CONSISTENT(mp);
17601760
return 0;
@@ -1795,9 +1795,6 @@ insert_to_emptydict(PyInterpreterState *interp, PyDictObject *mp,
17951795
assert(mp->ma_keys == Py_EMPTY_KEYS);
17961796
ASSERT_DICT_LOCKED(mp);
17971797

1798-
uint64_t new_version = _PyDict_NotifyEvent(
1799-
interp, PyDict_EVENT_ADDED, mp, key, value);
1800-
18011798
int unicode = PyUnicode_CheckExact(key);
18021799
PyDictKeysObject *newkeys = new_keys_object(
18031800
interp, PyDict_LOG_MINSIZE, unicode);
@@ -1806,6 +1803,9 @@ insert_to_emptydict(PyInterpreterState *interp, PyDictObject *mp,
18061803
Py_DECREF(value);
18071804
return -1;
18081805
}
1806+
uint64_t new_version = _PyDict_NotifyEvent(
1807+
interp, PyDict_EVENT_ADDED, mp, key, value);
1808+
18091809
/* We don't decref Py_EMPTY_KEYS here because it is immortal. */
18101810
assert(mp->ma_values == NULL);
18111811

@@ -4199,9 +4199,6 @@ dict_setdefault_ref_lock_held(PyObject *d, PyObject *key, PyObject *default_valu
41994199

42004200
if (ix == DKIX_EMPTY) {
42014201
assert(!_PyDict_HasSplitTable(mp));
4202-
uint64_t new_version = _PyDict_NotifyEvent(
4203-
interp, PyDict_EVENT_ADDED, mp, key, default_value);
4204-
mp->ma_keys->dk_version = 0;
42054202
value = default_value;
42064203

42074204
if (insert_combined_dict(interp, mp, hash, Py_NewRef(key), Py_NewRef(value)) < 0) {
@@ -4214,7 +4211,6 @@ dict_setdefault_ref_lock_held(PyObject *d, PyObject *key, PyObject *default_valu
42144211

42154212
MAINTAIN_TRACKING(mp, key, value);
42164213
STORE_USED(mp, mp->ma_used + 1);
4217-
mp->ma_version_tag = new_version;
42184214
assert(mp->ma_keys->dk_usable >= 0);
42194215
ASSERT_CONSISTENT(mp);
42204216
if (result) {

0 commit comments

Comments
 (0)