bpo-35059: Convert PyObject_INIT() to function (GH-10077)

* Convert PyObject_INIT() and PyObject_INIT_VAR() macros to static
  inline functions.
* Fix usage of these functions: cast to PyObject* or PyVarObject*.
This commit is contained in:
Victor Stinner 2018-10-26 14:35:00 +02:00 committed by GitHub
parent 7cd2543416
commit b4435e20a9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 33 additions and 16 deletions

View File

@ -138,12 +138,29 @@ PyAPI_FUNC(PyVarObject *) _PyObject_NewVar(PyTypeObject *, Py_ssize_t);
#define PyObject_NewVar(type, typeobj, n) \ #define PyObject_NewVar(type, typeobj, n) \
( (type *) _PyObject_NewVar((typeobj), (n)) ) ( (type *) _PyObject_NewVar((typeobj), (n)) )
/* Macros trading binary compatibility for speed. See also pymem.h. /* Inline functions trading binary compatibility for speed:
Note that these macros expect non-NULL object pointers.*/ PyObject_INIT() is the fast version of PyObject_Init(), and
#define PyObject_INIT(op, typeobj) \ PyObject_INIT_VAR() is the fast version of PyObject_InitVar.
( Py_TYPE(op) = (typeobj), _Py_NewReference((PyObject *)(op)), (op) ) See also pymem.h.
#define PyObject_INIT_VAR(op, typeobj, size) \
( Py_SIZE(op) = (size), PyObject_INIT((op), (typeobj)) ) These inline functions expect non-NULL object pointers. */
Py_STATIC_INLINE(PyObject*)
PyObject_INIT(PyObject *op, PyTypeObject *typeobj)
{
assert(op != NULL);
Py_TYPE(op) = typeobj;
_Py_NewReference(op);
return op;
}
Py_STATIC_INLINE(PyVarObject*)
PyObject_INIT_VAR(PyVarObject *op, PyTypeObject *typeobj, Py_ssize_t size)
{
assert(op != NULL);
Py_SIZE(op) = size;
PyObject_INIT((PyObject *)op, typeobj);
return op;
}
#define _PyObject_SIZE(typeobj) ( (typeobj)->tp_basicsize ) #define _PyObject_SIZE(typeobj) ( (typeobj)->tp_basicsize )

View File

