mirror of
https://github.com/python/cpython.git
synced 2025-07-07 11:25:30 +00:00
gh-133079: Remove Py_C_RECURSION_LIMIT & PyThreadState.c_recursion_remaining (GH-133080)
Both were added in 3.13, are undocumented, and don't make sense in 3.14 due to changes in the stack overflow detection machinery (gh-112282). PEP 387 exception for skipping a deprecation period: https://github.com/python/steering-council/issues/288
This commit is contained in:
parent
208d06fd51
commit
0c26dbd16e
5 changed files with 12 additions and 6 deletions
|
@ -2280,3 +2280,10 @@ Removed
|
|||
* Remove the private ``_Py_InitializeMain()`` function. It was a
|
||||
:term:`provisional API` added to Python 3.8 by :pep:`587`.
|
||||
(Contributed by Victor Stinner in :gh:`129033`.)
|
||||
|
||||
* The undocumented APIs :c:macro:`!Py_C_RECURSION_LIMIT` and
|
||||
:c:member:`!PyThreadState.c_recursion_remaining`, added in 3.13, are removed
|
||||
without a deprecation period.
|
||||
Please use :c:func:`Py_EnterRecursiveCall` to guard against runaway recursion
|
||||
in C code.
|
||||
(Removed in :gh:`133079`, see also :gh:`130396`.)
|
||||
|
|
|
@ -118,8 +118,6 @@ struct _ts {
|
|||
|
||||
int py_recursion_remaining;
|
||||
int py_recursion_limit;
|
||||
|
||||
int c_recursion_remaining; /* Retained for backwards compatibility. Do not use */
|
||||
int recursion_headroom; /* Allow 50 more calls to handle any errors. */
|
||||
|
||||
/* 'tracing' keeps track of the execution depth when tracing/profiling.
|
||||
|
@ -210,8 +208,6 @@ struct _ts {
|
|||
_PyRemoteDebuggerSupport remote_debugger_support;
|
||||
};
|
||||
|
||||
# define Py_C_RECURSION_LIMIT 5000
|
||||
|
||||
/* other API */
|
||||
|
||||
/* Similar to PyThreadState_Get(), but don't issue a fatal error
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
The undocumented APIs :c:macro:`!Py_C_RECURSION_LIMIT` and
|
||||
:c:member:`!PyThreadState.c_recursion_remaining`, added in 3.13, are removed
|
||||
without a deprecation period.
|
|
@ -1559,7 +1559,6 @@ init_threadstate(_PyThreadStateImpl *_tstate,
|
|||
|
||||
tstate->py_recursion_limit = interp->ceval.recursion_limit;
|
||||
tstate->py_recursion_remaining = interp->ceval.recursion_limit;
|
||||
tstate->c_recursion_remaining = 2;
|
||||
tstate->exc_info = &tstate->exc_state;
|
||||
|
||||
// PyGILState_Release must not try to delete this thread state.
|
||||
|
|
|
@ -73,7 +73,8 @@ It will be more complex in the JIT.
|
|||
|
||||
Another important piece of VM state is the **thread state**, held in `tstate`.
|
||||
The current frame pointer, `frame`, is always equal to `tstate->current_frame`.
|
||||
The thread state also holds the exception state (`tstate->exc_info`) and the recursion counters (`tstate->c_recursion_remaining` and `tstate->py_recursion_remaining`).
|
||||
The thread state also holds the exception state (`tstate->exc_info`) and
|
||||
recursion tracking data (`tstate->py_recursion_remaining`, `tstate->c_stack*`).
|
||||
|
||||
The thread state is also used to access the **interpreter state** (`tstate->interp`), which is important since the "eval breaker" flags are stored there (`tstate->interp->ceval.eval_breaker`, an "atomic" variable), as well as the "PEP 523 function" (`tstate->interp->eval_frame`).
|
||||
The interpreter state also holds the optimizer state (`optimizer` and some counters).
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue