blob: 13e2728e3ae3268b582b3a64efc134b96c8f895f [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"
Guido van Rossumbefa14f1995-09-18 21:42:42 +000033#undef argument /* Avoid conflict on Mac */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000034#include "errcode.h"
35#include "sysmodule.h"
Guido van Rossum6135a871995-01-09 17:53:26 +000036#include "bltinmodule.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000037#include "compile.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000038#include "eval.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000039#include "ceval.h"
40#include "pythonrun.h"
41#include "import.h"
Guido van Rossumfdef2711994-09-14 13:31:04 +000042#include "marshal.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000043
Guido van Rossuma110aa61994-08-29 12:50:44 +000044#ifdef HAVE_SIGNAL_H
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000045#include <signal.h>
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000046#endif
47
Guido van Rossuma44823b1995-03-14 15:01:17 +000048#ifdef NT
49#undef BYTE
50#include "windows.h"
51#endif
52
Guido van Rossum1984f1e1992-08-04 12:41:02 +000053extern char *getpythonpath();
54
55extern grammar gram; /* From graminit.c */
56
Guido van Rossumb73cc041993-11-01 16:28:59 +000057/* Forward */
Guido van Rossum6135a871995-01-09 17:53:26 +000058static void initmain PROTO((void));
Guido van Rossuma110aa61994-08-29 12:50:44 +000059static object *run_err_node PROTO((node *n, char *filename,
Guido van Rossumb73cc041993-11-01 16:28:59 +000060 object *globals, object *locals));
61static object *run_node PROTO((node *n, char *filename,
62 object *globals, object *locals));
Guido van Rossum262e1241995-02-07 15:30:45 +000063static object *run_pyc_file PROTO((FILE *fp, char *filename,
64 object *globals, object *locals));
Guido van Rossuma110aa61994-08-29 12:50:44 +000065static void err_input PROTO((perrdetail *));
Guido van Rossumb376a4a1993-11-23 17:53:17 +000066static void initsigs PROTO((void));
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000067
Guido van Rossum1984f1e1992-08-04 12:41:02 +000068int debugging; /* Needed by parser.c */
69int verbose; /* Needed by import.c */
Guido van Rossuma110aa61994-08-29 12:50:44 +000070int suppress_print; /* Needed by ceval.c */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000071
72/* Initialize all */
73
74void
75initall()
76{
77 static int inited;
78
79 if (inited)
80 return;
81 inited = 1;
82
83 initimport();
84
Guido van Rossuma110aa61994-08-29 12:50:44 +000085 /* Modules '__builtin__' and 'sys' are initialized here,
Guido van Rossum1984f1e1992-08-04 12:41:02 +000086 they are needed by random bits of the interpreter.
87 All other modules are optional and are initialized
88 when they are first imported. */
89
90 initbuiltin(); /* Also initializes builtin exceptions */
91 initsys();
Guido van Rossum1984f1e1992-08-04 12:41:02 +000092
93 setpythonpath(getpythonpath());
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000094
95 initsigs(); /* Signal handling stuff, including initintr() */
Guido van Rossum6135a871995-01-09 17:53:26 +000096
97 initmain();
98}
99
100/* Create __main__ module */
101
102static void
103initmain()
104{
105 object *m, *d;
106 m = add_module("__main__");
107 if (m == NULL)
108 fatal("can't create __main__ module");
109 d = getmoduledict(m);
110 if (dictlookup(d, "__builtins__") == NULL) {
Guido van Rossum94390ec1995-01-12 11:37:57 +0000111 if (dictinsert(d, "__builtins__", getbuiltins()))
Guido van Rossum6135a871995-01-09 17:53:26 +0000112 fatal("can't add __builtins__ to __main__");
113 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000114}
115
116/* Parse input from a file and execute it */
117
118int
119run(fp, filename)
120 FILE *fp;
121 char *filename;
122{
123 if (filename == NULL)
124 filename = "???";
125 if (isatty((int)fileno(fp)))
126 return run_tty_loop(fp, filename);
127 else
128 return run_script(fp, filename);
129}
130
131int
132run_tty_loop(fp, filename)
133 FILE *fp;
134 char *filename;
135{
136 object *v;
137 int ret;
138 v = sysget("ps1");
139 if (v == NULL) {
140 sysset("ps1", v = newstringobject(">>> "));
141 XDECREF(v);
142 }
143 v = sysget("ps2");
144 if (v == NULL) {
145 sysset("ps2", v = newstringobject("... "));
146 XDECREF(v);
147 }
148 for (;;) {
149 ret = run_tty_1(fp, filename);
150#ifdef REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000151 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000152#endif
153 if (ret == E_EOF)
154 return 0;
155 /*
156 if (ret == E_NOMEM)
157 return -1;
158 */
159 }
160}
161
162int
163run_tty_1(fp, filename)
164 FILE *fp;
165 char *filename;
166{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000167 object *m, *d, *v, *w;
168 node *n;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000169 perrdetail err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000170 char *ps1, *ps2;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000171 v = sysget("ps1");
172 w = sysget("ps2");
173 if (v != NULL && is_stringobject(v)) {
174 INCREF(v);
175 ps1 = getstringvalue(v);
176 }
177 else {
178 v = NULL;
179 ps1 = "";
180 }
181 if (w != NULL && is_stringobject(w)) {
182 INCREF(w);
183 ps2 = getstringvalue(w);
184 }
185 else {
186 w = NULL;
187 ps2 = "";
188 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000189 BGN_SAVE
Guido van Rossuma110aa61994-08-29 12:50:44 +0000190 n = parsefile(fp, filename, &gram, single_input, ps1, ps2, &err);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000191 END_SAVE
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000192 XDECREF(v);
193 XDECREF(w);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000194 if (n == NULL) {
195 if (err.error == E_EOF) {
196 if (err.text)
197 free(err.text);
198 return E_EOF;
199 }
200 err_input(&err);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000201 print_error();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000202 return err.error;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000203 }
204 m = add_module("__main__");
205 if (m == NULL)
206 return -1;
207 d = getmoduledict(m);
208 v = run_node(n, filename, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000209 if (v == NULL) {
210 print_error();
211 return -1;
212 }
213 DECREF(v);
Guido van Rossum6d023c91995-01-04 19:12:13 +0000214 flushline();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000215 return 0;
216}
217
218int
219run_script(fp, filename)
220 FILE *fp;
221 char *filename;
222{
223 object *m, *d, *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000224 char *ext;
225
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000226 m = add_module("__main__");
227 if (m == NULL)
228 return -1;
229 d = getmoduledict(m);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000230 ext = filename + strlen(filename) - 4;
Jack Jansenbd06e961995-02-13 11:44:56 +0000231#ifdef macintosh
232 /* On a mac, we also assume a pyc file for types 'PYC ' and 'APPL' */
233 if ( strcmp(ext, ".pyc") == 0 || getfiletype(filename) == 'PYC ' ||
234 getfiletype(filename) == 'APPL' ) {
235#else
Guido van Rossumfdef2711994-09-14 13:31:04 +0000236 if ( strcmp(ext, ".pyc") == 0 ) {
Jack Jansenbd06e961995-02-13 11:44:56 +0000237#endif /* macintosh */
Guido van Rossumfdef2711994-09-14 13:31:04 +0000238 /* Try to run a pyc file. First, re-open in binary */
Jack Jansene00637b1994-12-14 12:58:37 +0000239 /* Don't close, done in main: fclose(fp); */
Guido van Rossumfdef2711994-09-14 13:31:04 +0000240 if( (fp = fopen(filename, "rb")) == NULL ) {
241 fprintf(stderr, "python: Can't reopen .pyc file\n");
242 return -1;
243 }
244 v = run_pyc_file(fp, filename, d, d);
245 } else {
246 v = run_file(fp, filename, file_input, d, d);
247 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000248 if (v == NULL) {
249 print_error();
250 return -1;
251 }
252 DECREF(v);
Guido van Rossum6d023c91995-01-04 19:12:13 +0000253 flushline();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000254 return 0;
255}
256
257int
258run_command(command)
259 char *command;
260{
261 object *m, *d, *v;
262 m = add_module("__main__");
263 if (m == NULL)
264 return -1;
265 d = getmoduledict(m);
266 v = run_string(command, file_input, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000267 if (v == NULL) {
268 print_error();
269 return -1;
270 }
271 DECREF(v);
Guido van Rossum6d023c91995-01-04 19:12:13 +0000272 flushline();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000273 return 0;
274}
275
276void
277print_error()
278{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000279 object *exception, *v, *tb, *f;
280 err_fetch(&exception, &v, &tb);
Guido van Rossum6d023c91995-01-04 19:12:13 +0000281 flushline();
Guido van Rossum527c2641995-03-30 11:01:44 +0000282 fflush(stdout);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000283 if (exception == NULL)
284 fatal("print_error called but no exception");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000285 if (exception == SystemExit) {
286 if (v == NULL || v == None)
287 goaway(0);
288 if (is_intobject(v))
289 goaway((int)getintvalue(v));
290 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000291 /* OK to use real stderr here */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000292 printobject(v, stderr, PRINT_RAW);
293 fprintf(stderr, "\n");
294 goaway(1);
295 }
296 }
297 sysset("last_type", exception);
298 sysset("last_value", v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000299 sysset("last_traceback", tb);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000300 f = sysget("stderr");
301 if (f == NULL)
302 fprintf(stderr, "lost sys.stderr\n");
303 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000304 tb_print(tb, f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000305 if (exception == SyntaxError) {
306 object *message;
307 char *filename, *text;
308 int lineno, offset;
309 if (!getargs(v, "(O(ziiz))", &message,
310 &filename, &lineno, &offset, &text))
311 err_clear();
312 else {
313 char buf[10];
314 writestring(" File \"", f);
315 if (filename == NULL)
316 writestring("<string>", f);
317 else
318 writestring(filename, f);
319 writestring("\", line ", f);
320 sprintf(buf, "%d", lineno);
321 writestring(buf, f);
322 writestring("\n", f);
323 if (text != NULL) {
Guido van Rossum798199d1994-09-19 08:08:50 +0000324 char *nl;
325 if (offset > 0 &&
326 offset == strlen(text))
327 offset--;
328 for (;;) {
329 nl = strchr(text, '\n');
330 if (nl == NULL ||
331 nl-text >= offset)
332 break;
333 offset -= (nl+1-text);
334 text = nl+1;
335 }
Guido van Rossuma110aa61994-08-29 12:50:44 +0000336 while (*text == ' ' || *text == '\t') {
337 text++;
338 offset--;
339 }
340 writestring(" ", f);
341 writestring(text, f);
342 if (*text == '\0' ||
343 text[strlen(text)-1] != '\n')
344 writestring("\n", f);
345 writestring(" ", f);
346 offset--;
347 while (offset > 0) {
348 writestring(" ", f);
349 offset--;
350 }
351 writestring("^\n", f);
352 }
353 INCREF(message);
354 DECREF(v);
355 v = message;
356 }
357 }
Guido van Rossum262e1241995-02-07 15:30:45 +0000358 if (is_classobject(exception)) {
359 object* className = ((classobject*)exception)->cl_name;
360 if (className == NULL)
361 writestring("<unknown>", f);
362 else {
363 if (writeobject(className, f, PRINT_RAW) != 0)
364 err_clear();
365 }
366 } else {
367 if (writeobject(exception, f, PRINT_RAW) != 0)
368 err_clear();
369 }
Guido van Rossum3165fe61992-09-25 21:59:05 +0000370 if (v != NULL && v != None) {
371 writestring(": ", f);
372 if (writeobject(v, f, PRINT_RAW) != 0)
373 err_clear();
374 }
375 writestring("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000376 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000377 XDECREF(exception);
378 XDECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000379 XDECREF(tb);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000380}
381
382object *
383run_string(str, start, globals, locals)
384 char *str;
385 int start;
Guido van Rossum5b722181993-03-30 17:46:03 +0000386 object *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000387{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000388 return run_err_node(parse_string(str, start),
389 "<string>", globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000390}
391
392object *
393run_file(fp, filename, start, globals, locals)
394 FILE *fp;
395 char *filename;
396 int start;
Guido van Rossum5b722181993-03-30 17:46:03 +0000397 object *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000398{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000399 return run_err_node(parse_file(fp, filename, start),
400 filename, globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000401}
402
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000403static object *
Guido van Rossuma110aa61994-08-29 12:50:44 +0000404run_err_node(n, filename, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000405 node *n;
406 char *filename;
Guido van Rossum5b722181993-03-30 17:46:03 +0000407 object *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000408{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000409 if (n == NULL)
410 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000411 return run_node(n, filename, globals, locals);
412}
413
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000414static object *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000415run_node(n, filename, globals, locals)
416 node *n;
417 char *filename;
Guido van Rossum5b722181993-03-30 17:46:03 +0000418 object *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000419{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000420 codeobject *co;
421 object *v;
422 co = compile(n, filename);
423 freetree(n);
424 if (co == NULL)
425 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000426 v = eval_code(co, globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000427 DECREF(co);
428 return v;
429}
430
Guido van Rossum8ae87c01995-01-26 00:40:38 +0000431static object *
Guido van Rossumfdef2711994-09-14 13:31:04 +0000432run_pyc_file(fp, filename, globals, locals)
433 FILE *fp;
434 char *filename;
435 object *globals, *locals;
436{
437 codeobject *co;
438 object *v;
439 long magic;
440 long get_pyc_magic();
441
442 magic = rd_long(fp);
443 if (magic != get_pyc_magic()) {
444 err_setstr(RuntimeError,
445 "Bad magic number in .pyc file");
446 return NULL;
447 }
448 (void) rd_long(fp);
449 v = rd_object(fp);
450 fclose(fp);
451 if (v == NULL || !is_codeobject(v)) {
452 XDECREF(v);
453 err_setstr(RuntimeError,
454 "Bad code object in .pyc file");
455 return NULL;
456 }
457 co = (codeobject *)v;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000458 v = eval_code(co, globals, locals);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000459 DECREF(co);
460 return v;
461}
462
463object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000464compile_string(str, filename, start)
465 char *str;
466 char *filename;
467 int start;
468{
469 node *n;
Guido van Rossum5b722181993-03-30 17:46:03 +0000470 codeobject *co;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000471 n = parse_string(str, start);
472 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +0000473 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000474 co = compile(n, filename);
475 freetree(n);
476 return (object *)co;
477}
478
Guido van Rossuma110aa61994-08-29 12:50:44 +0000479/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000480
Guido van Rossuma110aa61994-08-29 12:50:44 +0000481node *
482parse_file(fp, filename, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000483 FILE *fp;
484 char *filename;
485 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000486{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000487 node *n;
488 perrdetail err;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000489 BGN_SAVE
Guido van Rossuma110aa61994-08-29 12:50:44 +0000490 n = parsefile(fp, filename, &gram, start,
491 (char *)0, (char *)0, &err);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000492 END_SAVE
Guido van Rossuma110aa61994-08-29 12:50:44 +0000493 if (n == NULL)
494 err_input(&err);
495 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000496}
497
Guido van Rossuma110aa61994-08-29 12:50:44 +0000498/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000499
Guido van Rossuma110aa61994-08-29 12:50:44 +0000500node *
501parse_string(str, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000502 char *str;
503 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000504{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000505 node *n;
506 perrdetail err;
507 n = parsestring(str, &gram, start, &err);
508 if (n == NULL)
509 err_input(&err);
510 return n;
511}
512
513/* Set the error appropriate to the given input error code (see errcode.h) */
514
515static void
516err_input(err)
517 perrdetail *err;
518{
519 object *v, *w;
520 char *msg = NULL;
521 v = mkvalue("(ziiz)", err->filename,
522 err->lineno, err->offset, err->text);
523 if (err->text != NULL) {
524 free(err->text);
525 err->text = NULL;
526 }
527 switch (err->error) {
528 case E_SYNTAX:
529 msg = "invalid syntax";
530 break;
531 case E_TOKEN:
532 msg = "invalid token";
533
534 break;
535 case E_INTR:
536 err_set(KeyboardInterrupt);
537 return;
538 case E_NOMEM:
539 err_nomem();
540 return;
541 case E_EOF:
542 msg = "unexpected EOF while parsing";
543 break;
544 default:
545 fprintf(stderr, "error=%d\n", err->error);
546 msg = "unknown parsing error";
547 break;
548 }
549 w = mkvalue("(sO)", msg, v);
550 XDECREF(v);
551 err_setval(SyntaxError, w);
552 XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000553}
554
555/* Print fatal error message and abort */
556
557void
558fatal(msg)
559 char *msg;
560{
Guido van Rossum83dd6c31994-09-29 09:38:33 +0000561 fprintf(stderr, "Fatal Python error: %s\n", msg);
Guido van Rossum8ae87c01995-01-26 00:40:38 +0000562#ifdef macintosh
563 for (;;);
564#endif
Guido van Rossuma44823b1995-03-14 15:01:17 +0000565#ifdef NT
566 OutputDebugString("Fatal Python error:");
567 OutputDebugString(msg);
568 OutputDebugString("\n");
569#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000570 abort();
571}
572
573/* Clean up and exit */
574
Guido van Rossuma110aa61994-08-29 12:50:44 +0000575#ifdef WITH_THREAD
576#include "thread.h"
577int threads_started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +0000578#endif
579
Guido van Rossum1662dd51994-09-07 14:38:28 +0000580#define NEXITFUNCS 32
581static void (*exitfuncs[NEXITFUNCS])();
582static int nexitfuncs = 0;
583
584int Py_AtExit(func)
585 void (*func) PROTO((void));
586{
587 if (nexitfuncs >= NEXITFUNCS)
588 return -1;
589 exitfuncs[nexitfuncs++] = func;
590 return 0;
591}
592
Guido van Rossuma110aa61994-08-29 12:50:44 +0000593void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000594cleanup()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000595{
Guido van Rossum59bff391992-09-03 20:28:00 +0000596 object *exitfunc = sysget("exitfunc");
597
598 if (exitfunc) {
Guido van Rossum59bff391992-09-03 20:28:00 +0000599 object *res;
Guido van Rossum1c45ca31995-10-07 19:14:01 +0000600 INCREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +0000601 sysset("exitfunc", (object *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000602 res = call_object(exitfunc, (object *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +0000603 if (res == NULL) {
604 fprintf(stderr, "Error in sys.exitfunc:\n");
605 print_error();
606 }
Guido van Rossum1c45ca31995-10-07 19:14:01 +0000607 DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +0000608 }
609
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000610 flushline();
Guido van Rossum1662dd51994-09-07 14:38:28 +0000611
612 while (nexitfuncs > 0)
613 (*exitfuncs[--nexitfuncs])();
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000614}
615
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000616#ifdef COUNT_ALLOCS
617extern void dump_counts PROTO((void));
618#endif
619
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000620void
621goaway(sts)
622 int sts;
623{
624 cleanup();
Guido van Rossumff4949e1992-08-05 19:58:53 +0000625
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000626#ifdef COUNT_ALLOCS
627 dump_counts();
628#endif
629
Guido van Rossuma110aa61994-08-29 12:50:44 +0000630#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000631
632 /* Other threads may still be active, so skip most of the
633 cleanup actions usually done (these are mostly for
634 debugging anyway). */
635
Guido van Rossumdf72a651992-08-12 15:27:32 +0000636 (void) save_thread();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000637#ifndef NO_EXIT_PROG
Guido van Rossumf9f2e821992-08-17 08:59:08 +0000638 if (threads_started)
639 _exit_prog(sts);
640 else
641 exit_prog(sts);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000642#else /* !NO_EXIT_PROG */
643 if (threads_started)
644 _exit(sts);
645 else
646 exit(sts);
647#endif /* !NO_EXIT_PROG */
Guido van Rossumff4949e1992-08-05 19:58:53 +0000648
Guido van Rossuma110aa61994-08-29 12:50:44 +0000649#else /* WITH_THREAD */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000650
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000651 doneimport();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000652
653 err_clear();
654
655#ifdef REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000656 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000657#endif
658
659#ifdef TRACE_REFS
660 if (askyesno("Print left references?")) {
661 printrefs(stderr);
662 }
663#endif /* TRACE_REFS */
664
Jack Jansen66a89771995-10-27 13:22:14 +0000665#ifdef macintosh
666 PyMac_Exit(sts);
667#else
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000668 exit(sts);
Jack Jansen66a89771995-10-27 13:22:14 +0000669#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +0000670#endif /* WITH_THREAD */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000671 /*NOTREACHED*/
672}
673
Guido van Rossuma110aa61994-08-29 12:50:44 +0000674#ifdef HAVE_SIGNAL_H
675static RETSIGTYPE
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000676sighandler(sig)
677 int sig;
678{
679 signal(sig, SIG_DFL); /* Don't catch recursive signals */
680 cleanup(); /* Do essential clean-up */
Guido van Rossuma110aa61994-08-29 12:50:44 +0000681#ifdef HAVE_GETPID
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000682 kill(getpid(), sig); /* Pretend the signal killed us */
Guido van Rossuma110aa61994-08-29 12:50:44 +0000683#else
684 exit(1);
685#endif
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000686 /*NOTREACHED*/
687}
688#endif
689
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000690static void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000691initsigs()
692{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000693 RETSIGTYPE (*t)();
694#ifdef HAVE_SIGNAL_H
695#ifdef SIGPIPE
696 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000697#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +0000698#ifdef SIGHUP
699 t = signal(SIGHUP, SIG_IGN);
700 if (t == SIG_DFL)
701 signal(SIGHUP, sighandler);
702 else
703 signal(SIGHUP, t);
704#endif
705#ifdef SIGTERM
706 t = signal(SIGTERM, SIG_IGN);
707 if (t == SIG_DFL)
708 signal(SIGTERM, sighandler);
709 else
710 signal(SIGTERM, t);
711#endif
712#endif /* HAVE_SIGNAL_H */
713 initintr(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000714}
715
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000716#ifdef TRACE_REFS
717/* Ask a yes/no question */
718
Guido van Rossum59bff391992-09-03 20:28:00 +0000719int
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000720askyesno(prompt)
721 char *prompt;
722{
723 char buf[256];
724
725 printf("%s [ny] ", prompt);
726 if (fgets(buf, sizeof buf, stdin) == NULL)
727 return 0;
728 return buf[0] == 'y' || buf[0] == 'Y';
729}
730#endif
731
Guido van Rossuma110aa61994-08-29 12:50:44 +0000732#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000733
734/* Check for file descriptor connected to interactive device.
735 Pretend that stdin is always interactive, other files never. */
736
737int
738isatty(fd)
739 int fd;
740{
741 return fd == fileno(stdin);
742}
743
744#endif