summaryrefslogtreecommitdiff
path: root/Python/bytecodes.c
diff options
context:
space:
mode:
authorBrandt Bucher <brandtbucher@microsoft.com>2023-03-29 15:53:30 -0700
committerGitHub <noreply@github.com>2023-03-29 15:53:30 -0700
commit121057aa3600c4d4d392539aeb79e1b09fd5659d (patch)
treeed1b99c697ad052eb38e38c2da2d07bfe2bf0838 /Python/bytecodes.c
parente647dbaded898e5399d01d06771c1b42b5631be8 (diff)
downloadcpython-git-121057aa3600c4d4d392539aeb79e1b09fd5659d.tar.gz
GH-89987: Shrink the BINARY_SUBSCR caches (GH-103022)
Diffstat (limited to 'Python/bytecodes.c')
-rw-r--r--Python/bytecodes.c20
1 files changed, 11 insertions, 9 deletions
diff --git a/Python/bytecodes.c b/Python/bytecodes.c
index 2fe85dfeed..484f6e6b1a 100644
--- a/Python/bytecodes.c
+++ b/Python/bytecodes.c
@@ -292,7 +292,7 @@ dummy_func(
BINARY_SUBSCR_TUPLE_INT,
};
- inst(BINARY_SUBSCR, (unused/4, container, sub -- res)) {
+ inst(BINARY_SUBSCR, (unused/1, container, sub -- res)) {
#if ENABLE_SPECIALIZATION
_PyBinarySubscrCache *cache = (_PyBinarySubscrCache *)next_instr;
if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) {
@@ -339,7 +339,7 @@ dummy_func(
ERROR_IF(err, error);
}
- inst(BINARY_SUBSCR_LIST_INT, (unused/4, list, sub -- res)) {
+ inst(BINARY_SUBSCR_LIST_INT, (unused/1, list, sub -- res)) {
assert(cframe.use_tracing == 0);
DEOPT_IF(!PyLong_CheckExact(sub), BINARY_SUBSCR);
DEOPT_IF(!PyList_CheckExact(list), BINARY_SUBSCR);
@@ -356,7 +356,7 @@ dummy_func(
Py_DECREF(list);
}
- inst(BINARY_SUBSCR_TUPLE_INT, (unused/4, tuple, sub -- res)) {
+ inst(BINARY_SUBSCR_TUPLE_INT, (unused/1, tuple, sub -- res)) {
assert(cframe.use_tracing == 0);
DEOPT_IF(!PyLong_CheckExact(sub), BINARY_SUBSCR);
DEOPT_IF(!PyTuple_CheckExact(tuple), BINARY_SUBSCR);
@@ -373,7 +373,7 @@ dummy_func(
Py_DECREF(tuple);
}
- inst(BINARY_SUBSCR_DICT, (unused/4, dict, sub -- res)) {
+ inst(BINARY_SUBSCR_DICT, (unused/1, dict, sub -- res)) {
assert(cframe.use_tracing == 0);
DEOPT_IF(!PyDict_CheckExact(dict), BINARY_SUBSCR);
STAT_INC(BINARY_SUBSCR, hit);
@@ -389,14 +389,16 @@ dummy_func(
DECREF_INPUTS();
}
- inst(BINARY_SUBSCR_GETITEM, (unused/1, type_version/2, func_version/1, container, sub -- unused)) {
+ inst(BINARY_SUBSCR_GETITEM, (unused/1, container, sub -- unused)) {
PyTypeObject *tp = Py_TYPE(container);
- DEOPT_IF(tp->tp_version_tag != type_version, BINARY_SUBSCR);
- assert(tp->tp_flags & Py_TPFLAGS_HEAPTYPE);
- PyObject *cached = ((PyHeapTypeObject *)tp)->_spec_cache.getitem;
+ DEOPT_IF(!PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE), BINARY_SUBSCR);
+ PyHeapTypeObject *ht = (PyHeapTypeObject *)tp;
+ PyObject *cached = ht->_spec_cache.getitem;
+ DEOPT_IF(cached == NULL, BINARY_SUBSCR);
assert(PyFunction_Check(cached));
PyFunctionObject *getitem = (PyFunctionObject *)cached;
- DEOPT_IF(getitem->func_version != func_version, BINARY_SUBSCR);
+ uint32_t cached_version = ht->_spec_cache.getitem_version;
+ DEOPT_IF(getitem->func_version != cached_version, BINARY_SUBSCR);
PyCodeObject *code = (PyCodeObject *)getitem->func_code;
assert(code->co_argcount == 2);
DEOPT_IF(!_PyThreadState_HasStackSpace(tstate, code->co_framesize), BINARY_SUBSCR);