blob: 7ab6c583352ab639d66da1d71ce2ae543faeb240 [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
Guido van Rossum4f1c59b1996-04-09 02:37:03 +000050#undef arglist
Guido van Rossuma44823b1995-03-14 15:01:17 +000051#include "windows.h"
52#endif
53
Guido van Rossum1984f1e1992-08-04 12:41:02 +000054extern char *getpythonpath();
55
56extern grammar gram; /* From graminit.c */
57
Guido van Rossumb73cc041993-11-01 16:28:59 +000058/* Forward */
Guido van Rossum6135a871995-01-09 17:53:26 +000059static void initmain PROTO((void));
Guido van Rossuma110aa61994-08-29 12:50:44 +000060static object *run_err_node PROTO((node *n, char *filename,
Guido van Rossumb73cc041993-11-01 16:28:59 +000061 object *globals, object *locals));
62static object *run_node PROTO((node *n, char *filename,
63 object *globals, object *locals));
Guido van Rossum262e1241995-02-07 15:30:45 +000064static object *run_pyc_file PROTO((FILE *fp, char *filename,
65 object *globals, object *locals));
Guido van Rossuma110aa61994-08-29 12:50:44 +000066static void err_input PROTO((perrdetail *));
Guido van Rossumb376a4a1993-11-23 17:53:17 +000067static void initsigs PROTO((void));
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000068
Guido van Rossum1984f1e1992-08-04 12:41:02 +000069int debugging; /* Needed by parser.c */
70int verbose; /* Needed by import.c */
Guido van Rossuma110aa61994-08-29 12:50:44 +000071int suppress_print; /* Needed by ceval.c */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000072
73/* Initialize all */
74
75void
76initall()
77{
78 static int inited;
79
80 if (inited)
81 return;
82 inited = 1;
83
84 initimport();
85
Guido van Rossuma110aa61994-08-29 12:50:44 +000086 /* Modules '__builtin__' and 'sys' are initialized here,
Guido van Rossum1984f1e1992-08-04 12:41:02 +000087 they are needed by random bits of the interpreter.
88 All other modules are optional and are initialized
89 when they are first imported. */
90
91 initbuiltin(); /* Also initializes builtin exceptions */
92 initsys();
Guido van Rossum1984f1e1992-08-04 12:41:02 +000093
94 setpythonpath(getpythonpath());
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000095
96 initsigs(); /* Signal handling stuff, including initintr() */
Guido van Rossum6135a871995-01-09 17:53:26 +000097
98 initmain();
99}
100
101/* Create __main__ module */
102
103static void
104initmain()
105{
106 object *m, *d;
107 m = add_module("__main__");
108 if (m == NULL)
109 fatal("can't create __main__ module");
110 d = getmoduledict(m);
111 if (dictlookup(d, "__builtins__") == NULL) {
Guido van Rossum94390ec1995-01-12 11:37:57 +0000112 if (dictinsert(d, "__builtins__", getbuiltins()))
Guido van Rossum6135a871995-01-09 17:53:26 +0000113 fatal("can't add __builtins__ to __main__");
114 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000115}
116
117/* Parse input from a file and execute it */
118
119int
120run(fp, filename)
121 FILE *fp;
122 char *filename;
123{
124 if (filename == NULL)
125 filename = "???";
126 if (isatty((int)fileno(fp)))
127 return run_tty_loop(fp, filename);
128 else
129 return run_script(fp, filename);
130}
131
132int
133run_tty_loop(fp, filename)
134 FILE *fp;
135 char *filename;
136{
137 object *v;
138 int ret;
139 v = sysget("ps1");
140 if (v == NULL) {
141 sysset("ps1", v = newstringobject(">>> "));
142 XDECREF(v);
143 }
144 v = sysget("ps2");
145 if (v == NULL) {
146 sysset("ps2", v = newstringobject("... "));
147 XDECREF(v);
148 }
149 for (;;) {
150 ret = run_tty_1(fp, filename);
151#ifdef REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000152 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000153#endif
154 if (ret == E_EOF)
155 return 0;
156 /*
157 if (ret == E_NOMEM)
158 return -1;
159 */
160 }
161}
162
163int
164run_tty_1(fp, filename)
165 FILE *fp;
166 char *filename;
167{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000168 object *m, *d, *v, *w;
169 node *n;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000170 perrdetail err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000171 char *ps1, *ps2;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000172 v = sysget("ps1");
173 w = sysget("ps2");
174 if (v != NULL && is_stringobject(v)) {
175 INCREF(v);
176 ps1 = getstringvalue(v);
177 }
178 else {
179 v = NULL;
180 ps1 = "";
181 }
182 if (w != NULL && is_stringobject(w)) {
183 INCREF(w);
184 ps2 = getstringvalue(w);
185 }
186 else {
187 w = NULL;
188 ps2 = "";
189 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000190 BGN_SAVE
Guido van Rossuma110aa61994-08-29 12:50:44 +0000191 n = parsefile(fp, filename, &gram, single_input, ps1, ps2, &err);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000192 END_SAVE
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000193 XDECREF(v);
194 XDECREF(w);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000195 if (n == NULL) {
196 if (err.error == E_EOF) {
197 if (err.text)
198 free(err.text);
199 return E_EOF;
200 }
201 err_input(&err);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000202 print_error();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000203 return err.error;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000204 }
205 m = add_module("__main__");
206 if (m == NULL)
207 return -1;
208 d = getmoduledict(m);
209 v = run_node(n, filename, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000210 if (v == NULL) {
211 print_error();
212 return -1;
213 }
214 DECREF(v);
Guido van Rossum6d023c91995-01-04 19:12:13 +0000215 flushline();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000216 return 0;
217}
218
219int
220run_script(fp, filename)
221 FILE *fp;
222 char *filename;
223{
224 object *m, *d, *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000225 char *ext;
226
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000227 m = add_module("__main__");
228 if (m == NULL)
229 return -1;
230 d = getmoduledict(m);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000231 ext = filename + strlen(filename) - 4;
Jack Jansenbd06e961995-02-13 11:44:56 +0000232#ifdef macintosh
233 /* On a mac, we also assume a pyc file for types 'PYC ' and 'APPL' */
234 if ( strcmp(ext, ".pyc") == 0 || getfiletype(filename) == 'PYC ' ||
235 getfiletype(filename) == 'APPL' ) {
236#else
Guido van Rossumfdef2711994-09-14 13:31:04 +0000237 if ( strcmp(ext, ".pyc") == 0 ) {
Jack Jansenbd06e961995-02-13 11:44:56 +0000238#endif /* macintosh */
Guido van Rossumfdef2711994-09-14 13:31:04 +0000239 /* Try to run a pyc file. First, re-open in binary */
Jack Jansene00637b1994-12-14 12:58:37 +0000240 /* Don't close, done in main: fclose(fp); */
Guido van Rossumfdef2711994-09-14 13:31:04 +0000241 if( (fp = fopen(filename, "rb")) == NULL ) {
242 fprintf(stderr, "python: Can't reopen .pyc file\n");
243 return -1;
244 }
245 v = run_pyc_file(fp, filename, d, d);
246 } else {
247 v = run_file(fp, filename, file_input, d, d);
248 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000249 if (v == NULL) {
250 print_error();
251 return -1;
252 }
253 DECREF(v);
Guido van Rossum6d023c91995-01-04 19:12:13 +0000254 flushline();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000255 return 0;
256}
257
258int
259run_command(command)
260 char *command;
261{
262 object *m, *d, *v;
263 m = add_module("__main__");
264 if (m == NULL)
265 return -1;
266 d = getmoduledict(m);
267 v = run_string(command, file_input, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000268 if (v == NULL) {
269 print_error();
270 return -1;
271 }
272 DECREF(v);
Guido van Rossum6d023c91995-01-04 19:12:13 +0000273 flushline();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000274 return 0;
275}
276
277void
278print_error()
279{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000280 object *exception, *v, *tb, *f;
281 err_fetch(&exception, &v, &tb);
Guido van Rossum6d023c91995-01-04 19:12:13 +0000282 flushline();
Guido van Rossum527c2641995-03-30 11:01:44 +0000283 fflush(stdout);
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 Rossum681d79a1995-07-18 14:51:37 +0000427 v = eval_code(co, globals, locals);
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;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000459 v = eval_code(co, globals, locals);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000460 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 Rossuma44823b1995-03-14 15:01:17 +0000566#ifdef NT
567 OutputDebugString("Fatal Python error:");
568 OutputDebugString(msg);
569 OutputDebugString("\n");
570#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000571 abort();
572}
573
574/* Clean up and exit */
575
Guido van Rossuma110aa61994-08-29 12:50:44 +0000576#ifdef WITH_THREAD
577#include "thread.h"
578int threads_started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +0000579#endif
580
Guido van Rossum1662dd51994-09-07 14:38:28 +0000581#define NEXITFUNCS 32
582static void (*exitfuncs[NEXITFUNCS])();
583static int nexitfuncs = 0;
584
585int Py_AtExit(func)
586 void (*func) PROTO((void));
587{
588 if (nexitfuncs >= NEXITFUNCS)
589 return -1;
590 exitfuncs[nexitfuncs++] = func;
591 return 0;
592}
593
Guido van Rossuma110aa61994-08-29 12:50:44 +0000594void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000595cleanup()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000596{
Guido van Rossum59bff391992-09-03 20:28:00 +0000597 object *exitfunc = sysget("exitfunc");
598
599 if (exitfunc) {
Guido van Rossum59bff391992-09-03 20:28:00 +0000600 object *res;
Guido van Rossum1c45ca31995-10-07 19:14:01 +0000601 INCREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +0000602 sysset("exitfunc", (object *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000603 res = call_object(exitfunc, (object *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +0000604 if (res == NULL) {
605 fprintf(stderr, "Error in sys.exitfunc:\n");
606 print_error();
607 }
Guido van Rossum1c45ca31995-10-07 19:14:01 +0000608 DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +0000609 }
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
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000657 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000658#endif
659
660#ifdef TRACE_REFS
661 if (askyesno("Print left references?")) {
662 printrefs(stderr);
663 }
664#endif /* TRACE_REFS */
665
Jack Jansen66a89771995-10-27 13:22:14 +0000666#ifdef macintosh
667 PyMac_Exit(sts);
668#else
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000669 exit(sts);
Jack Jansen66a89771995-10-27 13:22:14 +0000670#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +0000671#endif /* WITH_THREAD */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000672 /*NOTREACHED*/
673}
674
Guido van Rossuma110aa61994-08-29 12:50:44 +0000675#ifdef HAVE_SIGNAL_H
676static RETSIGTYPE
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000677sighandler(sig)
678 int sig;
679{
680 signal(sig, SIG_DFL); /* Don't catch recursive signals */
681 cleanup(); /* Do essential clean-up */
Guido van Rossuma110aa61994-08-29 12:50:44 +0000682#ifdef HAVE_GETPID
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000683 kill(getpid(), sig); /* Pretend the signal killed us */
Guido van Rossuma110aa61994-08-29 12:50:44 +0000684#else
685 exit(1);
686#endif
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000687 /*NOTREACHED*/
688}
689#endif
690
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000691static void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000692initsigs()
693{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000694 RETSIGTYPE (*t)();
695#ifdef HAVE_SIGNAL_H
696#ifdef SIGPIPE
697 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000698#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +0000699#ifdef SIGHUP
700 t = signal(SIGHUP, SIG_IGN);
701 if (t == SIG_DFL)
702 signal(SIGHUP, sighandler);
703 else
704 signal(SIGHUP, t);
705#endif
706#ifdef SIGTERM
707 t = signal(SIGTERM, SIG_IGN);
708 if (t == SIG_DFL)
709 signal(SIGTERM, sighandler);
710 else
711 signal(SIGTERM, t);
712#endif
713#endif /* HAVE_SIGNAL_H */
714 initintr(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000715}
716
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000717#ifdef TRACE_REFS
718/* Ask a yes/no question */
719
Guido van Rossum59bff391992-09-03 20:28:00 +0000720int
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000721askyesno(prompt)
722 char *prompt;
723{
724 char buf[256];
725
726 printf("%s [ny] ", prompt);
727 if (fgets(buf, sizeof buf, stdin) == NULL)
728 return 0;
729 return buf[0] == 'y' || buf[0] == 'Y';
730}
731#endif
732
Guido van Rossuma110aa61994-08-29 12:50:44 +0000733#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000734
735/* Check for file descriptor connected to interactive device.
736 Pretend that stdin is always interactive, other files never. */
737
738int
739isatty(fd)
740 int fd;
741{
742 return fd == fileno(stdin);
743}
744
745#endif