mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
[3.12] GH-107263: Increase C stack limit for most functions, except _PyEval_EvalFrameDefault()
(GH-107535) (#107618)
GH-107263: Increase C stack limit for most functions, except `_PyEval_EvalFrameDefault()` (GH-107535)
* Set C recursion limit to 1500, set cost of eval loop to 2 frames, and compiler mutliply to 2.
(cherry picked from commit fa45958450
)
Co-authored-by: Mark Shannon <mark@hotpy.org>
This commit is contained in:
parent
58af2293c5
commit
98902d6c05
21 changed files with 57 additions and 45 deletions
|
@ -637,6 +637,11 @@ static inline void _Py_LeaveRecursiveCallPy(PyThreadState *tstate) {
|
|||
# pragma warning(disable:4102)
|
||||
#endif
|
||||
|
||||
|
||||
/* _PyEval_EvalFrameDefault() is a *big* function,
|
||||
* so consume 3 units of C stack */
|
||||
#define PY_EVAL_C_STACK_UNITS 2
|
||||
|
||||
PyObject* _Py_HOT_FUNCTION
|
||||
_PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int throwflag)
|
||||
{
|
||||
|
@ -691,6 +696,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int
|
|||
frame->previous = &entry_frame;
|
||||
cframe.current_frame = frame;
|
||||
|
||||
tstate->c_recursion_remaining -= (PY_EVAL_C_STACK_UNITS - 1);
|
||||
if (_Py_EnterRecursiveCallTstate(tstate, "")) {
|
||||
tstate->c_recursion_remaining--;
|
||||
tstate->py_recursion_remaining--;
|
||||
|
@ -990,7 +996,7 @@ exit_unwind:
|
|||
/* Restore previous cframe and exit */
|
||||
tstate->cframe = cframe.previous;
|
||||
assert(tstate->cframe->current_frame == frame->previous);
|
||||
_Py_LeaveRecursiveCallTstate(tstate);
|
||||
tstate->c_recursion_remaining += PY_EVAL_C_STACK_UNITS;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue