diff --git a/Include/objimpl.h b/Include/objimpl.h index 140918198da..dde8df34835 100644 --- a/Include/objimpl.h +++ b/Include/objimpl.h @@ -135,14 +135,14 @@ PyAPI_FUNC(PyVarObject *) _PyObject_NewVar(PyTypeObject *, Py_ssize_t); // Alias to PyObject_New(). In Python 3.8, PyObject_NEW() called directly // PyObject_MALLOC() with _PyObject_SIZE(). -#define PyObject_NEW(type, typeobj) PyObject_New((type), (typeobj)) +#define PyObject_NEW(type, typeobj) PyObject_New(type, (typeobj)) #define PyObject_NewVar(type, typeobj, n) \ ( (type *) _PyObject_NewVar((typeobj), (n)) ) // Alias to PyObject_NewVar(). In Python 3.8, PyObject_NEW_VAR() called // directly PyObject_MALLOC() with _PyObject_VAR_SIZE(). -#define PyObject_NEW_VAR(type, typeobj, n) PyObject_NewVar((type), (typeobj), (n)) +#define PyObject_NEW_VAR(type, typeobj, n) PyObject_NewVar(type, (typeobj), (n)) /* diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index f427a490471..f8fb6eeec66 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -4188,6 +4188,48 @@ test_pymem_alloc0(PyObject *self, PyObject *Py_UNUSED(ignored)) Py_RETURN_NONE; } +static PyObject * +test_pymem_new(PyObject *self, PyObject *Py_UNUSED(ignored)) +{ + char *ptr; + PyTypeObject *type = &PyBaseObject_Type; + PyTypeObject *var_type = &PyLong_Type; + + // PyObject_New() + ptr = PyObject_New(char, type); + if (ptr == NULL) { + goto alloc_failed; + } + PyObject_Free(ptr); + + // PyObject_NEW() + ptr = PyObject_NEW(char, type); + if (ptr == NULL) { + goto alloc_failed; + } + PyObject_Free(ptr); + + // PyObject_NewVar() + ptr = PyObject_NewVar(char, var_type, 3); + if (ptr == NULL) { + goto alloc_failed; + } + PyObject_Free(ptr); + + // PyObject_NEW_VAR() + ptr = PyObject_NEW_VAR(char, var_type, 3); + if (ptr == NULL) { + goto alloc_failed; + } + PyObject_Free(ptr); + + Py_RETURN_NONE; + +alloc_failed: + PyErr_NoMemory(); + return NULL; +} + typedef struct { PyMemAllocatorEx alloc; @@ -6284,6 +6326,7 @@ static PyMethodDef TestMethods[] = { {"with_tp_del", with_tp_del, METH_VARARGS}, {"create_cfunction", create_cfunction, METH_NOARGS}, {"test_pymem_alloc0", test_pymem_alloc0, METH_NOARGS}, + {"test_pymem_new", test_pymem_new, METH_NOARGS}, {"test_pymem_setrawallocators",test_pymem_setrawallocators, METH_NOARGS}, {"test_pymem_setallocators",test_pymem_setallocators, METH_NOARGS}, {"test_pyobject_setallocators",test_pyobject_setallocators, METH_NOARGS},