blob: 6811367d7625fbaf7f9602aa517fed5e540a01e0 [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 *);
Martin v. Löwis4d0d4712010-12-03 20:14:31 +000026#endif
Fred Drake55fb6e02001-06-27 19:18:03 +000027
Guido van Rossum6297a7a2003-02-19 15:53:17 +000028struct _frame; /* Avoid including frameobject.h */
29
Mark Hammond91a681d2002-08-12 07:21:58 +000030PyAPI_FUNC(PyObject *) PyEval_GetBuiltins(void);
31PyAPI_FUNC(PyObject *) PyEval_GetGlobals(void);
32PyAPI_FUNC(PyObject *) PyEval_GetLocals(void);
Guido van Rossum6297a7a2003-02-19 15:53:17 +000033PyAPI_FUNC(struct _frame *) PyEval_GetFrame(void);
Tim Peters5ba58662001-07-16 02:29:45 +000034
35/* Look at the current frame's (if any) code's co_flags, and turn on
36 the corresponding compiler flags in cf->cf_flags. Return 1 if any
37 flag was set, else return 0. */
Martin v. Löwis4d0d4712010-12-03 20:14:31 +000038#ifndef Py_LIMITED_API
Mark Hammond91a681d2002-08-12 07:21:58 +000039PyAPI_FUNC(int) PyEval_MergeCompilerFlags(PyCompilerFlags *cf);
Martin v. Löwis4d0d4712010-12-03 20:14:31 +000040#endif
Guido van Rossum3f5da241990-12-20 15:06:42 +000041
Mark Hammond91a681d2002-08-12 07:21:58 +000042PyAPI_FUNC(int) Py_AddPendingCall(int (*func)(void *), void *arg);
43PyAPI_FUNC(int) Py_MakePendingCalls(void);
Guido van Rossum95664081994-09-14 13:23:36 +000044
Antoine Pitrou658fad82008-09-03 18:34:34 +000045/* Protection against deeply nested recursive calls
46
47 In Python 3.0, this protection has two levels:
48 * normal anti-recursion protection is triggered when the recursion level
49 exceeds the current recursion limit. It raises a RuntimeError, and sets
50 the "overflowed" flag in the thread state structure. This flag
51 temporarily *disables* the normal protection; this allows cleanup code
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000052 to potentially outgrow the recursion limit while processing the
Antoine Pitrou658fad82008-09-03 18:34:34 +000053 RuntimeError.
54 * "last chance" anti-recursion protection is triggered when the recursion
55 level exceeds "current recursion limit + 50". By construction, this
56 protection can only be triggered when the "overflowed" flag is set. It
57 means the cleanup code has itself gone into an infinite loop, or the
58 RuntimeError has been mistakingly ignored. When this protection is
59 triggered, the interpreter aborts with a Fatal Error.
60
61 In addition, the "overflowed" flag is automatically reset when the
62 recursion level drops below "current recursion limit - 50". This heuristic
63 is meant to ensure that the normal anti-recursion protection doesn't get
64 disabled too long.
65
66 Please note: this scheme has its own limitations. See:
67 http://mail.python.org/pipermail/python-dev/2008-August/082106.html
68 for some observations.
69*/
Mark Hammond91a681d2002-08-12 07:21:58 +000070PyAPI_FUNC(void) Py_SetRecursionLimit(int);
71PyAPI_FUNC(int) Py_GetRecursionLimit(void);
Guido van Rossumff4949e1992-08-05 19:58:53 +000072
Antoine Pitrou658fad82008-09-03 18:34:34 +000073#define Py_EnterRecursiveCall(where) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000074 (_Py_MakeRecCheck(PyThreadState_GET()->recursion_depth) && \
75 _Py_CheckRecursiveCall(where))
76#define Py_LeaveRecursiveCall() \
Antoine Pitrou658fad82008-09-03 18:34:34 +000077 do{ if(_Py_MakeEndRecCheck(PyThreadState_GET()->recursion_depth)) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000078 PyThreadState_GET()->overflowed = 0; \
79 } while(0)
Armin Rigo2b3eb402003-10-28 12:05:48 +000080PyAPI_FUNC(int) _Py_CheckRecursiveCall(char *where);
81PyAPI_DATA(int) _Py_CheckRecursionLimit;
Antoine Pitrou658fad82008-09-03 18:34:34 +000082
Armin Rigo2b3eb402003-10-28 12:05:48 +000083#ifdef USE_STACKCHECK
Antoine Pitrou658fad82008-09-03 18:34:34 +000084/* With USE_STACKCHECK, we artificially decrement the recursion limit in order
85 to trigger regular stack checks in _Py_CheckRecursiveCall(), except if
86 the "overflowed" flag is set, in which case we need the true value
87 of _Py_CheckRecursionLimit for _Py_MakeEndRecCheck() to function properly.
88*/
89# define _Py_MakeRecCheck(x) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000090 (++(x) > (_Py_CheckRecursionLimit += PyThreadState_GET()->overflowed - 1))
Armin Rigo2b3eb402003-10-28 12:05:48 +000091#else
92# define _Py_MakeRecCheck(x) (++(x) > _Py_CheckRecursionLimit)
93#endif
94
Antoine Pitrou652e7072009-03-13 19:25:20 +000095#define _Py_MakeEndRecCheck(x) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000096 (--(x) < ((_Py_CheckRecursionLimit > 100) \
97 ? (_Py_CheckRecursionLimit - 50) \
98 : (3 * (_Py_CheckRecursionLimit >> 2))))
Antoine Pitrou658fad82008-09-03 18:34:34 +000099
Martin v. Löwis5b222132007-06-10 09:51:05 +0000100#define Py_ALLOW_RECURSION \
101 do { unsigned char _old = PyThreadState_GET()->recursion_critical;\
102 PyThreadState_GET()->recursion_critical = 1;
103
104#define Py_END_ALLOW_RECURSION \
105 PyThreadState_GET()->recursion_critical = _old; \
106 } while(0);
107
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000108PyAPI_FUNC(const char *) PyEval_GetFuncName(PyObject *);
109PyAPI_FUNC(const char *) PyEval_GetFuncDesc(PyObject *);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000110
Jeremy Hylton985eba52003-02-05 23:13:00 +0000111PyAPI_FUNC(PyObject *) PyEval_GetCallStats(PyObject *);
Martin v. Löwis8d97e332004-06-27 15:43:12 +0000112PyAPI_FUNC(PyObject *) PyEval_EvalFrame(struct _frame *);
Phillip J. Eby0d6615f2005-08-02 00:46:46 +0000113PyAPI_FUNC(PyObject *) PyEval_EvalFrameEx(struct _frame *f, int exc);
Jeremy Hylton985eba52003-02-05 23:13:00 +0000114
Guido van Rossumff4949e1992-08-05 19:58:53 +0000115/* Interface for threads.
116
117 A module that plans to do a blocking system call (or something else
118 that lasts a long time and doesn't touch Python data) can allow other
119 threads to run as follows:
120
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000121 ...preparations here...
122 Py_BEGIN_ALLOW_THREADS
123 ...blocking system call here...
124 Py_END_ALLOW_THREADS
125 ...interpret result here...
Guido van Rossumff4949e1992-08-05 19:58:53 +0000126
Guido van Rossumcaa63801995-01-12 11:45:45 +0000127 The Py_BEGIN_ALLOW_THREADS/Py_END_ALLOW_THREADS pair expands to a
128 {}-surrounded block.
Guido van Rossumff4949e1992-08-05 19:58:53 +0000129 To leave the block in the middle (e.g., with return), you must insert
Skip Montanaro682c25a2000-09-15 18:19:27 +0000130 a line containing Py_BLOCK_THREADS before the return, e.g.
Guido van Rossumff4949e1992-08-05 19:58:53 +0000131
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000132 if (...premature_exit...) {
133 Py_BLOCK_THREADS
134 PyErr_SetFromErrno(PyExc_IOError);
135 return NULL;
136 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000137
138 An alternative is:
139
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000140 Py_BLOCK_THREADS
141 if (...premature_exit...) {
142 PyErr_SetFromErrno(PyExc_IOError);
143 return NULL;
144 }
145 Py_UNBLOCK_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000146
147 For convenience, that the value of 'errno' is restored across
Skip Montanaro682c25a2000-09-15 18:19:27 +0000148 Py_END_ALLOW_THREADS and Py_BLOCK_THREADS.
Guido van Rossumff4949e1992-08-05 19:58:53 +0000149
Guido van Rossumcaa63801995-01-12 11:45:45 +0000150 WARNING: NEVER NEST CALLS TO Py_BEGIN_ALLOW_THREADS AND
151 Py_END_ALLOW_THREADS!!!
Guido van Rossumff4949e1992-08-05 19:58:53 +0000152
Guido van Rossumcaa63801995-01-12 11:45:45 +0000153 The function PyEval_InitThreads() should be called only from
Georg Brandl2067bfd2008-05-25 13:05:15 +0000154 init_thread() in "_threadmodule.c".
Guido van Rossumff4949e1992-08-05 19:58:53 +0000155
156 Note that not yet all candidates have been converted to use this
157 mechanism!
158*/
159
Mark Hammond91a681d2002-08-12 07:21:58 +0000160PyAPI_FUNC(PyThreadState *) PyEval_SaveThread(void);
161PyAPI_FUNC(void) PyEval_RestoreThread(PyThreadState *);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000162
Guido van Rossumb6775db1994-08-01 11:34:53 +0000163#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000164
Tim Peters7f468f22004-10-11 02:40:51 +0000165PyAPI_FUNC(int) PyEval_ThreadsInitialized(void);
Mark Hammond91a681d2002-08-12 07:21:58 +0000166PyAPI_FUNC(void) PyEval_InitThreads(void);
Antoine Pitrou1df15362010-09-13 14:16:46 +0000167PyAPI_FUNC(void) _PyEval_FiniThreads(void);
Mark Hammond91a681d2002-08-12 07:21:58 +0000168PyAPI_FUNC(void) PyEval_AcquireLock(void);
169PyAPI_FUNC(void) PyEval_ReleaseLock(void);
170PyAPI_FUNC(void) PyEval_AcquireThread(PyThreadState *tstate);
171PyAPI_FUNC(void) PyEval_ReleaseThread(PyThreadState *tstate);
172PyAPI_FUNC(void) PyEval_ReInitThreads(void);
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000173
Martin v. Löwis4d0d4712010-12-03 20:14:31 +0000174#ifndef Py_LIMITED_API
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000175PyAPI_FUNC(void) _PyEval_SetSwitchInterval(unsigned long microseconds);
176PyAPI_FUNC(unsigned long) _PyEval_GetSwitchInterval(void);
Martin v. Löwis4d0d4712010-12-03 20:14:31 +0000177#endif
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000178
Guido van Rossumcaa63801995-01-12 11:45:45 +0000179#define Py_BEGIN_ALLOW_THREADS { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000180 PyThreadState *_save; \
181 _save = PyEval_SaveThread();
182#define Py_BLOCK_THREADS PyEval_RestoreThread(_save);
183#define Py_UNBLOCK_THREADS _save = PyEval_SaveThread();
184#define Py_END_ALLOW_THREADS PyEval_RestoreThread(_save); \
185 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000186
Guido van Rossumb6775db1994-08-01 11:34:53 +0000187#else /* !WITH_THREAD */
Guido van Rossumff4949e1992-08-05 19:58:53 +0000188
Guido van Rossumcaa63801995-01-12 11:45:45 +0000189#define Py_BEGIN_ALLOW_THREADS {
190#define Py_BLOCK_THREADS
191#define Py_UNBLOCK_THREADS
192#define Py_END_ALLOW_THREADS }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000193
Guido van Rossumb6775db1994-08-01 11:34:53 +0000194#endif /* !WITH_THREAD */
Guido van Rossuma3309961993-07-28 09:05:47 +0000195
Martin v. Löwis4d0d4712010-12-03 20:14:31 +0000196#ifndef Py_LIMITED_API
Martin v. Löwis18e16552006-02-15 17:27:45 +0000197PyAPI_FUNC(int) _PyEval_SliceIndex(PyObject *, Py_ssize_t *);
Antoine Pitrou074e5ed2009-11-10 19:50:40 +0000198PyAPI_FUNC(void) _PyEval_SignalAsyncExc(void);
Martin v. Löwis4d0d4712010-12-03 20:14:31 +0000199#endif
Guido van Rossum7c36ada2000-05-08 14:04:54 +0000200
201
Guido van Rossuma3309961993-07-28 09:05:47 +0000202#ifdef __cplusplus
203}
204#endif
205#endif /* !Py_CEVAL_H */