From 743f4124c16df4297966cdd3c2569bceb1e45039 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 3 Jun 2020 14:58:43 +0200 Subject: [PATCH 1/2] bpo-39573: Porting to Python 3.10: Py_SET_SIZE() macro In What's New in Python 3.10, propose Py_SET_SIZE(), Py_SET_REFCNT() and Py_SET_TYPE() macros for backward compatibility with Python 3.9 and older. --- Doc/whatsnew/3.10.rst | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 0b656475b7167c..a9c8d0b6c594e5 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -135,17 +135,35 @@ 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). + see :c:func:`Py_SET_TYPE()` (available since Python 3.9). For backward + compatibility, this macro can be used:: + + #if PY_VERSION_HEX < 0x030900A4 + # define Py_SET_TYPE(obj, type) do { Py_TYPE(obj) = (type); } while (0) + #endif + (Contributed by Dong-hee Na in :issue:`39573`.) * Since :c:func:`Py_REFCNT()` is changed to the inline static function, ``Py_REFCNT(obj) = new_refcnt`` must be replaced with ``Py_SET_REFCNT(obj, new_refcnt)``: - see :c:func:`Py_SET_REFCNT()` (available since Python 3.9). + see :c:func:`Py_SET_REFCNT()` (available since Python 3.9). For backward + compatibility, this macro can be used:: + + #if PY_VERSION_HEX < 0x030900A4 + # define Py_SET_REFCNT(obj, refcnt) do { Py_REFCNT(obj) = (refcnt); } while (0) + #endif + (Contributed by Victor Stinner in :issue:`39573`.) * Since :c:func:`Py_SIZE()` is changed to the inline static function, ``Py_SIZE(obj) = new_size`` must be replaced with ``Py_SET_SIZE(obj, new_size)``: - see :c:func:`Py_SET_SIZE()` (available since Python 3.9). + see :c:func:`Py_SET_SIZE()` (available since Python 3.9). For backward + compatibility, this macro can be used:: + + #if PY_VERSION_HEX < 0x030900A4 + # define Py_SET_SIZE(obj, size) do { Py_SIZE(obj) = (size); } while (0) + #endif + (Contributed by Victor Stinner in :issue:`39573`.) * Calling :c:func:`PyDict_GetItem` without :term:`GIL` held had been allowed From 3feadc84f702f16620710ecc549d1c8375d78d1f Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 4 Jun 2020 17:48:42 +0200 Subject: [PATCH 2/2] Rewrite macros --- Doc/whatsnew/3.10.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index a9c8d0b6c594e5..1234b2e6bbf279 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -139,7 +139,7 @@ Porting to Python 3.10 compatibility, this macro can be used:: #if PY_VERSION_HEX < 0x030900A4 - # define Py_SET_TYPE(obj, type) do { Py_TYPE(obj) = (type); } while (0) + # define Py_SET_TYPE(obj, type) ((Py_TYPE(obj) = (type)), (void)0) #endif (Contributed by Dong-hee Na in :issue:`39573`.) @@ -150,7 +150,7 @@ Porting to Python 3.10 compatibility, this macro can be used:: #if PY_VERSION_HEX < 0x030900A4 - # define Py_SET_REFCNT(obj, refcnt) do { Py_REFCNT(obj) = (refcnt); } while (0) + # define Py_SET_REFCNT(obj, refcnt) ((Py_REFCNT(obj) = (refcnt)), (void)0) #endif (Contributed by Victor Stinner in :issue:`39573`.) @@ -161,7 +161,7 @@ Porting to Python 3.10 compatibility, this macro can be used:: #if PY_VERSION_HEX < 0x030900A4 - # define Py_SET_SIZE(obj, size) do { Py_SIZE(obj) = (size); } while (0) + # define Py_SET_SIZE(obj, size) ((Py_SIZE(obj) = (size)), (void)0) #endif (Contributed by Victor Stinner in :issue:`39573`.)