diff options
Diffstat (limited to 'Include/object.h')
-rw-r--r-- | Include/object.h | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/Include/object.h b/Include/object.h index f2af428..73bebcd 100644 --- a/Include/object.h +++ b/Include/object.h @@ -575,16 +575,21 @@ static inline void Py_DECREF(PyObject *op) * one of those can't cause problems -- but in part that relies on that * Python integers aren't currently weakly referencable. Best practice is * to use Py_CLEAR() even if you can't think of a reason for why you need to. + * + * gh-98724: Use the _py_tmp_ptr variable to evaluate the macro argument + * exactly once, to prevent the duplication of side effects in this macro. */ -#define Py_CLEAR(op) \ - do { \ - PyObject *_py_tmp = _PyObject_CAST(op); \ - if (_py_tmp != NULL) { \ - (op) = NULL; \ - Py_DECREF(_py_tmp); \ - } \ +#define Py_CLEAR(op) \ + do { \ + PyObject **_py_tmp_ptr = _Py_CAST(PyObject**, &(op)); \ + if (*_py_tmp_ptr != NULL) { \ + PyObject* _py_tmp = (*_py_tmp_ptr); \ + *_py_tmp_ptr = NULL; \ + Py_DECREF(_py_tmp); \ + } \ } while (0) + /* Function to use in case the object pointer can be NULL: */ static inline void Py_XINCREF(PyObject *op) { |