Skip to content

Commit 3345d8c

Browse files
gh-155503: Add more PyType C API tests
Add tests on functions: * PyType_GenericAlloc() * PyType_SUPPORTS_WEAKREFS()
1 parent 1a85213 commit 3345d8c

3 files changed

Lines changed: 66 additions & 0 deletions

File tree

‎Lib/test/test_capi/test_type.py‎

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -495,3 +495,39 @@ class MyType:
495495

496496
# CRASHES type_modified(NULL)
497497
# CRASHES type_modified({}): argument must be a type
498+
499+
def test_type_genericalloc(self):
500+
# Test PyType_GenericAlloc()
501+
type_genericalloc = _testlimitedcapi.type_genericalloc
502+
503+
class HeapType:
504+
pass
505+
506+
obj = type_genericalloc(HeapType)
507+
self.assertIsInstance(obj, HeapType)
508+
509+
obj2 = type_genericalloc(HeapType, 0)
510+
self.assertIsInstance(obj2, HeapType)
511+
512+
# CRASHES type_genericalloc(NULL)
513+
# CRASHES type_genericalloc(123): argument must be a type
514+
515+
def test_type_supports_weakrefs(self):
516+
# Test PyType_SUPPORTS_WEAKREFS()
517+
type_supports_weakrefs = _testcapi.type_supports_weakrefs
518+
519+
class WithWeakref:
520+
pass
521+
522+
class NoWeakref:
523+
__slots__ = ('x',)
524+
525+
self.assertTrue(type_supports_weakrefs(WithWeakref))
526+
self.assertFalse(type_supports_weakrefs(NoWeakref))
527+
self.assertFalse(type_supports_weakrefs(int))
528+
self.assertFalse(type_supports_weakrefs(str))
529+
self.assertFalse(type_supports_weakrefs(list))
530+
self.assertFalse(type_supports_weakrefs(dict))
531+
532+
# CRASHES type_supports_weakrefs(NULL)
533+
# CRASHES type_supports_weakrefs(123): argument must be a type

‎Modules/_testcapi/type.c‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,13 +157,26 @@ type_get_tp_mro(PyObject *self, PyObject *arg)
157157
}
158158

159159

160+
// Test PyType_SUPPORTS_WEAKREFS()
161+
static PyObject *
162+
type_supports_weakrefs(PyObject *self, PyObject *arg)
163+
{
164+
NULLABLE(arg);
165+
PyTypeObject *type = (PyTypeObject*)arg;
166+
167+
int res = PyType_SUPPORTS_WEAKREFS(type);
168+
return PyLong_FromLong(res);
169+
}
170+
171+
160172
static PyMethodDef test_methods[] = {
161173
{"test_get_type_dict", test_get_type_dict, METH_NOARGS},
162174
{"test_get_statictype_slots", test_get_statictype_slots, METH_NOARGS},
163175
{"type_get_version", type_get_version, METH_O, PyDoc_STR("type->tp_version_tag")},
164176
{"type_assign_version", type_assign_version, METH_O, PyDoc_STR("PyUnstable_Type_AssignVersionTag")},
165177
{"type_get_tp_bases", type_get_tp_bases, METH_O},
166178
{"type_get_tp_mro", type_get_tp_mro, METH_O},
179+
{"type_supports_weakrefs", type_supports_weakrefs, METH_O, PyDoc_STR("PyType_SUPPORTS_WEAKREFS(type)")},
167180
{NULL},
168181
};
169182

‎Modules/_testlimitedcapi/type.c‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,22 @@ type_issubtype(PyObject *module, PyObject *args)
160160
}
161161

162162

163+
// Test PyType_GenericAlloc()
164+
static PyObject *
165+
type_genericalloc(PyObject *module, PyObject *args)
166+
{
167+
PyObject *arg;
168+
Py_ssize_t nitems = 0;
169+
if (!PyArg_ParseTuple(args, "O|n", &arg, &nitems)) {
170+
return NULL;
171+
}
172+
NULLABLE(arg);
173+
PyTypeObject *type = (PyTypeObject *)arg;
174+
175+
return PyType_GenericAlloc(type, nitems);
176+
}
177+
178+
163179
static PyMethodDef test_methods[] = {
164180
{"get_heaptype_for_name", get_heaptype_for_name, METH_NOARGS},
165181
{"get_type_name", get_type_name, METH_O},
@@ -172,6 +188,7 @@ static PyMethodDef test_methods[] = {
172188
{"type_clearcache", type_clearcache, METH_NOARGS},
173189
{"type_getflags", type_getflags, METH_O},
174190
{"type_issubtype", type_issubtype, METH_VARARGS},
191+
{"type_genericalloc", type_genericalloc, METH_VARARGS},
175192
{NULL},
176193
};
177194

0 commit comments

Comments
 (0)