summaryrefslogtreecommitdiffstats
path: root/Python/bytecodes.c
diff options
context:
space:
mode:
authorMark Shannon <mark@hotpy.org>2024-08-01 23:19:05 (GMT)
committerGitHub <noreply@github.com>2024-08-01 23:19:05 (GMT)
commitdf13a1821a90fcfb75eca59aad6af1f0893b1e77 (patch)
treee917574fea945573980717b4823202049568893e /Python/bytecodes.c
parentfda6bd842a2b93a501526f1b830eb900d935ac73 (diff)
downloadcpython-df13a1821a90fcfb75eca59aad6af1f0893b1e77.zip
cpython-df13a1821a90fcfb75eca59aad6af1f0893b1e77.tar.gz
cpython-df13a1821a90fcfb75eca59aad6af1f0893b1e77.tar.bz2
GH-118095: Add tier two support for BINARY_SUBSCR_GETITEM (GH-120793)
Diffstat (limited to 'Python/bytecodes.c')
-rw-r--r--Python/bytecodes.c42
1 files changed, 25 insertions, 17 deletions
diff --git a/Python/bytecodes.c b/Python/bytecodes.c
index abfd803..4147255 100644
--- a/Python/bytecodes.c
+++ b/Python/bytecodes.c
@@ -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);