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.12] gh-102304: doc: Add links to Stable ABI and Limited C API (#105345) #105371

Merged
merged 2 commits into from
Jun 6, 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 @@ -887,15 +887,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
55 changes: 34 additions & 21 deletions Doc/c-api/stable.rst
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,9 @@ but will need to be compiled separately for 3.9.x and 3.10.x.

There are two tiers of C API with different stability exepectations:

- *Unstable API*, may change in minor versions without a deprecation period.
It is marked by the ``PyUnstable`` prefix in names.
- *Limited API*, is compatible across several minor releases.
- :ref:`Unstable API <unstable-c-api>`, may change in minor versions without
a deprecation period. It is marked by the ``PyUnstable`` prefix in names.
- :ref:`Limited API <limited-c-api>`, is compatible across several minor releases.
When :c:macro:`Py_LIMITED_API` is defined, only this subset is exposed
from ``Python.h``.

Expand Down Expand Up @@ -55,19 +55,19 @@ CPython development and spend extra effort adjusting to changes.
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 @@ -87,6 +87,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 @@ -131,9 +144,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 @@ -166,9 +179,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 @@ -177,12 +190,12 @@ This is the case with Windows and macOS releases from ``python.org`` and many
third-party distributors.


.. _stable-abi-list:
.. _limited-api-list:

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 @@ -288,7 +288,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>`.


.. data:: 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 @@ -472,7 +472,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 *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 @@ -2150,7 +2150,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 @@ -992,7 +992,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/library/test.rst
Original file line number Diff line number Diff line change
Expand Up @@ -803,7 +803,7 @@ The :mod:`test.support` module defines the following functions:

.. decorator:: requires_limited_api

Decorator for only running the test if :ref:`Limited C API <stable>`
Decorator for only running the test if :ref:`Limited C API <limited-c-api>`
is available.


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 @@ -2650,7 +2650,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 Doc/whatsnew/3.12.rst
Original file line number Diff line number Diff line change
Expand Up @@ -1580,7 +1580,7 @@ New Features

(Contributed by Petr Viktorin in :gh:`103509`.)

* Added the new limited C API function :c:func:`PyType_FromMetaclass`,
* Added the new :ref:`limited C API <limited-c-api>` function :c:func:`PyType_FromMetaclass`,
which generalizes the existing :c:func:`PyType_FromModuleAndSpec` using
an additional metaclass argument.
(Contributed by Wenzel Jakob in :gh:`93012`.)
Expand Down
3 changes: 1 addition & 2 deletions Lib/test/test_stable_abi_ctypes.py

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

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
2 changes: 1 addition & 1 deletion Modules/_testcapi_feature_macros.inc
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Generated by Tools/scripts/stable_abi.py
// Generated by Tools/build/stable_abi.py

// Add an entry in dict `result` for each Stable ABI feature macro.

Expand Down
1 change: 0 additions & 1 deletion PC/python3dll.c

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 4 additions & 4 deletions Tools/build/stable_abi.py
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,7 @@ def _decorator(func):
def gen_python3dll(manifest, args, outfile):
"""Generate/check the source for the Windows stable ABI library"""
write = partial(print, file=outfile)
content = f"""
content = f"""\
/* Re-export stable Python ABI */

/* Generated by {SCRIPT_NAME} */
Expand Down Expand Up @@ -267,8 +267,8 @@ def gen_doc_annotations(manifest, args, outfile):
def gen_ctypes_test(manifest, args, outfile):
"""Generate/check the ctypes-based test for exported symbols"""
write = partial(print, file=outfile)
write(textwrap.dedent('''
# Generated by Tools/scripts/stable_abi.py
write(textwrap.dedent(f'''\
# Generated by {SCRIPT_NAME}

"""Test that all symbols of the Stable ABI are accessible using ctypes
"""
Expand Down Expand Up @@ -341,7 +341,7 @@ def test_windows_feature_macros(self):
def gen_testcapi_feature_macros(manifest, args, outfile):
"""Generate/check the stable ABI list for documentation annotations"""
write = partial(print, file=outfile)
write('// Generated by Tools/scripts/stable_abi.py')
write(f'// Generated by {SCRIPT_NAME}')
write()
write('// Add an entry in dict `result` for each Stable ABI feature macro.')
write()
Expand Down