Skip to content

Commit d248354

Browse files
committed
gh-12324: Document restrictions for tp_traverse implementations
1 parent b3bf212 commit d248354

File tree

2 files changed

+9
-0
lines changed

2 files changed

+9
-0
lines changed

Doc/c-api/gcsupport.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,10 @@ The :c:member:`~PyTypeObject.tp_traverse` handler must have the following type:
232232
object argument. If *visit* returns a non-zero value that value should be
233233
returned immediately.
234234
235+
The traversal function must not have any side effects. Implementations
236+
may not modify the reference counts of any Python objects nor create or
237+
destroy any Python objects.
238+
235239
To simplify writing :c:member:`~PyTypeObject.tp_traverse` handlers, a :c:func:`Py_VISIT` macro is
236240
provided. In order to use this macro, the :c:member:`~PyTypeObject.tp_traverse` implementation
237241
must name its arguments exactly *visit* and *arg*:

Doc/c-api/typeobj.rst

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1569,6 +1569,11 @@ and :c:data:`PyType_Type` effectively act as defaults.)
15691569
but the instance has no strong reference to the elements inside it, as they
15701570
are allowed to be removed even if the instance is still alive).
15711571

1572+
.. warning::
1573+
The traversal function must not have any side effects. It must not
1574+
modify the reference counts of any Python objects nor create or destroy
1575+
any Python objects.
1576+
15721577
Note that :c:func:`Py_VISIT` requires the *visit* and *arg* parameters to
15731578
:c:func:`!local_traverse` to have these specific names; don't name them just
15741579
anything.

0 commit comments

Comments
 (0)