mirror of
https://github.com/python/cpython.git
synced 2025-08-19 00:00:48 +00:00
* Add "limited-c-api" and "stable-api" targets * Rename the "stable-abi-list" target to "limited-api-list"
This commit is contained in:
parent
6024a75b10
commit
d81bcc2327
10 changed files with 42 additions and 29 deletions
|
@ -806,7 +806,7 @@ 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)
|
||||
|
||||
|
@ -814,7 +814,7 @@ because the :ref:`call protocol <call>` takes care of recursion handling.
|
|||
*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,
|
||||
|
|
|
@ -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
|
||||
|
||||
|
@ -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``.
|
||||
|
@ -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.
|
||||
|
@ -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
|
||||
|
@ -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:
|
||||
|
||||
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::
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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`.)
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue