diff --git a/Doc/api/refcounting.tex b/Doc/api/refcounting.tex index 42b9e6a156a..add5d656b3d 100644 --- a/Doc/api/refcounting.tex +++ b/Doc/api/refcounting.tex @@ -42,6 +42,22 @@ of Python objects. applies. \end{cfuncdesc} +\begin{cfuncdesc}{void}{Py_CLEAR}{PyObject *o} + Decrement the reference count for object \var{o}. The object may be + \NULL, in which case the macro has no effect; otherwise the effect + is the same as for \cfunction{Py_DECREF()}, except that the argument + is also set to \NULL. The warning for \cfunction{Py_DECREF()}, does + not apply with respect to the object passed because the macro + carefully uses a temporary variable and sets the argument to \NULL + before decrementing it's reference count. + + It is a good idea to use this macro whenever decrementing the value + of a variable that might be traversed during garbage collection. + +\versionadded{2.4} +\end{cfuncdesc} + + The following functions are for runtime dynamic embedding of Python: \cfunction{Py_IncRef(PyObject *o)}, \cfunction{Py_DecRef(PyObject *o)}. They are simply exported function versions of \cfunction{Py_XINCREF()} and diff --git a/Include/object.h b/Include/object.h index 555d810cbf8..60cf1464fa0 100644 --- a/Include/object.h +++ b/Include/object.h @@ -620,6 +620,15 @@ PyAPI_FUNC(void) _Py_AddToAllObjects(PyObject *, int force); else \ _Py_Dealloc((PyObject *)(op)) +#define Py_CLEAR(op) \ + do { \ + if (op) { \ + PyObject *tmp = (op); \ + (op) = NULL; \ + Py_DECREF(tmp); \ + } \ + } while (0) + /* Macros to use in case the object pointer may be NULL: */ #define Py_XINCREF(op) if ((op) == NULL) ; else Py_INCREF(op) #define Py_XDECREF(op) if ((op) == NULL) ; else Py_DECREF(op)