]> granicus.if.org Git - python/commitdiff
Issue 8753: Added documentation for Py_ReprEntr and Py_ReprLeave.
authorDaniel Stutzbach <daniel@stutzbachenterprises.com>
Fri, 17 Dec 2010 16:31:32 +0000 (16:31 +0000)
committerDaniel Stutzbach <daniel@stutzbachenterprises.com>
Fri, 17 Dec 2010 16:31:32 +0000 (16:31 +0000)
Doc/c-api/exceptions.rst

index 894652eb9b27ecf4248b760fd244102772f22745..db46902e9c3799a2110dc02a4f517fcc0f1e8ecb 100644 (file)
@@ -533,6 +533,35 @@ recursion depth automatically).
    Ends a :c:func:`Py_EnterRecursiveCall`.  Must be called once for each
    *successful* invocation of :c:func:`Py_EnterRecursiveCall`.
 
+Properly implementing :attr:`tp_repr` for container types requires
+special recursion handling.  In addition to protecting the stack,
+:attr:`tp_repr` also needs to track objects to prevent cycles.  The
+following two functions facilitate this functionality.  Effectively,
+these are the C equivalent to :func:`reprlib.recursive_repr`.
+
+.. c:function:: int Py_ReprEntr(PyObject *object)
+
+   Called at the beginning of the :attr:`tp_repr` implementation to
+   detect cycles.
+
+   If the object has already been processed, the function returns a
+   positive integer.  In that case the :attr:`tp_repr` implementation
+   should return a string object indicating a cycle.  As examples,
+   :class:`dict` objects return ``{...}`` and :class:`list` objects
+   return ``[...]``.
+
+   The function will return a negative integer if the recursion limit
+   is reached.  In that case the :attr:`tp_repr` implementation should
+   typically return ``NULL``.
+
+   Otherwise, the function returns zero and the :attr:`tp_repr`
+   implementation can continue normally.
+
+.. c:function:: void Py_ReprLeave(PyObject *object)
+
+   Ends a :c:func:`Py_ReprEntr`.  Must be called once for each
+   invocation of :c:func:`Py_ReprEntr` that returns zero.
+
 
 .. _standardexceptions: