mirror of
https://github.com/python/cpython.git
synced 2025-08-23 18:24:46 +00:00
gh-115999: Add free-threaded specialization for STORE_SUBSCR
(#127169)
The specialization only depends on the type, so no special thread-safety considerations there. STORE_SUBSCR_LIST_INT needs to lock the list before modifying it. `_PyDict_SetItem_Take2` already internally locks the dictionary using a critical section.
This commit is contained in:
parent
f0d3f10c43
commit
71ede1142d
5 changed files with 109 additions and 70 deletions
|
@ -910,7 +910,7 @@ dummy_func(
|
|||
};
|
||||
|
||||
specializing op(_SPECIALIZE_STORE_SUBSCR, (counter/1, container, sub -- container, sub)) {
|
||||
#if ENABLE_SPECIALIZATION
|
||||
#if ENABLE_SPECIALIZATION_FT
|
||||
if (ADAPTIVE_COUNTER_TRIGGERS(counter)) {
|
||||
next_instr = this_instr;
|
||||
_Py_Specialize_StoreSubscr(container, sub, next_instr);
|
||||
|
@ -918,7 +918,7 @@ dummy_func(
|
|||
}
|
||||
OPCODE_DEFERRED_INC(STORE_SUBSCR);
|
||||
ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter);
|
||||
#endif /* ENABLE_SPECIALIZATION */
|
||||
#endif /* ENABLE_SPECIALIZATION_FT */
|
||||
}
|
||||
|
||||
op(_STORE_SUBSCR, (v, container, sub -- )) {
|
||||
|
@ -940,13 +940,18 @@ dummy_func(
|
|||
// Ensure nonnegative, zero-or-one-digit ints.
|
||||
DEOPT_IF(!_PyLong_IsNonNegativeCompact((PyLongObject *)sub));
|
||||
Py_ssize_t index = ((PyLongObject*)sub)->long_value.ob_digit[0];
|
||||
DEOPT_IF(!LOCK_OBJECT(list));
|
||||
// Ensure index < len(list)
|
||||
DEOPT_IF(index >= PyList_GET_SIZE(list));
|
||||
if (index >= PyList_GET_SIZE(list)) {
|
||||
UNLOCK_OBJECT(list);
|
||||
DEOPT_IF(true);
|
||||
}
|
||||
STAT_INC(STORE_SUBSCR, hit);
|
||||
|
||||
PyObject *old_value = PyList_GET_ITEM(list, index);
|
||||
PyList_SET_ITEM(list, index, PyStackRef_AsPyObjectSteal(value));
|
||||
assert(old_value != NULL);
|
||||
UNLOCK_OBJECT(list); // unlock before decrefs!
|
||||
Py_DECREF(old_value);
|
||||
PyStackRef_CLOSE_SPECIALIZED(sub_st, (destructor)PyObject_Free);
|
||||
DEAD(sub_st);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue