summaryrefslogtreecommitdiffstats
path: root/Include/ceval.h
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@python.org>2019-11-04 18:48:34 (GMT)
committerGitHub <noreply@github.com>2019-11-04 18:48:34 (GMT)
commitf4b1e3d7c64985f5d5b00f6cc9a1c146bbbfd613 (patch)
treeb42e4aaf30370f71b5622f8a41976ac71706d8e8 /Include/ceval.h
parent6552563b3d5061816720a5a6c7d4ffd6ba35b98b (diff)
downloadcpython-f4b1e3d7c64985f5d5b00f6cc9a1c146bbbfd613.zip
cpython-f4b1e3d7c64985f5d5b00f6cc9a1c146bbbfd613.tar.gz
cpython-f4b1e3d7c64985f5d5b00f6cc9a1c146bbbfd613.tar.bz2
bpo-38644: Add Py_EnterRecursiveCall() to the limited API (GH-17046)
Provide Py_EnterRecursiveCall() and Py_LeaveRecursiveCall() as regular functions for the limited API. Previously, there were defined as macros, but these macros didn't work with the limited API which cannot access PyThreadState.recursion_depth field. Remove _Py_CheckRecursionLimit from the stable ABI. Add Include/cpython/ceval.h header file.
Diffstat (limited to 'Include/ceval.h')
-rw-r--r--Include/ceval.h43
1 files changed, 8 insertions, 35 deletions
diff --git a/Include/ceval.h b/Include/ceval.h
index 61db777..8da779b 100644
--- a/Include/ceval.h
+++ b/Include/ceval.h
@@ -85,41 +85,8 @@ PyAPI_FUNC(int) Py_MakePendingCalls(void);
PyAPI_FUNC(void) Py_SetRecursionLimit(int);
PyAPI_FUNC(int) Py_GetRecursionLimit(void);
-#define Py_EnterRecursiveCall(where) \
- (_Py_MakeRecCheck(PyThreadState_GET()->recursion_depth) && \
- _Py_CheckRecursiveCall(where))
-#define Py_LeaveRecursiveCall() \
- do{ if(_Py_MakeEndRecCheck(PyThreadState_GET()->recursion_depth)) \
- PyThreadState_GET()->overflowed = 0; \
- } while(0)
-PyAPI_FUNC(int) _Py_CheckRecursiveCall(const char *where);
-
-/* Due to the macros in which it's used, _Py_CheckRecursionLimit is in
- the stable ABI. It should be removed therefrom when possible.
-*/
-PyAPI_DATA(int) _Py_CheckRecursionLimit;
-
-#ifdef USE_STACKCHECK
-/* With USE_STACKCHECK, trigger stack checks in _Py_CheckRecursiveCall()
- on every 64th call to Py_EnterRecursiveCall.
-*/
-# define _Py_MakeRecCheck(x) \
- (++(x) > _Py_CheckRecursionLimit || \
- ++(PyThreadState_GET()->stackcheck_counter) > 64)
-#else
-# define _Py_MakeRecCheck(x) (++(x) > _Py_CheckRecursionLimit)
-#endif
-
-/* Compute the "lower-water mark" for a recursion limit. When
- * Py_LeaveRecursiveCall() is called with a recursion depth below this mark,
- * the overflowed flag is reset to 0. */
-#define _Py_RecursionLimitLowerWaterMark(limit) \
- (((limit) > 200) \
- ? ((limit) - 50) \
- : (3 * ((limit) >> 2)))
-
-#define _Py_MakeEndRecCheck(x) \
- (--(x) < _Py_RecursionLimitLowerWaterMark(_Py_CheckRecursionLimit))
+PyAPI_FUNC(int) Py_EnterRecursiveCall(const char *where);
+PyAPI_FUNC(void) Py_LeaveRecursiveCall(void);
#define Py_ALLOW_RECURSION \
do { unsigned char _old = PyThreadState_GET()->recursion_critical;\
@@ -224,6 +191,12 @@ PyAPI_FUNC(int) _PyEval_SliceIndexNotNone(PyObject *, Py_ssize_t *);
#define FVS_MASK 0x4
#define FVS_HAVE_SPEC 0x4
+#ifndef Py_LIMITED_API
+# define Py_CPYTHON_CEVAL_H
+# include "cpython/ceval.h"
+# undef Py_CPYTHON_CEVAL_H
+#endif
+
#ifdef __cplusplus
}
#endif