blob: 43ff59914266e9303c39b1cacd594fed0b72339c [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 Rossum1984f1e1992-08-04 12:41:02 +000055extern char *getpythonpath();
56
57extern grammar gram; /* From graminit.c */
58
Guido van Rossumb73cc041993-11-01 16:28:59 +000059/* Forward */
Guido van Rossum6135a871995-01-09 17:53:26 +000060static void initmain PROTO((void));
Guido van Rossuma110aa61994-08-29 12:50:44 +000061static object *run_err_node PROTO((node *n, char *filename,
Guido van Rossumb73cc041993-11-01 16:28:59 +000062 object *globals, object *locals));
63static object *run_node PROTO((node *n, char *filename,
64 object *globals, object *locals));
Guido van Rossum262e1241995-02-07 15:30:45 +000065static object *run_pyc_file PROTO((FILE *fp, char *filename,
66 object *globals, object *locals));
Guido van Rossuma110aa61994-08-29 12:50:44 +000067static void err_input PROTO((perrdetail *));
Guido van Rossumb376a4a1993-11-23 17:53:17 +000068static void initsigs PROTO((void));
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000069
Guido van Rossum1984f1e1992-08-04 12:41:02 +000070int debugging; /* Needed by parser.c */
71int verbose; /* Needed by import.c */
Guido van Rossuma110aa61994-08-29 12:50:44 +000072int suppress_print; /* Needed by ceval.c */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000073
74/* Initialize all */
75
76void
77initall()
78{
79 static int inited;
80
81 if (inited)
82 return;
83 inited = 1;
84
85 initimport();
86
Guido van Rossuma110aa61994-08-29 12:50:44 +000087 /* Modules '__builtin__' and 'sys' are initialized here,
Guido van Rossum1984f1e1992-08-04 12:41:02 +000088 they are needed by random bits of the interpreter.
89 All other modules are optional and are initialized
90 when they are first imported. */
91
92 initbuiltin(); /* Also initializes builtin exceptions */
93 initsys();
Guido van Rossum1984f1e1992-08-04 12:41:02 +000094
95 setpythonpath(getpythonpath());
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000096
97 initsigs(); /* Signal handling stuff, including initintr() */
Guido van Rossum6135a871995-01-09 17:53:26 +000098
99 initmain();
100}
101
102/* Create __main__ module */
103
104static void
105initmain()
106{
107 object *m, *d;
108 m = add_module("__main__");
109 if (m == NULL)
110 fatal("can't create __main__ module");
111 d = getmoduledict(m);
112 if (dictlookup(d, "__builtins__") == NULL) {
Guido van Rossum94390ec1995-01-12 11:37:57 +0000113 if (dictinsert(d, "__builtins__", getbuiltins()))
Guido van Rossum6135a871995-01-09 17:53:26 +0000114 fatal("can't add __builtins__ to __main__");
115 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000116}
117
118/* Parse input from a file and execute it */
119
120int
121run(fp, filename)
122 FILE *fp;
123 char *filename;
124{
125 if (filename == NULL)
126 filename = "???";
127 if (isatty((int)fileno(fp)))
128 return run_tty_loop(fp, filename);
129 else
130 return run_script(fp, filename);
131}
132
133int
134run_tty_loop(fp, filename)
135 FILE *fp;
136 char *filename;
137{
138 object *v;
139 int ret;
140 v = sysget("ps1");
141 if (v == NULL) {
142 sysset("ps1", v = newstringobject(">>> "));
143 XDECREF(v);
144 }
145 v = sysget("ps2");
146 if (v == NULL) {
147 sysset("ps2", v = newstringobject("... "));
148 XDECREF(v);
149 }
150 for (;;) {
151 ret = run_tty_1(fp, filename);
152#ifdef REF_DEBUG
153 fprintf(stderr, "[%ld refs]\n", ref_total);
154#endif
155 if (ret == E_EOF)
156 return 0;
157 /*
158 if (ret == E_NOMEM)
159 return -1;
160 */
161 }
162}
163
164int
165run_tty_1(fp, filename)
166 FILE *fp;
167 char *filename;
168{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000169 object *m, *d, *v, *w;
170 node *n;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000171 perrdetail err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000172 char *ps1, *ps2;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000173 v = sysget("ps1");
174 w = sysget("ps2");
175 if (v != NULL && is_stringobject(v)) {
176 INCREF(v);
177 ps1 = getstringvalue(v);
178 }
179 else {
180 v = NULL;
181 ps1 = "";
182 }
183 if (w != NULL && is_stringobject(w)) {
184 INCREF(w);
185 ps2 = getstringvalue(w);
186 }
187 else {
188 w = NULL;
189 ps2 = "";
190 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000191 BGN_SAVE
Guido van Rossuma110aa61994-08-29 12:50:44 +0000192 n = parsefile(fp, filename, &gram, single_input, ps1, ps2, &err);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000193 END_SAVE
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000194 XDECREF(v);
195 XDECREF(w);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000196 if (n == NULL) {
197 if (err.error == E_EOF) {
198 if (err.text)
199 free(err.text);
200 return E_EOF;
201 }
202 err_input(&err);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000203 print_error();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000204 return err.error;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000205 }
206 m = add_module("__main__");
207 if (m == NULL)
208 return -1;
209 d = getmoduledict(m);
210 v = run_node(n, filename, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000211 if (v == NULL) {
212 print_error();
213 return -1;
214 }
215 DECREF(v);
Guido van Rossum6d023c91995-01-04 19:12:13 +0000216 flushline();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000217 return 0;
218}
219
220int
221run_script(fp, filename)
222 FILE *fp;
223 char *filename;
224{
225 object *m, *d, *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000226 char *ext;
227
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000228 m = add_module("__main__");
229 if (m == NULL)
230 return -1;
231 d = getmoduledict(m);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000232 ext = filename + strlen(filename) - 4;
233 if ( strcmp(ext, ".pyc") == 0 ) {
234 /* Try to run a pyc file. First, re-open in binary */
Jack Jansene00637b1994-12-14 12:58:37 +0000235 /* Don't close, done in main: fclose(fp); */
Guido van Rossumfdef2711994-09-14 13:31:04 +0000236 if( (fp = fopen(filename, "rb")) == NULL ) {
237 fprintf(stderr, "python: Can't reopen .pyc file\n");
238 return -1;
239 }
240 v = run_pyc_file(fp, filename, d, d);
241 } else {
242 v = run_file(fp, filename, file_input, d, d);
243 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000244 if (v == NULL) {
245 print_error();
246 return -1;
247 }
248 DECREF(v);
Guido van Rossum6d023c91995-01-04 19:12:13 +0000249 flushline();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000250 return 0;
251}
252
253int
254run_command(command)
255 char *command;
256{
257 object *m, *d, *v;
258 m = add_module("__main__");
259 if (m == NULL)
260 return -1;
261 d = getmoduledict(m);
262 v = run_string(command, file_input, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000263 if (v == NULL) {
264 print_error();
265 return -1;
266 }
267 DECREF(v);
Guido van Rossum6d023c91995-01-04 19:12:13 +0000268 flushline();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000269 return 0;
270}
271
272void
273print_error()
274{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000275 object *exception, *v, *tb, *f;
276 err_fetch(&exception, &v, &tb);
Guido van Rossum6d023c91995-01-04 19:12:13 +0000277 flushline();
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000278 if (exception == NULL)
279 fatal("print_error called but no exception");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000280 if (exception == SystemExit) {
281 if (v == NULL || v == None)
282 goaway(0);
283 if (is_intobject(v))
284 goaway((int)getintvalue(v));
285 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000286 /* OK to use real stderr here */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000287 printobject(v, stderr, PRINT_RAW);
288 fprintf(stderr, "\n");
289 goaway(1);
290 }
291 }
292 sysset("last_type", exception);
293 sysset("last_value", v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000294 sysset("last_traceback", tb);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000295 f = sysget("stderr");
296 if (f == NULL)
297 fprintf(stderr, "lost sys.stderr\n");
298 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000299 tb_print(tb, f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000300 if (exception == SyntaxError) {
301 object *message;
302 char *filename, *text;
303 int lineno, offset;
304 if (!getargs(v, "(O(ziiz))", &message,
305 &filename, &lineno, &offset, &text))
306 err_clear();
307 else {
308 char buf[10];
309 writestring(" File \"", f);
310 if (filename == NULL)
311 writestring("<string>", f);
312 else
313 writestring(filename, f);
314 writestring("\", line ", f);
315 sprintf(buf, "%d", lineno);
316 writestring(buf, f);
317 writestring("\n", f);
318 if (text != NULL) {
Guido van Rossum798199d1994-09-19 08:08:50 +0000319 char *nl;
320 if (offset > 0 &&
321 offset == strlen(text))
322 offset--;
323 for (;;) {
324 nl = strchr(text, '\n');
325 if (nl == NULL ||
326 nl-text >= offset)
327 break;
328 offset -= (nl+1-text);
329 text = nl+1;
330 }
Guido van Rossuma110aa61994-08-29 12:50:44 +0000331 while (*text == ' ' || *text == '\t') {
332 text++;
333 offset--;
334 }
335 writestring(" ", f);
336 writestring(text, f);
337 if (*text == '\0' ||
338 text[strlen(text)-1] != '\n')
339 writestring("\n", f);
340 writestring(" ", f);
341 offset--;
342 while (offset > 0) {
343 writestring(" ", f);
344 offset--;
345 }
346 writestring("^\n", f);
347 }
348 INCREF(message);
349 DECREF(v);
350 v = message;
351 }
352 }
Guido van Rossum262e1241995-02-07 15:30:45 +0000353 if (is_classobject(exception)) {
354 object* className = ((classobject*)exception)->cl_name;
355 if (className == NULL)
356 writestring("<unknown>", f);
357 else {
358 if (writeobject(className, f, PRINT_RAW) != 0)
359 err_clear();
360 }
361 } else {
362 if (writeobject(exception, f, PRINT_RAW) != 0)
363 err_clear();
364 }
Guido van Rossum3165fe61992-09-25 21:59:05 +0000365 if (v != NULL && v != None) {
366 writestring(": ", f);
367 if (writeobject(v, f, PRINT_RAW) != 0)
368 err_clear();
369 }
370 writestring("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000371 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000372 XDECREF(exception);
373 XDECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000374 XDECREF(tb);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000375}
376
377object *
378run_string(str, start, globals, locals)
379 char *str;
380 int start;
Guido van Rossum5b722181993-03-30 17:46:03 +0000381 object *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000382{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000383 return run_err_node(parse_string(str, start),
384 "<string>", globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000385}
386
387object *
388run_file(fp, filename, start, globals, locals)
389 FILE *fp;
390 char *filename;
391 int start;
Guido van Rossum5b722181993-03-30 17:46:03 +0000392 object *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000393{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000394 return run_err_node(parse_file(fp, filename, start),
395 filename, globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000396}
397
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000398static object *
Guido van Rossuma110aa61994-08-29 12:50:44 +0000399run_err_node(n, filename, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000400 node *n;
401 char *filename;
Guido van Rossum5b722181993-03-30 17:46:03 +0000402 object *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000403{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000404 if (n == NULL)
405 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000406 return run_node(n, filename, globals, locals);
407}
408
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000409static object *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000410run_node(n, filename, globals, locals)
411 node *n;
412 char *filename;
Guido van Rossum5b722181993-03-30 17:46:03 +0000413 object *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000414{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000415 codeobject *co;
416 object *v;
417 co = compile(n, filename);
418 freetree(n);
419 if (co == NULL)
420 return NULL;
Guido van Rossum81daa321993-05-20 14:24:46 +0000421 v = eval_code(co, globals, locals, (object *)NULL, (object *)NULL);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000422 DECREF(co);
423 return v;
424}
425
Guido van Rossum8ae87c01995-01-26 00:40:38 +0000426static object *
Guido van Rossumfdef2711994-09-14 13:31:04 +0000427run_pyc_file(fp, filename, globals, locals)
428 FILE *fp;
429 char *filename;
430 object *globals, *locals;
431{
432 codeobject *co;
433 object *v;
434 long magic;
435 long get_pyc_magic();
436
437 magic = rd_long(fp);
438 if (magic != get_pyc_magic()) {
439 err_setstr(RuntimeError,
440 "Bad magic number in .pyc file");
441 return NULL;
442 }
443 (void) rd_long(fp);
444 v = rd_object(fp);
445 fclose(fp);
446 if (v == NULL || !is_codeobject(v)) {
447 XDECREF(v);
448 err_setstr(RuntimeError,
449 "Bad code object in .pyc file");
450 return NULL;
451 }
452 co = (codeobject *)v;
453 v = eval_code(co, globals, locals, (object *)NULL, (object *)NULL);
454 DECREF(co);
455 return v;
456}
457
458object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000459compile_string(str, filename, start)
460 char *str;
461 char *filename;
462 int start;
463{
464 node *n;
Guido van Rossum5b722181993-03-30 17:46:03 +0000465 codeobject *co;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000466 n = parse_string(str, start);
467 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +0000468 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000469 co = compile(n, filename);
470 freetree(n);
471 return (object *)co;
472}
473
Guido van Rossuma110aa61994-08-29 12:50:44 +0000474/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000475
Guido van Rossuma110aa61994-08-29 12:50:44 +0000476node *
477parse_file(fp, filename, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000478 FILE *fp;
479 char *filename;
480 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000481{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000482 node *n;
483 perrdetail err;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000484 BGN_SAVE
Guido van Rossuma110aa61994-08-29 12:50:44 +0000485 n = parsefile(fp, filename, &gram, start,
486 (char *)0, (char *)0, &err);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000487 END_SAVE
Guido van Rossuma110aa61994-08-29 12:50:44 +0000488 if (n == NULL)
489 err_input(&err);
490 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000491}
492
Guido van Rossuma110aa61994-08-29 12:50:44 +0000493/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000494
Guido van Rossuma110aa61994-08-29 12:50:44 +0000495node *
496parse_string(str, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000497 char *str;
498 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000499{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000500 node *n;
501 perrdetail err;
502 n = parsestring(str, &gram, start, &err);
503 if (n == NULL)
504 err_input(&err);
505 return n;
506}
507
508/* Set the error appropriate to the given input error code (see errcode.h) */
509
510static void
511err_input(err)
512 perrdetail *err;
513{
514 object *v, *w;
515 char *msg = NULL;
516 v = mkvalue("(ziiz)", err->filename,
517 err->lineno, err->offset, err->text);
518 if (err->text != NULL) {
519 free(err->text);
520 err->text = NULL;
521 }
522 switch (err->error) {
523 case E_SYNTAX:
524 msg = "invalid syntax";
525 break;
526 case E_TOKEN:
527 msg = "invalid token";
528
529 break;
530 case E_INTR:
531 err_set(KeyboardInterrupt);
532 return;
533 case E_NOMEM:
534 err_nomem();
535 return;
536 case E_EOF:
537 msg = "unexpected EOF while parsing";
538 break;
539 default:
540 fprintf(stderr, "error=%d\n", err->error);
541 msg = "unknown parsing error";
542 break;
543 }
544 w = mkvalue("(sO)", msg, v);
545 XDECREF(v);
546 err_setval(SyntaxError, w);
547 XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000548}
549
550/* Print fatal error message and abort */
551
552void
553fatal(msg)
554 char *msg;
555{
Guido van Rossum83dd6c31994-09-29 09:38:33 +0000556 fprintf(stderr, "Fatal Python error: %s\n", msg);
Guido van Rossum8ae87c01995-01-26 00:40:38 +0000557#ifdef macintosh
558 for (;;);
559#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000560 abort();
561}
562
563/* Clean up and exit */
564
Guido van Rossuma110aa61994-08-29 12:50:44 +0000565#ifdef WITH_THREAD
566#include "thread.h"
567int threads_started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +0000568#endif
569
Guido van Rossum1662dd51994-09-07 14:38:28 +0000570#define NEXITFUNCS 32
571static void (*exitfuncs[NEXITFUNCS])();
572static int nexitfuncs = 0;
573
574int Py_AtExit(func)
575 void (*func) PROTO((void));
576{
577 if (nexitfuncs >= NEXITFUNCS)
578 return -1;
579 exitfuncs[nexitfuncs++] = func;
580 return 0;
581}
582
Guido van Rossuma110aa61994-08-29 12:50:44 +0000583void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000584cleanup()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000585{
Guido van Rossum59bff391992-09-03 20:28:00 +0000586 object *exitfunc = sysget("exitfunc");
587
588 if (exitfunc) {
589 object *arg;
590 object *res;
591 sysset("exitfunc", (object *)NULL);
592 arg = newtupleobject(0);
593 if (arg == NULL)
594 res = NULL;
595 else {
596 res = call_object(exitfunc, arg);
597 DECREF(arg);
598 }
599 if (res == NULL) {
600 fprintf(stderr, "Error in sys.exitfunc:\n");
601 print_error();
602 }
603 }
604
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000605 flushline();
Guido van Rossum1662dd51994-09-07 14:38:28 +0000606
607 while (nexitfuncs > 0)
608 (*exitfuncs[--nexitfuncs])();
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000609}
610
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000611#ifdef COUNT_ALLOCS
612extern void dump_counts PROTO((void));
613#endif
614
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000615void
616goaway(sts)
617 int sts;
618{
619 cleanup();
Guido van Rossumff4949e1992-08-05 19:58:53 +0000620
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000621#ifdef COUNT_ALLOCS
622 dump_counts();
623#endif
624
Guido van Rossuma110aa61994-08-29 12:50:44 +0000625#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000626
627 /* Other threads may still be active, so skip most of the
628 cleanup actions usually done (these are mostly for
629 debugging anyway). */
630
Guido van Rossumdf72a651992-08-12 15:27:32 +0000631 (void) save_thread();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000632#ifndef NO_EXIT_PROG
Guido van Rossumf9f2e821992-08-17 08:59:08 +0000633 if (threads_started)
634 _exit_prog(sts);
635 else
636 exit_prog(sts);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000637#else /* !NO_EXIT_PROG */
638 if (threads_started)
639 _exit(sts);
640 else
641 exit(sts);
642#endif /* !NO_EXIT_PROG */
Guido van Rossumff4949e1992-08-05 19:58:53 +0000643
Guido van Rossuma110aa61994-08-29 12:50:44 +0000644#else /* WITH_THREAD */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000645
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000646 doneimport();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000647
648 err_clear();
649
650#ifdef REF_DEBUG
651 fprintf(stderr, "[%ld refs]\n", ref_total);
652#endif
653
654#ifdef TRACE_REFS
655 if (askyesno("Print left references?")) {
656 printrefs(stderr);
657 }
658#endif /* TRACE_REFS */
659
Jack Jansen08e767b1995-02-02 14:30:20 +0000660 /* XXXX Jack thinks it would be nicer to pause if any output has
661 ** been generated since the last interaction with the user...
662 */
Guido van Rossum42a51241995-01-30 12:52:46 +0000663#ifdef THINK_C
664 if (sts == 0)
665 console_options.pause_atexit = 0;
666#endif
Jack Jansen08e767b1995-02-02 14:30:20 +0000667#ifdef __MWERKS__
668 if (sts == 0)
669 SIOUXSettings.autocloseonquit = 1;
670#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000671 exit(sts);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000672#endif /* WITH_THREAD */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000673 /*NOTREACHED*/
674}
675
Guido van Rossuma110aa61994-08-29 12:50:44 +0000676#ifdef HAVE_SIGNAL_H
677static RETSIGTYPE
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000678sighandler(sig)
679 int sig;
680{
681 signal(sig, SIG_DFL); /* Don't catch recursive signals */
682 cleanup(); /* Do essential clean-up */
Guido van Rossuma110aa61994-08-29 12:50:44 +0000683#ifdef HAVE_GETPID
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000684 kill(getpid(), sig); /* Pretend the signal killed us */
Guido van Rossuma110aa61994-08-29 12:50:44 +0000685#else
686 exit(1);
687#endif
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000688 /*NOTREACHED*/
689}
690#endif
691
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000692static void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000693initsigs()
694{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000695 RETSIGTYPE (*t)();
696#ifdef HAVE_SIGNAL_H
697#ifdef SIGPIPE
698 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000699#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +0000700#ifdef SIGHUP
701 t = signal(SIGHUP, SIG_IGN);
702 if (t == SIG_DFL)
703 signal(SIGHUP, sighandler);
704 else
705 signal(SIGHUP, t);
706#endif
707#ifdef SIGTERM
708 t = signal(SIGTERM, SIG_IGN);
709 if (t == SIG_DFL)
710 signal(SIGTERM, sighandler);
711 else
712 signal(SIGTERM, t);
713#endif
714#endif /* HAVE_SIGNAL_H */
715 initintr(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000716}
717
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000718#ifdef TRACE_REFS
719/* Ask a yes/no question */
720
Guido van Rossum59bff391992-09-03 20:28:00 +0000721int
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000722askyesno(prompt)
723 char *prompt;
724{
725 char buf[256];
726
727 printf("%s [ny] ", prompt);
728 if (fgets(buf, sizeof buf, stdin) == NULL)
729 return 0;
730 return buf[0] == 'y' || buf[0] == 'Y';
731}
732#endif
733
Guido van Rossuma110aa61994-08-29 12:50:44 +0000734#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000735
736/* Check for file descriptor connected to interactive device.
737 Pretend that stdin is always interactive, other files never. */
738
739int
740isatty(fd)
741 int fd;
742{
743 return fd == fileno(stdin);
744}
745
746#endif