Skip to content

Commit e99ba6d

Browse files
committed
Modernize LOAD_ATTR_METHOD_WITH_VALUES
1 parent 99daf59 commit e99ba6d

File tree

3 files changed

+27
-26
lines changed

3 files changed

+27
-26
lines changed

Python/bytecodes.c

+8-13
Original file line numberDiff line numberDiff line change
@@ -1445,7 +1445,7 @@ dummy_func(
14451445
LOAD_ATTR_CLASS,
14461446
LOAD_ATTR_PROPERTY,
14471447
LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN,
1448-
// LOAD_ATTR_METHOD_WITH_VALUES,
1448+
LOAD_ATTR_METHOD_WITH_VALUES,
14491449
// LOAD_ATTR_METHOD_NO_DICT,
14501450
// LOAD_ATTR_METHOD_LAZY_DICT,
14511451
};
@@ -2339,29 +2339,24 @@ dummy_func(
23392339

23402340
}
23412341

2342-
// error: LOAD_ATTR has irregular stack effect
2343-
inst(LOAD_ATTR_METHOD_WITH_VALUES) {
2342+
inst(LOAD_ATTR_METHOD_WITH_VALUES, (unused/1, type_version/2, keys_version/2, descr/4, self -- res2 if (oparg & 1), res)) {
23442343
/* Cached method object */
23452344
assert(cframe.use_tracing == 0);
2346-
PyObject *self = TOP();
23472345
PyTypeObject *self_cls = Py_TYPE(self);
2348-
_PyLoadMethodCache *cache = (_PyLoadMethodCache *)next_instr;
2349-
uint32_t type_version = read_u32(cache->type_version);
23502346
assert(type_version != 0);
23512347
DEOPT_IF(self_cls->tp_version_tag != type_version, LOAD_ATTR);
23522348
assert(self_cls->tp_flags & Py_TPFLAGS_MANAGED_DICT);
23532349
PyDictOrValues dorv = *_PyObject_DictOrValuesPointer(self);
23542350
DEOPT_IF(!_PyDictOrValues_IsValues(dorv), LOAD_ATTR);
23552351
PyHeapTypeObject *self_heap_type = (PyHeapTypeObject *)self_cls;
23562352
DEOPT_IF(self_heap_type->ht_cached_keys->dk_version !=
2357-
read_u32(cache->keys_version), LOAD_ATTR);
2353+
keys_version, LOAD_ATTR);
23582354
STAT_INC(LOAD_ATTR, hit);
2359-
PyObject *res = read_obj(cache->descr);
2360-
assert(res != NULL);
2361-
assert(_PyType_HasFeature(Py_TYPE(res), Py_TPFLAGS_METHOD_DESCRIPTOR));
2362-
SET_TOP(Py_NewRef(res));
2363-
PUSH(self);
2364-
JUMPBY(INLINE_CACHE_ENTRIES_LOAD_ATTR);
2355+
assert(descr != NULL);
2356+
res2 = Py_NewRef(descr);
2357+
assert(_PyType_HasFeature(Py_TYPE(res2), Py_TPFLAGS_METHOD_DESCRIPTOR));
2358+
res = self;
2359+
assert(oparg & 1);
23652360
}
23662361

23672362
// error: LOAD_ATTR has irregular stack effect

Python/generated_cases.c.h

+16-10
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Python/opcode_metadata.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,7 @@ _PyOpcode_num_popped(int opcode, int oparg) {
279279
case PUSH_EXC_INFO:
280280
return -1;
281281
case LOAD_ATTR_METHOD_WITH_VALUES:
282-
return -1;
282+
return 1;
283283
case LOAD_ATTR_METHOD_NO_DICT:
284284
return -1;
285285
case LOAD_ATTR_METHOD_LAZY_DICT:
@@ -625,7 +625,7 @@ _PyOpcode_num_pushed(int opcode, int oparg) {
625625
case PUSH_EXC_INFO:
626626
return -1;
627627
case LOAD_ATTR_METHOD_WITH_VALUES:
628-
return -1;
628+
return ((oparg & 1) ? 1 : 0) + 1;
629629
case LOAD_ATTR_METHOD_NO_DICT:
630630
return -1;
631631
case LOAD_ATTR_METHOD_LAZY_DICT:
@@ -838,7 +838,7 @@ struct opcode_metadata {
838838
[BEFORE_WITH] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IX },
839839
[WITH_EXCEPT_START] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IX },
840840
[PUSH_EXC_INFO] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IX },
841-
[LOAD_ATTR_METHOD_WITH_VALUES] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IX },
841+
[LOAD_ATTR_METHOD_WITH_VALUES] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IBC00000000 },
842842
[LOAD_ATTR_METHOD_NO_DICT] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IX },
843843
[LOAD_ATTR_METHOD_LAZY_DICT] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IX },
844844
[CALL_BOUND_METHOD_EXACT_ARGS] = { DIR_NONE, DIR_NONE, DIR_NONE, true, INSTR_FMT_IB },

0 commit comments

Comments
 (0)