bpo-39573: Py_TYPE becomes a static inline function (GH-28128) · python/cpython@cb15afc (original) (raw)

5 files changed

lines changed

Original file line number Diff line number Diff line change
@@ -99,7 +99,10 @@ the definition of all other Python objects.
99 99
100 100 Return a :term:`borrowed reference`.
101 101
102 - The :c:func:`Py_SET_TYPE` function must be used to set an object type.
102 + Use the :c:func:`Py_SET_TYPE` function to set an object type.
103 +
104 + .. versionchanged:: 3.11
105 + :c:func:`Py_TYPE()` is changed to an inline static function.
103 106
104 107
105 108 .. c:function:: int Py_IS_TYPE(PyObject *o, PyTypeObject *type)
@@ -121,9 +124,10 @@ the definition of all other Python objects.
121 124
122 125 Get the reference count of the Python object *o*.
123 126
127 + Use the :c:func:`Py_SET_REFCNT()` function to set an object reference count.
128 +
124 129 .. versionchanged:: 3.10
125 130 :c:func:`Py_REFCNT()` is changed to the inline static function.
126 - Use :c:func:`Py_SET_REFCNT()` to set an object reference count.
127 131
128 132
129 133 .. c:function:: void Py_SET_REFCNT(PyObject *o, Py_ssize_t refcnt)
@@ -137,7 +141,10 @@ the definition of all other Python objects.
137 141
138 142 Get the size of the Python object *o*.
139 143
140 - The :c:func:`Py_SET_SIZE` function must be used to set an object size.
144 + Use the :c:func:`Py_SET_SIZE` function to set an object size.
145 +
146 + .. versionchanged:: 3.11
147 + :c:func:`Py_SIZE()` is changed to an inline static function.
141 148
142 149
143 150 .. c:function:: void Py_SET_SIZE(PyVarObject *o, Py_ssize_t size)
Original file line number Diff line number Diff line change
@@ -402,6 +402,34 @@ Porting to Python 3.11
402 402 :ref:`static types <static-types>`.
403 403 (Contributed by Erlend E. Aasland in :issue:`43908`)
404 404
405 +* Since :c:func:`Py_TYPE()` is changed to a inline static function,
406 + ``Py_TYPE(obj) = new_type`` must be replaced with
407 + ``Py_SET_TYPE(obj, new_type)``: see the :c:func:`Py_SET_TYPE()` function
408 + (available since Python 3.9). For backward compatibility, this macro can be
409 + used::
410 +
411 + #if PY_VERSION_HEX < 0x030900A4 && !defined(Py_SET_TYPE)
412 + static inline void _Py_SET_TYPE(PyObject *ob, PyTypeObject *type)
413 + { ob->ob_type = type; }
414 + #define Py_SET_TYPE(ob, type) _Py_SET_TYPE((PyObject*)(ob), type)
415 + #endif
416 +
417 + (Contributed by Victor Stinner in :issue:`39573`.)
418 +
419 +* Since :c:func:`Py_SIZE()` is changed to a inline static function,
420 + ``Py_SIZE(obj) = new_size`` must be replaced with
421 + ``Py_SET_SIZE(obj, new_size)``: see the :c:func:`Py_SET_SIZE()` function
422 + (available since Python 3.9). For backward compatibility, this macro can be
423 + used::
424 +
425 + #if PY_VERSION_HEX < 0x030900A4 && !defined(Py_SET_SIZE)
426 + static inline void _Py_SET_SIZE(PyVarObject *ob, Py_ssize_t size)
427 + { ob->ob_size = size; }
428 + #define Py_SET_SIZE(ob, size) _Py_SET_SIZE((PyVarObject*)(ob), size)
429 + #endif
430 +
431 + (Contributed by Victor Stinner in :issue:`39573`.)
432 +
405 433 Deprecated
406 434 ----------
407 435
Original file line number Diff line number Diff line change
@@ -134,10 +134,16 @@ static inline Py_ssize_t _Py_REFCNT(const PyObject *ob) {
134 134
135 135
136 136 // bpo-39573: The Py_SET_TYPE() function must be used to set an object type.
137 -#define Py_TYPE(ob) (_PyObject_CAST(ob)->ob_type)
137 +static inline PyTypeObject* _Py_TYPE(const PyObject *ob) {
138 +return ob->ob_type;
139 +}
140 +#define Py_TYPE(ob) _Py_TYPE(_PyObject_CAST_CONST(ob))
138 141
139 142 // bpo-39573: The Py_SET_SIZE() function must be used to set an object size.
140 -#define Py_SIZE(ob) (_PyVarObject_CAST(ob)->ob_size)
143 +static inline Py_ssize_t _Py_SIZE(const PyVarObject *ob) {
144 +return ob->ob_size;
145 +}
146 +#define Py_SIZE(ob) _Py_SIZE(_PyVarObject_CAST_CONST(ob))
141 147
142 148
143 149 static inline int _Py_IS_TYPE(const PyObject *ob, const PyTypeObject *type) {
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
1 +Convert the :c:func:`Py_TYPE` and :c:func:`Py_SIZE` macros to static inline
2 +functions. The :c:func:`Py_SET_TYPE` and :c:func:`Py_SET_SIZE` functions
3 +must now be used to set an object type and size. Patch by Victor Stinner.
Original file line number Diff line number Diff line change
@@ -5511,10 +5511,9 @@ test_set_type_size(PyObject *self, PyObject *Py_UNUSED(ignored))
5511 5511 assert(Py_TYPE(obj) == &PyList_Type);
5512 5512 assert(Py_SIZE(obj) == 0);
5513 5513
5514 -// bpo-39573: Check that Py_TYPE() and Py_SIZE() can be used
5515 -// as l-values to set an object type and size.
5516 -Py_TYPE(obj) = &PyList_Type;
5517 -Py_SIZE(obj) = 0;
5514 +// bpo-39573: Test Py_SET_TYPE() and Py_SET_SIZE() functions.
5515 +Py_SET_TYPE(obj, &PyList_Type);
5516 +Py_SET_SIZE(obj, 0);
5518 5517
5519 5518 Py_DECREF(obj);
5520 5519 Py_RETURN_NONE;