Skip to content

Commit

Permalink
pythongh-76785: Add _PyType_GetModuleName() to the Internal C-API (py…
Browse files Browse the repository at this point in the history
…thongh-112323)

The new function corresponds to the existing (public) PyType_GetName() and PyType_GetQualName().
  • Loading branch information
ericsnowcurrently authored and Glyphack committed Jan 27, 2024
1 parent 7d84391 commit 3c4c71e
Show file tree
Hide file tree
Showing 5 changed files with 43 additions and 0 deletions.
5 changes: 5 additions & 0 deletions Include/internal/pycore_typeobject.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
15 changes: 15 additions & 0 deletions Lib/test/test_capi/test_misc.py
Original file line number Diff line number Diff line change
Expand Up @@ -1098,6 +1098,21 @@ class Data(_testcapi.ObjExtraData):
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):
Expand Down
7 changes: 7 additions & 0 deletions Modules/_testcapimodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -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))
{
Expand Down Expand Up @@ -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},
Expand Down
10 changes: 10 additions & 0 deletions Modules/_testinternalcapi.c
Original file line number Diff line number Diff line change
Expand Up @@ -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()

Expand Down Expand Up @@ -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},
Expand Down Expand Up @@ -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 */
};

Expand Down
6 changes: 6 additions & 0 deletions Objects/typeobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down

0 comments on commit 3c4c71e

Please sign in to comment.