aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Python/executor_cases.c.h
diff options
context:
space:
mode:
authorMark Shannon <mark@hotpy.org>2024-08-02 00:19:05 +0100
committerGitHub <noreply@github.com>2024-08-01 16:19:05 -0700
commitdf13a1821a90fcfb75eca59aad6af1f0893b1e77 (patch)
treee917574fea945573980717b4823202049568893e /Python/executor_cases.c.h
parentfda6bd842a2b93a501526f1b830eb900d935ac73 (diff)
downloadcpython-df13a1821a90fcfb75eca59aad6af1f0893b1e77.tar.gz
cpython-df13a1821a90fcfb75eca59aad6af1f0893b1e77.zip
GH-118095: Add tier two support for BINARY_SUBSCR_GETITEM (GH-120793)
Diffstat (limited to 'Python/executor_cases.c.h')
-rw-r--r--Python/executor_cases.c.h52
1 files changed, 51 insertions, 1 deletions
diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h
index f0acc3b6ea2..61e1c5cf5c2 100644
--- a/Python/executor_cases.c.h
+++ b/Python/executor_cases.c.h
@@ -966,7 +966,57 @@
break;
}
- /* _BINARY_SUBSCR_GETITEM is not a viable micro-op for tier 2 because it uses the 'this_instr' variable */
+ case _BINARY_SUBSCR_CHECK_FUNC: {
+ _PyStackRef container;
+ container = stack_pointer[-2];
+ PyTypeObject *tp = Py_TYPE(PyStackRef_AsPyObjectBorrow(container));
+ if (!PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
+ UOP_STAT_INC(uopcode, miss);
+ JUMP_TO_JUMP_TARGET();
+ }
+ PyHeapTypeObject *ht = (PyHeapTypeObject *)tp;
+ PyObject *getitem = ht->_spec_cache.getitem;
+ if (getitem == NULL) {
+ UOP_STAT_INC(uopcode, miss);
+ JUMP_TO_JUMP_TARGET();
+ }
+ assert(PyFunction_Check(getitem));
+ uint32_t cached_version = ht->_spec_cache.getitem_version;
+ if (((PyFunctionObject *)getitem)->func_version != cached_version) {
+ UOP_STAT_INC(uopcode, miss);
+ JUMP_TO_JUMP_TARGET();
+ }
+ PyCodeObject *code = (PyCodeObject *)PyFunction_GET_CODE(getitem);
+ assert(code->co_argcount == 2);
+ if (!_PyThreadState_HasStackSpace(tstate, code->co_framesize)) {
+ UOP_STAT_INC(uopcode, miss);
+ JUMP_TO_JUMP_TARGET();
+ }
+ STAT_INC(BINARY_SUBSCR, hit);
+ Py_INCREF(getitem);
+ break;
+ }
+
+ case _BINARY_SUBSCR_INIT_CALL: {
+ _PyStackRef sub;
+ _PyStackRef container;
+ _PyInterpreterFrame *new_frame;
+ sub = stack_pointer[-1];
+ container = stack_pointer[-2];
+ 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);
+ stack_pointer += -2;
+ assert(WITHIN_STACK_BOUNDS());
+ new_frame->localsplus[0] = container;
+ new_frame->localsplus[1] = sub;
+ frame->return_offset = (uint16_t)(1 + INLINE_CACHE_ENTRIES_BINARY_SUBSCR);
+ stack_pointer[0].bits = (uintptr_t)new_frame;
+ stack_pointer += 1;
+ assert(WITHIN_STACK_BOUNDS());
+ break;
+ }
case _LIST_APPEND: {
_PyStackRef v;