]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-41834: Remove _Py_CheckRecursionLimit variable (GH-22359)
authorVictor Stinner <vstinner@python.org>
Wed, 23 Sep 2020 12:04:57 +0000 (14:04 +0200)
committerGitHub <noreply@github.com>
Wed, 23 Sep 2020 12:04:57 +0000 (14:04 +0200)
Remove the global _Py_CheckRecursionLimit variable: it has been
replaced by ceval.recursion_limit of the PyInterpreterState
structure.

There is no need to keep the variable for the stable ABI, since
Py_EnterRecursiveCall() and Py_LeaveRecursiveCall() were not usable
in Python 3.8 and older: these macros accessed PyThreadState members,
whereas the PyThreadState structure is opaque in the limited C API.

Doc/whatsnew/3.10.rst
Include/internal/pycore_ceval.h
Misc/NEWS.d/next/C API/2020-09-22-14-47-12.bpo-41834.nrOrDU.rst [new file with mode: 0644]
PC/python3dll.c
Python/ceval.c
Tools/c-analyzer/TODO
Tools/c-analyzer/known.tsv

index f88281a934ca195d17efd3bbb559b0e84cf06922..606fad2fdcf059249d7a2f4c70bf1865f05c71d3 100644 (file)
@@ -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`.)
index aafb533b57d5f048c1ba15adcbb15e99a9bf8423..bbb667ea32d27efbef130dbf4b17fb545661d8a6 100644 (file)
@@ -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. */
diff --git a/Misc/NEWS.d/next/C API/2020-09-22-14-47-12.bpo-41834.nrOrDU.rst b/Misc/NEWS.d/next/C API/2020-09-22-14-47-12.bpo-41834.nrOrDU.rst
new file mode 100644 (file)
index 0000000..07043dc
--- /dev/null
@@ -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.
index f72f2c8af19d2bfcad7b9c3a51a77ff10fb2d015..ff69ea7ca5efaa47d7829d2dc450a833981349cc 100644 (file)
@@ -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)
index 3de372f45a251706a17d708254a9b6f8d882db5f..4bb4b820b8e17a5595904ff64a98afa0b538b03c 100644 (file)
@@ -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
@@ -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
@@ -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. */
index 1134055f9a8fd812e6c8c87b86d8de0bed2bcb24..f5c1a92f856959c60c17b189d539e76935b6124f 100644 (file)
@@ -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]
index f92b45e5b4d8599a5439d95a8ad89c29b7649913..f8c12a3944d9b7de2054369c99a92cff303d5040 100644 (file)
@@ -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