diff options
Diffstat (limited to 'Python')
-rw-r--r-- | Python/ceval.c | 11 | ||||
-rw-r--r-- | Python/specialize.c | 9 |
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; } |