summaryrefslogtreecommitdiffstats
path: root/Python/bytecodes.c
diff options
context:
space:
mode:
authorMark Shannon <mark@hotpy.org>2023-07-13 15:36:19 (GMT)
committerGitHub <noreply@github.com>2023-07-13 15:36:19 (GMT)
commit487861c6aef2fbcd92ccabb05ea1b57d18299b29 (patch)
tree8df9458534fd5be8bcce69f837f1954ee3f87731 /Python/bytecodes.c
parent32718f908cc92c474fd968912368b8a4500bd055 (diff)
downloadcpython-487861c6aef2fbcd92ccabb05ea1b57d18299b29.zip
cpython-487861c6aef2fbcd92ccabb05ea1b57d18299b29.tar.gz
cpython-487861c6aef2fbcd92ccabb05ea1b57d18299b29.tar.bz2
GH-104909: Split `LOAD_ATTR_INSTANCE_VALUE` into micro-ops (GH-106678)
Diffstat (limited to 'Python/bytecodes.c')
-rw-r--r--Python/bytecodes.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/Python/bytecodes.c b/Python/bytecodes.c
index 18862f8..176dbb5 100644
--- a/Python/bytecodes.c
+++ b/Python/bytecodes.c
@@ -1816,14 +1816,21 @@ dummy_func(
LOAD_ATTR,
};
- inst(LOAD_ATTR_INSTANCE_VALUE, (unused/1, type_version/2, index/1, unused/5, owner -- res2 if (oparg & 1), res)) {
+ op(_GUARD_TYPE_VERSION, (type_version/2, owner -- owner)) {
PyTypeObject *tp = Py_TYPE(owner);
assert(type_version != 0);
DEOPT_IF(tp->tp_version_tag != type_version, LOAD_ATTR);
- assert(tp->tp_dictoffset < 0);
- assert(tp->tp_flags & Py_TPFLAGS_MANAGED_DICT);
+ }
+
+ op(_CHECK_MANAGED_OBJECT_HAS_VALUES, (owner -- owner)) {
+ assert(Py_TYPE(owner)->tp_dictoffset < 0);
+ assert(Py_TYPE(owner)->tp_flags & Py_TPFLAGS_MANAGED_DICT);
PyDictOrValues dorv = *_PyObject_DictOrValuesPointer(owner);
DEOPT_IF(!_PyDictOrValues_IsValues(dorv), LOAD_ATTR);
+ }
+
+ op(_LOAD_ATTR_INSTANCE_VALUE, (index/1, unused/5, owner -- res2 if (oparg & 1), res)) {
+ PyDictOrValues dorv = *_PyObject_DictOrValuesPointer(owner);
res = _PyDictOrValues_GetValues(dorv)->values[index];
DEOPT_IF(res == NULL, LOAD_ATTR);
STAT_INC(LOAD_ATTR, hit);
@@ -1832,6 +1839,12 @@ dummy_func(
DECREF_INPUTS();
}
+ macro(LOAD_ATTR_INSTANCE_VALUE) =
+ _SKIP_CACHE + // Skip over the counter
+ _GUARD_TYPE_VERSION +
+ _CHECK_MANAGED_OBJECT_HAS_VALUES +
+ _LOAD_ATTR_INSTANCE_VALUE;
+
inst(LOAD_ATTR_MODULE, (unused/1, type_version/2, index/1, unused/5, owner -- res2 if (oparg & 1), res)) {
DEOPT_IF(!PyModule_CheckExact(owner), LOAD_ATTR);
PyDictObject *dict = (PyDictObject *)((PyModuleObject *)owner)->md_dict;