]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-76785: Add _PyType_GetModuleName() to the Internal C-API (gh-112323)
authorEric Snow <ericsnowcurrently@gmail.com>
Wed, 22 Nov 2023 22:03:33 +0000 (15:03 -0700)
committerGitHub <noreply@github.com>
Wed, 22 Nov 2023 22:03:33 +0000 (15:03 -0700)
The new function corresponds to the existing (public) PyType_GetName() and PyType_GetQualName().

Include/internal/pycore_typeobject.h
Lib/test/test_capi/test_misc.py
Modules/_testcapimodule.c
Modules/_testinternalcapi.c
Objects/typeobject.c

index 27c6c8731cb3f98c22f7878b51de034c2938fdf7..bbf8544b09f0fb7c973cfb1915ba163d824b3f11 100644 (file)
@@ -143,6 +143,11 @@ extern PyTypeObject _PyBufferWrapper_Type;
 extern PyObject* _PySuper_Lookup(PyTypeObject *su_type, PyObject *su_obj,
                                  PyObject *name, int *meth_found);
 
+
+// This is exported for the _testinternalcapi module.
+PyAPI_FUNC(PyObject *) _PyType_GetModuleName(PyTypeObject *);
+
+
 #ifdef __cplusplus
 }
 #endif
index 21a5cd3326d7073adac08db061beb2d3b5313fe0..6cbf5d222038048e38118630488566e540f3ba18 100644 (file)
@@ -1098,6 +1098,21 @@ class CAPITest(unittest.TestCase):
         del d.extra
         self.assertIsNone(d.extra)
 
+    def test_get_type_module_name(self):
+        from collections import OrderedDict
+        ht = _testcapi.get_heaptype_for_name()
+        for cls, expected in {
+            int: 'builtins',
+            OrderedDict: 'collections',
+            ht: '_testcapi',
+        }.items():
+            with self.subTest(repr(cls)):
+                modname = _testinternalcapi.get_type_module_name(cls)
+                self.assertEqual(modname, expected)
+
+        ht.__module__ = 'test_module'
+        modname = _testinternalcapi.get_type_module_name(ht)
+        self.assertEqual(modname, 'test_module')
 
 @requires_limited_api
 class TestHeapTypeRelative(unittest.TestCase):
index 999bd866f148144e662a2c6a0c306067bf608379..9fdd67093338e45ef573b10773fda3efc4df1772 100644 (file)
@@ -569,6 +569,12 @@ static PyType_Spec HeapTypeNameType_Spec = {
     .slots = HeapTypeNameType_slots,
 };
 
+static PyObject *
+get_heaptype_for_name(PyObject *self, PyObject *Py_UNUSED(ignored))
+{
+    return PyType_FromSpec(&HeapTypeNameType_Spec);
+}
+
 static PyObject *
 test_get_type_name(PyObject *self, PyObject *Py_UNUSED(ignored))
 {
@@ -3210,6 +3216,7 @@ static PyMethodDef TestMethods[] = {
     {"py_buildvalue_ints",       py_buildvalue_ints,             METH_VARARGS},
     {"test_buildvalue_N",        test_buildvalue_N,              METH_NOARGS},
     {"test_get_statictype_slots", test_get_statictype_slots,     METH_NOARGS},
+    {"get_heaptype_for_name",     get_heaptype_for_name,         METH_NOARGS},
     {"test_get_type_name",        test_get_type_name,            METH_NOARGS},
     {"test_get_type_qualname",    test_get_type_qualname,        METH_NOARGS},
     {"test_get_type_dict",        test_get_type_dict,            METH_NOARGS},
index 4fc9e853c0cd91b6a6d7a63d1c6f233179f232e9..4607a3faf17f74c5b1be74875b0d6c86bed951ff 100644 (file)
@@ -27,6 +27,7 @@
 #include "pycore_pathconfig.h"    // _PyPathConfig_ClearGlobal()
 #include "pycore_pyerrors.h"      // _PyErr_ChainExceptions1()
 #include "pycore_pystate.h"       // _PyThreadState_GET()
+#include "pycore_typeobject.h"    // _PyType_GetModuleName()
 
 #include "interpreteridobject.h"  // PyInterpreterID_LookUp()
 
@@ -1616,6 +1617,14 @@ perf_trampoline_set_persist_after_fork(PyObject *self, PyObject *args)
 }
 
 
+static PyObject *
+get_type_module_name(PyObject *self, PyObject *type)
+{
+    assert(PyType_Check(type));
+    return _PyType_GetModuleName((PyTypeObject *)type);
+}
+
+
 static PyMethodDef module_functions[] = {
     {"get_configs", get_configs, METH_NOARGS},
     {"get_recursion_depth", get_recursion_depth, METH_NOARGS},
@@ -1678,6 +1687,7 @@ static PyMethodDef module_functions[] = {
     {"get_crossinterp_data",    get_crossinterp_data,            METH_VARARGS},
     {"restore_crossinterp_data", restore_crossinterp_data,       METH_VARARGS},
     _TESTINTERNALCAPI_TEST_LONG_NUMBITS_METHODDEF
+    {"get_type_module_name",    get_type_module_name,            METH_O},
     {NULL, NULL} /* sentinel */
 };
 
index f5975a3cd90cb4a3bf10e08838ba6be7bc2d7b3c..aa00e04ad5e11b05fee989a096b12fb7ec2478ef 100644 (file)
@@ -4540,6 +4540,12 @@ PyType_GetQualName(PyTypeObject *type)
     return type_qualname(type, NULL);
 }
 
+PyObject *
+_PyType_GetModuleName(PyTypeObject *type)
+{
+    return type_module(type, NULL);
+}
+
 void *
 PyType_GetSlot(PyTypeObject *type, int slot)
 {