https://github.com/python/cpython/commit/fa52f289a36f50d6d10e57d485e5a4f58261222b
commit: fa52f289a36f50d6d10e57d485e5a4f58261222b
branch: main
author: neonene <[email protected]>
committer: encukou <[email protected]>
date: 2025-05-01T14:32:57+02:00
summary:
gh-133166: Fix missing error emission of PyType_GetModuleByDef (GH-133240)
files:
A Misc/NEWS.d/next/C_API/2025-05-01-01-02-11.gh-issue-133166.Ly9Ae2.rst
M Lib/test/test_capi/test_type.py
M Modules/_testcapi/heaptype.c
M Objects/typeobject.c
diff --git a/Lib/test/test_capi/test_type.py b/Lib/test/test_capi/test_type.py
index 7e5d013d737ab0..3c9974c7387388 100644
--- a/Lib/test/test_capi/test_type.py
+++ b/Lib/test/test_capi/test_type.py
@@ -179,6 +179,22 @@ class Z(C1, A2): pass
_testcapi.pytype_getbasebytoken(
'not a type', id(self), True, False)
+ def test_get_module_by_def(self):
+ heaptype = _testcapi.create_type_with_token('_testcapi.H', 0)
+ mod = _testcapi.pytype_getmodulebydef(heaptype)
+ self.assertIs(mod, _testcapi)
+
+ class H1(heaptype): pass
+ mod = _testcapi.pytype_getmodulebydef(H1)
+ self.assertIs(mod, _testcapi)
+
+ with self.assertRaises(TypeError):
+ _testcapi.pytype_getmodulebydef(int)
+
+ class H2(int): pass
+ with self.assertRaises(TypeError):
+ _testcapi.pytype_getmodulebydef(H2)
+
def test_freeze(self):
# test PyType_Freeze()
type_freeze = _testcapi.type_freeze
diff --git
a/Misc/NEWS.d/next/C_API/2025-05-01-01-02-11.gh-issue-133166.Ly9Ae2.rst
b/Misc/NEWS.d/next/C_API/2025-05-01-01-02-11.gh-issue-133166.Ly9Ae2.rst
new file mode 100644
index 00000000000000..976b823b441067
--- /dev/null
+++ b/Misc/NEWS.d/next/C_API/2025-05-01-01-02-11.gh-issue-133166.Ly9Ae2.rst
@@ -0,0 +1,2 @@
+Fix regression where :c:func:`PyType_GetModuleByDef` returns NULL without
+setting :exc:`TypeError` when a static type is passed.
diff --git a/Modules/_testcapi/heaptype.c b/Modules/_testcapi/heaptype.c
index fd061f2d23a47c..257e0256655976 100644
--- a/Modules/_testcapi/heaptype.c
+++ b/Modules/_testcapi/heaptype.c
@@ -521,6 +521,13 @@ pytype_getbasebytoken(PyObject *self, PyObject *args)
return NULL;
}
+static PyObject *
+pytype_getmodulebydef(PyObject *self, PyObject *type)
+{
+ PyObject *mod = PyType_GetModuleByDef((PyTypeObject *)type,
_testcapimodule);
+ return Py_XNewRef(mod);
+}
+
static PyMethodDef TestMethods[] = {
{"pytype_fromspec_meta", pytype_fromspec_meta, METH_O},
@@ -538,6 +545,7 @@ static PyMethodDef TestMethods[] = {
{"create_type_with_token", create_type_with_token, METH_VARARGS},
{"get_tp_token", get_tp_token, METH_O},
{"pytype_getbasebytoken", pytype_getbasebytoken, METH_VARARGS},
+ {"pytype_getmodulebydef", pytype_getmodulebydef, METH_O},
{NULL},
};
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index ff68311281ce6f..a7ab69fef4c721 100644
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -5399,7 +5399,7 @@ PyType_GetModuleByDef(PyTypeObject *type, PyModuleDef
*def)
if (!_PyType_HasFeature(type, Py_TPFLAGS_HEAPTYPE)) {
// type_ready_mro() ensures that no heap type is
// contained in a static type MRO.
- return NULL;
+ goto error;
}
else {
PyHeapTypeObject *ht = (PyHeapTypeObject*)type;
@@ -5439,13 +5439,15 @@ PyType_GetModuleByDef(PyTypeObject *type, PyModuleDef
*def)
}
END_TYPE_LOCK();
- if (res == NULL) {
- PyErr_Format(
- PyExc_TypeError,
- "PyType_GetModuleByDef: No superclass of '%s' has the given
module",
- type->tp_name);
+ if (res != NULL) {
+ return res;
}
- return res;
+error:
+ PyErr_Format(
+ PyExc_TypeError,
+ "PyType_GetModuleByDef: No superclass of '%s' has the given module",
+ type->tp_name);
+ return NULL;
}
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]