Skip to content

bpo-41834: Remove _Py_CheckRecursionLimit variable #22359

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Sep 23, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions Doc/whatsnew/3.10.rst
Original file line number Diff line number Diff line change
Expand Up @@ -314,3 +314,7 @@ Removed
* Removed ``PyUnicode_AsUnicodeCopy()``. Please use :c:func:`PyUnicode_AsUCS4Copy` or
:c:func:`PyUnicode_AsWideCharString`
(Contributed by Inada Naoki in :issue:`41103`.)

* Removed ``_Py_CheckRecursionLimit`` variable: it has been replaced by
``ceval.recursion_limit`` of the :c:type:`PyInterpreterState` structure.
(Contributed by Victor Stinner in :issue:`41834`.)
2 changes: 0 additions & 2 deletions Include/internal/pycore_ceval.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,6 @@ extern void _PyEval_ReleaseLock(PyThreadState *tstate);

/* --- _Py_EnterRecursiveCall() ----------------------------------------- */

PyAPI_DATA(int) _Py_CheckRecursionLimit;

#ifdef USE_STACKCHECK
/* With USE_STACKCHECK macro defined, trigger stack checks in
_Py_CheckRecursiveCall() on every 64th call to Py_EnterRecursiveCall. */
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Remove the ``_Py_CheckRecursionLimit`` variable: it has been replaced by
``ceval.recursion_limit`` of the :c:type:`PyInterpreterState`
structure. Patch by Victor Stinner.
1 change: 0 additions & 1 deletion PC/python3dll.c
Original file line number Diff line number Diff line change
Expand Up @@ -663,7 +663,6 @@ EXPORT_FUNC(PyWeakref_NewProxy)
EXPORT_FUNC(PyWeakref_NewRef)
EXPORT_FUNC(PyWrapper_New)

EXPORT_DATA(_Py_CheckRecursionLimit)
EXPORT_DATA(_Py_EllipsisObject)
EXPORT_DATA(_Py_FalseStruct)
EXPORT_DATA(_Py_NoneStruct)
Expand Down
16 changes: 3 additions & 13 deletions Python/ceval.c
Original file line number Diff line number Diff line change
Expand Up @@ -741,15 +741,12 @@ Py_MakePendingCalls(void)
/* The interpreter's recursion limit */

#ifndef Py_DEFAULT_RECURSION_LIMIT
#define Py_DEFAULT_RECURSION_LIMIT 1000
# define Py_DEFAULT_RECURSION_LIMIT 1000
#endif

int _Py_CheckRecursionLimit = Py_DEFAULT_RECURSION_LIMIT;

void
_PyEval_InitRuntimeState(struct _ceval_runtime_state *ceval)
{
_Py_CheckRecursionLimit = Py_DEFAULT_RECURSION_LIMIT;
#ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
_gil_initialize(&ceval->gil);
#endif
Expand Down Expand Up @@ -797,14 +794,11 @@ Py_SetRecursionLimit(int new_limit)
{
PyThreadState *tstate = _PyThreadState_GET();
tstate->interp->ceval.recursion_limit = new_limit;
if (_Py_IsMainInterpreter(tstate)) {
_Py_CheckRecursionLimit = new_limit;
}
}

/* The function _Py_EnterRecursiveCall() only calls _Py_CheckRecursiveCall()
if the recursion_depth reaches _Py_CheckRecursionLimit.
If USE_STACKCHECK, the macro decrements _Py_CheckRecursionLimit
if the recursion_depth reaches recursion_limit.
If USE_STACKCHECK, the macro decrements recursion_limit
to guarantee that _Py_CheckRecursiveCall() is regularly called.
Without USE_STACKCHECK, there is no need for this. */
int
Expand All @@ -819,10 +813,6 @@ _Py_CheckRecursiveCall(PyThreadState *tstate, const char *where)
_PyErr_SetString(tstate, PyExc_MemoryError, "Stack overflow");
return -1;
}
if (_Py_IsMainInterpreter(tstate)) {
/* Needed for ABI backwards-compatibility (see bpo-31857) */
_Py_CheckRecursionLimit = recursion_limit;
}
#endif
if (tstate->recursion_critical)
/* Somebody asked that we don't check for recursion. */
Expand Down
1 change: 0 additions & 1 deletion Tools/c-analyzer/TODO
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,6 @@ Objects/tupleobject.c:_Py_tuple_zero_allocs Py_ssize_t _Py_
Objects/typeobject.c:next_version_tag static unsigned int next_version_tag
Python/Python-ast.c:init_types():initialized static int initialized
Python/bootstrap_hash.c:urandom_cache static struct { int fd; dev_t st_dev; ino_t st_ino; } urandom_cache
Python/ceval.c:_Py_CheckRecursionLimit int _Py_CheckRecursionLimit
Python/ceval.c:lltrace static int lltrace
Python/ceval.c:make_pending_calls():busy static int busy
Python/dynload_shlib.c:handles static struct { dev_t dev; ino_t ino; void *handle; } handles[128]
Expand Down
1 change: 0 additions & 1 deletion Tools/c-analyzer/known.tsv
Original file line number Diff line number Diff line change
Expand Up @@ -805,7 +805,6 @@ Objects/iterobject.c - PyCallIter_Type variable PyTypeObject PyCallIter_Type
Objects/capsule.c - PyCapsule_Type variable PyTypeObject PyCapsule_Type
Objects/cellobject.c - PyCell_Type variable PyTypeObject PyCell_Type
Objects/methodobject.c - PyCFunction_Type variable PyTypeObject PyCFunction_Type
Python/ceval.c - _Py_CheckRecursionLimit variable int _Py_CheckRecursionLimit
Objects/descrobject.c - PyClassMethodDescr_Type variable PyTypeObject PyClassMethodDescr_Type
Objects/funcobject.c - PyClassMethod_Type variable PyTypeObject PyClassMethod_Type
Objects/codeobject.c - PyCode_Type variable PyTypeObject PyCode_Type
Expand Down