From ad3252bad905d41635bcbb4b76db30d570cf0087 Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Tue, 26 May 2020 01:52:54 +0900 Subject: bpo-39573: Convert Py_TYPE() to a static inline function (GH-20290) --- Doc/c-api/structures.rst | 11 +++++--- Doc/whatsnew/3.10.rst | 30 +++++++++++++++++----- Include/object.h | 6 ++++- .../2020-05-22-00-34-34.bpo-39573.QO2QHj.rst | 2 ++ 4 files changed, 37 insertions(+), 12 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-05-22-00-34-34.bpo-39573.QO2QHj.rst diff --git a/Doc/c-api/structures.rst b/Doc/c-api/structures.rst index 634e971..5535f42 100644 --- a/Doc/c-api/structures.rst +++ b/Doc/c-api/structures.rst @@ -62,12 +62,15 @@ the definition of all other Python objects. See documentation of :c:type:`PyVarObject` above. -.. c:macro:: Py_TYPE(o) +.. c:function:: PyTypeObject* Py_TYPE(const PyObject *o) - This macro is used to access the :attr:`ob_type` member of a Python object. - It expands to:: + Get the type of the Python object *o*. + + Return a borrowed reference. - (((PyObject*)(o))->ob_type) + .. versionchanged:: 3.10 + :c:func:`Py_TYPE()` is changed to the inline static function. + Use :c:func:`Py_SET_TYPE()` to set an object type. .. c:function:: int Py_IS_TYPE(PyObject *o, PyTypeObject *type) diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index e650f94..98a231f 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -97,21 +97,14 @@ Optimizations ============= -Build and C API Changes -======================= - - - Deprecated ========== - Removed ======= - Porting to Python 3.10 ====================== @@ -119,3 +112,26 @@ This section lists previously described changes and other bugfixes that may require changes to your code. + +Build Changes +============= + + +C API Changes +============= + +New Features +------------ + + +Porting to Python 3.10 +---------------------- + +* Since :c:func:`Py_TYPE()` is changed to the inline static function, + ``Py_TYPE(obj) = new_type`` must be replaced with ``Py_SET_TYPE(obj, new_type)``: + see :c:func:`Py_SET_TYPE()` (available since Python 3.9). + (Contributed by Dong-hee Na in :issue:`39573`.) + + +Removed +------- diff --git a/Include/object.h b/Include/object.h index 514d934..5ad0569 100644 --- a/Include/object.h +++ b/Include/object.h @@ -121,9 +121,13 @@ typedef struct { #define _PyVarObject_CAST(op) ((PyVarObject*)(op)) #define Py_REFCNT(ob) (_PyObject_CAST(ob)->ob_refcnt) -#define Py_TYPE(ob) (_PyObject_CAST(ob)->ob_type) #define Py_SIZE(ob) (_PyVarObject_CAST(ob)->ob_size) +static inline PyTypeObject* _Py_TYPE(const PyObject *ob) { + return ob->ob_type; +} +#define Py_TYPE(ob) _Py_TYPE(_PyObject_CAST_CONST(ob)) + static inline int _Py_IS_TYPE(const PyObject *ob, const PyTypeObject *type) { return ob->ob_type == type; } diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-05-22-00-34-34.bpo-39573.QO2QHj.rst b/Misc/NEWS.d/next/Core and Builtins/2020-05-22-00-34-34.bpo-39573.QO2QHj.rst new file mode 100644 index 0000000..2430030 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-05-22-00-34-34.bpo-39573.QO2QHj.rst @@ -0,0 +1,2 @@ +:c:func:`Py_TYPE()` is changed to the inline static function. Patch by +Dong-hee Na. -- cgit v0.12