mirror of https://github.com/python/cpython
gh-99845: PEP 670: Convert PyObject macros to functions (#99850)
Convert macros to static inline functions to avoid macro pitfalls, like duplication of side effects: * _PyObject_SIZE() * _PyObject_VAR_SIZE() The result type is size_t (unsigned).
This commit is contained in:
parent
85dd6cb6df
commit
131801d14d
|
@ -2,7 +2,9 @@
|
|||
# error "this header file must not be included directly"
|
||||
#endif
|
||||
|
||||
#define _PyObject_SIZE(typeobj) ( (typeobj)->tp_basicsize )
|
||||
static inline size_t _PyObject_SIZE(PyTypeObject *type) {
|
||||
return _Py_STATIC_CAST(size_t, type->tp_basicsize);
|
||||
}
|
||||
|
||||
/* _PyObject_VAR_SIZE returns the number of bytes (as size_t) allocated for a
|
||||
vrbl-size object with nitems items, exclusive of gc overhead (if any). The
|
||||
|
@ -18,10 +20,11 @@
|
|||
# error "_PyObject_VAR_SIZE requires SIZEOF_VOID_P be a power of 2"
|
||||
#endif
|
||||
|
||||
#define _PyObject_VAR_SIZE(typeobj, nitems) \
|
||||
_Py_SIZE_ROUND_UP((typeobj)->tp_basicsize + \
|
||||
(nitems)*(typeobj)->tp_itemsize, \
|
||||
SIZEOF_VOID_P)
|
||||
static inline size_t _PyObject_VAR_SIZE(PyTypeObject *type, Py_ssize_t nitems) {
|
||||
size_t size = _Py_STATIC_CAST(size_t, type->tp_basicsize);
|
||||
size += _Py_STATIC_CAST(size_t, nitems) * _Py_STATIC_CAST(size_t, type->tp_itemsize);
|
||||
return _Py_SIZE_ROUND_UP(size, SIZEOF_VOID_P);
|
||||
}
|
||||
|
||||
|
||||
/* This example code implements an object constructor with a custom
|
||||
|
|
Loading…
Reference in New Issue