blob: e55f4b4efb99787110d0cbecd82af2ffd75bb288 [file] [log] [blame]
Guido van Rossuma3309961993-07-28 09:05:47 +00001#ifndef Py_CEVAL_H
2#define Py_CEVAL_H
3#ifdef __cplusplus
4extern "C" {
5#endif
6
Guido van Rossumf70e43a1991-02-19 12:39:46 +00007
Guido van Rossumff4949e1992-08-05 19:58:53 +00008/* Interface to random parts in ceval.c */
Guido van Rossum3f5da241990-12-20 15:06:42 +00009
Mark Hammond91a681d2002-08-12 07:21:58 +000010PyAPI_FUNC(PyObject *) PyEval_CallObjectWithKeywords(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000011 PyObject *, PyObject *, PyObject *);
Guido van Rossuma0490311991-07-27 21:33:03 +000012
Guido van Rossumd7ed6831997-08-30 15:02:50 +000013/* Inline this */
14#define PyEval_CallObject(func,arg) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000015 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossumd7ed6831997-08-30 15:02:50 +000016
Jeremy Hyltonaf68c872005-12-10 18:50:16 +000017PyAPI_FUNC(PyObject *) PyEval_CallFunction(PyObject *obj,
18 const char *format, ...);
Mark Hammond91a681d2002-08-12 07:21:58 +000019PyAPI_FUNC(PyObject *) PyEval_CallMethod(PyObject *obj,
Jeremy Hyltonaf68c872005-12-10 18:50:16 +000020 const char *methodname,
21 const char *format, ...);
Guido van Rossum3d109a01998-08-08 20:53:36 +000022
Mark Hammond91a681d2002-08-12 07:21:58 +000023PyAPI_FUNC(void) PyEval_SetProfile(Py_tracefunc, PyObject *);
24PyAPI_FUNC(void) PyEval_SetTrace(Py_tracefunc, PyObject *);
Fred Drake55fb6e02001-06-27 19:18:03 +000025
Guido van Rossum6297a7a2003-02-19 15:53:17 +000026struct _frame; /* Avoid including frameobject.h */
27
Mark Hammond91a681d2002-08-12 07:21:58 +000028PyAPI_FUNC(PyObject *) PyEval_GetBuiltins(void);
29PyAPI_FUNC(PyObject *) PyEval_GetGlobals(void);
30PyAPI_FUNC(PyObject *) PyEval_GetLocals(void);
Guido van Rossum6297a7a2003-02-19 15:53:17 +000031PyAPI_FUNC(struct _frame *) PyEval_GetFrame(void);
Tim Peters5ba58662001-07-16 02:29:45 +000032
33/* Look at the current frame's (if any) code's co_flags, and turn on
34 the corresponding compiler flags in cf->cf_flags. Return 1 if any
35 flag was set, else return 0. */
Mark Hammond91a681d2002-08-12 07:21:58 +000036PyAPI_FUNC(int) PyEval_MergeCompilerFlags(PyCompilerFlags *cf);
Guido van Rossum3f5da241990-12-20 15:06:42 +000037
Mark Hammond91a681d2002-08-12 07:21:58 +000038PyAPI_FUNC(int) Py_AddPendingCall(int (*func)(void *), void *arg);
39PyAPI_FUNC(int) Py_MakePendingCalls(void);
Guido van Rossum95664081994-09-14 13:23:36 +000040
Antoine Pitrou658fad82008-09-03 18:34:34 +000041/* Protection against deeply nested recursive calls
42
43 In Python 3.0, this protection has two levels:
44 * normal anti-recursion protection is triggered when the recursion level
45 exceeds the current recursion limit. It raises a RuntimeError, and sets
46 the "overflowed" flag in the thread state structure. This flag
47 temporarily *disables* the normal protection; this allows cleanup code
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000048 to potentially outgrow the recursion limit while processing the
Antoine Pitrou658fad82008-09-03 18:34:34 +000049 RuntimeError.
50 * "last chance" anti-recursion protection is triggered when the recursion
51 level exceeds "current recursion limit + 50". By construction, this
52 protection can only be triggered when the "overflowed" flag is set. It
53 means the cleanup code has itself gone into an infinite loop, or the
54 RuntimeError has been mistakingly ignored. When this protection is
55 triggered, the interpreter aborts with a Fatal Error.
56
57 In addition, the "overflowed" flag is automatically reset when the
58 recursion level drops below "current recursion limit - 50". This heuristic
59 is meant to ensure that the normal anti-recursion protection doesn't get
60 disabled too long.
61
62 Please note: this scheme has its own limitations. See:
63 http://mail.python.org/pipermail/python-dev/2008-August/082106.html
64 for some observations.
65*/
Mark Hammond91a681d2002-08-12 07:21:58 +000066PyAPI_FUNC(void) Py_SetRecursionLimit(int);
67PyAPI_FUNC(int) Py_GetRecursionLimit(void);
Guido van Rossumff4949e1992-08-05 19:58:53 +000068
Antoine Pitrou658fad82008-09-03 18:34:34 +000069#define Py_EnterRecursiveCall(where) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000070 (_Py_MakeRecCheck(PyThreadState_GET()->recursion_depth) && \
71 _Py_CheckRecursiveCall(where))
72#define Py_LeaveRecursiveCall() \
Antoine Pitrou658fad82008-09-03 18:34:34 +000073 do{ if(_Py_MakeEndRecCheck(PyThreadState_GET()->recursion_depth)) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000074 PyThreadState_GET()->overflowed = 0; \
75 } while(0)
Armin Rigo2b3eb402003-10-28 12:05:48 +000076PyAPI_FUNC(int) _Py_CheckRecursiveCall(char *where);
77PyAPI_DATA(int) _Py_CheckRecursionLimit;
Antoine Pitrou658fad82008-09-03 18:34:34 +000078
Armin Rigo2b3eb402003-10-28 12:05:48 +000079#ifdef USE_STACKCHECK
Antoine Pitrou658fad82008-09-03 18:34:34 +000080/* With USE_STACKCHECK, we artificially decrement the recursion limit in order
81 to trigger regular stack checks in _Py_CheckRecursiveCall(), except if
82 the "overflowed" flag is set, in which case we need the true value
83 of _Py_CheckRecursionLimit for _Py_MakeEndRecCheck() to function properly.
84*/
85# define _Py_MakeRecCheck(x) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000086 (++(x) > (_Py_CheckRecursionLimit += PyThreadState_GET()->overflowed - 1))
Armin Rigo2b3eb402003-10-28 12:05:48 +000087#else
88# define _Py_MakeRecCheck(x) (++(x) > _Py_CheckRecursionLimit)
89#endif
90
Antoine Pitrou652e7072009-03-13 19:25:20 +000091#define _Py_MakeEndRecCheck(x) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000092 (--(x) < ((_Py_CheckRecursionLimit > 100) \
93 ? (_Py_CheckRecursionLimit - 50) \
94 : (3 * (_Py_CheckRecursionLimit >> 2))))
Antoine Pitrou658fad82008-09-03 18:34:34 +000095
Martin v. Löwis5b222132007-06-10 09:51:05 +000096#define Py_ALLOW_RECURSION \
97 do { unsigned char _old = PyThreadState_GET()->recursion_critical;\
98 PyThreadState_GET()->recursion_critical = 1;
99
100#define Py_END_ALLOW_RECURSION \
101 PyThreadState_GET()->recursion_critical = _old; \
102 } while(0);
103
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000104PyAPI_FUNC(const char *) PyEval_GetFuncName(PyObject *);
105PyAPI_FUNC(const char *) PyEval_GetFuncDesc(PyObject *);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000106
Jeremy Hylton985eba52003-02-05 23:13:00 +0000107PyAPI_FUNC(PyObject *) PyEval_GetCallStats(PyObject *);
Martin v. Löwis8d97e332004-06-27 15:43:12 +0000108PyAPI_FUNC(PyObject *) PyEval_EvalFrame(struct _frame *);
Phillip J. Eby0d6615f2005-08-02 00:46:46 +0000109PyAPI_FUNC(PyObject *) PyEval_EvalFrameEx(struct _frame *f, int exc);
Jeremy Hylton985eba52003-02-05 23:13:00 +0000110
Guido van Rossumff4949e1992-08-05 19:58:53 +0000111/* Interface for threads.
112
113 A module that plans to do a blocking system call (or something else
114 that lasts a long time and doesn't touch Python data) can allow other
115 threads to run as follows:
116
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000117 ...preparations here...
118 Py_BEGIN_ALLOW_THREADS
119 ...blocking system call here...
120 Py_END_ALLOW_THREADS
121 ...interpret result here...
Guido van Rossumff4949e1992-08-05 19:58:53 +0000122
Guido van Rossumcaa63801995-01-12 11:45:45 +0000123 The Py_BEGIN_ALLOW_THREADS/Py_END_ALLOW_THREADS pair expands to a
124 {}-surrounded block.
Guido van Rossumff4949e1992-08-05 19:58:53 +0000125 To leave the block in the middle (e.g., with return), you must insert
Skip Montanaro682c25a2000-09-15 18:19:27 +0000126 a line containing Py_BLOCK_THREADS before the return, e.g.
Guido van Rossumff4949e1992-08-05 19:58:53 +0000127
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000128 if (...premature_exit...) {
129 Py_BLOCK_THREADS
130 PyErr_SetFromErrno(PyExc_IOError);
131 return NULL;
132 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000133
134 An alternative is:
135
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000136 Py_BLOCK_THREADS
137 if (...premature_exit...) {
138 PyErr_SetFromErrno(PyExc_IOError);
139 return NULL;
140 }
141 Py_UNBLOCK_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000142
143 For convenience, that the value of 'errno' is restored across
Skip Montanaro682c25a2000-09-15 18:19:27 +0000144 Py_END_ALLOW_THREADS and Py_BLOCK_THREADS.
Guido van Rossumff4949e1992-08-05 19:58:53 +0000145
Guido van Rossumcaa63801995-01-12 11:45:45 +0000146 WARNING: NEVER NEST CALLS TO Py_BEGIN_ALLOW_THREADS AND
147 Py_END_ALLOW_THREADS!!!
Guido van Rossumff4949e1992-08-05 19:58:53 +0000148
Guido van Rossumcaa63801995-01-12 11:45:45 +0000149 The function PyEval_InitThreads() should be called only from
Georg Brandl2067bfd2008-05-25 13:05:15 +0000150 init_thread() in "_threadmodule.c".
Guido van Rossumff4949e1992-08-05 19:58:53 +0000151
152 Note that not yet all candidates have been converted to use this
153 mechanism!
154*/
155
Mark Hammond91a681d2002-08-12 07:21:58 +0000156PyAPI_FUNC(PyThreadState *) PyEval_SaveThread(void);
157PyAPI_FUNC(void) PyEval_RestoreThread(PyThreadState *);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000158
Guido van Rossumb6775db1994-08-01 11:34:53 +0000159#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000160
Tim Peters7f468f22004-10-11 02:40:51 +0000161PyAPI_FUNC(int) PyEval_ThreadsInitialized(void);
Mark Hammond91a681d2002-08-12 07:21:58 +0000162PyAPI_FUNC(void) PyEval_InitThreads(void);
163PyAPI_FUNC(void) PyEval_AcquireLock(void);
164PyAPI_FUNC(void) PyEval_ReleaseLock(void);
165PyAPI_FUNC(void) PyEval_AcquireThread(PyThreadState *tstate);
166PyAPI_FUNC(void) PyEval_ReleaseThread(PyThreadState *tstate);
167PyAPI_FUNC(void) PyEval_ReInitThreads(void);
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000168
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000169PyAPI_FUNC(void) _PyEval_SetSwitchInterval(unsigned long microseconds);
170PyAPI_FUNC(unsigned long) _PyEval_GetSwitchInterval(void);
171
Guido van Rossumcaa63801995-01-12 11:45:45 +0000172#define Py_BEGIN_ALLOW_THREADS { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000173 PyThreadState *_save; \
174 _save = PyEval_SaveThread();
175#define Py_BLOCK_THREADS PyEval_RestoreThread(_save);
176#define Py_UNBLOCK_THREADS _save = PyEval_SaveThread();
177#define Py_END_ALLOW_THREADS PyEval_RestoreThread(_save); \
178 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000179
Guido van Rossumb6775db1994-08-01 11:34:53 +0000180#else /* !WITH_THREAD */
Guido van Rossumff4949e1992-08-05 19:58:53 +0000181
Guido van Rossumcaa63801995-01-12 11:45:45 +0000182#define Py_BEGIN_ALLOW_THREADS {
183#define Py_BLOCK_THREADS
184#define Py_UNBLOCK_THREADS
185#define Py_END_ALLOW_THREADS }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000186
Guido van Rossumb6775db1994-08-01 11:34:53 +0000187#endif /* !WITH_THREAD */
Guido van Rossuma3309961993-07-28 09:05:47 +0000188
Martin v. Löwis18e16552006-02-15 17:27:45 +0000189PyAPI_FUNC(int) _PyEval_SliceIndex(PyObject *, Py_ssize_t *);
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000190PyAPI_FUNC(void) _PyEval_SignalAsyncExc(void);
Guido van Rossum7c36ada2000-05-08 14:04:54 +0000191
192
Guido van Rossuma3309961993-07-28 09:05:47 +0000193#ifdef __cplusplus
194}
195#endif
196#endif /* !Py_CEVAL_H */