]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-44263: Better explain the GC contract for PyType_FromSpecWithBases (GH-26442)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Sat, 29 May 2021 03:20:54 +0000 (20:20 -0700)
committerGitHub <noreply@github.com>
Sat, 29 May 2021 03:20:54 +0000 (20:20 -0700)
(cherry picked from commit 8b55bc3f93a655bc803bff79725d5fe3f124e2f0)

Co-authored-by: Pablo Galindo <Pablogsal@gmail.com>
Doc/c-api/gcsupport.rst
Doc/c-api/type.rst

index eee114c19d59049c8fce8263271853e17b9a3d69..76f9ab53b4f31a3ff35d2bbd93ff0d57b7720d3d 100644 (file)
@@ -33,6 +33,17 @@ Constructors for container types must conform to two rules:
 #. Once all the fields which may contain references to other containers are
    initialized, it must call :c:func:`PyObject_GC_Track`.
 
+   .. warning::
+      If a type adds the Py_TPFLAGS_HAVE_GC, then it *must* implement at least
+      a :c:member:`~PyTypeObject.tp_traverse` handler or explicitly use one
+      from its subclass or subclasses.
+
+      Some APIs like :c:func:`PyType_FromSpecWithBases` or
+      :c:func:`PyType_FromSpec` will automatically populate the
+      :c:member:`~PyTypeObject.tp_flags`, :c:member:`~PyTypeObject.tp_traverse`
+      and :c:member:`~PyTypeObject.tp_clear` fields if the type inherits from a
+      class that implements the garbage collector protocol and the child class
+      does *not* include the :const:`Py_TPFLAGS_HAVE_GC` flag.
 
 .. c:function:: TYPE* PyObject_GC_New(TYPE, PyTypeObject *type)
 
index ee76f52289387fb7ff750408f491dc3caeb95037..d694b8caf17996bc25f07dda0fc22fad9ea855cb 100644 (file)
@@ -168,6 +168,13 @@ The following functions and structs are used to create
    The associated module is not inherited by subclasses; it must be specified
    for each class individually.
 
+   If some of the bases in *bases* implements the GC protocol and the type being
+   created does not include the :const:`Py_TPFLAGS_HAVE_GC` in the flags included in
+   *spec*, then the GC protocol will be automatically implemented from its parents. On
+   the contrary, if the type being created does include :const:`Py_TPFLAGS_HAVE_GC` in
+   its flags then it *must* implement the GC protocol itself by at least including a slot
+   for :c:member:`~PyTypeObject.tp_traverse` in *spec*.
+
    This function calls :c:func:`PyType_Ready` on the new type.
 
    .. versionadded:: 3.9