mirror of
https://github.com/python/cpython.git
synced 2024-11-27 03:45:08 +08:00
gh-103951: enable optimization for fast attribute access on module subclasses (GH-126264)
Co-authored-by: Nicolas Tessore <n.tessore@ucl.ac.uk>
This commit is contained in:
parent
3fecbe9255
commit
d9e251223e
@ -0,0 +1,2 @@
|
||||
Relax optimization requirements to allow fast attribute access to module
|
||||
subclasses.
|
@ -2132,7 +2132,7 @@ dummy_func(
|
||||
|
||||
op(_CHECK_ATTR_MODULE, (dict_version/2, owner -- owner)) {
|
||||
PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
|
||||
DEOPT_IF(!PyModule_CheckExact(owner_o));
|
||||
DEOPT_IF(Py_TYPE(owner_o)->tp_getattro != PyModule_Type.tp_getattro);
|
||||
PyDictObject *dict = (PyDictObject *)((PyModuleObject *)owner_o)->md_dict;
|
||||
assert(dict != NULL);
|
||||
DEOPT_IF(dict->ma_keys->dk_version != dict_version);
|
||||
|
2
Python/executor_cases.c.h
generated
2
Python/executor_cases.c.h
generated
@ -2602,7 +2602,7 @@
|
||||
owner = stack_pointer[-1];
|
||||
uint32_t dict_version = (uint32_t)CURRENT_OPERAND0();
|
||||
PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
|
||||
if (!PyModule_CheckExact(owner_o)) {
|
||||
if (Py_TYPE(owner_o)->tp_getattro != PyModule_Type.tp_getattro) {
|
||||
UOP_STAT_INC(uopcode, miss);
|
||||
JUMP_TO_JUMP_TARGET();
|
||||
}
|
||||
|
2
Python/generated_cases.c.h
generated
2
Python/generated_cases.c.h
generated
@ -5561,7 +5561,7 @@
|
||||
owner = stack_pointer[-1];
|
||||
uint32_t dict_version = read_u32(&this_instr[2].cache);
|
||||
PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
|
||||
DEOPT_IF(!PyModule_CheckExact(owner_o), LOAD_ATTR);
|
||||
DEOPT_IF(Py_TYPE(owner_o)->tp_getattro != PyModule_Type.tp_getattro, LOAD_ATTR);
|
||||
PyDictObject *dict = (PyDictObject *)((PyModuleObject *)owner_o)->md_dict;
|
||||
assert(dict != NULL);
|
||||
DEOPT_IF(dict->ma_keys->dk_version != dict_version, LOAD_ATTR);
|
||||
|
@ -1219,7 +1219,7 @@ _Py_Specialize_LoadAttr(_PyStackRef owner_st, _Py_CODEUNIT *instr, PyObject *nam
|
||||
SPECIALIZATION_FAIL(LOAD_ATTR, SPEC_FAIL_OTHER);
|
||||
fail = true;
|
||||
}
|
||||
else if (PyModule_CheckExact(owner)) {
|
||||
else if (Py_TYPE(owner)->tp_getattro == PyModule_Type.tp_getattro) {
|
||||
fail = specialize_module_load_attr(owner, instr, name);
|
||||
}
|
||||
else if (PyType_Check(owner)) {
|
||||
|
Loading…
Reference in New Issue
Block a user