@ -85,7 +85,7 @@ _PyBytes_FromSize(Py_ssize_t size, int use_calloc)
op = (PyBytesObject *)PyObject_Malloc(PyBytesObject_SIZE + size); op = (PyBytesObject *)PyObject_Malloc(PyBytesObject_SIZE + size);
if (op == NULL) if (op == NULL)
return PyErr_NoMemory(); return PyErr_NoMemory();
(void)PyObject_INIT_VAR(op, &PyBytes_Type, size); (void)PyObject_INIT_VAR((PyVarObject *)op, &PyBytes_Type, size);
op->ob_shash = -1; op->ob_shash = -1;
if (!use_calloc) if (!use_calloc)
op->ob_sval[size] = '\0'; op->ob_sval[size] = '\0';
@ -163,7 +163,7 @@ PyBytes_FromString(const char *str)
op = (PyBytesObject *)PyObject_MALLOC(PyBytesObject_SIZE + size); op = (PyBytesObject *)PyObject_MALLOC(PyBytesObject_SIZE + size);
if (op == NULL) if (op == NULL)
return PyErr_NoMemory(); return PyErr_NoMemory();
(void)PyObject_INIT_VAR(op, &PyBytes_Type, size); (void)PyObject_INIT_VAR((PyVarObject *)op, &PyBytes_Type, size);
op->ob_shash = -1; op->ob_shash = -1;
memcpy(op->ob_sval, str, size+1); memcpy(op->ob_sval, str, size+1);
/* share short strings */ /* share short strings */
@ -1508,7 +1508,7 @@ bytes_repeat(PyBytesObject *a, Py_ssize_t n)
op = (PyBytesObject *)PyObject_MALLOC(PyBytesObject_SIZE + nbytes); op = (PyBytesObject *)PyObject_MALLOC(PyBytesObject_SIZE + nbytes);
if (op == NULL) if (op == NULL)
return PyErr_NoMemory(); return PyErr_NoMemory();
(void)PyObject_INIT_VAR(op, &PyBytes_Type, size); (void)PyObject_INIT_VAR((PyVarObject *)op, &PyBytes_Type, size);
op->ob_shash = -1; op->ob_shash = -1;
op->ob_sval[size] = '\0'; op->ob_sval[size] = '\0';
if (Py_SIZE(a) == 1 && n > 0) { if (Py_SIZE(a) == 1 && n > 0) {

View File

@ -55,7 +55,7 @@ PyMethod_New(PyObject *func, PyObject *self)
im = free_list; im = free_list;
if (im != NULL) { if (im != NULL) {
free_list = (PyMethodObject *)(im->im_self); free_list = (PyMethodObject *)(im->im_self);
(void)PyObject_INIT(im, &PyMethod_Type); (void)PyObject_INIT((PyObject *)im, &PyMethod_Type);
numfree--; numfree--;
} }
else { else {

View File

@ -228,7 +228,7 @@ PyComplex_FromCComplex(Py_complex cval)
op = (PyComplexObject *) PyObject_MALLOC(sizeof(PyComplexObject)); op = (PyComplexObject *) PyObject_MALLOC(sizeof(PyComplexObject));
if (op == NULL) if (op == NULL)
return PyErr_NoMemory(); return PyErr_NoMemory();
(void)PyObject_INIT(op, &PyComplex_Type); (void)PyObject_INIT((PyObject *)op, &PyComplex_Type);
op->cval = cval; op->cval = cval;
return (PyObject *) op; return (PyObject *) op;
} }

View File

@ -124,7 +124,7 @@ PyFloat_FromDouble(double fval)
return PyErr_NoMemory(); return PyErr_NoMemory();
} }
/* Inline PyObject_New */ /* Inline PyObject_New */
(void)PyObject_INIT(op, &PyFloat_Type); (void)PyObject_INIT((PyObject *)op, &PyFloat_Type);
op->ob_fval = fval; op->ob_fval = fval;
return (PyObject *) op; return (PyObject *) op;
} }

View File

@ -211,7 +211,7 @@ _PyLong_New(Py_ssize_t size)
PyErr_NoMemory(); PyErr_NoMemory();
return NULL; return NULL;
} }
return (PyLongObject*)PyObject_INIT_VAR(result, &PyLong_Type, size); return (PyLongObject*)PyObject_INIT_VAR((PyVarObject *)result, &PyLong_Type, size);
} }
PyObject * PyObject *
@ -5620,7 +5620,7 @@ _PyLong_Init(void)
assert(v->ob_digit[0] == (digit)abs(ival)); assert(v->ob_digit[0] == (digit)abs(ival));
} }
else { else {
(void)PyObject_INIT(v, &PyLong_Type); (void)PyObject_INIT((PyObject *)v, &PyLong_Type);
} }
Py_SIZE(v) = size; Py_SIZE(v) = size;
v->ob_digit[0] = (digit)abs(ival); v->ob_digit[0] = (digit)abs(ival);

View File

@ -31,7 +31,7 @@ PyCFunction_NewEx(PyMethodDef *ml, PyObject *self, PyObject *module)
op = free_list; op = free_list;
if (op != NULL) { if (op != NULL) {
free_list = (PyCFunctionObject *)(op->m_self); free_list = (PyCFunctionObject *)(op->m_self);
(void)PyObject_INIT(op, &PyCFunction_Type); (void)PyObject_INIT((PyObject *)op, &PyCFunction_Type);
numfree--; numfree--;
} }
else { else {

View File

@ -459,7 +459,7 @@ PyHKEY_FromHKEY(HKEY h)
op = (PyHKEYObject *) PyObject_MALLOC(sizeof(PyHKEYObject)); op = (PyHKEYObject *) PyObject_MALLOC(sizeof(PyHKEYObject));
if (op == NULL) if (op == NULL)
return PyErr_NoMemory(); return PyErr_NoMemory();
PyObject_INIT(op, &PyHKEY_Type); PyObject_INIT((PyObject *)op, &PyHKEY_Type);
op->hkey = h; op->hkey = h;
return (PyObject *)op; return (PyObject *)op;
} }