blob: e5585945ae174d3a63e2313615f5fd35ae975e94 [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
Martin v. Löwis4d0d4712010-12-03 20:14:31 +000023#ifndef Py_LIMITED_API
Mark Hammond91a681d2002-08-12 07:21:58 +000024PyAPI_FUNC(void) PyEval_SetProfile(Py_tracefunc, PyObject *);
25PyAPI_FUNC(void) PyEval_SetTrace(Py_tracefunc, PyObject *);
Yury Selivanovd8cf3822015-06-01 12:15:23 -040026PyAPI_FUNC(void) _PyEval_SetCoroutineWrapper(PyObject *wrapper);
27PyAPI_FUNC(PyObject *) _PyEval_GetCoroutineWrapper(void);
Martin v. Löwis4d0d4712010-12-03 20:14:31 +000028#endif
Fred Drake55fb6e02001-06-27 19:18:03 +000029
Guido van Rossum6297a7a2003-02-19 15:53:17 +000030struct _frame; /* Avoid including frameobject.h */
31
Mark Hammond91a681d2002-08-12 07:21:58 +000032PyAPI_FUNC(PyObject *) PyEval_GetBuiltins(void);
33PyAPI_FUNC(PyObject *) PyEval_GetGlobals(void);
34PyAPI_FUNC(PyObject *) PyEval_GetLocals(void);
Guido van Rossum6297a7a2003-02-19 15:53:17 +000035PyAPI_FUNC(struct _frame *) PyEval_GetFrame(void);
Tim Peters5ba58662001-07-16 02:29:45 +000036
37/* Look at the current frame's (if any) code's co_flags, and turn on
38 the corresponding compiler flags in cf->cf_flags. Return 1 if any
39 flag was set, else return 0. */
Martin v. Löwis4d0d4712010-12-03 20:14:31 +000040#ifndef Py_LIMITED_API
Mark Hammond91a681d2002-08-12 07:21:58 +000041PyAPI_FUNC(int) PyEval_MergeCompilerFlags(PyCompilerFlags *cf);
Martin v. Löwis4d0d4712010-12-03 20:14:31 +000042#endif
Guido van Rossum3f5da241990-12-20 15:06:42 +000043
Mark Hammond91a681d2002-08-12 07:21:58 +000044PyAPI_FUNC(int) Py_AddPendingCall(int (*func)(void *), void *arg);
45PyAPI_FUNC(int) Py_MakePendingCalls(void);
Guido van Rossum95664081994-09-14 13:23:36 +000046
Antoine Pitrou658fad82008-09-03 18:34:34 +000047/* Protection against deeply nested recursive calls
48
49 In Python 3.0, this protection has two levels:
50 * normal anti-recursion protection is triggered when the recursion level
51 exceeds the current recursion limit. It raises a RuntimeError, and sets
52 the "overflowed" flag in the thread state structure. This flag
53 temporarily *disables* the normal protection; this allows cleanup code
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000054 to potentially outgrow the recursion limit while processing the
Antoine Pitrou658fad82008-09-03 18:34:34 +000055 RuntimeError.
56 * "last chance" anti-recursion protection is triggered when the recursion
57 level exceeds "current recursion limit + 50". By construction, this
58 protection can only be triggered when the "overflowed" flag is set. It
59 means the cleanup code has itself gone into an infinite loop, or the
60 RuntimeError has been mistakingly ignored. When this protection is
61 triggered, the interpreter aborts with a Fatal Error.
62
63 In addition, the "overflowed" flag is automatically reset when the
64 recursion level drops below "current recursion limit - 50". This heuristic
65 is meant to ensure that the normal anti-recursion protection doesn't get
66 disabled too long.
67
68 Please note: this scheme has its own limitations. See:
69 http://mail.python.org/pipermail/python-dev/2008-August/082106.html
70 for some observations.
71*/
Mark Hammond91a681d2002-08-12 07:21:58 +000072PyAPI_FUNC(void) Py_SetRecursionLimit(int);
73PyAPI_FUNC(int) Py_GetRecursionLimit(void);
Guido van Rossumff4949e1992-08-05 19:58:53 +000074
Antoine Pitrou658fad82008-09-03 18:34:34 +000075#define Py_EnterRecursiveCall(where) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000076 (_Py_MakeRecCheck(PyThreadState_GET()->recursion_depth) && \
77 _Py_CheckRecursiveCall(where))
78#define Py_LeaveRecursiveCall() \
Antoine Pitrou658fad82008-09-03 18:34:34 +000079 do{ if(_Py_MakeEndRecCheck(PyThreadState_GET()->recursion_depth)) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000080 PyThreadState_GET()->overflowed = 0; \
81 } while(0)
Armin Rigo2b3eb402003-10-28 12:05:48 +000082PyAPI_FUNC(int) _Py_CheckRecursiveCall(char *where);
83PyAPI_DATA(int) _Py_CheckRecursionLimit;
Antoine Pitrou658fad82008-09-03 18:34:34 +000084
Armin Rigo2b3eb402003-10-28 12:05:48 +000085#ifdef USE_STACKCHECK
Antoine Pitrou658fad82008-09-03 18:34:34 +000086/* With USE_STACKCHECK, we artificially decrement the recursion limit in order
87 to trigger regular stack checks in _Py_CheckRecursiveCall(), except if
88 the "overflowed" flag is set, in which case we need the true value
89 of _Py_CheckRecursionLimit for _Py_MakeEndRecCheck() to function properly.
90*/
91# define _Py_MakeRecCheck(x) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000092 (++(x) > (_Py_CheckRecursionLimit += PyThreadState_GET()->overflowed - 1))
Armin Rigo2b3eb402003-10-28 12:05:48 +000093#else
94# define _Py_MakeRecCheck(x) (++(x) > _Py_CheckRecursionLimit)
95#endif
96
Antoine Pitrou652e7072009-03-13 19:25:20 +000097#define _Py_MakeEndRecCheck(x) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000098 (--(x) < ((_Py_CheckRecursionLimit > 100) \
99 ? (_Py_CheckRecursionLimit - 50) \
100 : (3 * (_Py_CheckRecursionLimit >> 2))))
Antoine Pitrou658fad82008-09-03 18:34:34 +0000101
Martin v. Löwis5b222132007-06-10 09:51:05 +0000102#define Py_ALLOW_RECURSION \
103 do { unsigned char _old = PyThreadState_GET()->recursion_critical;\
104 PyThreadState_GET()->recursion_critical = 1;
105
106#define Py_END_ALLOW_RECURSION \
107 PyThreadState_GET()->recursion_critical = _old; \
108 } while(0);
109
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000110PyAPI_FUNC(const char *) PyEval_GetFuncName(PyObject *);
111PyAPI_FUNC(const char *) PyEval_GetFuncDesc(PyObject *);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000112
Jeremy Hylton985eba52003-02-05 23:13:00 +0000113PyAPI_FUNC(PyObject *) PyEval_GetCallStats(PyObject *);
Martin v. Löwis8d97e332004-06-27 15:43:12 +0000114PyAPI_FUNC(PyObject *) PyEval_EvalFrame(struct _frame *);
Phillip J. Eby0d6615f2005-08-02 00:46:46 +0000115PyAPI_FUNC(PyObject *) PyEval_EvalFrameEx(struct _frame *f, int exc);
Jeremy Hylton985eba52003-02-05 23:13:00 +0000116
Guido van Rossumff4949e1992-08-05 19:58:53 +0000117/* Interface for threads.
118
119 A module that plans to do a blocking system call (or something else
120 that lasts a long time and doesn't touch Python data) can allow other
121 threads to run as follows:
122
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000123 ...preparations here...
124 Py_BEGIN_ALLOW_THREADS
125 ...blocking system call here...
126 Py_END_ALLOW_THREADS
127 ...interpret result here...
Guido van Rossumff4949e1992-08-05 19:58:53 +0000128
Guido van Rossumcaa63801995-01-12 11:45:45 +0000129 The Py_BEGIN_ALLOW_THREADS/Py_END_ALLOW_THREADS pair expands to a
130 {}-surrounded block.
Guido van Rossumff4949e1992-08-05 19:58:53 +0000131 To leave the block in the middle (e.g., with return), you must insert
Skip Montanaro682c25a2000-09-15 18:19:27 +0000132 a line containing Py_BLOCK_THREADS before the return, e.g.
Guido van Rossumff4949e1992-08-05 19:58:53 +0000133
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000134 if (...premature_exit...) {
135 Py_BLOCK_THREADS
136 PyErr_SetFromErrno(PyExc_IOError);
137 return NULL;
138 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000139
140 An alternative is:
141
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000142 Py_BLOCK_THREADS
143 if (...premature_exit...) {
144 PyErr_SetFromErrno(PyExc_IOError);
145 return NULL;
146 }
147 Py_UNBLOCK_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000148
149 For convenience, that the value of 'errno' is restored across
Skip Montanaro682c25a2000-09-15 18:19:27 +0000150 Py_END_ALLOW_THREADS and Py_BLOCK_THREADS.
Guido van Rossumff4949e1992-08-05 19:58:53 +0000151
Guido van Rossumcaa63801995-01-12 11:45:45 +0000152 WARNING: NEVER NEST CALLS TO Py_BEGIN_ALLOW_THREADS AND
153 Py_END_ALLOW_THREADS!!!
Guido van Rossumff4949e1992-08-05 19:58:53 +0000154
Guido van Rossumcaa63801995-01-12 11:45:45 +0000155 The function PyEval_InitThreads() should be called only from
Georg Brandl2067bfd2008-05-25 13:05:15 +0000156 init_thread() in "_threadmodule.c".
Guido van Rossumff4949e1992-08-05 19:58:53 +0000157
158 Note that not yet all candidates have been converted to use this
159 mechanism!
160*/
161
Mark Hammond91a681d2002-08-12 07:21:58 +0000162PyAPI_FUNC(PyThreadState *) PyEval_SaveThread(void);
163PyAPI_FUNC(void) PyEval_RestoreThread(PyThreadState *);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000164
Guido van Rossumb6775db1994-08-01 11:34:53 +0000165#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000166
Tim Peters7f468f22004-10-11 02:40:51 +0000167PyAPI_FUNC(int) PyEval_ThreadsInitialized(void);
Mark Hammond91a681d2002-08-12 07:21:58 +0000168PyAPI_FUNC(void) PyEval_InitThreads(void);
Antoine Pitrou1df15362010-09-13 14:16:46 +0000169PyAPI_FUNC(void) _PyEval_FiniThreads(void);
Mark Hammond91a681d2002-08-12 07:21:58 +0000170PyAPI_FUNC(void) PyEval_AcquireLock(void);
171PyAPI_FUNC(void) PyEval_ReleaseLock(void);
172PyAPI_FUNC(void) PyEval_AcquireThread(PyThreadState *tstate);
173PyAPI_FUNC(void) PyEval_ReleaseThread(PyThreadState *tstate);
174PyAPI_FUNC(void) PyEval_ReInitThreads(void);
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000175
Martin v. Löwis4d0d4712010-12-03 20:14:31 +0000176#ifndef Py_LIMITED_API
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000177PyAPI_FUNC(void) _PyEval_SetSwitchInterval(unsigned long microseconds);
178PyAPI_FUNC(unsigned long) _PyEval_GetSwitchInterval(void);
Martin v. Löwis4d0d4712010-12-03 20:14:31 +0000179#endif
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000180
Guido van Rossumcaa63801995-01-12 11:45:45 +0000181#define Py_BEGIN_ALLOW_THREADS { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000182 PyThreadState *_save; \
183 _save = PyEval_SaveThread();
184#define Py_BLOCK_THREADS PyEval_RestoreThread(_save);
185#define Py_UNBLOCK_THREADS _save = PyEval_SaveThread();
186#define Py_END_ALLOW_THREADS PyEval_RestoreThread(_save); \
187 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000188
Guido van Rossumb6775db1994-08-01 11:34:53 +0000189#else /* !WITH_THREAD */
Guido van Rossumff4949e1992-08-05 19:58:53 +0000190
Guido van Rossumcaa63801995-01-12 11:45:45 +0000191#define Py_BEGIN_ALLOW_THREADS {
192#define Py_BLOCK_THREADS
193#define Py_UNBLOCK_THREADS
194#define Py_END_ALLOW_THREADS }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000195
Guido van Rossumb6775db1994-08-01 11:34:53 +0000196#endif /* !WITH_THREAD */
Guido van Rossuma3309961993-07-28 09:05:47 +0000197
Martin v. Löwis4d0d4712010-12-03 20:14:31 +0000198#ifndef Py_LIMITED_API
Martin v. Löwis18e16552006-02-15 17:27:45 +0000199PyAPI_FUNC(int) _PyEval_SliceIndex(PyObject *, Py_ssize_t *);
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000200PyAPI_FUNC(void) _PyEval_SignalAsyncExc(void);
Martin v. Löwis4d0d4712010-12-03 20:14:31 +0000201#endif
Guido van Rossum7c36ada2000-05-08 14:04:54 +0000202
203
Guido van Rossuma3309961993-07-28 09:05:47 +0000204#ifdef __cplusplus
205}
206#endif
207#endif /* !Py_CEVAL_H */