Skip to content
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

bpo-46355: What's New: Note that PyFrameObject are private #31032

Merged
merged 1 commit into from
Feb 1, 2022
Merged
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
29 changes: 20 additions & 9 deletions Doc/whatsnew/3.11.rst
Original file line number Diff line number Diff line change
Expand Up @@ -759,12 +759,19 @@ Porting to Python 3.11
which are not available in the limited C API.
(Contributed by Victor Stinner in :issue:`46007`.)

* Changes of the :c:type:`PyFrameObject` structure members:
* Changes of the private :c:type:`PyFrameObject` structure members.

While the documentation notes that the fields of ``PyFrameObject`` are
subject to change at any time, they have been stable for a long time
and were used in several popular extensions.
In Python 3.11, the frame struct was reorganized to allow performance
optimizations. Rather than reading the fields directly, extensions should
use functions:

* ``f_code``: removed, use :c:func:`PyFrame_GetCode` instead.
Warning: the function returns a :term:`strong reference`, need to call
:c:func:`Py_DECREF`.
* ``f_back``: changed, use :c:func:`PyFrame_GetBack`.
* ``f_back``: changed (see below), use :c:func:`PyFrame_GetBack`.
* ``f_builtins``: removed,
use ``PyObject_GetAttrString(frame, "f_builtins")``.
* ``f_globals``: removed,
Expand All @@ -773,13 +780,17 @@ Porting to Python 3.11
use ``PyObject_GetAttrString(frame, "f_locals")``.
* ``f_lasti``: removed,
use ``PyObject_GetAttrString(frame, "f_lasti")``.
* ``f_valuesstack``: removed.
* ``f_stackdepth``: removed.
* ``f_gen``: removed.
* ``f_iblock``: removed.
* ``f_state``: removed.
* ``f_blockstack``: removed.
* ``f_localsplus``: removed.

The following fields were removed entirely, as they were details
of the old implementation:

* ``f_valuesstack``
* ``f_stackdepth``
* ``f_gen``
* ``f_iblock``
* ``f_state``
* ``f_blockstack``
* ``f_localsplus``

The Python frame object is now created lazily. A side effect is that the
``f_back`` member must not be accessed directly, since its value is now also
Expand Down