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