mirror of
https://github.com/python/cpython.git
synced 2025-11-10 02:21:40 +00:00
[3.13] gh-132744: Check recursion limit in _PY_FRAME_GENERAL (GH-132746) (GH-138032)
This commit is contained in:
parent
8f2280272d
commit
ebccd1de88
9 changed files with 164 additions and 122 deletions
|
|
@ -3205,6 +3205,7 @@ dummy_func(
|
|||
unused/1 + // Skip over the counter
|
||||
_CHECK_PEP_523 +
|
||||
_CHECK_FUNCTION_VERSION +
|
||||
_CHECK_RECURSION_REMAINING +
|
||||
_PY_FRAME_GENERAL +
|
||||
_SAVE_RETURN_OFFSET +
|
||||
_PUSH_FRAME;
|
||||
|
|
@ -3234,6 +3235,7 @@ dummy_func(
|
|||
_CHECK_PEP_523 +
|
||||
_CHECK_METHOD_VERSION +
|
||||
_EXPAND_METHOD +
|
||||
_CHECK_RECURSION_REMAINING +
|
||||
_PY_FRAME_GENERAL +
|
||||
_SAVE_RETURN_OFFSET +
|
||||
_PUSH_FRAME;
|
||||
|
|
@ -3302,6 +3304,9 @@ dummy_func(
|
|||
PyFunctionObject *func = (PyFunctionObject *)callable;
|
||||
PyCodeObject *code = (PyCodeObject *)func->func_code;
|
||||
DEOPT_IF(!_PyThreadState_HasStackSpace(tstate, code->co_framesize));
|
||||
}
|
||||
|
||||
op(_CHECK_RECURSION_REMAINING, (--)) {
|
||||
DEOPT_IF(tstate->py_recursion_remaining <= 1);
|
||||
}
|
||||
|
||||
|
|
@ -3339,6 +3344,7 @@ dummy_func(
|
|||
_INIT_CALL_BOUND_METHOD_EXACT_ARGS +
|
||||
_CHECK_FUNCTION_EXACT_ARGS +
|
||||
_CHECK_STACK_SPACE +
|
||||
_CHECK_RECURSION_REMAINING +
|
||||
_INIT_CALL_PY_EXACT_ARGS +
|
||||
_SAVE_RETURN_OFFSET +
|
||||
_PUSH_FRAME;
|
||||
|
|
@ -3348,6 +3354,7 @@ dummy_func(
|
|||
_CHECK_PEP_523 +
|
||||
_CHECK_FUNCTION_EXACT_ARGS +
|
||||
_CHECK_STACK_SPACE +
|
||||
_CHECK_RECURSION_REMAINING +
|
||||
_INIT_CALL_PY_EXACT_ARGS +
|
||||
_SAVE_RETURN_OFFSET +
|
||||
_PUSH_FRAME;
|
||||
|
|
|
|||
4
Python/executor_cases.c.h
generated
4
Python/executor_cases.c.h
generated
|
|
@ -3233,6 +3233,10 @@
|
|||
UOP_STAT_INC(uopcode, miss);
|
||||
JUMP_TO_JUMP_TARGET();
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case _CHECK_RECURSION_REMAINING: {
|
||||
if (tstate->py_recursion_remaining <= 1) {
|
||||
UOP_STAT_INC(uopcode, miss);
|
||||
JUMP_TO_JUMP_TARGET();
|
||||
|
|
|
|||
14
Python/generated_cases.c.h
generated
14
Python/generated_cases.c.h
generated
|
|
@ -961,6 +961,9 @@
|
|||
PyFunctionObject *func = (PyFunctionObject *)callable;
|
||||
PyCodeObject *code = (PyCodeObject *)func->func_code;
|
||||
DEOPT_IF(!_PyThreadState_HasStackSpace(tstate, code->co_framesize), CALL);
|
||||
}
|
||||
// _CHECK_RECURSION_REMAINING
|
||||
{
|
||||
DEOPT_IF(tstate->py_recursion_remaining <= 1, CALL);
|
||||
}
|
||||
// _INIT_CALL_PY_EXACT_ARGS
|
||||
|
|
@ -1044,6 +1047,10 @@
|
|||
Py_INCREF(method);
|
||||
Py_DECREF(callable);
|
||||
}
|
||||
// _CHECK_RECURSION_REMAINING
|
||||
{
|
||||
DEOPT_IF(tstate->py_recursion_remaining <= 1, CALL);
|
||||
}
|
||||
// _PY_FRAME_GENERAL
|
||||
args = &stack_pointer[-oparg];
|
||||
self_or_null = self;
|
||||
|
|
@ -1890,6 +1897,9 @@
|
|||
PyFunctionObject *func = (PyFunctionObject *)callable;
|
||||
PyCodeObject *code = (PyCodeObject *)func->func_code;
|
||||
DEOPT_IF(!_PyThreadState_HasStackSpace(tstate, code->co_framesize), CALL);
|
||||
}
|
||||
// _CHECK_RECURSION_REMAINING
|
||||
{
|
||||
DEOPT_IF(tstate->py_recursion_remaining <= 1, CALL);
|
||||
}
|
||||
// _INIT_CALL_PY_EXACT_ARGS
|
||||
|
|
@ -1955,6 +1965,10 @@
|
|||
PyFunctionObject *func = (PyFunctionObject *)callable;
|
||||
DEOPT_IF(func->func_version != func_version, CALL);
|
||||
}
|
||||
// _CHECK_RECURSION_REMAINING
|
||||
{
|
||||
DEOPT_IF(tstate->py_recursion_remaining <= 1, CALL);
|
||||
}
|
||||
// _PY_FRAME_GENERAL
|
||||
args = &stack_pointer[-oparg];
|
||||
self_or_null = stack_pointer[-1 - oparg];
|
||||
|
|
|
|||
4
Python/optimizer_cases.c.h
generated
4
Python/optimizer_cases.c.h
generated
|
|
@ -1660,6 +1660,10 @@
|
|||
break;
|
||||
}
|
||||
|
||||
case _CHECK_RECURSION_REMAINING: {
|
||||
break;
|
||||
}
|
||||
|
||||
case _INIT_CALL_PY_EXACT_ARGS: {
|
||||
_Py_UopsSymbol **args;
|
||||
_Py_UopsSymbol *self_or_null;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue