From 3345d8c0a784f4fba2db73a5f1f6e775dce21e42 Mon Sep 17 00:00:00 2001 From: Amankumar-10012004 Date: Sat, 3 Oct 2026 22:46:12 +0530 Subject: [PATCH] gh-155503: Add more PyType C API tests Add tests on functions: * PyType_GenericAlloc() * PyType_SUPPORTS_WEAKREFS() --- Lib/test/test_capi/test_type.py | 36 +++++++++++++++++++++++++++++++++ Modules/_testcapi/type.c | 13 ++++++++++++ Modules/_testlimitedcapi/type.c | 17 ++++++++++++++++ 3 files changed, 66 insertions(+) diff --git a/Lib/test/test_capi/test_type.py b/Lib/test/test_capi/test_type.py index 90b1f57d1c3c9d3..509256a2fb7dd50 100644 --- a/Lib/test/test_capi/test_type.py +++ b/Lib/test/test_capi/test_type.py @@ -495,3 +495,39 @@ class MyType: # CRASHES type_modified(NULL) # CRASHES type_modified({}): argument must be a type + + def test_type_genericalloc(self): + # Test PyType_GenericAlloc() + type_genericalloc = _testlimitedcapi.type_genericalloc + + class HeapType: + pass + + obj = type_genericalloc(HeapType) + self.assertIsInstance(obj, HeapType) + + obj2 = type_genericalloc(HeapType, 0) + self.assertIsInstance(obj2, HeapType) + + # CRASHES type_genericalloc(NULL) + # CRASHES type_genericalloc(123): argument must be a type + + def test_type_supports_weakrefs(self): + # Test PyType_SUPPORTS_WEAKREFS() + type_supports_weakrefs = _testcapi.type_supports_weakrefs + + class WithWeakref: + pass + + class NoWeakref: + __slots__ = ('x',) + + self.assertTrue(type_supports_weakrefs(WithWeakref)) + self.assertFalse(type_supports_weakrefs(NoWeakref)) + self.assertFalse(type_supports_weakrefs(int)) + self.assertFalse(type_supports_weakrefs(str)) + self.assertFalse(type_supports_weakrefs(list)) + self.assertFalse(type_supports_weakrefs(dict)) + + # CRASHES type_supports_weakrefs(NULL) + # CRASHES type_supports_weakrefs(123): argument must be a type diff --git a/Modules/_testcapi/type.c b/Modules/_testcapi/type.c index 91203c7bf0f678a..e2778c1947aae5a 100644 --- a/Modules/_testcapi/type.c +++ b/Modules/_testcapi/type.c @@ -157,6 +157,18 @@ type_get_tp_mro(PyObject *self, PyObject *arg) } +// Test PyType_SUPPORTS_WEAKREFS() +static PyObject * +type_supports_weakrefs(PyObject *self, PyObject *arg) +{ + NULLABLE(arg); + PyTypeObject *type = (PyTypeObject*)arg; + + int res = PyType_SUPPORTS_WEAKREFS(type); + return PyLong_FromLong(res); +} + + static PyMethodDef test_methods[] = { {"test_get_type_dict", test_get_type_dict, METH_NOARGS}, {"test_get_statictype_slots", test_get_statictype_slots, METH_NOARGS}, @@ -164,6 +176,7 @@ static PyMethodDef test_methods[] = { {"type_assign_version", type_assign_version, METH_O, PyDoc_STR("PyUnstable_Type_AssignVersionTag")}, {"type_get_tp_bases", type_get_tp_bases, METH_O}, {"type_get_tp_mro", type_get_tp_mro, METH_O}, + {"type_supports_weakrefs", type_supports_weakrefs, METH_O, PyDoc_STR("PyType_SUPPORTS_WEAKREFS(type)")}, {NULL}, }; diff --git a/Modules/_testlimitedcapi/type.c b/Modules/_testlimitedcapi/type.c index 640468ae08dcbb6..7b5db552d3669c4 100644 --- a/Modules/_testlimitedcapi/type.c +++ b/Modules/_testlimitedcapi/type.c @@ -160,6 +160,22 @@ type_issubtype(PyObject *module, PyObject *args) } +// Test PyType_GenericAlloc() +static PyObject * +type_genericalloc(PyObject *module, PyObject *args) +{ + PyObject *arg; + Py_ssize_t nitems = 0; + if (!PyArg_ParseTuple(args, "O|n", &arg, &nitems)) { + return NULL; + } + NULLABLE(arg); + PyTypeObject *type = (PyTypeObject *)arg; + + return PyType_GenericAlloc(type, nitems); +} + + static PyMethodDef test_methods[] = { {"get_heaptype_for_name", get_heaptype_for_name, METH_NOARGS}, {"get_type_name", get_type_name, METH_O}, @@ -172,6 +188,7 @@ static PyMethodDef test_methods[] = { {"type_clearcache", type_clearcache, METH_NOARGS}, {"type_getflags", type_getflags, METH_O}, {"type_issubtype", type_issubtype, METH_VARARGS}, + {"type_genericalloc", type_genericalloc, METH_VARARGS}, {NULL}, };