mirror of
https://github.com/python/cpython.git
synced 2025-12-08 06:10:17 +00:00
bpo-38644: Add Py_EnterRecursiveCall() to the limited API (GH-17046)
Provide Py_EnterRecursiveCall() and Py_LeaveRecursiveCall() as regular functions for the limited API. Previously, there were defined as macros, but these macros didn't work with the limited API which cannot access PyThreadState.recursion_depth field. Remove _Py_CheckRecursionLimit from the stable ABI. Add Include/cpython/ceval.h header file.
This commit is contained in:
parent
6552563b3d
commit
f4b1e3d7c6
9 changed files with 101 additions and 38 deletions
|
|
@ -715,15 +715,21 @@ recursion depth automatically).
|
|||
case, a :exc:`RecursionError` is set and a nonzero value is returned.
|
||||
Otherwise, zero is returned.
|
||||
|
||||
*where* should be a string such as ``" in instance check"`` to be
|
||||
concatenated to the :exc:`RecursionError` message caused by the recursion
|
||||
*where* should be a UTF-8 encoded string such as ``" in instance check"`` to
|
||||
be concatenated to the :exc:`RecursionError` message caused by the recursion
|
||||
depth limit.
|
||||
|
||||
.. c:function:: void Py_LeaveRecursiveCall()
|
||||
.. versionchanged:: 3.9
|
||||
This function is now also available in the limited 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.
|
||||
|
||||
Properly implementing :c:member:`~PyTypeObject.tp_repr` for container types requires
|
||||
special recursion handling. In addition to protecting the stack,
|
||||
:c:member:`~PyTypeObject.tp_repr` also needs to track objects to prevent cycles. The
|
||||
|
|
|
|||
|
|
@ -197,6 +197,12 @@ Optimizations
|
|||
Build and C API Changes
|
||||
=======================
|
||||
|
||||
* Provide :c:func:`Py_EnterRecursiveCall` and :c:func:`Py_LeaveRecursiveCall`
|
||||
as regular functions for the limited API. Previously, there were defined as
|
||||
macros, but these macros didn't work with the limited API which cannot access
|
||||
``PyThreadState.recursion_depth`` field. Remove ``_Py_CheckRecursionLimit``
|
||||
from the stable ABI.
|
||||
(Contributed by Victor Stinner in :issue:`38644`.)
|
||||
* Add a new public :c:func:`PyObject_CallNoArgs` function to the C API, which
|
||||
calls a callable Python object without any arguments. It is the most efficient
|
||||
way to call a callable Python object without any argument.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue