Skip to content

gh-137740: Clarify __del__ invocation mechanism in reference counting #137741

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 4 commits into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion Doc/extending/extending.rst
Original file line number Diff line number Diff line change
Expand Up @@ -1084,7 +1084,15 @@ references to all its items, so when item 1 is replaced, it has to dispose of
the original item 1. Now let's suppose the original item 1 was an instance of a
user-defined class, and let's further suppose that the class defined a
:meth:`!__del__` method. If this class instance has a reference count of 1,
disposing of it will call its :meth:`!__del__` method.
disposing of it will call its :meth:`!__del__` method. Internally,
:c:func:`PyList_SetItem` calls :c:func:`Py_DECREF` on the replaced item,
which invokes replaced item's corresponding
:c:member:`~PyTypeObject.tp_dealloc` function (that is
:c:func:`subtype_dealloc` in case of Python class instance). During
deallocation, :c:func:`subtype_dealloc` calls
:c:member:`~PyTypeObject.tp_finalize`, which is mapped to the
:meth:`!__del__` method for class instances (see :pep:`442`). This entire
sequence happens synchronously within the :c:func:`PyList_SetItem` call.

Since it is written in Python, the :meth:`!__del__` method can execute arbitrary
Python code. Could it perhaps do something to invalidate the reference to
Expand Down
Loading