mirror of
https://github.com/python/cpython.git
synced 2025-09-28 19:25:27 +00:00
bpo-44263: Better explain the GC contract for PyType_FromSpecWithBases (GH-26442)
(cherry picked from commit 8b55bc3f93
)
Co-authored-by: Pablo Galindo <Pablogsal@gmail.com>
This commit is contained in:
parent
d5b657b964
commit
a30cbaee84
2 changed files with 18 additions and 0 deletions
|
@ -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
|
#. Once all the fields which may contain references to other containers are
|
||||||
initialized, it must call :c:func:`PyObject_GC_Track`.
|
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)
|
.. c:function:: TYPE* PyObject_GC_New(TYPE, PyTypeObject *type)
|
||||||
|
|
||||||
|
|
|
@ -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
|
The associated module is not inherited by subclasses; it must be specified
|
||||||
for each class individually.
|
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.
|
This function calls :c:func:`PyType_Ready` on the new type.
|
||||||
|
|
||||||
.. versionadded:: 3.9
|
.. versionadded:: 3.9
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue