Skip to content

Commit 59ea4f2

Browse files
committed
Address code review
1 parent c732019 commit 59ea4f2

File tree

4 files changed

+26
-21
lines changed

4 files changed

+26
-21
lines changed

Objects/dictobject.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1703,6 +1703,8 @@ insert_split_value(PyInterpreterState *interp, PyDictObject *mp, PyObject *key,
17031703
uint64_t new_version = _PyDict_NotifyEvent(interp, PyDict_EVENT_MODIFIED, mp, key, value);
17041704
STORE_SPLIT_VALUE(mp, ix, Py_NewRef(value));
17051705
mp->ma_version_tag = new_version;
1706+
// old_value should be DECREFed after GC track checking is done, if not, it could raise a segmentation fault,
1707+
// when dict only holds the strong reference to value in ep->me_value.
17061708
Py_DECREF(old_value);
17071709
}
17081710
ASSERT_CONSISTENT(mp);

Python/bytecodes.c

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2230,18 +2230,19 @@ dummy_func(
22302230
DEOPT_IF(!DK_IS_UNICODE(dict->ma_keys));
22312231
PyDictUnicodeEntry *ep = DK_UNICODE_ENTRIES(dict->ma_keys) + hint;
22322232
DEOPT_IF(ep->me_key != name);
2233-
old_value = ep->me_value;
2234-
PyDict_WatchEvent event = old_value == NULL ? PyDict_EVENT_ADDED : PyDict_EVENT_MODIFIED;
2235-
new_version = _PyDict_NotifyEvent(tstate->interp, event, dict, name, PyStackRef_AsPyObjectBorrow(value));
2236-
ep->me_value = PyStackRef_AsPyObjectSteal(value);
2237-
STAT_INC(STORE_ATTR, hit);
22382233
/* Ensure dict is GC tracked if it needs to be */
22392234
if (!_PyObject_GC_IS_TRACKED(dict) && _PyObject_GC_MAY_BE_TRACKED(PyStackRef_AsPyObjectBorrow(value))) {
22402235
_PyObject_GC_TRACK(dict);
22412236
}
2237+
old_value = ep->me_value;
2238+
PyDict_WatchEvent event = old_value == NULL ? PyDict_EVENT_ADDED : PyDict_EVENT_MODIFIED;
2239+
new_version = _PyDict_NotifyEvent(tstate->interp, event, dict, name, PyStackRef_AsPyObjectBorrow(value));
2240+
ep->me_value = PyStackRef_AsPyObjectSteal(value);
2241+
dict->ma_version_tag = new_version; // PEP 509
2242+
// old_value should be DECREFed after GC track checking is done, if not, it could raise a segmentation fault,
2243+
// when dict only holds the strong reference to value in ep->me_value.
22422244
Py_XDECREF(old_value);
2243-
/* PEP 509 */
2244-
dict->ma_version_tag = new_version;
2245+
STAT_INC(STORE_ATTR, hit);
22452246
PyStackRef_CLOSE(owner);
22462247
}
22472248

Python/executor_cases.c.h

Lines changed: 8 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Python/generated_cases.c.h

Lines changed: 8 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)