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

[3.11] gh-102304: doc: Add links to Stable ABI and Limited C API (#105345) (#105371) #109901

Merged
merged 2 commits into from
Sep 29, 2023
Merged
Show file tree
Hide file tree
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
4 changes: 2 additions & 2 deletions Doc/c-api/exceptions.rst
Original file line number Diff line number Diff line change
Expand Up @@ -806,15 +806,15 @@ because the :ref:`call protocol <call>` takes care of recursion handling.
depth limit.

.. versionchanged:: 3.9
This function is now also available in the limited API.
This function is now also available in the :ref:`limited API <limited-c-api>`.

.. c:function:: void Py_LeaveRecursiveCall(void)

Ends a :c:func:`Py_EnterRecursiveCall`. Must be called once for each
*successful* invocation of :c:func:`Py_EnterRecursiveCall`.

.. versionchanged:: 3.9
This function is now also available in the limited API.
This function is now also available in the :ref:`limited API <limited-c-api>`.

Properly implementing :c:member:`~PyTypeObject.tp_repr` for container types requires
special recursion handling. In addition to protecting the stack,
Expand Down
49 changes: 31 additions & 18 deletions Doc/c-api/stable.rst
Original file line number Diff line number Diff line change
Expand Up @@ -25,19 +25,19 @@ are private API that can change without notice even in patch releases.
Stable Application Binary Interface
===================================

For simplicity, this document talks about *extensions*, but the Limited API
and Stable ABI work the same way for all uses of the API – for example,
embedding Python.

.. _limited-c-api:

Limited C API
-------------

Python 3.2 introduced the *Limited API*, a subset of Python's C API.
Extensions that only use the Limited API can be
compiled once and work with multiple versions of Python.
Contents of the Limited API are :ref:`listed below <stable-abi-list>`.

To enable this, Python provides a *Stable ABI*: a set of symbols that will
remain compatible across Python 3.x versions. The Stable ABI contains symbols
exposed in the Limited API, but also other ones – for example, functions
necessary to support older versions of the Limited API.

(For simplicity, this document talks about *extensions*, but the Limited API
and Stable ABI work the same way for all uses of the API – for example,
embedding Python.)
Contents of the Limited API are :ref:`listed below <limited-api-list>`.

.. c:macro:: Py_LIMITED_API

Expand All @@ -57,6 +57,19 @@ embedding Python.)
You can also define ``Py_LIMITED_API`` to ``3``. This works the same as
``0x03020000`` (Python 3.2, the version that introduced Limited API).


.. _stable-abi:

Stable ABI
----------

To enable this, Python provides a *Stable ABI*: a set of symbols that will
remain compatible across Python 3.x versions.

The Stable ABI contains symbols exposed in the :ref:`Limited API
<limited-c-api>`, but also other ones – for example, functions necessary to
support older versions of the Limited API.

On Windows, extensions that use the Stable ABI should be linked against
``python3.dll`` rather than a version-specific library such as
``python39.dll``.
Expand Down Expand Up @@ -101,9 +114,9 @@ Limited API Caveats
-------------------

Note that compiling with ``Py_LIMITED_API`` is *not* a complete guarantee that
code conforms to the Limited API or the Stable ABI. ``Py_LIMITED_API`` only
covers definitions, but an API also includes other issues, such as expected
semantics.
code conforms to the :ref:`Limited API <limited-c-api>` or the :ref:`Stable ABI
<stable-abi>`. ``Py_LIMITED_API`` only covers definitions, but an API also
includes other issues, such as expected semantics.

One issue that ``Py_LIMITED_API`` does not guard against is calling a function
with arguments that are invalid in a lower Python version.
Expand Down Expand Up @@ -136,9 +149,9 @@ Platform Considerations
=======================

ABI stability depends not only on Python, but also on the compiler used,
lower-level libraries and compiler options. For the purposes of the Stable ABI,
these details define a “platform”. They usually depend on the OS
type and processor architecture
lower-level libraries and compiler options. For the purposes of
the :ref:`Stable ABI <stable-abi>`, these details define a “platform”. They
usually depend on the OS type and processor architecture

It is the responsibility of each particular distributor of Python
to ensure that all Python versions on a particular platform are built
Expand All @@ -147,12 +160,12 @@ This is the case with Windows and macOS releases from ``python.org`` and many
third-party distributors.


.. _stable-abi-list:
.. _limited-api-list:
erlend-aasland marked this conversation as resolved.
Show resolved Hide resolved

Contents of Limited API
=======================


Currently, the Limited API includes the following items:
Currently, the :ref:`Limited API <limited-c-api>` includes the following items:

