summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Doc/api/refcounting.tex16
-rw-r--r--Include/object.h9
2 files changed, 25 insertions, 0 deletions
diff --git a/Doc/api/refcounting.tex b/Doc/api/refcounting.tex
index 42b9e6a..add5d65 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 555d810..60cf146 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)