summaryrefslogtreecommitdiffstats
path: root/Python/bytecodes.c
diff options
context:
space:
mode:
Diffstat (limited to 'Python/bytecodes.c')
-rw-r--r--Python/bytecodes.c22
1 files changed, 10 insertions, 12 deletions
diff --git a/Python/bytecodes.c b/Python/bytecodes.c
index 772b46d..b67264f 100644
--- a/Python/bytecodes.c
+++ b/Python/bytecodes.c
@@ -865,26 +865,24 @@ dummy_func(
res = PyStackRef_FromPyObjectSteal(res_o);
}
- op(_BINARY_SUBSCR_CHECK_FUNC, (container, unused -- container, unused)) {
+ op(_BINARY_SUBSCR_CHECK_FUNC, (container, unused -- container, unused, getitem)) {
PyTypeObject *tp = Py_TYPE(PyStackRef_AsPyObjectBorrow(container));
DEOPT_IF(!PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE));
PyHeapTypeObject *ht = (PyHeapTypeObject *)tp;
- PyObject *getitem = ht->_spec_cache.getitem;
- DEOPT_IF(getitem == NULL);
- assert(PyFunction_Check(getitem));
- uint32_t cached_version = ht->_spec_cache.getitem_version;
- DEOPT_IF(((PyFunctionObject *)getitem)->func_version != cached_version);
- PyCodeObject *code = (PyCodeObject *)PyFunction_GET_CODE(getitem);
+ PyObject *getitem_o = FT_ATOMIC_LOAD_PTR_ACQUIRE(ht->_spec_cache.getitem);
+ DEOPT_IF(getitem_o == NULL);
+ assert(PyFunction_Check(getitem_o));
+ uint32_t cached_version = FT_ATOMIC_LOAD_UINT32_RELAXED(ht->_spec_cache.getitem_version);
+ DEOPT_IF(((PyFunctionObject *)getitem_o)->func_version != cached_version);
+ PyCodeObject *code = (PyCodeObject *)PyFunction_GET_CODE(getitem_o);
assert(code->co_argcount == 2);
DEOPT_IF(!_PyThreadState_HasStackSpace(tstate, code->co_framesize));
+ getitem = PyStackRef_FromPyObjectNew(getitem_o);
STAT_INC(BINARY_SUBSCR, hit);
}
- op(_BINARY_SUBSCR_INIT_CALL, (container, sub -- new_frame: _PyInterpreterFrame* )) {
- PyTypeObject *tp = Py_TYPE(PyStackRef_AsPyObjectBorrow(container));
- PyHeapTypeObject *ht = (PyHeapTypeObject *)tp;
- PyObject *getitem = ht->_spec_cache.getitem;
- new_frame = _PyFrame_PushUnchecked(tstate, PyStackRef_FromPyObjectNew(getitem), 2, frame);
+ op(_BINARY_SUBSCR_INIT_CALL, (container, sub, getitem -- new_frame: _PyInterpreterFrame* )) {
+ new_frame = _PyFrame_PushUnchecked(tstate, getitem, 2, frame);
new_frame->localsplus[0] = container;
new_frame->localsplus[1] = sub;
INPUTS_DEAD();