gh-115999: Enable BINARY_SUBSCR_GETITEM for free-threaded build (gh-1… · python/cpython@48c70b8

GitHub

@@ -865,26 +865,24 @@ dummy_func(

865865res=PyStackRef_FromPyObjectSteal(res_o);

866866 }

867867868-op(_BINARY_SUBSCR_CHECK_FUNC, (container, unused--container, unused)) {

868+op(_BINARY_SUBSCR_CHECK_FUNC, (container, unused--container, unused, getitem)) {

869869PyTypeObject*tp=Py_TYPE(PyStackRef_AsPyObjectBorrow(container));

870870DEOPT_IF(!PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE));

871871PyHeapTypeObject*ht= (PyHeapTypeObject*)tp;

872-PyObject*getitem=ht->_spec_cache.getitem;

873-DEOPT_IF(getitem==NULL);

874-assert(PyFunction_Check(getitem));

875-uint32_tcached_version=ht->_spec_cache.getitem_version;

876-DEOPT_IF(((PyFunctionObject*)getitem)->func_version!=cached_version);

877-PyCodeObject*code= (PyCodeObject*)PyFunction_GET_CODE(getitem);

872+PyObject*getitem_o=FT_ATOMIC_LOAD_PTR_ACQUIRE(ht->_spec_cache.getitem);

873+DEOPT_IF(getitem_o==NULL);

874+assert(PyFunction_Check(getitem_o));

875+uint32_tcached_version=FT_ATOMIC_LOAD_UINT32_RELAXED(ht->_spec_cache.getitem_version);

876+DEOPT_IF(((PyFunctionObject*)getitem_o)->func_version!=cached_version);

877+PyCodeObject*code= (PyCodeObject*)PyFunction_GET_CODE(getitem_o);

878878assert(code->co_argcount==2);

879879DEOPT_IF(!_PyThreadState_HasStackSpace(tstate, code->co_framesize));

880+getitem=PyStackRef_FromPyObjectNew(getitem_o);

880881STAT_INC(BINARY_SUBSCR, hit);

881882 }

882883883-op(_BINARY_SUBSCR_INIT_CALL, (container, sub--new_frame: _PyInterpreterFrame* )) {

884-PyTypeObject*tp=Py_TYPE(PyStackRef_AsPyObjectBorrow(container));

885-PyHeapTypeObject*ht= (PyHeapTypeObject*)tp;

886-PyObject*getitem=ht->_spec_cache.getitem;

887-new_frame=_PyFrame_PushUnchecked(tstate, PyStackRef_FromPyObjectNew(getitem), 2, frame);

884+op(_BINARY_SUBSCR_INIT_CALL, (container, sub, getitem--new_frame: _PyInterpreterFrame* )) {

885+new_frame=_PyFrame_PushUnchecked(tstate, getitem, 2, frame);

888886new_frame->localsplus[0] =container;

889887new_frame->localsplus[1] =sub;

890888INPUTS_DEAD();