diff options
author | Mark Shannon <mark@hotpy.org> | 2025-02-25 09:24:48 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-02-25 09:24:48 (GMT) |
commit | 014223649c33b2febbccfa221c2ab7f18a8c0847 (patch) | |
tree | 5fb6432982ab3085d9275f20769f8fbcc581666b /Python/generated_cases.c.h | |
parent | 99088ab081279329b8362e1c24533fa0be303e6f (diff) | |
download | cpython-014223649c33b2febbccfa221c2ab7f18a8c0847.zip cpython-014223649c33b2febbccfa221c2ab7f18a8c0847.tar.gz cpython-014223649c33b2febbccfa221c2ab7f18a8c0847.tar.bz2 |
GH-130396: Use computed stack limits on linux (GH-130398)
* Implement C recursion protection with limit pointers for Linux, MacOS and Windows
* Remove calls to PyOS_CheckStack
* Add stack protection to parser
* Make tests more robust to low stacks
* Improve error messages for stack overflow
Diffstat (limited to 'Python/generated_cases.c.h')
-rw-r--r-- | Python/generated_cases.c.h | 11 |
1 files changed, 3 insertions, 8 deletions
diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index 01fa857..268e883 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -2222,7 +2222,7 @@ JUMP_TO_PREDICTED(CALL); } // CPython promises to check all non-vectorcall function calls. - if (tstate->c_recursion_remaining <= 0) { + if (_Py_ReachedRecursionLimit(tstate)) { UPDATE_MISS_STATS(CALL); assert(_PyOpcode_Deopt[opcode] == (CALL)); JUMP_TO_PREDICTED(CALL); @@ -2230,7 +2230,6 @@ STAT_INC(CALL, hit); PyCFunction cfunc = PyCFunction_GET_FUNCTION(callable_o); _PyStackRef arg = args[0]; - _Py_EnterRecursiveCallTstateUnchecked(tstate); _PyFrame_SetStackPointer(frame, stack_pointer); PyObject *res_o = _PyCFunction_TrampolineCall(cfunc, PyCFunction_GET_SELF(callable_o), PyStackRef_AsPyObjectBorrow(arg)); stack_pointer = _PyFrame_GetStackPointer(frame); @@ -3599,14 +3598,13 @@ JUMP_TO_PREDICTED(CALL); } // CPython promises to check all non-vectorcall function calls. - if (tstate->c_recursion_remaining <= 0) { + if (_Py_ReachedRecursionLimit(tstate)) { UPDATE_MISS_STATS(CALL); assert(_PyOpcode_Deopt[opcode] == (CALL)); JUMP_TO_PREDICTED(CALL); } STAT_INC(CALL, hit); PyCFunction cfunc = meth->ml_meth; - _Py_EnterRecursiveCallTstateUnchecked(tstate); _PyFrame_SetStackPointer(frame, stack_pointer); PyObject *res_o = _PyCFunction_TrampolineCall(cfunc, self, NULL); stack_pointer = _PyFrame_GetStackPointer(frame); @@ -3696,7 +3694,7 @@ JUMP_TO_PREDICTED(CALL); } // CPython promises to check all non-vectorcall function calls. - if (tstate->c_recursion_remaining <= 0) { + if (_Py_ReachedRecursionLimit(tstate)) { UPDATE_MISS_STATS(CALL); assert(_PyOpcode_Deopt[opcode] == (CALL)); JUMP_TO_PREDICTED(CALL); @@ -3711,7 +3709,6 @@ } STAT_INC(CALL, hit); PyCFunction cfunc = meth->ml_meth; - _Py_EnterRecursiveCallTstateUnchecked(tstate); _PyFrame_SetStackPointer(frame, stack_pointer); PyObject *res_o = _PyCFunction_TrampolineCall(cfunc, PyStackRef_AsPyObjectBorrow(self_stackref), @@ -7292,7 +7289,6 @@ /* Restore previous frame and return. */ tstate->current_frame = frame->previous; assert(!_PyErr_Occurred(tstate)); - tstate->c_recursion_remaining += PY_EVAL_C_STACK_UNITS; PyObject *result = PyStackRef_AsPyObjectSteal(retval); stack_pointer += -1; assert(WITHIN_STACK_BOUNDS()); @@ -12081,7 +12077,6 @@ JUMP_TO_LABEL(error); if (frame->owner == FRAME_OWNED_BY_INTERPRETER) { /* Restore previous frame and exit */ tstate->current_frame = frame->previous; - tstate->c_recursion_remaining += PY_EVAL_C_STACK_UNITS; return NULL; } next_instr = frame->instr_ptr; |