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; |