blob: f0875454e268ef6cc60a6ab1423c54dc503a1ef8 [file] [log] [blame]
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossum1984f1e1992-08-04 12:41:02 +00004
5 All Rights Reserved
6
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
25/* Python interpreter top-level routines, including init/exit */
26
27#include "allobjects.h"
28
29#include "grammar.h"
30#include "node.h"
31#include "parsetok.h"
32#include "graminit.h"
33#include "errcode.h"
34#include "sysmodule.h"
Guido van Rossum6135a871995-01-09 17:53:26 +000035#include "bltinmodule.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000036#include "compile.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000037#include "eval.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000038#include "ceval.h"
39#include "pythonrun.h"
40#include "import.h"
Guido van Rossumfdef2711994-09-14 13:31:04 +000041#include "marshal.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000042
Guido van Rossuma110aa61994-08-29 12:50:44 +000043#ifdef HAVE_SIGNAL_H
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000044#include <signal.h>
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000045#endif
46
Guido van Rossum42a51241995-01-30 12:52:46 +000047#ifdef THINK_C
48#include <console.h>
49#endif
50
Jack Jansen08e767b1995-02-02 14:30:20 +000051#ifdef __MWERKS__
52#include <SIOUX.h>
53#endif
54
Guido van Rossuma44823b1995-03-14 15:01:17 +000055#ifdef NT
56#undef BYTE
57#include "windows.h"
58#endif
59
Guido van Rossum1984f1e1992-08-04 12:41:02 +000060extern char *getpythonpath();
61
62extern grammar gram; /* From graminit.c */
63
Guido van Rossumb73cc041993-11-01 16:28:59 +000064/* Forward */
Guido van Rossum6135a871995-01-09 17:53:26 +000065static void initmain PROTO((void));
Guido van Rossuma110aa61994-08-29 12:50:44 +000066static object *run_err_node PROTO((node *n, char *filename,
Guido van Rossumb73cc041993-11-01 16:28:59 +000067 object *globals, object *locals));
68static object *run_node PROTO((node *n, char *filename,
69 object *globals, object *locals));
Guido van Rossum262e1241995-02-07 15:30:45 +000070static object *run_pyc_file PROTO((FILE *fp, char *filename,
71 object *globals, object *locals));
Guido van Rossuma110aa61994-08-29 12:50:44 +000072static void err_input PROTO((perrdetail *));
Guido van Rossumb376a4a1993-11-23 17:53:17 +000073static void initsigs PROTO((void));
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000074
Guido van Rossum1984f1e1992-08-04 12:41:02 +000075int debugging; /* Needed by parser.c */
76int verbose; /* Needed by import.c */
Guido van Rossuma110aa61994-08-29 12:50:44 +000077int suppress_print; /* Needed by ceval.c */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000078
79/* Initialize all */
80
81void
82initall()
83{
84 static int inited;
85
86 if (inited)
87 return;
88 inited = 1;
89
90 initimport();
91
Guido van Rossuma110aa61994-08-29 12:50:44 +000092 /* Modules '__builtin__' and 'sys' are initialized here,
Guido van Rossum1984f1e1992-08-04 12:41:02 +000093 they are needed by random bits of the interpreter.
94 All other modules are optional and are initialized
95 when they are first imported. */
96
97 initbuiltin(); /* Also initializes builtin exceptions */
98 initsys();
Guido van Rossum1984f1e1992-08-04 12:41:02 +000099
100 setpythonpath(getpythonpath());
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000101
102 initsigs(); /* Signal handling stuff, including initintr() */
Guido van Rossum6135a871995-01-09 17:53:26 +0000103
104 initmain();
105}
106
107/* Create __main__ module */
108
109static void
110initmain()
111{
112 object *m, *d;
113 m = add_module("__main__");
114 if (m == NULL)
115 fatal("can't create __main__ module");
116 d = getmoduledict(m);
117 if (dictlookup(d, "__builtins__") == NULL) {
Guido van Rossum94390ec1995-01-12 11:37:57 +0000118 if (dictinsert(d, "__builtins__", getbuiltins()))
Guido van Rossum6135a871995-01-09 17:53:26 +0000119 fatal("can't add __builtins__ to __main__");
120 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000121}
122
123/* Parse input from a file and execute it */
124
125int
126run(fp, filename)
127 FILE *fp;
128 char *filename;
129{
130 if (filename == NULL)
131 filename = "???";
132 if (isatty((int)fileno(fp)))
133 return run_tty_loop(fp, filename);
134 else
135 return run_script(fp, filename);
136}
137
138int
139run_tty_loop(fp, filename)
140 FILE *fp;
141 char *filename;
142{
143 object *v;
144 int ret;
145 v = sysget("ps1");
146 if (v == NULL) {
147 sysset("ps1", v = newstringobject(">>> "));
148 XDECREF(v);
149 }
150 v = sysget("ps2");
151 if (v == NULL) {
152 sysset("ps2", v = newstringobject("... "));
153 XDECREF(v);
154 }
155 for (;;) {
156 ret = run_tty_1(fp, filename);
157#ifdef REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000158 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000159#endif
160 if (ret == E_EOF)
161 return 0;
162 /*
163 if (ret == E_NOMEM)
164 return -1;
165 */
166 }
167}
168
169int
170run_tty_1(fp, filename)
171 FILE *fp;
172 char *filename;
173{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000174 object *m, *d, *v, *w;
175 node *n;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000176 perrdetail err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000177 char *ps1, *ps2;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000178 v = sysget("ps1");
179 w = sysget("ps2");
180 if (v != NULL && is_stringobject(v)) {
181 INCREF(v);
182 ps1 = getstringvalue(v);
183 }
184 else {
185 v = NULL;
186 ps1 = "";
187 }
188 if (w != NULL && is_stringobject(w)) {
189 INCREF(w);
190 ps2 = getstringvalue(w);
191 }
192 else {
193 w = NULL;
194 ps2 = "";
195 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000196 BGN_SAVE
Guido van Rossuma110aa61994-08-29 12:50:44 +0000197 n = parsefile(fp, filename, &gram, single_input, ps1, ps2, &err);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000198 END_SAVE
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000199 XDECREF(v);
200 XDECREF(w);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000201 if (n == NULL) {
202 if (err.error == E_EOF) {
203 if (err.text)
204 free(err.text);
205 return E_EOF;
206 }
207 err_input(&err);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000208 print_error();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000209 return err.error;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000210 }
211 m = add_module("__main__");
212 if (m == NULL)
213 return -1;
214 d = getmoduledict(m);
215 v = run_node(n, filename, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000216 if (v == NULL) {
217 print_error();
218 return -1;
219 }
220 DECREF(v);
Guido van Rossum6d023c91995-01-04 19:12:13 +0000221 flushline();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000222 return 0;
223}
224
225int
226run_script(fp, filename)
227 FILE *fp;
228 char *filename;
229{
230 object *m, *d, *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000231 char *ext;
232
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000233 m = add_module("__main__");
234 if (m == NULL)
235 return -1;
236 d = getmoduledict(m);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000237 ext = filename + strlen(filename) - 4;
Jack Jansenbd06e961995-02-13 11:44:56 +0000238#ifdef macintosh
239 /* On a mac, we also assume a pyc file for types 'PYC ' and 'APPL' */
240 if ( strcmp(ext, ".pyc") == 0 || getfiletype(filename) == 'PYC ' ||
241 getfiletype(filename) == 'APPL' ) {
242#else
Guido van Rossumfdef2711994-09-14 13:31:04 +0000243 if ( strcmp(ext, ".pyc") == 0 ) {
Jack Jansenbd06e961995-02-13 11:44:56 +0000244#endif /* macintosh */
Guido van Rossumfdef2711994-09-14 13:31:04 +0000245 /* Try to run a pyc file. First, re-open in binary */
Jack Jansene00637b1994-12-14 12:58:37 +0000246 /* Don't close, done in main: fclose(fp); */
Guido van Rossumfdef2711994-09-14 13:31:04 +0000247 if( (fp = fopen(filename, "rb")) == NULL ) {
248 fprintf(stderr, "python: Can't reopen .pyc file\n");
249 return -1;
250 }
251 v = run_pyc_file(fp, filename, d, d);
252 } else {
253 v = run_file(fp, filename, file_input, d, d);
254 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000255 if (v == NULL) {
256 print_error();
257 return -1;
258 }
259 DECREF(v);
Guido van Rossum6d023c91995-01-04 19:12:13 +0000260 flushline();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000261 return 0;
262}
263
264int
265run_command(command)
266 char *command;
267{
268 object *m, *d, *v;
269 m = add_module("__main__");
270 if (m == NULL)
271 return -1;
272 d = getmoduledict(m);
273 v = run_string(command, file_input, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000274 if (v == NULL) {
275 print_error();
276 return -1;
277 }
278 DECREF(v);
Guido van Rossum6d023c91995-01-04 19:12:13 +0000279 flushline();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000280 return 0;
281}
282
283void
284print_error()
285{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000286 object *exception, *v, *tb, *f;
287 err_fetch(&exception, &v, &tb);
Guido van Rossum6d023c91995-01-04 19:12:13 +0000288 flushline();
Guido van Rossum527c2641995-03-30 11:01:44 +0000289 fflush(stdout);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000290 if (exception == NULL)
291 fatal("print_error called but no exception");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000292 if (exception == SystemExit) {
293 if (v == NULL || v == None)
294 goaway(0);
295 if (is_intobject(v))
296 goaway((int)getintvalue(v));
297 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000298 /* OK to use real stderr here */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000299 printobject(v, stderr, PRINT_RAW);
300 fprintf(stderr, "\n");
301 goaway(1);
302 }
303 }
304 sysset("last_type", exception);
305 sysset("last_value", v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000306 sysset("last_traceback", tb);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000307 f = sysget("stderr");
308 if (f == NULL)
309 fprintf(stderr, "lost sys.stderr\n");
310 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000311 tb_print(tb, f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000312 if (exception == SyntaxError) {
313 object *message;
314 char *filename, *text;
315 int lineno, offset;
316 if (!getargs(v, "(O(ziiz))", &message,
317 &filename, &lineno, &offset, &text))
318 err_clear();
319 else {
320 char buf[10];
321 writestring(" File \"", f);
322 if (filename == NULL)
323 writestring("<string>", f);
324 else
325 writestring(filename, f);
326 writestring("\", line ", f);
327 sprintf(buf, "%d", lineno);
328 writestring(buf, f);
329 writestring("\n", f);
330 if (text != NULL) {
Guido van Rossum798199d1994-09-19 08:08:50 +0000331 char *nl;
332 if (offset > 0 &&
333 offset == strlen(text))
334 offset--;
335 for (;;) {
336 nl = strchr(text, '\n');
337 if (nl == NULL ||
338 nl-text >= offset)
339 break;
340 offset -= (nl+1-text);
341 text = nl+1;
342 }
Guido van Rossuma110aa61994-08-29 12:50:44 +0000343 while (*text == ' ' || *text == '\t') {
344 text++;
345 offset--;
346 }
347 writestring(" ", f);
348 writestring(text, f);
349 if (*text == '\0' ||
350 text[strlen(text)-1] != '\n')
351 writestring("\n", f);
352 writestring(" ", f);
353 offset--;
354 while (offset > 0) {
355 writestring(" ", f);
356 offset--;
357 }
358 writestring("^\n", f);
359 }
360 INCREF(message);
361 DECREF(v);
362 v = message;
363 }
364 }
Guido van Rossum262e1241995-02-07 15:30:45 +0000365 if (is_classobject(exception)) {
366 object* className = ((classobject*)exception)->cl_name;
367 if (className == NULL)
368 writestring("<unknown>", f);
369 else {
370 if (writeobject(className, f, PRINT_RAW) != 0)
371 err_clear();
372 }
373 } else {
374 if (writeobject(exception, f, PRINT_RAW) != 0)
375 err_clear();
376 }
Guido van Rossum3165fe61992-09-25 21:59:05 +0000377 if (v != NULL && v != None) {
378 writestring(": ", f);
379 if (writeobject(v, f, PRINT_RAW) != 0)
380 err_clear();
381 }
382 writestring("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000383 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000384 XDECREF(exception);
385 XDECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000386 XDECREF(tb);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000387}
388
389object *
390run_string(str, start, globals, locals)
391 char *str;
392 int start;
Guido van Rossum5b722181993-03-30 17:46:03 +0000393 object *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000394{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000395 return run_err_node(parse_string(str, start),
396 "<string>", globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000397}
398
399object *
400run_file(fp, filename, start, globals, locals)
401 FILE *fp;
402 char *filename;
403 int start;
Guido van Rossum5b722181993-03-30 17:46:03 +0000404 object *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000405{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000406 return run_err_node(parse_file(fp, filename, start),
407 filename, globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000408}
409
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000410static object *
Guido van Rossuma110aa61994-08-29 12:50:44 +0000411run_err_node(n, filename, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000412 node *n;
413 char *filename;
Guido van Rossum5b722181993-03-30 17:46:03 +0000414 object *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000415{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000416 if (n == NULL)
417 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000418 return run_node(n, filename, globals, locals);
419}
420
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000421static object *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000422run_node(n, filename, globals, locals)
423 node *n;
424 char *filename;
Guido van Rossum5b722181993-03-30 17:46:03 +0000425 object *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000426{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000427 codeobject *co;
428 object *v;
429 co = compile(n, filename);
430 freetree(n);
431 if (co == NULL)
432 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000433 v = eval_code(co, globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000434 DECREF(co);
435 return v;
436}
437
Guido van Rossum8ae87c01995-01-26 00:40:38 +0000438static object *
Guido van Rossumfdef2711994-09-14 13:31:04 +0000439run_pyc_file(fp, filename, globals, locals)
440 FILE *fp;
441 char *filename;
442 object *globals, *locals;
443{
444 codeobject *co;
445 object *v;
446 long magic;
447 long get_pyc_magic();
448
449 magic = rd_long(fp);
450 if (magic != get_pyc_magic()) {
451 err_setstr(RuntimeError,
452 "Bad magic number in .pyc file");
453 return NULL;
454 }
455 (void) rd_long(fp);
456 v = rd_object(fp);
457 fclose(fp);
458 if (v == NULL || !is_codeobject(v)) {
459 XDECREF(v);
460 err_setstr(RuntimeError,
461 "Bad code object in .pyc file");
462 return NULL;
463 }
464 co = (codeobject *)v;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000465 v = eval_code(co, globals, locals);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000466 DECREF(co);
467 return v;
468}
469
470object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000471compile_string(str, filename, start)
472 char *str;
473 char *filename;
474 int start;
475{
476 node *n;
Guido van Rossum5b722181993-03-30 17:46:03 +0000477 codeobject *co;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000478 n = parse_string(str, start);
479 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +0000480 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000481 co = compile(n, filename);
482 freetree(n);
483 return (object *)co;
484}
485
Guido van Rossuma110aa61994-08-29 12:50:44 +0000486/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000487
Guido van Rossuma110aa61994-08-29 12:50:44 +0000488node *
489parse_file(fp, filename, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000490 FILE *fp;
491 char *filename;
492 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000493{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000494 node *n;
495 perrdetail err;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000496 BGN_SAVE
Guido van Rossuma110aa61994-08-29 12:50:44 +0000497 n = parsefile(fp, filename, &gram, start,
498 (char *)0, (char *)0, &err);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000499 END_SAVE
Guido van Rossuma110aa61994-08-29 12:50:44 +0000500 if (n == NULL)
501 err_input(&err);
502 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000503}
504
Guido van Rossuma110aa61994-08-29 12:50:44 +0000505/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000506
Guido van Rossuma110aa61994-08-29 12:50:44 +0000507node *
508parse_string(str, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000509 char *str;
510 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000511{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000512 node *n;
513 perrdetail err;
514 n = parsestring(str, &gram, start, &err);
515 if (n == NULL)
516 err_input(&err);
517 return n;
518}
519
520/* Set the error appropriate to the given input error code (see errcode.h) */
521
522static void
523err_input(err)
524 perrdetail *err;
525{
526 object *v, *w;
527 char *msg = NULL;
528 v = mkvalue("(ziiz)", err->filename,
529 err->lineno, err->offset, err->text);
530 if (err->text != NULL) {
531 free(err->text);
532 err->text = NULL;
533 }
534 switch (err->error) {
535 case E_SYNTAX:
536 msg = "invalid syntax";
537 break;
538 case E_TOKEN:
539 msg = "invalid token";
540
541 break;
542 case E_INTR:
543 err_set(KeyboardInterrupt);
544 return;
545 case E_NOMEM:
546 err_nomem();
547 return;
548 case E_EOF:
549 msg = "unexpected EOF while parsing";
550 break;
551 default:
552 fprintf(stderr, "error=%d\n", err->error);
553 msg = "unknown parsing error";
554 break;
555 }
556 w = mkvalue("(sO)", msg, v);
557 XDECREF(v);
558 err_setval(SyntaxError, w);
559 XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000560}
561
562/* Print fatal error message and abort */
563
564void
565fatal(msg)
566 char *msg;
567{
Guido van Rossum83dd6c31994-09-29 09:38:33 +0000568 fprintf(stderr, "Fatal Python error: %s\n", msg);
Guido van Rossum8ae87c01995-01-26 00:40:38 +0000569#ifdef macintosh
570 for (;;);
571#endif
Guido van Rossuma44823b1995-03-14 15:01:17 +0000572#ifdef NT
573 OutputDebugString("Fatal Python error:");
574 OutputDebugString(msg);
575 OutputDebugString("\n");
576#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000577 abort();
578}
579
580/* Clean up and exit */
581
Guido van Rossuma110aa61994-08-29 12:50:44 +0000582#ifdef WITH_THREAD
583#include "thread.h"
584int threads_started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +0000585#endif
586
Guido van Rossum1662dd51994-09-07 14:38:28 +0000587#define NEXITFUNCS 32
588static void (*exitfuncs[NEXITFUNCS])();
589static int nexitfuncs = 0;
590
591int Py_AtExit(func)
592 void (*func) PROTO((void));
593{
594 if (nexitfuncs >= NEXITFUNCS)
595 return -1;
596 exitfuncs[nexitfuncs++] = func;
597 return 0;
598}
599
Guido van Rossuma110aa61994-08-29 12:50:44 +0000600void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000601cleanup()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000602{
Guido van Rossum59bff391992-09-03 20:28:00 +0000603 object *exitfunc = sysget("exitfunc");
604
605 if (exitfunc) {
Guido van Rossum59bff391992-09-03 20:28:00 +0000606 object *res;
607 sysset("exitfunc", (object *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000608 res = call_object(exitfunc, (object *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +0000609 if (res == NULL) {
610 fprintf(stderr, "Error in sys.exitfunc:\n");
611 print_error();
612 }
613 }
614
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000615 flushline();
Guido van Rossum1662dd51994-09-07 14:38:28 +0000616
617 while (nexitfuncs > 0)
618 (*exitfuncs[--nexitfuncs])();
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000619}
620
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000621#ifdef COUNT_ALLOCS
622extern void dump_counts PROTO((void));
623#endif
624
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000625void
626goaway(sts)
627 int sts;
628{
629 cleanup();
Guido van Rossumff4949e1992-08-05 19:58:53 +0000630
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000631#ifdef COUNT_ALLOCS
632 dump_counts();
633#endif
634
Guido van Rossuma110aa61994-08-29 12:50:44 +0000635#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000636
637 /* Other threads may still be active, so skip most of the
638 cleanup actions usually done (these are mostly for
639 debugging anyway). */
640
Guido van Rossumdf72a651992-08-12 15:27:32 +0000641 (void) save_thread();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000642#ifndef NO_EXIT_PROG
Guido van Rossumf9f2e821992-08-17 08:59:08 +0000643 if (threads_started)
644 _exit_prog(sts);
645 else
646 exit_prog(sts);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000647#else /* !NO_EXIT_PROG */
648 if (threads_started)
649 _exit(sts);
650 else
651 exit(sts);
652#endif /* !NO_EXIT_PROG */
Guido van Rossumff4949e1992-08-05 19:58:53 +0000653
Guido van Rossuma110aa61994-08-29 12:50:44 +0000654#else /* WITH_THREAD */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000655
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000656 doneimport();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000657
658 err_clear();
659
660#ifdef REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000661 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000662#endif
663
664#ifdef TRACE_REFS
665 if (askyesno("Print left references?")) {
666 printrefs(stderr);
667 }
668#endif /* TRACE_REFS */
669
Jack Jansen08e767b1995-02-02 14:30:20 +0000670 /* XXXX Jack thinks it would be nicer to pause if any output has
671 ** been generated since the last interaction with the user...
672 */
Guido van Rossum42a51241995-01-30 12:52:46 +0000673#ifdef THINK_C
674 if (sts == 0)
675 console_options.pause_atexit = 0;
676#endif
Jack Jansen08e767b1995-02-02 14:30:20 +0000677#ifdef __MWERKS__
678 if (sts == 0)
679 SIOUXSettings.autocloseonquit = 1;
Jack Jansenbd06e961995-02-13 11:44:56 +0000680 else
681 SIOUXSettings.showstatusline = 1;
Jack Jansen08e767b1995-02-02 14:30:20 +0000682#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000683 exit(sts);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000684#endif /* WITH_THREAD */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000685 /*NOTREACHED*/
686}
687
Guido van Rossuma110aa61994-08-29 12:50:44 +0000688#ifdef HAVE_SIGNAL_H
689static RETSIGTYPE
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000690sighandler(sig)
691 int sig;
692{
693 signal(sig, SIG_DFL); /* Don't catch recursive signals */
694 cleanup(); /* Do essential clean-up */
Guido van Rossuma110aa61994-08-29 12:50:44 +0000695#ifdef HAVE_GETPID
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000696 kill(getpid(), sig); /* Pretend the signal killed us */
Guido van Rossuma110aa61994-08-29 12:50:44 +0000697#else
698 exit(1);
699#endif
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000700 /*NOTREACHED*/
701}
702#endif
703
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000704static void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000705initsigs()
706{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000707 RETSIGTYPE (*t)();
708#ifdef HAVE_SIGNAL_H
709#ifdef SIGPIPE
710 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000711#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +0000712#ifdef SIGHUP
713 t = signal(SIGHUP, SIG_IGN);
714 if (t == SIG_DFL)
715 signal(SIGHUP, sighandler);
716 else
717 signal(SIGHUP, t);
718#endif
719#ifdef SIGTERM
720 t = signal(SIGTERM, SIG_IGN);
721 if (t == SIG_DFL)
722 signal(SIGTERM, sighandler);
723 else
724 signal(SIGTERM, t);
725#endif
726#endif /* HAVE_SIGNAL_H */
727 initintr(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000728}
729
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000730#ifdef TRACE_REFS
731/* Ask a yes/no question */
732
Guido van Rossum59bff391992-09-03 20:28:00 +0000733int
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000734askyesno(prompt)
735 char *prompt;
736{
737 char buf[256];
738
739 printf("%s [ny] ", prompt);
740 if (fgets(buf, sizeof buf, stdin) == NULL)
741 return 0;
742 return buf[0] == 'y' || buf[0] == 'Y';
743}
744#endif
745
Guido van Rossuma110aa61994-08-29 12:50:44 +0000746#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000747
748/* Check for file descriptor connected to interactive device.
749 Pretend that stdin is always interactive, other files never. */
750
751int
752isatty(fd)
753 int fd;
754{
755 return fd == fileno(stdin);
756}
757
758#endif