Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions Lib/test/test_capi/test_type.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
13 changes: 13 additions & 0 deletions Modules/_testcapi/type.c
Original file line number Diff line number Diff line change
Expand Up @@ -157,13 +157,26 @@ 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},
{"type_get_version", type_get_version, METH_O, PyDoc_STR("type->tp_version_tag")},
{"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},
};

Expand Down
17 changes: 17 additions & 0 deletions Modules/_testlimitedcapi/type.c
Original file line number Diff line number Diff line change
Expand Up @@ -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},
Expand All @@ -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},
};

Expand Down
Loading