diff options
author | Victor Stinner <vstinner@python.org> | 2020-02-07 11:05:12 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-02-07 11:05:12 (GMT) |
commit | b10dc3e7a11fcdb97e285882eba6da92594f90f9 (patch) | |
tree | 6c304386f0a2be9d0d6213cbb45b3ff78f60b040 | |
parent | 877ea88934a5164be4d9f15207694fad4173d87d (diff) | |
download | cpython-b10dc3e7a11fcdb97e285882eba6da92594f90f9.zip cpython-b10dc3e7a11fcdb97e285882eba6da92594f90f9.tar.gz cpython-b10dc3e7a11fcdb97e285882eba6da92594f90f9.tar.bz2 |
bpo-39573: Add Py_SET_SIZE() function (GH-18400)
Add Py_SET_SIZE() function to set the size of an object.
-rw-r--r-- | Doc/c-api/structures.rst | 7 | ||||
-rw-r--r-- | Include/cpython/objimpl.h | 2 | ||||
-rw-r--r-- | Include/object.h | 5 | ||||
-rw-r--r-- | Misc/NEWS.d/next/C API/2020-02-07-10-41-53.bpo-39573.EG9VDI.rst | 1 | ||||
-rw-r--r-- | Objects/object.c | 2 |
5 files changed, 15 insertions, 2 deletions
diff --git a/Doc/c-api/structures.rst b/Doc/c-api/structures.rst index 8a1431c..75e2383 100644 --- a/Doc/c-api/structures.rst +++ b/Doc/c-api/structures.rst @@ -101,6 +101,13 @@ the definition of all other Python objects. (((PyVarObject*)(o))->ob_size) +.. c:function:: void Py_SET_SIZE(PyVarObject *o, Py_ssize_t size) + + Set the object *o* size of *size*. + + .. versionadded:: 3.9 + + .. c:macro:: PyObject_HEAD_INIT(type) This is a macro which expands to initialization values for a new diff --git a/Include/cpython/objimpl.h b/Include/cpython/objimpl.h index ebb3e23..8e3c964 100644 --- a/Include/cpython/objimpl.h +++ b/Include/cpython/objimpl.h @@ -30,7 +30,7 @@ static inline PyVarObject* _PyObject_INIT_VAR(PyVarObject *op, PyTypeObject *typeobj, Py_ssize_t size) { assert(op != NULL); - Py_SIZE(op) = size; + Py_SET_SIZE(op, size); PyObject_INIT((PyObject *)op, typeobj); return op; } diff --git a/Include/object.h b/Include/object.h index eb887f4..68200f7 100644 --- a/Include/object.h +++ b/Include/object.h @@ -133,6 +133,11 @@ static inline void _Py_SET_TYPE(PyObject *ob, PyTypeObject *type) { } #define Py_SET_TYPE(ob, type) _Py_SET_TYPE(_PyObject_CAST(ob), type) +static inline void _Py_SET_SIZE(PyVarObject *ob, Py_ssize_t refcnt) { + ob->ob_size = refcnt; +} +#define Py_SET_SIZE(ob, refcnt) _Py_SET_SIZE(_PyVarObject_CAST(ob), refcnt) + /* Type objects contain a string containing the type name (to help somewhat diff --git a/Misc/NEWS.d/next/C API/2020-02-07-10-41-53.bpo-39573.EG9VDI.rst b/Misc/NEWS.d/next/C API/2020-02-07-10-41-53.bpo-39573.EG9VDI.rst new file mode 100644 index 0000000..d84cddc --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-02-07-10-41-53.bpo-39573.EG9VDI.rst @@ -0,0 +1 @@ +Add :c:func:`Py_SET_SIZE` function to set the size of an object. diff --git a/Objects/object.c b/Objects/object.c index ff6c497..81de3b8 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -160,7 +160,7 @@ PyObject_InitVar(PyVarObject *op, PyTypeObject *tp, Py_ssize_t size) return (PyVarObject *) PyErr_NoMemory(); } - Py_SIZE(op) = size; + Py_SET_SIZE(op, size); PyObject_Init((PyObject *)op, tp); return op; } |