* 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`.)
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.
_PyRemoteDebuggerSupport remote_debugger_support;
};
-# define Py_C_RECURSION_LIMIT 5000
-
/* other API */
/* Similar to PyThreadState_Get(), but don't issue a fatal error
--- /dev/null
+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.
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.
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).