Skip to content

Commit afd077e

Browse files
committed
Update Py_SETREF() to fix gh-98724
python/cpython#98724
1 parent dda2c76 commit afd077e

File tree

2 files changed

+14
-10
lines changed

2 files changed

+14
-10
lines changed

docs/changelog.rst

+2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
Changelog
22
=========
33

4+
* 2022-11-09: Fix ``Py_SETREF()`` and ``Py_XSETREF()`` macros
5+
for `gh-98724 <https://github.com/python/cpython/issues/98724>`_.
46
* 2022-11-04: Add ``PyFrame_GetVar()`` and ``PyFrame_GetVarString()``
57
functions.
68
* 2022-08-04: Add ``PyCode_GetVarnames()``, ``PyCode_GetFreevars()``

pythoncapi_compat.h

+12-10
Original file line numberDiff line numberDiff line change
@@ -90,18 +90,20 @@ _Py_SET_REFCNT(PyObject *ob, Py_ssize_t refcnt)
9090
// Py_SETREF() and Py_XSETREF() were added to Python 3.5.2.
9191
// It is excluded from the limited C API.
9292
#if (PY_VERSION_HEX < 0x03050200 && !defined(Py_SETREF)) && !defined(Py_LIMITED_API)
93-
#define Py_SETREF(op, op2) \
94-
do { \
95-
PyObject *_py_tmp = _PyObject_CAST(op); \
96-
(op) = (op2); \
97-
Py_DECREF(_py_tmp); \
93+
#define Py_SETREF(dst, src) \
94+
do { \
95+
PyObject **_tmp_dst_ptr = _Py_CAST(PyObject**, &(dst)); \
96+
PyObject *_tmp_dst = (*_tmp_dst_ptr); \
97+
*_tmp_dst_ptr = _PyObject_CAST(src); \
98+
Py_DECREF(_tmp_dst); \
9899
} while (0)
99100

100-
#define Py_XSETREF(op, op2) \
101-
do { \
102-
PyObject *_py_tmp = _PyObject_CAST(op); \
103-
(op) = (op2); \
104-
Py_XDECREF(_py_tmp); \
101+
#define Py_XSETREF(dst, src) \
102+
do { \
103+
PyObject **_tmp_dst_ptr = _Py_CAST(PyObject**, &(dst)); \
104+
PyObject *_tmp_dst = (*_tmp_dst_ptr); \
105+
*_tmp_dst_ptr = _PyObject_CAST(src); \
106+
Py_XDECREF(_tmp_dst); \
105107
} while (0)
106108
#endif
107109

0 commit comments

Comments
 (0)