blob: e46a526470598866cc938ac44a9a0306948047d8 [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;
Jack Jansenbd06e961995-02-13 11:44:56 +0000233#ifdef macintosh
234 /* On a mac, we also assume a pyc file for types 'PYC ' and 'APPL' */
235 if ( strcmp(ext, ".pyc") == 0 || getfiletype(filename) == 'PYC ' ||
236 getfiletype(filename) == 'APPL' ) {
237#else
Guido van Rossumfdef2711994-09-14 13:31:04 +0000238 if ( strcmp(ext, ".pyc") == 0 ) {
Jack Jansenbd06e961995-02-13 11:44:56 +0000239#endif /* macintosh */
Guido van Rossumfdef2711994-09-14 13:31:04 +0000240 /* Try to run a pyc file. First, re-open in binary */
Jack Jansene00637b1994-12-14 12:58:37 +0000241 /* Don't close, done in main: fclose(fp); */
Guido van Rossumfdef2711994-09-14 13:31:04 +0000242 if( (fp = fopen(filename, "rb")) == NULL ) {
243 fprintf(stderr, "python: Can't reopen .pyc file\n");
244 return -1;
245 }
246 v = run_pyc_file(fp, filename, d, d);
247 } else {
248 v = run_file(fp, filename, file_input, d, d);
249 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000250 if (v == NULL) {
251 print_error();
252 return -1;
253 }
254 DECREF(v);
Guido van Rossum6d023c91995-01-04 19:12:13 +0000255 flushline();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000256 return 0;
257}
258
259int
260run_command(command)
261 char *command;
262{
263 object *m, *d, *v;
264 m = add_module("__main__");
265 if (m == NULL)
266 return -1;
267 d = getmoduledict(m);
268 v = run_string(command, file_input, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000269 if (v == NULL) {
270 print_error();
271 return -1;
272 }
273 DECREF(v);
Guido van Rossum6d023c91995-01-04 19:12:13 +0000274 flushline();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000275 return 0;
276}
277
278void
279print_error()
280{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000281 object *exception, *v, *tb, *f;
282 err_fetch(&exception, &v, &tb);
Guido van Rossum6d023c91995-01-04 19:12:13 +0000283 flushline();
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000284 if (exception == NULL)
285 fatal("print_error called but no exception");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000286 if (exception == SystemExit) {
287 if (v == NULL || v == None)
288 goaway(0);
289 if (is_intobject(v))
290 goaway((int)getintvalue(v));
291 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000292 /* OK to use real stderr here */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000293 printobject(v, stderr, PRINT_RAW);
294 fprintf(stderr, "\n");
295 goaway(1);
296 }
297 }
298 sysset("last_type", exception);
299 sysset("last_value", v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000300 sysset("last_traceback", tb);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000301 f = sysget("stderr");
302 if (f == NULL)
303 fprintf(stderr, "lost sys.stderr\n");
304 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000305 tb_print(tb, f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000306 if (exception == SyntaxError) {
307 object *message;
308 char *filename, *text;
309 int lineno, offset;
310 if (!getargs(v, "(O(ziiz))", &message,
311 &filename, &lineno, &offset, &text))
312 err_clear();
313 else {
314 char buf[10];
315 writestring(" File \"", f);
316 if (filename == NULL)
317 writestring("<string>", f);
318 else
319 writestring(filename, f);
320 writestring("\", line ", f);
321 sprintf(buf, "%d", lineno);
322 writestring(buf, f);
323 writestring("\n", f);
324 if (text != NULL) {
Guido van Rossum798199d1994-09-19 08:08:50 +0000325 char *nl;
326 if (offset > 0 &&
327 offset == strlen(text))
328 offset--;
329 for (;;) {
330 nl = strchr(text, '\n');
331 if (nl == NULL ||
332 nl-text >= offset)
333 break;
334 offset -= (nl+1-text);
335 text = nl+1;
336 }
Guido van Rossuma110aa61994-08-29 12:50:44 +0000337 while (*text == ' ' || *text == '\t') {
338 text++;
339 offset--;
340 }
341 writestring(" ", f);
342 writestring(text, f);
343 if (*text == '\0' ||
344 text[strlen(text)-1] != '\n')
345 writestring("\n", f);
346 writestring(" ", f);
347 offset--;
348 while (offset > 0) {
349 writestring(" ", f);
350 offset--;
351 }
352 writestring("^\n", f);
353 }
354 INCREF(message);
355 DECREF(v);
356 v = message;
357 }
358 }
Guido van Rossum262e1241995-02-07 15:30:45 +0000359 if (is_classobject(exception)) {
360 object* className = ((classobject*)exception)->cl_name;
361 if (className == NULL)
362 writestring("<unknown>", f);
363 else {
364 if (writeobject(className, f, PRINT_RAW) != 0)
365 err_clear();
366 }
367 } else {
368 if (writeobject(exception, f, PRINT_RAW) != 0)
369 err_clear();
370 }
Guido van Rossum3165fe61992-09-25 21:59:05 +0000371 if (v != NULL && v != None) {
372 writestring(": ", f);
373 if (writeobject(v, f, PRINT_RAW) != 0)
374 err_clear();
375 }
376 writestring("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000377 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000378 XDECREF(exception);
379 XDECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000380 XDECREF(tb);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000381}
382
383object *
384run_string(str, start, globals, locals)
385 char *str;
386 int start;
Guido van Rossum5b722181993-03-30 17:46:03 +0000387 object *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000388{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000389 return run_err_node(parse_string(str, start),
390 "<string>", globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000391}
392
393object *
394run_file(fp, filename, start, globals, locals)
395 FILE *fp;
396 char *filename;
397 int start;
Guido van Rossum5b722181993-03-30 17:46:03 +0000398 object *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000399{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000400 return run_err_node(parse_file(fp, filename, start),
401 filename, globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000402}
403
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000404static object *
Guido van Rossuma110aa61994-08-29 12:50:44 +0000405run_err_node(n, filename, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000406 node *n;
407 char *filename;
Guido van Rossum5b722181993-03-30 17:46:03 +0000408 object *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000409{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000410 if (n == NULL)
411 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000412 return run_node(n, filename, globals, locals);
413}
414
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000415static object *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000416run_node(n, filename, globals, locals)
417 node *n;
418 char *filename;
Guido van Rossum5b722181993-03-30 17:46:03 +0000419 object *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000420{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000421 codeobject *co;
422 object *v;
423 co = compile(n, filename);
424 freetree(n);
425 if (co == NULL)
426 return NULL;
Guido van Rossum81daa321993-05-20 14:24:46 +0000427 v = eval_code(co, globals, locals, (object *)NULL, (object *)NULL);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000428 DECREF(co);
429 return v;
430}
431
Guido van Rossum8ae87c01995-01-26 00:40:38 +0000432static object *
Guido van Rossumfdef2711994-09-14 13:31:04 +0000433run_pyc_file(fp, filename, globals, locals)
434 FILE *fp;
435 char *filename;
436 object *globals, *locals;
437{
438 codeobject *co;
439 object *v;
440 long magic;
441 long get_pyc_magic();
442
443 magic = rd_long(fp);
444 if (magic != get_pyc_magic()) {
445 err_setstr(RuntimeError,
446 "Bad magic number in .pyc file");
447 return NULL;
448 }
449 (void) rd_long(fp);
450 v = rd_object(fp);
451 fclose(fp);
452 if (v == NULL || !is_codeobject(v)) {
453 XDECREF(v);
454 err_setstr(RuntimeError,
455 "Bad code object in .pyc file");
456 return NULL;
457 }
458 co = (codeobject *)v;
459 v = eval_code(co, globals, locals, (object *)NULL, (object *)NULL);
460 DECREF(co);
461 return v;
462}
463
464object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000465compile_string(str, filename, start)
466 char *str;
467 char *filename;
468 int start;
469{
470 node *n;
Guido van Rossum5b722181993-03-30 17:46:03 +0000471 codeobject *co;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000472 n = parse_string(str, start);
473 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +0000474 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000475 co = compile(n, filename);
476 freetree(n);
477 return (object *)co;
478}
479
Guido van Rossuma110aa61994-08-29 12:50:44 +0000480/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000481
Guido van Rossuma110aa61994-08-29 12:50:44 +0000482node *
483parse_file(fp, filename, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000484 FILE *fp;
485 char *filename;
486 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000487{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000488 node *n;
489 perrdetail err;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000490 BGN_SAVE
Guido van Rossuma110aa61994-08-29 12:50:44 +0000491 n = parsefile(fp, filename, &gram, start,
492 (char *)0, (char *)0, &err);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000493 END_SAVE
Guido van Rossuma110aa61994-08-29 12:50:44 +0000494 if (n == NULL)
495 err_input(&err);
496 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000497}
498
Guido van Rossuma110aa61994-08-29 12:50:44 +0000499/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000500
Guido van Rossuma110aa61994-08-29 12:50:44 +0000501node *
502parse_string(str, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000503 char *str;
504 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000505{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000506 node *n;
507 perrdetail err;
508 n = parsestring(str, &gram, start, &err);
509 if (n == NULL)
510 err_input(&err);
511 return n;
512}
513
514/* Set the error appropriate to the given input error code (see errcode.h) */
515
516static void
517err_input(err)
518 perrdetail *err;
519{
520 object *v, *w;
521 char *msg = NULL;
522 v = mkvalue("(ziiz)", err->filename,
523 err->lineno, err->offset, err->text);
524 if (err->text != NULL) {
525 free(err->text);
526 err->text = NULL;
527 }
528 switch (err->error) {
529 case E_SYNTAX:
530 msg = "invalid syntax";
531 break;
532 case E_TOKEN:
533 msg = "invalid token";
534
535 break;
536 case E_INTR:
537 err_set(KeyboardInterrupt);
538 return;
539 case E_NOMEM:
540 err_nomem();
541 return;
542 case E_EOF:
543 msg = "unexpected EOF while parsing";
544 break;
545 default:
546 fprintf(stderr, "error=%d\n", err->error);
547 msg = "unknown parsing error";
548 break;
549 }
550 w = mkvalue("(sO)", msg, v);
551 XDECREF(v);
552 err_setval(SyntaxError, w);
553 XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000554}
555
556/* Print fatal error message and abort */
557
558void
559fatal(msg)
560 char *msg;
561{
Guido van Rossum83dd6c31994-09-29 09:38:33 +0000562 fprintf(stderr, "Fatal Python error: %s\n", msg);
Guido van Rossum8ae87c01995-01-26 00:40:38 +0000563#ifdef macintosh
564 for (;;);
565#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000566 abort();
567}
568
569/* Clean up and exit */
570
Guido van Rossuma110aa61994-08-29 12:50:44 +0000571#ifdef WITH_THREAD
572#include "thread.h"
573int threads_started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +0000574#endif
575
Guido van Rossum1662dd51994-09-07 14:38:28 +0000576#define NEXITFUNCS 32
577static void (*exitfuncs[NEXITFUNCS])();
578static int nexitfuncs = 0;
579
580int Py_AtExit(func)
581 void (*func) PROTO((void));
582{
583 if (nexitfuncs >= NEXITFUNCS)
584 return -1;
585 exitfuncs[nexitfuncs++] = func;
586 return 0;
587}
588
Guido van Rossuma110aa61994-08-29 12:50:44 +0000589void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000590cleanup()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000591{
Guido van Rossum59bff391992-09-03 20:28:00 +0000592 object *exitfunc = sysget("exitfunc");
593
594 if (exitfunc) {
595 object *arg;
596 object *res;
597 sysset("exitfunc", (object *)NULL);
598 arg = newtupleobject(0);
599 if (arg == NULL)
600 res = NULL;
601 else {
602 res = call_object(exitfunc, arg);
603 DECREF(arg);
604 }
605 if (res == NULL) {
606 fprintf(stderr, "Error in sys.exitfunc:\n");
607 print_error();
608 }
609 }
610
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000611 flushline();
Guido van Rossum1662dd51994-09-07 14:38:28 +0000612
613 while (nexitfuncs > 0)
614 (*exitfuncs[--nexitfuncs])();
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000615}
616
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000617#ifdef COUNT_ALLOCS
618extern void dump_counts PROTO((void));
619#endif
620
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000621void
622goaway(sts)
623 int sts;
624{
625 cleanup();
Guido van Rossumff4949e1992-08-05 19:58:53 +0000626
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000627#ifdef COUNT_ALLOCS
628 dump_counts();
629#endif
630
Guido van Rossuma110aa61994-08-29 12:50:44 +0000631#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000632
633 /* Other threads may still be active, so skip most of the
634 cleanup actions usually done (these are mostly for
635 debugging anyway). */
636
Guido van Rossumdf72a651992-08-12 15:27:32 +0000637 (void) save_thread();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000638#ifndef NO_EXIT_PROG
Guido van Rossumf9f2e821992-08-17 08:59:08 +0000639 if (threads_started)
640 _exit_prog(sts);
641 else
642 exit_prog(sts);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000643#else /* !NO_EXIT_PROG */
644 if (threads_started)
645 _exit(sts);
646 else
647 exit(sts);
648#endif /* !NO_EXIT_PROG */
Guido van Rossumff4949e1992-08-05 19:58:53 +0000649
Guido van Rossuma110aa61994-08-29 12:50:44 +0000650#else /* WITH_THREAD */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000651
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000652 doneimport();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000653
654 err_clear();
655
656#ifdef REF_DEBUG
657 fprintf(stderr, "[%ld refs]\n", ref_total);
658#endif
659
660#ifdef TRACE_REFS
661 if (askyesno("Print left references?")) {
662 printrefs(stderr);
663 }
664#endif /* TRACE_REFS */
665
Jack Jansen08e767b1995-02-02 14:30:20 +0000666 /* XXXX Jack thinks it would be nicer to pause if any output has
667 ** been generated since the last interaction with the user...
668 */
Guido van Rossum42a51241995-01-30 12:52:46 +0000669#ifdef THINK_C
670 if (sts == 0)
671 console_options.pause_atexit = 0;
672#endif
Jack Jansen08e767b1995-02-02 14:30:20 +0000673#ifdef __MWERKS__
674 if (sts == 0)
675 SIOUXSettings.autocloseonquit = 1;
Jack Jansenbd06e961995-02-13 11:44:56 +0000676 else
677 SIOUXSettings.showstatusline = 1;
Jack Jansen08e767b1995-02-02 14:30:20 +0000678#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000679 exit(sts);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000680#endif /* WITH_THREAD */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000681 /*NOTREACHED*/
682}
683
Guido van Rossuma110aa61994-08-29 12:50:44 +0000684#ifdef HAVE_SIGNAL_H
685static RETSIGTYPE
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000686sighandler(sig)
687 int sig;
688{
689 signal(sig, SIG_DFL); /* Don't catch recursive signals */
690 cleanup(); /* Do essential clean-up */
Guido van Rossuma110aa61994-08-29 12:50:44 +0000691#ifdef HAVE_GETPID
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000692 kill(getpid(), sig); /* Pretend the signal killed us */
Guido van Rossuma110aa61994-08-29 12:50:44 +0000693#else
694 exit(1);
695#endif
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000696 /*NOTREACHED*/
697}
698#endif
699
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000700static void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000701initsigs()
702{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000703 RETSIGTYPE (*t)();
704#ifdef HAVE_SIGNAL_H
705#ifdef SIGPIPE
706 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000707#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +0000708#ifdef SIGHUP
709 t = signal(SIGHUP, SIG_IGN);
710 if (t == SIG_DFL)
711 signal(SIGHUP, sighandler);
712 else
713 signal(SIGHUP, t);
714#endif
715#ifdef SIGTERM
716 t = signal(SIGTERM, SIG_IGN);
717 if (t == SIG_DFL)
718 signal(SIGTERM, sighandler);
719 else
720 signal(SIGTERM, t);
721#endif
722#endif /* HAVE_SIGNAL_H */
723 initintr(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000724}
725
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000726#ifdef TRACE_REFS
727/* Ask a yes/no question */
728
Guido van Rossum59bff391992-09-03 20:28:00 +0000729int
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000730askyesno(prompt)
731 char *prompt;
732{
733 char buf[256];
734
735 printf("%s [ny] ", prompt);
736 if (fgets(buf, sizeof buf, stdin) == NULL)
737 return 0;
738 return buf[0] == 'y' || buf[0] == 'Y';
739}
740#endif
741
Guido van Rossuma110aa61994-08-29 12:50:44 +0000742#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000743
744/* Check for file descriptor connected to interactive device.
745 Pretend that stdin is always interactive, other files never. */
746
747int
748isatty(fd)
749 int fd;
750{
751 return fd == fileno(stdin);
752}
753
754#endif