| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent c3c7848 commit 36d3583
8 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -336,7 +336,6 @@ def pseudo_op(name, op, real_ops): | |||
| 336 | 336 | # These will always push [unbound method, self] onto the stack. | |
| 337 | 337 | "LOAD_ATTR_METHOD_LAZY_DICT", | |
| 338 | 338 | "LOAD_ATTR_METHOD_NO_DICT", | |
| 339 | - "LOAD_ATTR_METHOD_MANAGED_DICT", | ||
| 340 | 339 | "LOAD_ATTR_METHOD_WITH_DICT", | |
| 341 | 340 | "LOAD_ATTR_METHOD_WITH_VALUES", | |
| 342 | 341 | ], | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -2717,31 +2717,6 @@ dummy_func( | |||
| 2717 | 2717 | JUMPBY(INLINE_CACHE_ENTRIES_LOAD_ATTR); | |
| 2718 | 2718 | } | |
| 2719 | 2719 | ||
| 2720 | - // error: LOAD_ATTR has irregular stack effect | ||
| 2721 | - inst(LOAD_ATTR_METHOD_MANAGED_DICT) { | ||
| 2722 | - assert(cframe.use_tracing == 0); | ||
| 2723 | - PyObject *self = TOP(); | ||
| 2724 | - PyTypeObject *self_cls = Py_TYPE(self); | ||
| 2725 | - _PyLoadMethodCache *cache = (_PyLoadMethodCache *)next_instr; | ||
| 2726 | - uint32_t type_version = read_u32(cache->type_version); | ||
| 2727 | - assert(type_version != 0); | ||
| 2728 | - DEOPT_IF(self_cls->tp_version_tag != type_version, LOAD_ATTR) | ||
| 2729 | - assert(self_cls->tp_flags & Py_TPFLAGS_MANAGED_DICT); | ||
| 2730 | - PyDictOrValues dorv = *_PyObject_DictOrValuesPointer(self); | ||
| 2731 | - DEOPT_IF(_PyDictOrValues_IsValues(dorv), LOAD_ATTR); | ||
| 2732 | - PyObject *dict = _PyDictOrValues_GetDict(dorv); | ||
| 2733 | - PyDictKeysObject *keys = (dict == NULL) ? NULL : ((PyDictObject *)dict)->ma_keys; | ||
| 2734 | - // Note: cache->keys_version can be 0 when dict is NULL. | ||
| 2735 | - DEOPT_IF(keys != NULL && keys->dk_version != read_u32(cache->keys_version), LOAD_ATTR); | ||
| 2736 | - STAT_INC(LOAD_ATTR, hit); | ||
| 2737 | - PyObject *res = read_obj(cache->descr); | ||
| 2738 | - assert(res != NULL); | ||
| 2739 | - assert(_PyType_HasFeature(Py_TYPE(res), Py_TPFLAGS_METHOD_DESCRIPTOR)); | ||
| 2740 | - SET_TOP(Py_NewRef(res)); | ||
| 2741 | - PUSH(self); | ||
| 2742 | - JUMPBY(INLINE_CACHE_ENTRIES_LOAD_ATTR); | ||
| 2743 | - } | ||
| 2744 | - | ||
| 2745 | 2720 | // error: LOAD_ATTR has irregular stack effect | |
| 2746 | 2721 | inst(LOAD_ATTR_METHOD_WITH_DICT) { | |
| 2747 | 2722 | /* Can be either a managed dict, or a tp_dictoffset offset.*/ | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -335,6 +335,7 @@ _PyCode_Quicken(PyCodeObject *code) | |||
| 335 | 335 | #define SPEC_FAIL_ATTR_BUILTIN_CLASS_METHOD 22 | |
| 336 | 336 | #define SPEC_FAIL_ATTR_CLASS_METHOD_OBJ 23 | |
| 337 | 337 | #define SPEC_FAIL_ATTR_OBJECT_SLOT 24 | |
| 338 | + #define SPEC_FAIL_ATTR_HAS_MANAGED_DICT 25 | ||
| 338 | 339 | #define SPEC_FAIL_ATTR_INSTANCE_ATTRIBUTE 26 | |
| 339 | 340 | #define SPEC_FAIL_ATTR_METACLASS_ATTRIBUTE 27 | |
| 340 | 341 | #define SPEC_FAIL_ATTR_PROPERTY_NOT_PY_FUNCTION 28 | |
@@ -1035,14 +1036,11 @@ PyObject *descr, DescriptorClassification kind) | |||
| 1035 | 1036 | PyDictKeysObject *keys; | |
| 1036 | 1037 | if (owner_cls->tp_flags & Py_TPFLAGS_MANAGED_DICT) { | |
| 1037 | 1038 | PyDictOrValues dorv = *_PyObject_DictOrValuesPointer(owner); | |
| 1039 | + keys = ((PyHeapTypeObject *)owner_cls)->ht_cached_keys; | ||
| 1038 | 1040 | if (_PyDictOrValues_IsValues(dorv)) { | |
| 1039 | - keys = ((PyHeapTypeObject *)owner_cls)->ht_cached_keys; | ||
| 1040 | 1041 | dictkind = MANAGED_VALUES; | |
| 1041 | 1042 | } | |
| 1042 | 1043 | else { | |
| 1043 | - PyDictObject *dict = (PyDictObject *)_PyDictOrValues_GetDict(dorv); | ||
| 1044 | - keys = dict != NULL ? dict->ma_keys : NULL; | ||
| 1045 | - // User has directly accessed __dict__. | ||
| 1046 | 1044 | dictkind = MANAGED_DICT; | |
| 1047 | 1045 | } | |
| 1048 | 1046 | } | |
@@ -1069,7 +1067,7 @@ PyObject *descr, DescriptorClassification kind) | |||
| 1069 | 1067 | } | |
| 1070 | 1068 | } | |
| 1071 | 1069 | } | |
| 1072 | - if (dictkind == MANAGED_VALUES || dictkind == OFFSET_DICT || (dictkind == MANAGED_DICT && keys != NULL)) { | ||
| 1070 | + if (dictkind == MANAGED_VALUES || dictkind == OFFSET_DICT) { | ||
| 1073 | 1071 | Py_ssize_t index = _PyDictKeys_StringLookup(keys, name); | |
| 1074 | 1072 | if (index != DKIX_EMPTY) { | |
| 1075 | 1073 | SPECIALIZATION_FAIL(LOAD_ATTR, SPEC_FAIL_ATTR_SHADOWED); | |
@@ -1090,11 +1088,8 @@ PyObject *descr, DescriptorClassification kind) | |||
| 1090 | 1088 | _py_set_opcode(instr, LOAD_ATTR_METHOD_WITH_VALUES); | |
| 1091 | 1089 | break; | |
| 1092 | 1090 | case MANAGED_DICT: | |
| 1093 | - if (keys == NULL) { | ||
| 1094 | - write_u32(cache->keys_version, 0); | ||
| 1095 | - } | ||
| 1096 | - _py_set_opcode(instr, LOAD_ATTR_METHOD_MANAGED_DICT); | ||
| 1097 | - break; | ||
| 1091 | + SPECIALIZATION_FAIL(LOAD_ATTR, SPEC_FAIL_ATTR_HAS_MANAGED_DICT); | ||
| 1092 | + goto fail; | ||
| 1098 | 1093 | case OFFSET_DICT: | |
| 1099 | 1094 | assert(owner_cls->tp_dictoffset > 0 && owner_cls->tp_dictoffset <= INT16_MAX); | |
| 1100 | 1095 | _py_set_opcode(instr, LOAD_ATTR_METHOD_WITH_DICT); | |
| Back | FazBrowse Home | New Git URL |
0 commit comments