mirror of https://github.com/python/cpython
gh-87347: Fix PyObject_NEW() regression (#94234)
Don't add parenthesis around the type parameter. Add unit tests on PyObject_NEW() and similar functions.
This commit is contained in:
parent
17ed560fcd
commit
44c8e68b8c
|
@ -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
|
// Alias to PyObject_New(). In Python 3.8, PyObject_NEW() called directly
|
||||||
// PyObject_MALLOC() with _PyObject_SIZE().
|
// 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) \
|
#define PyObject_NewVar(type, typeobj, n) \
|
||||||
( (type *) _PyObject_NewVar((typeobj), (n)) )
|
( (type *) _PyObject_NewVar((typeobj), (n)) )
|
||||||
|
|
||||||
// Alias to PyObject_NewVar(). In Python 3.8, PyObject_NEW_VAR() called
|
// Alias to PyObject_NewVar(). In Python 3.8, PyObject_NEW_VAR() called
|
||||||
// directly PyObject_MALLOC() with _PyObject_VAR_SIZE().
|
// 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))
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -4188,6 +4188,48 @@ test_pymem_alloc0(PyObject *self, PyObject *Py_UNUSED(ignored))
|
||||||
Py_RETURN_NONE;
|
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 {
|
typedef struct {
|
||||||
PyMemAllocatorEx alloc;
|
PyMemAllocatorEx alloc;
|
||||||
|
|
||||||
|
@ -6284,6 +6326,7 @@ static PyMethodDef TestMethods[] = {
|
||||||
{"with_tp_del", with_tp_del, METH_VARARGS},
|
{"with_tp_del", with_tp_del, METH_VARARGS},
|
||||||
{"create_cfunction", create_cfunction, METH_NOARGS},
|
{"create_cfunction", create_cfunction, METH_NOARGS},
|
||||||
{"test_pymem_alloc0", test_pymem_alloc0, 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_setrawallocators",test_pymem_setrawallocators, METH_NOARGS},
|
||||||
{"test_pymem_setallocators",test_pymem_setallocators, METH_NOARGS},
|
{"test_pymem_setallocators",test_pymem_setallocators, METH_NOARGS},
|
||||||
{"test_pyobject_setallocators",test_pyobject_setallocators, METH_NOARGS},
|
{"test_pyobject_setallocators",test_pyobject_setallocators, METH_NOARGS},
|
||||||
|
|
Loading…
Reference in New Issue