17db96d56Sopenharmony_ci/* Interface to random parts in ceval.c */ 27db96d56Sopenharmony_ci 37db96d56Sopenharmony_ci#ifndef Py_CEVAL_H 47db96d56Sopenharmony_ci#define Py_CEVAL_H 57db96d56Sopenharmony_ci#ifdef __cplusplus 67db96d56Sopenharmony_ciextern "C" { 77db96d56Sopenharmony_ci#endif 87db96d56Sopenharmony_ci 97db96d56Sopenharmony_ci 107db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) PyEval_EvalCode(PyObject *, PyObject *, PyObject *); 117db96d56Sopenharmony_ci 127db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) PyEval_EvalCodeEx(PyObject *co, 137db96d56Sopenharmony_ci PyObject *globals, 147db96d56Sopenharmony_ci PyObject *locals, 157db96d56Sopenharmony_ci PyObject *const *args, int argc, 167db96d56Sopenharmony_ci PyObject *const *kwds, int kwdc, 177db96d56Sopenharmony_ci PyObject *const *defs, int defc, 187db96d56Sopenharmony_ci PyObject *kwdefs, PyObject *closure); 197db96d56Sopenharmony_ci 207db96d56Sopenharmony_ci/* PyEval_CallObjectWithKeywords(), PyEval_CallObject(), PyEval_CallFunction 217db96d56Sopenharmony_ci * and PyEval_CallMethod are deprecated. Since they are officially part of the 227db96d56Sopenharmony_ci * stable ABI (PEP 384), they must be kept for backward compatibility. 237db96d56Sopenharmony_ci * PyObject_Call(), PyObject_CallFunction() and PyObject_CallMethod() are 247db96d56Sopenharmony_ci * recommended to call a callable object. 257db96d56Sopenharmony_ci */ 267db96d56Sopenharmony_ci 277db96d56Sopenharmony_ciPy_DEPRECATED(3.9) PyAPI_FUNC(PyObject *) PyEval_CallObjectWithKeywords( 287db96d56Sopenharmony_ci PyObject *callable, 297db96d56Sopenharmony_ci PyObject *args, 307db96d56Sopenharmony_ci PyObject *kwargs); 317db96d56Sopenharmony_ci 327db96d56Sopenharmony_ci/* Deprecated since PyEval_CallObjectWithKeywords is deprecated */ 337db96d56Sopenharmony_ci#define PyEval_CallObject(callable, arg) \ 347db96d56Sopenharmony_ci PyEval_CallObjectWithKeywords(callable, arg, (PyObject *)NULL) 357db96d56Sopenharmony_ci 367db96d56Sopenharmony_ciPy_DEPRECATED(3.9) PyAPI_FUNC(PyObject *) PyEval_CallFunction( 377db96d56Sopenharmony_ci PyObject *callable, const char *format, ...); 387db96d56Sopenharmony_ciPy_DEPRECATED(3.9) PyAPI_FUNC(PyObject *) PyEval_CallMethod( 397db96d56Sopenharmony_ci PyObject *obj, const char *name, const char *format, ...); 407db96d56Sopenharmony_ci 417db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) PyEval_GetBuiltins(void); 427db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) PyEval_GetGlobals(void); 437db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) PyEval_GetLocals(void); 447db96d56Sopenharmony_ciPyAPI_FUNC(PyFrameObject *) PyEval_GetFrame(void); 457db96d56Sopenharmony_ci 467db96d56Sopenharmony_ciPyAPI_FUNC(int) Py_AddPendingCall(int (*func)(void *), void *arg); 477db96d56Sopenharmony_ciPyAPI_FUNC(int) Py_MakePendingCalls(void); 487db96d56Sopenharmony_ci 497db96d56Sopenharmony_ci/* Protection against deeply nested recursive calls 507db96d56Sopenharmony_ci 517db96d56Sopenharmony_ci In Python 3.0, this protection has two levels: 527db96d56Sopenharmony_ci * normal anti-recursion protection is triggered when the recursion level 537db96d56Sopenharmony_ci exceeds the current recursion limit. It raises a RecursionError, and sets 547db96d56Sopenharmony_ci the "overflowed" flag in the thread state structure. This flag 557db96d56Sopenharmony_ci temporarily *disables* the normal protection; this allows cleanup code 567db96d56Sopenharmony_ci to potentially outgrow the recursion limit while processing the 577db96d56Sopenharmony_ci RecursionError. 587db96d56Sopenharmony_ci * "last chance" anti-recursion protection is triggered when the recursion 597db96d56Sopenharmony_ci level exceeds "current recursion limit + 50". By construction, this 607db96d56Sopenharmony_ci protection can only be triggered when the "overflowed" flag is set. It 617db96d56Sopenharmony_ci means the cleanup code has itself gone into an infinite loop, or the 627db96d56Sopenharmony_ci RecursionError has been mistakingly ignored. When this protection is 637db96d56Sopenharmony_ci triggered, the interpreter aborts with a Fatal Error. 647db96d56Sopenharmony_ci 657db96d56Sopenharmony_ci In addition, the "overflowed" flag is automatically reset when the 667db96d56Sopenharmony_ci recursion level drops below "current recursion limit - 50". This heuristic 677db96d56Sopenharmony_ci is meant to ensure that the normal anti-recursion protection doesn't get 687db96d56Sopenharmony_ci disabled too long. 697db96d56Sopenharmony_ci 707db96d56Sopenharmony_ci Please note: this scheme has its own limitations. See: 717db96d56Sopenharmony_ci http://mail.python.org/pipermail/python-dev/2008-August/082106.html 727db96d56Sopenharmony_ci for some observations. 737db96d56Sopenharmony_ci*/ 747db96d56Sopenharmony_ciPyAPI_FUNC(void) Py_SetRecursionLimit(int); 757db96d56Sopenharmony_ciPyAPI_FUNC(int) Py_GetRecursionLimit(void); 767db96d56Sopenharmony_ci 777db96d56Sopenharmony_ciPyAPI_FUNC(int) Py_EnterRecursiveCall(const char *where); 787db96d56Sopenharmony_ciPyAPI_FUNC(void) Py_LeaveRecursiveCall(void); 797db96d56Sopenharmony_ci 807db96d56Sopenharmony_ciPyAPI_FUNC(const char *) PyEval_GetFuncName(PyObject *); 817db96d56Sopenharmony_ciPyAPI_FUNC(const char *) PyEval_GetFuncDesc(PyObject *); 827db96d56Sopenharmony_ci 837db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) PyEval_EvalFrame(PyFrameObject *); 847db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) PyEval_EvalFrameEx(PyFrameObject *f, int exc); 857db96d56Sopenharmony_ci 867db96d56Sopenharmony_ci/* Interface for threads. 877db96d56Sopenharmony_ci 887db96d56Sopenharmony_ci A module that plans to do a blocking system call (or something else 897db96d56Sopenharmony_ci that lasts a long time and doesn't touch Python data) can allow other 907db96d56Sopenharmony_ci threads to run as follows: 917db96d56Sopenharmony_ci 927db96d56Sopenharmony_ci ...preparations here... 937db96d56Sopenharmony_ci Py_BEGIN_ALLOW_THREADS 947db96d56Sopenharmony_ci ...blocking system call here... 957db96d56Sopenharmony_ci Py_END_ALLOW_THREADS 967db96d56Sopenharmony_ci ...interpret result here... 977db96d56Sopenharmony_ci 987db96d56Sopenharmony_ci The Py_BEGIN_ALLOW_THREADS/Py_END_ALLOW_THREADS pair expands to a 997db96d56Sopenharmony_ci {}-surrounded block. 1007db96d56Sopenharmony_ci To leave the block in the middle (e.g., with return), you must insert 1017db96d56Sopenharmony_ci a line containing Py_BLOCK_THREADS before the return, e.g. 1027db96d56Sopenharmony_ci 1037db96d56Sopenharmony_ci if (...premature_exit...) { 1047db96d56Sopenharmony_ci Py_BLOCK_THREADS 1057db96d56Sopenharmony_ci PyErr_SetFromErrno(PyExc_OSError); 1067db96d56Sopenharmony_ci return NULL; 1077db96d56Sopenharmony_ci } 1087db96d56Sopenharmony_ci 1097db96d56Sopenharmony_ci An alternative is: 1107db96d56Sopenharmony_ci 1117db96d56Sopenharmony_ci Py_BLOCK_THREADS 1127db96d56Sopenharmony_ci if (...premature_exit...) { 1137db96d56Sopenharmony_ci PyErr_SetFromErrno(PyExc_OSError); 1147db96d56Sopenharmony_ci return NULL; 1157db96d56Sopenharmony_ci } 1167db96d56Sopenharmony_ci Py_UNBLOCK_THREADS 1177db96d56Sopenharmony_ci 1187db96d56Sopenharmony_ci For convenience, that the value of 'errno' is restored across 1197db96d56Sopenharmony_ci Py_END_ALLOW_THREADS and Py_BLOCK_THREADS. 1207db96d56Sopenharmony_ci 1217db96d56Sopenharmony_ci WARNING: NEVER NEST CALLS TO Py_BEGIN_ALLOW_THREADS AND 1227db96d56Sopenharmony_ci Py_END_ALLOW_THREADS!!! 1237db96d56Sopenharmony_ci 1247db96d56Sopenharmony_ci Note that not yet all candidates have been converted to use this 1257db96d56Sopenharmony_ci mechanism! 1267db96d56Sopenharmony_ci*/ 1277db96d56Sopenharmony_ci 1287db96d56Sopenharmony_ciPyAPI_FUNC(PyThreadState *) PyEval_SaveThread(void); 1297db96d56Sopenharmony_ciPyAPI_FUNC(void) PyEval_RestoreThread(PyThreadState *); 1307db96d56Sopenharmony_ci 1317db96d56Sopenharmony_ciPy_DEPRECATED(3.9) PyAPI_FUNC(int) PyEval_ThreadsInitialized(void); 1327db96d56Sopenharmony_ciPy_DEPRECATED(3.9) PyAPI_FUNC(void) PyEval_InitThreads(void); 1337db96d56Sopenharmony_ci/* PyEval_AcquireLock() and PyEval_ReleaseLock() are part of stable ABI. 1347db96d56Sopenharmony_ci * They will be removed from this header file in the future version. 1357db96d56Sopenharmony_ci * But they will be remained in ABI until Python 4.0. 1367db96d56Sopenharmony_ci */ 1377db96d56Sopenharmony_ciPy_DEPRECATED(3.2) PyAPI_FUNC(void) PyEval_AcquireLock(void); 1387db96d56Sopenharmony_ciPy_DEPRECATED(3.2) PyAPI_FUNC(void) PyEval_ReleaseLock(void); 1397db96d56Sopenharmony_ciPyAPI_FUNC(void) PyEval_AcquireThread(PyThreadState *tstate); 1407db96d56Sopenharmony_ciPyAPI_FUNC(void) PyEval_ReleaseThread(PyThreadState *tstate); 1417db96d56Sopenharmony_ci 1427db96d56Sopenharmony_ci#define Py_BEGIN_ALLOW_THREADS { \ 1437db96d56Sopenharmony_ci PyThreadState *_save; \ 1447db96d56Sopenharmony_ci _save = PyEval_SaveThread(); 1457db96d56Sopenharmony_ci#define Py_BLOCK_THREADS PyEval_RestoreThread(_save); 1467db96d56Sopenharmony_ci#define Py_UNBLOCK_THREADS _save = PyEval_SaveThread(); 1477db96d56Sopenharmony_ci#define Py_END_ALLOW_THREADS PyEval_RestoreThread(_save); \ 1487db96d56Sopenharmony_ci } 1497db96d56Sopenharmony_ci 1507db96d56Sopenharmony_ci/* Masks and values used by FORMAT_VALUE opcode. */ 1517db96d56Sopenharmony_ci#define FVC_MASK 0x3 1527db96d56Sopenharmony_ci#define FVC_NONE 0x0 1537db96d56Sopenharmony_ci#define FVC_STR 0x1 1547db96d56Sopenharmony_ci#define FVC_REPR 0x2 1557db96d56Sopenharmony_ci#define FVC_ASCII 0x3 1567db96d56Sopenharmony_ci#define FVS_MASK 0x4 1577db96d56Sopenharmony_ci#define FVS_HAVE_SPEC 0x4 1587db96d56Sopenharmony_ci 1597db96d56Sopenharmony_ci#ifndef Py_LIMITED_API 1607db96d56Sopenharmony_ci# define Py_CPYTHON_CEVAL_H 1617db96d56Sopenharmony_ci# include "cpython/ceval.h" 1627db96d56Sopenharmony_ci# undef Py_CPYTHON_CEVAL_H 1637db96d56Sopenharmony_ci#endif 1647db96d56Sopenharmony_ci 1657db96d56Sopenharmony_ci#ifdef __cplusplus 1667db96d56Sopenharmony_ci} 1677db96d56Sopenharmony_ci#endif 1687db96d56Sopenharmony_ci#endif /* !Py_CEVAL_H */ 169