blob: d1020aaab031a05fb6eae817bee244d8498ff2be [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 Rossum5799b521995-01-04 19:06:22 +00008Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
9The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000010
11 All Rights Reserved
12
13Permission to use, copy, modify, and distribute this software and its
14documentation for any purpose and without fee is hereby granted,
15provided that the above copyright notice appear in all copies and that
16both that copyright notice and this permission notice appear in
17supporting documentation, and that the names of Stichting Mathematisch
18Centrum or CWI not be used in advertising or publicity pertaining to
19distribution of the software without specific, written prior permission.
20
21STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
22THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
23FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
24FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
25WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
26ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
27OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
28
29******************************************************************/
30
Guido van Rossumff4949e1992-08-05 19:58:53 +000031/* Interface to random parts in ceval.c */
Guido van Rossum3f5da241990-12-20 15:06:42 +000032
Guido van Rossuma0490311991-07-27 21:33:03 +000033object *call_object PROTO((object *, object *));
34
Guido van Rossum6135a871995-01-09 17:53:26 +000035object *getbuiltins PROTO((void));
Guido van Rossum3f5da241990-12-20 15:06:42 +000036object *getglobals PROTO((void));
37object *getlocals PROTO((void));
Guido van Rossumeb6b33a1993-05-25 09:38:27 +000038object *getowner PROTO((void));
Guido van Rossumb6775db1994-08-01 11:34:53 +000039object *getframe PROTO((void));
Guido van Rossum6135a871995-01-09 17:53:26 +000040int getrestricted PROTO((void));
Guido van Rossum3f5da241990-12-20 15:06:42 +000041
Guido van Rossum704a26c1992-03-27 17:29:31 +000042void flushline PROTO((void));
Guido van Rossumff4949e1992-08-05 19:58:53 +000043
Guido van Rossum95664081994-09-14 13:23:36 +000044int Py_AddPendingCall PROTO((int (*func) PROTO((ANY *)), ANY *arg));
Guido van Rossumc5d92e11994-09-28 15:44:39 +000045int Py_MakePendingCalls PROTO((void));
Guido van Rossum95664081994-09-14 13:23:36 +000046
Guido van Rossumff4949e1992-08-05 19:58:53 +000047
48/* Interface for threads.
49
50 A module that plans to do a blocking system call (or something else
51 that lasts a long time and doesn't touch Python data) can allow other
52 threads to run as follows:
53
54 ...preparations here...
55 BGN_SAVE
56 ...blocking system call here...
57 END_SAVE
Guido van Rossum66cb3111994-12-30 15:33:50 +000058 ...interpret result here...
Guido van Rossumff4949e1992-08-05 19:58:53 +000059
60 The BGN_SAVE/END_SAVE pair expands to a {}-surrounded block.
61 To leave the block in the middle (e.g., with return), you must insert
62 a line containing RET_SAVE before the return, e.g.
63
64 if (...premature_exit...) {
65 RET_SAVE
66 err_errno(IOError);
67 return NULL;
68 }
69
70 An alternative is:
71
72 RET_SAVE
73 if (...premature_exit...) {
74 err_errno(IOError);
75 return NULL;
76 }
77 RES_SAVE
78
79 For convenience, that the value of 'errno' is restored across
80 END_SAVE and RET_SAVE.
81
82 WARNING: NEVER NEST CALLS TO BGN_SAVE AND END_SAVE!!!
83
84 The function init_save_thread() should be called only from
85 initthread() in "threadmodule.c".
86
87 Note that not yet all candidates have been converted to use this
88 mechanism!
89*/
90
91extern void init_save_thread PROTO((void));
Guido van Rossum04691fc1992-08-12 15:35:34 +000092extern object *save_thread PROTO((void));
93extern void restore_thread PROTO((object *));
Guido van Rossumff4949e1992-08-05 19:58:53 +000094
Guido van Rossumb6775db1994-08-01 11:34:53 +000095#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +000096
97#define BGN_SAVE { \
Guido van Rossum04691fc1992-08-12 15:35:34 +000098 object *_save; \
Guido van Rossumff4949e1992-08-05 19:58:53 +000099 _save = save_thread();
100#define RET_SAVE restore_thread(_save);
101#define RES_SAVE _save = save_thread();
102#define END_SAVE restore_thread(_save); \
103 }
104
Guido van Rossumb6775db1994-08-01 11:34:53 +0000105#else /* !WITH_THREAD */
Guido van Rossumff4949e1992-08-05 19:58:53 +0000106
107#define BGN_SAVE {
108#define RET_SAVE
109#define RES_SAVE
110#define END_SAVE }
111
Guido van Rossumb6775db1994-08-01 11:34:53 +0000112#endif /* !WITH_THREAD */
Guido van Rossuma3309961993-07-28 09:05:47 +0000113
114#ifdef __cplusplus
115}
116#endif
117#endif /* !Py_CEVAL_H */