]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-87347: Fix PyObject_NEW() regression (#94234)
authorVictor Stinner <vstinner@python.org>
Sun, 26 Jun 2022 10:40:17 +0000 (12:40 +0200)
committerGitHub <noreply@github.com>
Sun, 26 Jun 2022 10:40:17 +0000 (12:40 +0200)
Don't add parenthesis around the type parameter.

Add unit tests on PyObject_NEW() and similar functions.

Include/objimpl.h
Modules/_testcapimodule.c

index 140918198dae0e36ae07f21763d59226f3b6797a..dde8df34835328ed7bde2940e583aa99ccf828c3 100644 (file)
@@ -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))
 
 
 /*
index f427a490471762655e7a5b8ef38d1170f904b405..f8fb6eeec66f5edf3035cd373f2edd4b39147d99 100644 (file)
@@ -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},