|
|
#ifndef Py_INTERNAL_CEVAL_H |
|
|
#define Py_INTERNAL_CEVAL_H |
|
|
#ifdef __cplusplus |
|
|
extern "C" { |
|
|
#endif |
|
|
|
|
|
#ifndef Py_BUILD_CORE |
|
|
# error "this header requires Py_BUILD_CORE define" |
|
|
#endif |
|
|
|
|
|
|
|
|
struct pyruntimestate; |
|
|
struct _ceval_runtime_state; |
|
|
|
|
|
#include "pycore_interp.h" |
|
|
|
|
|
extern void _Py_FinishPendingCalls(PyThreadState *tstate); |
|
|
extern void _PyEval_InitRuntimeState(struct _ceval_runtime_state *); |
|
|
extern int _PyEval_InitState(struct _ceval_state *ceval); |
|
|
extern void _PyEval_FiniState(struct _ceval_state *ceval); |
|
|
PyAPI_FUNC(void) _PyEval_SignalReceived(PyInterpreterState *interp); |
|
|
PyAPI_FUNC(int) _PyEval_AddPendingCall( |
|
|
PyInterpreterState *interp, |
|
|
int (*func)(void *), |
|
|
void *arg); |
|
|
PyAPI_FUNC(void) _PyEval_SignalAsyncExc(PyInterpreterState *interp); |
|
|
#ifdef HAVE_FORK |
|
|
extern PyStatus _PyEval_ReInitThreads(PyThreadState *tstate); |
|
|
#endif |
|
|
PyAPI_FUNC(void) _PyEval_SetCoroutineOriginTrackingDepth( |
|
|
PyThreadState *tstate, |
|
|
int new_depth); |
|
|
|
|
|
void _PyEval_Fini(void); |
|
|
|
|
|
|
|
|
extern PyObject* _PyEval_GetBuiltins(PyThreadState *tstate); |
|
|
extern PyObject *_PyEval_BuiltinsFromGlobals( |
|
|
PyThreadState *tstate, |
|
|
PyObject *globals); |
|
|
|
|
|
|
|
|
static inline PyObject* |
|
|
_PyEval_EvalFrame(PyThreadState *tstate, PyFrameObject *f, int throwflag) |
|
|
{ |
|
|
return tstate->interp->eval_frame(tstate, f, throwflag); |
|
|
} |
|
|
|
|
|
extern PyObject * |
|
|
_PyEval_Vector(PyThreadState *tstate, |
|
|
PyFrameConstructor *desc, PyObject *locals, |
|
|
PyObject* const* args, size_t argcount, |
|
|
PyObject *kwnames); |
|
|
|
|
|
#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS |
|
|
extern int _PyEval_ThreadsInitialized(PyInterpreterState *interp); |
|
|
#else |
|
|
extern int _PyEval_ThreadsInitialized(struct pyruntimestate *runtime); |
|
|
#endif |
|
|
extern PyStatus _PyEval_InitGIL(PyThreadState *tstate); |
|
|
extern void _PyEval_FiniGIL(PyInterpreterState *interp); |
|
|
|
|
|
extern void _PyEval_ReleaseLock(PyThreadState *tstate); |
|
|
|
|
|
extern void _PyEval_DeactivateOpCache(void); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef USE_STACKCHECK |
|
|
|
|
|
|
|
|
static inline int _Py_MakeRecCheck(PyThreadState *tstate) { |
|
|
return (++tstate->recursion_depth > tstate->interp->ceval.recursion_limit |
|
|
|| ++tstate->stackcheck_counter > 64); |
|
|
} |
|
|
#else |
|
|
static inline int _Py_MakeRecCheck(PyThreadState *tstate) { |
|
|
return (++tstate->recursion_depth > tstate->interp->ceval.recursion_limit); |
|
|
} |
|
|
#endif |
|
|
|
|
|
PyAPI_FUNC(int) _Py_CheckRecursiveCall( |
|
|
PyThreadState *tstate, |
|
|
const char *where); |
|
|
|
|
|
static inline int _Py_EnterRecursiveCall(PyThreadState *tstate, |
|
|
const char *where) { |
|
|
return (_Py_MakeRecCheck(tstate) && _Py_CheckRecursiveCall(tstate, where)); |
|
|
} |
|
|
|
|
|
static inline int _Py_EnterRecursiveCall_inline(const char *where) { |
|
|
PyThreadState *tstate = PyThreadState_GET(); |
|
|
return _Py_EnterRecursiveCall(tstate, where); |
|
|
} |
|
|
|
|
|
#define Py_EnterRecursiveCall(where) _Py_EnterRecursiveCall_inline(where) |
|
|
|
|
|
static inline void _Py_LeaveRecursiveCall(PyThreadState *tstate) { |
|
|
tstate->recursion_depth--; |
|
|
} |
|
|
|
|
|
static inline void _Py_LeaveRecursiveCall_inline(void) { |
|
|
PyThreadState *tstate = PyThreadState_GET(); |
|
|
_Py_LeaveRecursiveCall(tstate); |
|
|
} |
|
|
|
|
|
#define Py_LeaveRecursiveCall() _Py_LeaveRecursiveCall_inline() |
|
|
|
|
|
|
|
|
#ifdef __cplusplus |
|
|
} |
|
|
#endif |
|
|
#endif |
|
|
|