mirror of
https://github.com/python/cpython.git
synced 2025-08-23 10:16:01 +00:00
bpo-45753: Make recursion checks more efficient. (GH-29524)
* Uses recursion remaining, instead of recursion depth to speed up check against recursion limit.
This commit is contained in:
parent
9bf2cbc4c4
commit
b931077375
10 changed files with 50 additions and 43 deletions
|
@ -1187,20 +1187,14 @@ sys_setrecursionlimit_impl(PyObject *module, int new_limit)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
/* Issue #25274: When the recursion depth hits the recursion limit in
|
||||
_Py_CheckRecursiveCall(), the overflowed flag of the thread state is
|
||||
set to 1 and a RecursionError is raised. The overflowed flag is reset
|
||||
to 0 when the recursion depth goes below the low-water mark: see
|
||||
Py_LeaveRecursiveCall().
|
||||
|
||||
Reject too low new limit if the current recursion depth is higher than
|
||||
the new low-water mark. Otherwise it may not be possible anymore to
|
||||
reset the overflowed flag to 0. */
|
||||
if (tstate->recursion_depth >= new_limit) {
|
||||
/* Reject too low new limit if the current recursion depth is higher than
|
||||
the new low-water mark. */
|
||||
int depth = tstate->recursion_limit - tstate->recursion_remaining;
|
||||
if (depth >= new_limit) {
|
||||
_PyErr_Format(tstate, PyExc_RecursionError,
|
||||
"cannot set the recursion limit to %i at "
|
||||
"the recursion depth %i: the limit is too low",
|
||||
new_limit, tstate->recursion_depth);
|
||||
new_limit, depth);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue