17db96d56Sopenharmony_ci#ifndef Py_INTERNAL_CEVAL_H
27db96d56Sopenharmony_ci#define Py_INTERNAL_CEVAL_H
37db96d56Sopenharmony_ci#ifdef __cplusplus
47db96d56Sopenharmony_ciextern "C" {
57db96d56Sopenharmony_ci#endif
67db96d56Sopenharmony_ci
77db96d56Sopenharmony_ci#ifndef Py_BUILD_CORE
87db96d56Sopenharmony_ci#  error "this header requires Py_BUILD_CORE define"
97db96d56Sopenharmony_ci#endif
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_ci/* Forward declarations */
127db96d56Sopenharmony_cistruct pyruntimestate;
137db96d56Sopenharmony_cistruct _ceval_runtime_state;
147db96d56Sopenharmony_ci
157db96d56Sopenharmony_ci/* WASI has limited call stack. Python's recursion limit depends on code
167db96d56Sopenharmony_ci   layout, optimization, and WASI runtime. Wasmtime can handle about 700-750
177db96d56Sopenharmony_ci   recursions, sometimes less. 600 is a more conservative limit. */
187db96d56Sopenharmony_ci#ifndef Py_DEFAULT_RECURSION_LIMIT
197db96d56Sopenharmony_ci#  ifdef __wasi__
207db96d56Sopenharmony_ci#    define Py_DEFAULT_RECURSION_LIMIT 600
217db96d56Sopenharmony_ci#  else
227db96d56Sopenharmony_ci#    define Py_DEFAULT_RECURSION_LIMIT 1000
237db96d56Sopenharmony_ci#  endif
247db96d56Sopenharmony_ci#endif
257db96d56Sopenharmony_ci
267db96d56Sopenharmony_ci#include "pycore_interp.h"        // PyInterpreterState.eval_frame
277db96d56Sopenharmony_ci#include "pycore_pystate.h"       // _PyThreadState_GET()
287db96d56Sopenharmony_ci
297db96d56Sopenharmony_ci
307db96d56Sopenharmony_ciextern void _Py_FinishPendingCalls(PyThreadState *tstate);
317db96d56Sopenharmony_ciextern void _PyEval_InitRuntimeState(struct _ceval_runtime_state *);
327db96d56Sopenharmony_ciextern void _PyEval_InitState(struct _ceval_state *, PyThread_type_lock);
337db96d56Sopenharmony_ciextern void _PyEval_FiniState(struct _ceval_state *ceval);
347db96d56Sopenharmony_ciPyAPI_FUNC(void) _PyEval_SignalReceived(PyInterpreterState *interp);
357db96d56Sopenharmony_ciPyAPI_FUNC(int) _PyEval_AddPendingCall(
367db96d56Sopenharmony_ci    PyInterpreterState *interp,
377db96d56Sopenharmony_ci    int (*func)(void *),
387db96d56Sopenharmony_ci    void *arg);
397db96d56Sopenharmony_ciPyAPI_FUNC(void) _PyEval_SignalAsyncExc(PyInterpreterState *interp);
407db96d56Sopenharmony_ci#ifdef HAVE_FORK
417db96d56Sopenharmony_ciextern PyStatus _PyEval_ReInitThreads(PyThreadState *tstate);
427db96d56Sopenharmony_ci#endif
437db96d56Sopenharmony_ci
447db96d56Sopenharmony_ci// Used by sys.call_tracing()
457db96d56Sopenharmony_ciextern PyObject* _PyEval_CallTracing(PyObject *func, PyObject *args);
467db96d56Sopenharmony_ci
477db96d56Sopenharmony_ci// Used by sys.get_asyncgen_hooks()
487db96d56Sopenharmony_ciextern PyObject* _PyEval_GetAsyncGenFirstiter(void);
497db96d56Sopenharmony_ciextern PyObject* _PyEval_GetAsyncGenFinalizer(void);
507db96d56Sopenharmony_ci
517db96d56Sopenharmony_ci// Used by sys.set_asyncgen_hooks()
527db96d56Sopenharmony_ciextern int _PyEval_SetAsyncGenFirstiter(PyObject *);
537db96d56Sopenharmony_ciextern int _PyEval_SetAsyncGenFinalizer(PyObject *);
547db96d56Sopenharmony_ci
557db96d56Sopenharmony_ci// Used by sys.get_coroutine_origin_tracking_depth()
567db96d56Sopenharmony_ci// and sys.set_coroutine_origin_tracking_depth()
577db96d56Sopenharmony_ciextern int _PyEval_GetCoroutineOriginTrackingDepth(void);
587db96d56Sopenharmony_ciextern int _PyEval_SetCoroutineOriginTrackingDepth(int depth);
597db96d56Sopenharmony_ci
607db96d56Sopenharmony_ciextern void _PyEval_Fini(void);
617db96d56Sopenharmony_ci
627db96d56Sopenharmony_ci
637db96d56Sopenharmony_ciextern PyObject* _PyEval_GetBuiltins(PyThreadState *tstate);
647db96d56Sopenharmony_ciextern PyObject* _PyEval_BuiltinsFromGlobals(
657db96d56Sopenharmony_ci    PyThreadState *tstate,
667db96d56Sopenharmony_ci    PyObject *globals);
677db96d56Sopenharmony_ci
687db96d56Sopenharmony_ci
697db96d56Sopenharmony_cistatic inline PyObject*
707db96d56Sopenharmony_ci_PyEval_EvalFrame(PyThreadState *tstate, struct _PyInterpreterFrame *frame, int throwflag)
717db96d56Sopenharmony_ci{
727db96d56Sopenharmony_ci    if (tstate->interp->eval_frame == NULL) {
737db96d56Sopenharmony_ci        return _PyEval_EvalFrameDefault(tstate, frame, throwflag);
747db96d56Sopenharmony_ci    }
757db96d56Sopenharmony_ci    return tstate->interp->eval_frame(tstate, frame, throwflag);
767db96d56Sopenharmony_ci}
777db96d56Sopenharmony_ci
787db96d56Sopenharmony_ciextern PyObject*
797db96d56Sopenharmony_ci_PyEval_Vector(PyThreadState *tstate,
807db96d56Sopenharmony_ci            PyFunctionObject *func, PyObject *locals,
817db96d56Sopenharmony_ci            PyObject* const* args, size_t argcount,
827db96d56Sopenharmony_ci            PyObject *kwnames);
837db96d56Sopenharmony_ci
847db96d56Sopenharmony_ciextern int _PyEval_ThreadsInitialized(struct pyruntimestate *runtime);
857db96d56Sopenharmony_ciextern PyStatus _PyEval_InitGIL(PyThreadState *tstate);
867db96d56Sopenharmony_ciextern void _PyEval_FiniGIL(PyInterpreterState *interp);
877db96d56Sopenharmony_ci
887db96d56Sopenharmony_ciextern void _PyEval_ReleaseLock(PyThreadState *tstate);
897db96d56Sopenharmony_ci
907db96d56Sopenharmony_ciextern void _PyEval_DeactivateOpCache(void);
917db96d56Sopenharmony_ci
927db96d56Sopenharmony_ci
937db96d56Sopenharmony_ci/* --- _Py_EnterRecursiveCall() ----------------------------------------- */
947db96d56Sopenharmony_ci
957db96d56Sopenharmony_ci#ifdef USE_STACKCHECK
967db96d56Sopenharmony_ci/* With USE_STACKCHECK macro defined, trigger stack checks in
977db96d56Sopenharmony_ci   _Py_CheckRecursiveCall() on every 64th call to _Py_EnterRecursiveCall. */
987db96d56Sopenharmony_cistatic inline int _Py_MakeRecCheck(PyThreadState *tstate)  {
997db96d56Sopenharmony_ci    return (tstate->recursion_remaining-- <= 0
1007db96d56Sopenharmony_ci            || (tstate->recursion_remaining & 63) == 0);
1017db96d56Sopenharmony_ci}
1027db96d56Sopenharmony_ci#else
1037db96d56Sopenharmony_cistatic inline int _Py_MakeRecCheck(PyThreadState *tstate) {
1047db96d56Sopenharmony_ci    return tstate->recursion_remaining-- <= 0;
1057db96d56Sopenharmony_ci}
1067db96d56Sopenharmony_ci#endif
1077db96d56Sopenharmony_ci
1087db96d56Sopenharmony_ciPyAPI_FUNC(int) _Py_CheckRecursiveCall(
1097db96d56Sopenharmony_ci    PyThreadState *tstate,
1107db96d56Sopenharmony_ci    const char *where);
1117db96d56Sopenharmony_ci
1127db96d56Sopenharmony_cistatic inline int _Py_EnterRecursiveCallTstate(PyThreadState *tstate,
1137db96d56Sopenharmony_ci                                               const char *where) {
1147db96d56Sopenharmony_ci    return (_Py_MakeRecCheck(tstate) && _Py_CheckRecursiveCall(tstate, where));
1157db96d56Sopenharmony_ci}
1167db96d56Sopenharmony_ci
1177db96d56Sopenharmony_cistatic inline int _Py_EnterRecursiveCall(const char *where) {
1187db96d56Sopenharmony_ci    PyThreadState *tstate = _PyThreadState_GET();
1197db96d56Sopenharmony_ci    return _Py_EnterRecursiveCallTstate(tstate, where);
1207db96d56Sopenharmony_ci}
1217db96d56Sopenharmony_ci
1227db96d56Sopenharmony_cistatic inline void _Py_LeaveRecursiveCallTstate(PyThreadState *tstate)  {
1237db96d56Sopenharmony_ci    tstate->recursion_remaining++;
1247db96d56Sopenharmony_ci}
1257db96d56Sopenharmony_ci
1267db96d56Sopenharmony_cistatic inline void _Py_LeaveRecursiveCall(void)  {
1277db96d56Sopenharmony_ci    PyThreadState *tstate = _PyThreadState_GET();
1287db96d56Sopenharmony_ci    _Py_LeaveRecursiveCallTstate(tstate);
1297db96d56Sopenharmony_ci}
1307db96d56Sopenharmony_ci
1317db96d56Sopenharmony_ciextern struct _PyInterpreterFrame* _PyEval_GetFrame(void);
1327db96d56Sopenharmony_ci
1337db96d56Sopenharmony_ciextern PyObject* _Py_MakeCoro(PyFunctionObject *func);
1347db96d56Sopenharmony_ci
1357db96d56Sopenharmony_ci#ifdef __cplusplus
1367db96d56Sopenharmony_ci}
1377db96d56Sopenharmony_ci#endif
1387db96d56Sopenharmony_ci#endif /* !Py_INTERNAL_CEVAL_H */
139