summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
authorMark Shannon <mark@hotpy.org>2022-06-07 09:28:53 (GMT)
committerGitHub <noreply@github.com>2022-06-07 09:28:53 (GMT)
commitf012df706cf3a9e63625b8166fe3f419855e9a94 (patch)
tree79e77365bf7a0deda813c0036ee0ed3bde2390c5 /Python
parent75ceae05c11461beda65e6170b67b0b42fd55cd0 (diff)
downloadcpython-f012df706cf3a9e63625b8166fe3f419855e9a94.zip
cpython-f012df706cf3a9e63625b8166fe3f419855e9a94.tar.gz
cpython-f012df706cf3a9e63625b8166fe3f419855e9a94.tar.bz2
Shrink the LOAD_METHOD cache by one codeunit. (#93537)
Diffstat (limited to 'Python')
-rw-r--r--Python/ceval.c11
-rw-r--r--Python/specialize.c9
2 files changed, 7 insertions, 13 deletions
diff --git a/Python/ceval.c b/Python/ceval.c
index ec86c70..d1480ac 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -4581,12 +4581,9 @@ handle_eval_breaker:
DEOPT_IF(self_cls->tp_version_tag != read_u32(cache->type_version),
LOAD_METHOD);
/* Treat index as a signed 16 bit value */
- int dictoffset = *(int16_t *)&cache->dict_offset;
+ int dictoffset = self_cls->tp_dictoffset;
+ assert(dictoffset > 0);
PyDictObject **dictptr = (PyDictObject**)(((char *)self)+dictoffset);
- assert(
- dictoffset == MANAGED_DICT_OFFSET ||
- (dictoffset == self_cls->tp_dictoffset && dictoffset > 0)
- );
PyDictObject *dict = *dictptr;
DEOPT_IF(dict == NULL, LOAD_METHOD);
DEOPT_IF(dict->ma_keys->dk_version != read_u32(cache->keys_version),
@@ -4628,9 +4625,9 @@ handle_eval_breaker:
_PyLoadMethodCache *cache = (_PyLoadMethodCache *)next_instr;
uint32_t type_version = read_u32(cache->type_version);
DEOPT_IF(self_cls->tp_version_tag != type_version, LOAD_METHOD);
- int dictoffset = cache->dict_offset;
+ int dictoffset = self_cls->tp_dictoffset;
+ assert(dictoffset > 0);
PyObject *dict = *(PyObject **)((char *)self + dictoffset);
- assert(dictoffset == self_cls->tp_dictoffset && dictoffset > 0);
/* This object has a __dict__, just not yet created */
DEOPT_IF(dict != NULL, LOAD_METHOD);
STAT_INC(LOAD_METHOD, hit);
diff --git a/Python/specialize.c b/Python/specialize.c
index 4d30a2a..1df281a1 100644
--- a/Python/specialize.c
+++ b/Python/specialize.c
@@ -986,7 +986,7 @@ _Py_Specialize_LoadMethod(PyObject *owner, _Py_CODEUNIT *instr, PyObject *name)
}
}
}
- if (dictkind == MANAGED_VALUES || dictkind == MANAGED_DICT || dictkind == OFFSET_DICT) {
+ if (dictkind == MANAGED_VALUES || dictkind == OFFSET_DICT) {
Py_ssize_t index = _PyDictKeys_StringLookup(keys, name);
if (index != DKIX_EMPTY) {
SPECIALIZATION_FAIL(LOAD_METHOD, SPEC_FAIL_LOAD_METHOD_IS_ATTR);
@@ -1007,17 +1007,14 @@ _Py_Specialize_LoadMethod(PyObject *owner, _Py_CODEUNIT *instr, PyObject *name)
_Py_SET_OPCODE(*instr, LOAD_METHOD_WITH_VALUES);
break;
case MANAGED_DICT:
- *(int16_t *)&cache->dict_offset = (int16_t)MANAGED_DICT_OFFSET;
- _Py_SET_OPCODE(*instr, LOAD_METHOD_WITH_DICT);
- break;
+ SPECIALIZATION_FAIL(LOAD_METHOD, SPEC_FAIL_LOAD_METHOD_HAS_MANAGED_DICT);
+ goto fail;
case OFFSET_DICT:
assert(owner_cls->tp_dictoffset > 0 && owner_cls->tp_dictoffset <= INT16_MAX);
- cache->dict_offset = (uint16_t)owner_cls->tp_dictoffset;
_Py_SET_OPCODE(*instr, LOAD_METHOD_WITH_DICT);
break;
case LAZY_DICT:
assert(owner_cls->tp_dictoffset > 0 && owner_cls->tp_dictoffset <= INT16_MAX);
- cache->dict_offset = (uint16_t)owner_cls->tp_dictoffset;
_Py_SET_OPCODE(*instr, LOAD_METHOD_LAZY_DICT);
break;
}