Issue #26200: Added Py_SETREF and replaced Py_XSETREF with Py_SETREF

in places where Py_DECREF was used.
This commit is contained in:
Serhiy Storchaka 2016-04-10 18:05:40 +03:00
parent e0805cf10e
commit 57a01d3a0e
20 changed files with 52 additions and 42 deletions

View file

@ -851,18 +851,28 @@ PyAPI_FUNC(void) _Py_Dealloc(PyObject *);
*
* As in case of Py_CLEAR "the obvious" code can be deadly:
*
* Py_XDECREF(op);
* Py_DECREF(op);
* op = op2;
*
* The safe way is:
*
* Py_XSETREF(op, op2);
* Py_SETREF(op, op2);
*
* That arranges to set `op` to `op2` _before_ decref'ing, so that any code
* triggered as a side-effect of `op` getting torn down no longer believes
* `op` points to a valid object.
*
* Py_XSETREF is a variant of Py_SETREF that uses Py_XDECREF instead of
* Py_DECREF.
*/
#define Py_SETREF(op, op2) \
do { \
PyObject *_py_tmp = (PyObject *)(op); \
(op) = (op2); \
Py_DECREF(_py_tmp); \
} while (0)
#define Py_XSETREF(op, op2) \
do { \
PyObject *_py_tmp = (PyObject *)(op); \