Skip to content

Commit

Permalink
Implemented a new Py_CLEAR macro. This macro should be used when
Browse files Browse the repository at this point in the history
decrementing the refcount of variables that might be accessed as a
result of calling Python
  • Loading branch information
Jim Fulton committed Jul 14, 2004
1 parent 7a0e8bc commit 8c5aeaa
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 0 deletions.
16 changes: 16 additions & 0 deletions Doc/api/refcounting.tex
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,22 @@ \chapter{Reference Counting \label{countingRefs}}
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
Expand Down
9 changes: 9 additions & 0 deletions Include/object.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down

0 comments on commit 8c5aeaa

Please sign in to comment.