.. limited-api-list::
2 changes: 1 addition & 1 deletion Doc/c-api/structures.rst
Original file line number Diff line number Diff line change
Expand Up @@ -318,7 +318,7 @@ There are these calling conventions:

.. versionchanged:: 3.10

``METH_FASTCALL`` is now part of the stable ABI.
``METH_FASTCALL`` is now part of the :ref:`stable ABI <stable-abi>`.


.. _METH_FASTCALL-METH_KEYWORDS:
Expand Down
4 changes: 2 additions & 2 deletions Doc/c-api/type.rst
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ Type Objects
Return the :c:member:`~PyTypeObject.tp_flags` member of *type*. This function is primarily
meant for use with ``Py_LIMITED_API``; the individual flag bits are
guaranteed to be stable across Python releases, but access to
:c:member:`~PyTypeObject.tp_flags` itself is not part of the limited API.
:c:member:`~PyTypeObject.tp_flags` itself is not part of the :ref:`limited API <limited-c-api>`.

.. versionadded:: 3.2

Expand Down Expand Up @@ -301,7 +301,7 @@ The following functions and structs are used to create
.. versionchanged:: 3.11
:c:member:`~PyBufferProcs.bf_getbuffer` and
:c:member:`~PyBufferProcs.bf_releasebuffer` are now available
under the limited API.
under the :ref:`limited API <limited-c-api>`.

.. c:member:: void *PyType_Slot.pfunc

Expand Down
2 changes: 1 addition & 1 deletion Doc/c-api/typeobj.rst
Original file line number Diff line number Diff line change
Expand Up @@ -2082,7 +2082,7 @@ This results in types that are limited relative to types defined in Python:
include any subinterpreter-specific state.

Also, since :c:type:`PyTypeObject` is only part of the :ref:`Limited API
<stable>` as an opaque struct, any extension modules using static types must be
<limited-c-api>` as an opaque struct, any extension modules using static types must be
compiled for a specific Python minor version.


Expand Down
2 changes: 1 addition & 1 deletion Doc/c-api/unicode.rst
Original file line number Diff line number Diff line change
Expand Up @@ -1084,7 +1084,7 @@ These are the UTF-8 codec APIs:
The return type is now ``const char *`` rather of ``char *``.

.. versionchanged:: 3.10
This function is a part of the :ref:`limited API <stable>`.
This function is a part of the :ref:`limited API <limited-c-api>`.


.. c:function:: const char* PyUnicode_AsUTF8(PyObject *unicode)
Expand Down
2 changes: 1 addition & 1 deletion Doc/howto/isolating-extensions.rst
Original file line number Diff line number Diff line change
Expand Up @@ -461,7 +461,7 @@ Module State Access from Slot Methods, Getters and Setters

.. After adding to limited API:

If you use the :ref:`limited API <stable>,
If you use the :ref:`limited API <limited-c-api>`,
you must update ``Py_LIMITED_API`` to ``0x030b0000``, losing ABI
compatibility with earlier versions.

Expand Down
2 changes: 1 addition & 1 deletion Doc/whatsnew/3.11.rst
Original file line number Diff line number Diff line change
Expand Up @@ -2654,7 +2654,7 @@ Removed
* :c:func:`PyMarshal_WriteObjectToString`
* the ``Py_MARSHAL_VERSION`` macro

These are not part of the :ref:`limited API <stable-abi-list>`.
These are not part of the :ref:`limited API <limited-api-list>`.

(Contributed by Victor Stinner in :issue:`45474`.)

Expand Down
2 changes: 1 addition & 1 deletion Misc/NEWS.d/3.11.0a1.rst
Original file line number Diff line number Diff line change
Expand Up @@ -4980,7 +4980,7 @@ Removed documentation for the removed ``PyParser_*`` C API.
.. nonce: fy0AXK
.. section: C API

The list in :ref:`stable-abi-list` now shows the public name
The list in :ref:`limited-api-list` now shows the public name
:c:struct:`PyFrameObject` rather than ``_frame``. The non-existing entry
``_node`` no longer appears in the list.

Expand Down
2 changes: 1 addition & 1 deletion Misc/NEWS.d/3.11.0a2.rst
Original file line number Diff line number Diff line change
Expand Up @@ -1234,7 +1234,7 @@ defined:
* :c:func:`PyMarshal_WriteObjectToString`
* the ``Py_MARSHAL_VERSION`` macro

These are not part of the :ref:`limited API <stable-abi-list>`.
These are not part of the :ref:`limited API <limited-api-list>`.

Patch by Victor Stinner.

Expand Down