mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
GH-118095: Add tier two support for BINARY_SUBSCR_GETITEM (GH-120793)
This commit is contained in:
parent
fda6bd842a
commit
df13a1821a
10 changed files with 317 additions and 207 deletions
|
@ -765,32 +765,40 @@ dummy_func(
|
|||
res = PyStackRef_FromPyObjectSteal(res_o);
|
||||
}
|
||||
|
||||
inst(BINARY_SUBSCR_GETITEM, (unused/1, container_st, sub_st -- unused)) {
|
||||
PyObject *container = PyStackRef_AsPyObjectBorrow(container_st);
|
||||
|
||||
DEOPT_IF(tstate->interp->eval_frame);
|
||||
PyTypeObject *tp = Py_TYPE(container);
|
||||
op(_BINARY_SUBSCR_CHECK_FUNC, (container, unused -- container, unused)) {
|
||||
PyTypeObject *tp = Py_TYPE(PyStackRef_AsPyObjectBorrow(container));
|
||||
DEOPT_IF(!PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE));
|
||||
PyHeapTypeObject *ht = (PyHeapTypeObject *)tp;
|
||||
PyObject *cached = ht->_spec_cache.getitem;
|
||||
DEOPT_IF(cached == NULL);
|
||||
assert(PyFunction_Check(cached));
|
||||
PyFunctionObject *getitem = (PyFunctionObject *)cached;
|
||||
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(getitem->func_version != cached_version);
|
||||
PyCodeObject *code = (PyCodeObject *)getitem->func_code;
|
||||
DEOPT_IF(((PyFunctionObject *)getitem)->func_version != cached_version);
|
||||
PyCodeObject *code = (PyCodeObject *)PyFunction_GET_CODE(getitem);
|
||||
assert(code->co_argcount == 2);
|
||||
DEOPT_IF(!_PyThreadState_HasStackSpace(tstate, code->co_framesize));
|
||||
STAT_INC(BINARY_SUBSCR, hit);
|
||||
Py_INCREF(getitem);
|
||||
_PyInterpreterFrame *new_frame = _PyFrame_PushUnchecked(tstate, getitem, 2);
|
||||
STACK_SHRINK(2);
|
||||
new_frame->localsplus[0] = container_st;
|
||||
new_frame->localsplus[1] = sub_st;
|
||||
frame->return_offset = (uint16_t)(next_instr - this_instr);
|
||||
DISPATCH_INLINED(new_frame);
|
||||
}
|
||||
|
||||
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, (PyFunctionObject *)getitem, 2);
|
||||
SYNC_SP();
|
||||
new_frame->localsplus[0] = container;
|
||||
new_frame->localsplus[1] = sub;
|
||||
frame->return_offset = (uint16_t)(1 + INLINE_CACHE_ENTRIES_BINARY_SUBSCR);
|
||||
}
|
||||
|
||||
macro(BINARY_SUBSCR_GETITEM) =
|
||||
unused/1 + // Skip over the counter
|
||||
_CHECK_PEP_523 +
|
||||
_BINARY_SUBSCR_CHECK_FUNC +
|
||||
_BINARY_SUBSCR_INIT_CALL +
|
||||
_PUSH_FRAME;
|
||||
|
||||
inst(LIST_APPEND, (list, unused[oparg-1], v -- list, unused[oparg-1])) {
|
||||
ERROR_IF(_PyList_AppendTakeRef((PyListObject *)PyStackRef_AsPyObjectBorrow(list),
|
||||
PyStackRef_AsPyObjectSteal(v)) < 0, error);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue