summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSergey B Kirpichev <skirpichev@gmail.com>2024-11-15 08:03:38 (GMT)
committerGitHub <noreply@github.com>2024-11-15 08:03:38 (GMT)
commitd9e251223e8314ca726fc0be8b834362184b0aad (patch)
tree27573aba3de90484f984bd608db7594961bb5a60
parent3fecbe9255391be1ac3c3b52dfe0254ee5c665bd (diff)
downloadcpython-d9e251223e8314ca726fc0be8b834362184b0aad.zip
cpython-d9e251223e8314ca726fc0be8b834362184b0aad.tar.gz
cpython-d9e251223e8314ca726fc0be8b834362184b0aad.tar.bz2
gh-103951: enable optimization for fast attribute access on module subclasses (GH-126264)
Co-authored-by: Nicolas Tessore <n.tessore@ucl.ac.uk>
-rw-r--r--Misc/NEWS.d/next/Core_and_Builtins/2024-11-01-09-58-06.gh-issue-103951.6qduwj.rst2
-rw-r--r--Python/bytecodes.c2
-rw-r--r--Python/executor_cases.c.h2
-rw-r--r--Python/generated_cases.c.h2
-rw-r--r--Python/specialize.c2
5 files changed, 6 insertions, 4 deletions
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2024-11-01-09-58-06.gh-issue-103951.6qduwj.rst b/Misc/NEWS.d/next/Core_and_Builtins/2024-11-01-09-58-06.gh-issue-103951.6qduwj.rst
new file mode 100644
index 0000000..39b54e0
--- /dev/null
+++ b/Misc/NEWS.d/next/Core_and_Builtins/2024-11-01-09-58-06.gh-issue-103951.6qduwj.rst
@@ -0,0 +1,2 @@
+Relax optimization requirements to allow fast attribute access to module
+subclasses.
diff --git a/Python/bytecodes.c b/Python/bytecodes.c
index 04983fd..c85b498 100644
--- a/Python/bytecodes.c
+++ b/Python/bytecodes.c
@@ -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);
diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h
index 494ace1..2c2a09a 100644
--- a/Python/executor_cases.c.h
+++ b/Python/executor_cases.c.h
@@ -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();
}
diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h
index 77bf6ad..15308d6 100644
--- a/Python/generated_cases.c.h
+++ b/Python/generated_cases.c.h
@@ -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);
diff --git a/Python/specialize.c b/Python/specialize.c
index 0699e7b..4c8cf85 100644
--- a/Python/specialize.c
+++ b/Python/specialize.c
@@ -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)) {