blob: 0666c5ac3729734d675de684e7357e09ff106e11 [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 Rossum42a51241995-01-30 12:52:46 +000048#ifdef THINK_C
49#include <console.h>
50#endif
51
Jack Jansen08e767b1995-02-02 14:30:20 +000052#ifdef __MWERKS__
53#include <SIOUX.h>
54#endif
55
Guido van Rossuma44823b1995-03-14 15:01:17 +000056#ifdef NT
57#undef BYTE
58#include "windows.h"
59#endif
60
Guido van Rossum1984f1e1992-08-04 12:41:02 +000061extern char *getpythonpath();
62
63extern grammar gram; /* From graminit.c */
64
Guido van Rossumb73cc041993-11-01 16:28:59 +000065/* Forward */
Guido van Rossum6135a871995-01-09 17:53:26 +000066static void initmain PROTO((void));
Guido van Rossuma110aa61994-08-29 12:50:44 +000067static object *run_err_node PROTO((node *n, char *filename,
Guido van Rossumb73cc041993-11-01 16:28:59 +000068 object *globals, object *locals));
69static object *run_node PROTO((node *n, char *filename,
70 object *globals, object *locals));
Guido van Rossum262e1241995-02-07 15:30:45 +000071static object *run_pyc_file PROTO((FILE *fp, char *filename,
72 object *globals, object *locals));
Guido van Rossuma110aa61994-08-29 12:50:44 +000073static void err_input PROTO((perrdetail *));
Guido van Rossumb376a4a1993-11-23 17:53:17 +000074static void initsigs PROTO((void));
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000075
Guido van Rossum1984f1e1992-08-04 12:41:02 +000076int debugging; /* Needed by parser.c */
77int verbose; /* Needed by import.c */
Guido van Rossuma110aa61994-08-29 12:50:44 +000078int suppress_print; /* Needed by ceval.c */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000079
80/* Initialize all */
81
82void
83initall()
84{
85 static int inited;
86
87 if (inited)
88 return;
89 inited = 1;
90
91 initimport();
92
Guido van Rossuma110aa61994-08-29 12:50:44 +000093 /* Modules '__builtin__' and 'sys' are initialized here,
Guido van Rossum1984f1e1992-08-04 12:41:02 +000094 they are needed by random bits of the interpreter.
95 All other modules are optional and are initialized
96 when they are first imported. */
97
98 initbuiltin(); /* Also initializes builtin exceptions */
99 initsys();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000100
101 setpythonpath(getpythonpath());
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000102
103 initsigs(); /* Signal handling stuff, including initintr() */
Guido van Rossum6135a871995-01-09 17:53:26 +0000104
105 initmain();
106}
107
108/* Create __main__ module */
109
110static void
111initmain()
112{
113 object *m, *d;
114 m = add_module("__main__");
115 if (m == NULL)
116 fatal("can't create __main__ module");
117 d = getmoduledict(m);
118 if (dictlookup(d, "__builtins__") == NULL) {
Guido van Rossum94390ec1995-01-12 11:37:57 +0000119 if (dictinsert(d, "__builtins__", getbuiltins()))
Guido van Rossum6135a871995-01-09 17:53:26 +0000120 fatal("can't add __builtins__ to __main__");
121 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000122}
123
124/* Parse input from a file and execute it */
125
126int
127run(fp, filename)
128 FILE *fp;
129 char *filename;
130{
131 if (filename == NULL)
132 filename = "???";
133 if (isatty((int)fileno(fp)))
134 return run_tty_loop(fp, filename);
135 else
136 return run_script(fp, filename);
137}
138
139int
140run_tty_loop(fp, filename)
141 FILE *fp;
142 char *filename;
143{
144 object *v;
145 int ret;
146 v = sysget("ps1");
147 if (v == NULL) {
148 sysset("ps1", v = newstringobject(">>> "));
149 XDECREF(v);
150 }
151 v = sysget("ps2");
152 if (v == NULL) {
153 sysset("ps2", v = newstringobject("... "));
154 XDECREF(v);
155 }
156 for (;;) {
157 ret = run_tty_1(fp, filename);
158#ifdef REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000159 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000160#endif
161 if (ret == E_EOF)
162 return 0;
163 /*
164 if (ret == E_NOMEM)
165 return -1;
166 */
167 }
168}
169
170int
171run_tty_1(fp, filename)
172 FILE *fp;
173 char *filename;
174{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000175 object *m, *d, *v, *w;
176 node *n;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000177 perrdetail err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000178 char *ps1, *ps2;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000179 v = sysget("ps1");
180 w = sysget("ps2");
181 if (v != NULL && is_stringobject(v)) {
182 INCREF(v);
183 ps1 = getstringvalue(v);
184 }
185 else {
186 v = NULL;
187 ps1 = "";
188 }
189 if (w != NULL && is_stringobject(w)) {
190 INCREF(w);
191 ps2 = getstringvalue(w);
192 }
193 else {
194 w = NULL;
195 ps2 = "";
196 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000197 BGN_SAVE
Guido van Rossuma110aa61994-08-29 12:50:44 +0000198 n = parsefile(fp, filename, &gram, single_input, ps1, ps2, &err);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000199 END_SAVE
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000200 XDECREF(v);
201 XDECREF(w);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000202 if (n == NULL) {
203 if (err.error == E_EOF) {
204 if (err.text)
205 free(err.text);
206 return E_EOF;
207 }
208 err_input(&err);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000209 print_error();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000210 return err.error;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000211 }
212 m = add_module("__main__");
213 if (m == NULL)
214 return -1;
215 d = getmoduledict(m);
216 v = run_node(n, filename, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000217 if (v == NULL) {
218 print_error();
219 return -1;
220 }
221 DECREF(v);
Guido van Rossum6d023c91995-01-04 19:12:13 +0000222 flushline();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000223 return 0;
224}
225
226int
227run_script(fp, filename)
228 FILE *fp;
229 char *filename;
230{
231 object *m, *d, *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000232 char *ext;
233
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000234 m = add_module("__main__");
235 if (m == NULL)
236 return -1;
237 d = getmoduledict(m);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000238 ext = filename + strlen(filename) - 4;
Jack Jansenbd06e961995-02-13 11:44:56 +0000239#ifdef macintosh
240 /* On a mac, we also assume a pyc file for types 'PYC ' and 'APPL' */
241 if ( strcmp(ext, ".pyc") == 0 || getfiletype(filename) == 'PYC ' ||
242 getfiletype(filename) == 'APPL' ) {
243#else
Guido van Rossumfdef2711994-09-14 13:31:04 +0000244 if ( strcmp(ext, ".pyc") == 0 ) {
Jack Jansenbd06e961995-02-13 11:44:56 +0000245#endif /* macintosh */
Guido van Rossumfdef2711994-09-14 13:31:04 +0000246 /* Try to run a pyc file. First, re-open in binary */
Jack Jansene00637b1994-12-14 12:58:37 +0000247 /* Don't close, done in main: fclose(fp); */
Guido van Rossumfdef2711994-09-14 13:31:04 +0000248 if( (fp = fopen(filename, "rb")) == NULL ) {
249 fprintf(stderr, "python: Can't reopen .pyc file\n");
250 return -1;
251 }
252 v = run_pyc_file(fp, filename, d, d);
253 } else {
254 v = run_file(fp, filename, file_input, d, d);
255 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000256 if (v == NULL) {
257 print_error();
258 return -1;
259 }
260 DECREF(v);
Guido van Rossum6d023c91995-01-04 19:12:13 +0000261 flushline();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000262 return 0;
263}
264
265int
266run_command(command)
267 char *command;
268{
269 object *m, *d, *v;
270 m = add_module("__main__");
271 if (m == NULL)
272 return -1;
273 d = getmoduledict(m);
274 v = run_string(command, file_input, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000275 if (v == NULL) {
276 print_error();
277 return -1;
278 }
279 DECREF(v);
Guido van Rossum6d023c91995-01-04 19:12:13 +0000280 flushline();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000281 return 0;
282}
283
284void
285print_error()
286{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000287 object *exception, *v, *tb, *f;
288 err_fetch(&exception, &v, &tb);
Guido van Rossum6d023c91995-01-04 19:12:13 +0000289 flushline();
Guido van Rossum527c2641995-03-30 11:01:44 +0000290 fflush(stdout);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000291 if (exception == NULL)
292 fatal("print_error called but no exception");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000293 if (exception == SystemExit) {
294 if (v == NULL || v == None)
295 goaway(0);
296 if (is_intobject(v))
297 goaway((int)getintvalue(v));
298 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000299 /* OK to use real stderr here */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000300 printobject(v, stderr, PRINT_RAW);
301 fprintf(stderr, "\n");
302 goaway(1);
303 }
304 }
305 sysset("last_type", exception);
306 sysset("last_value", v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000307 sysset("last_traceback", tb);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000308 f = sysget("stderr");
309 if (f == NULL)
310 fprintf(stderr, "lost sys.stderr\n");
311 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000312 tb_print(tb, f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000313 if (exception == SyntaxError) {
314 object *message;
315 char *filename, *text;
316 int lineno, offset;
317 if (!getargs(v, "(O(ziiz))", &message,
318 &filename, &lineno, &offset, &text))
319 err_clear();
320 else {
321 char buf[10];
322 writestring(" File \"", f);
323 if (filename == NULL)
324 writestring("<string>", f);
325 else
326 writestring(filename, f);
327 writestring("\", line ", f);
328 sprintf(buf, "%d", lineno);
329 writestring(buf, f);
330 writestring("\n", f);
331 if (text != NULL) {
Guido van Rossum798199d1994-09-19 08:08:50 +0000332 char *nl;
333 if (offset > 0 &&
334 offset == strlen(text))
335 offset--;
336 for (;;) {
337 nl = strchr(text, '\n');
338 if (nl == NULL ||
339 nl-text >= offset)
340 break;
341 offset -= (nl+1-text);
342 text = nl+1;
343 }
Guido van Rossuma110aa61994-08-29 12:50:44 +0000344 while (*text == ' ' || *text == '\t') {
345 text++;
346 offset--;
347 }
348 writestring(" ", f);
349 writestring(text, f);
350 if (*text == '\0' ||
351 text[strlen(text)-1] != '\n')
352 writestring("\n", f);
353 writestring(" ", f);
354 offset--;
355 while (offset > 0) {
356 writestring(" ", f);
357 offset--;
358 }
359 writestring("^\n", f);
360 }
361 INCREF(message);
362 DECREF(v);
363 v = message;
364 }
365 }
Guido van Rossum262e1241995-02-07 15:30:45 +0000366 if (is_classobject(exception)) {
367 object* className = ((classobject*)exception)->cl_name;
368 if (className == NULL)
369 writestring("<unknown>", f);
370 else {
371 if (writeobject(className, f, PRINT_RAW) != 0)
372 err_clear();
373 }
374 } else {
375 if (writeobject(exception, f, PRINT_RAW) != 0)
376 err_clear();
377 }
Guido van Rossum3165fe61992-09-25 21:59:05 +0000378 if (v != NULL && v != None) {
379 writestring(": ", f);
380 if (writeobject(v, f, PRINT_RAW) != 0)
381 err_clear();
382 }
383 writestring("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000384 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000385 XDECREF(exception);
386 XDECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000387 XDECREF(tb);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000388}
389
390object *
391run_string(str, start, globals, locals)
392 char *str;
393 int start;
Guido van Rossum5b722181993-03-30 17:46:03 +0000394 object *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000395{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000396 return run_err_node(parse_string(str, start),
397 "<string>", globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000398}
399
400object *
401run_file(fp, filename, start, globals, locals)
402 FILE *fp;
403 char *filename;
404 int start;
Guido van Rossum5b722181993-03-30 17:46:03 +0000405 object *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000406{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000407 return run_err_node(parse_file(fp, filename, start),
408 filename, globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000409}
410
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000411static object *
Guido van Rossuma110aa61994-08-29 12:50:44 +0000412run_err_node(n, filename, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000413 node *n;
414 char *filename;
Guido van Rossum5b722181993-03-30 17:46:03 +0000415 object *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000416{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000417 if (n == NULL)
418 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000419 return run_node(n, filename, globals, locals);
420}
421
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000422static object *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000423run_node(n, filename, globals, locals)
424 node *n;
425 char *filename;
Guido van Rossum5b722181993-03-30 17:46:03 +0000426 object *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000427{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000428 codeobject *co;
429 object *v;
430 co = compile(n, filename);
431 freetree(n);
432 if (co == NULL)
433 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000434 v = eval_code(co, globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000435 DECREF(co);
436 return v;
437}
438
Guido van Rossum8ae87c01995-01-26 00:40:38 +0000439static object *
Guido van Rossumfdef2711994-09-14 13:31:04 +0000440run_pyc_file(fp, filename, globals, locals)
441 FILE *fp;
442 char *filename;
443 object *globals, *locals;
444{
445 codeobject *co;
446 object *v;
447 long magic;
448 long get_pyc_magic();
449
450 magic = rd_long(fp);
451 if (magic != get_pyc_magic()) {
452 err_setstr(RuntimeError,
453 "Bad magic number in .pyc file");
454 return NULL;
455 }
456 (void) rd_long(fp);
457 v = rd_object(fp);
458 fclose(fp);
459 if (v == NULL || !is_codeobject(v)) {
460 XDECREF(v);
461 err_setstr(RuntimeError,
462 "Bad code object in .pyc file");
463 return NULL;
464 }
465 co = (codeobject *)v;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000466 v = eval_code(co, globals, locals);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000467 DECREF(co);
468 return v;
469}
470
471object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000472compile_string(str, filename, start)
473 char *str;
474 char *filename;
475 int start;
476{
477 node *n;
Guido van Rossum5b722181993-03-30 17:46:03 +0000478 codeobject *co;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000479 n = parse_string(str, start);
480 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +0000481 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000482 co = compile(n, filename);
483 freetree(n);
484 return (object *)co;
485}
486
Guido van Rossuma110aa61994-08-29 12:50:44 +0000487/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000488
Guido van Rossuma110aa61994-08-29 12:50:44 +0000489node *
490parse_file(fp, filename, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000491 FILE *fp;
492 char *filename;
493 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000494{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000495 node *n;
496 perrdetail err;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000497 BGN_SAVE
Guido van Rossuma110aa61994-08-29 12:50:44 +0000498 n = parsefile(fp, filename, &gram, start,
499 (char *)0, (char *)0, &err);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000500 END_SAVE
Guido van Rossuma110aa61994-08-29 12:50:44 +0000501 if (n == NULL)
502 err_input(&err);
503 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000504}
505
Guido van Rossuma110aa61994-08-29 12:50:44 +0000506/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000507
Guido van Rossuma110aa61994-08-29 12:50:44 +0000508node *
509parse_string(str, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000510 char *str;
511 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000512{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000513 node *n;
514 perrdetail err;
515 n = parsestring(str, &gram, start, &err);
516 if (n == NULL)
517 err_input(&err);
518 return n;
519}
520
521/* Set the error appropriate to the given input error code (see errcode.h) */
522
523static void
524err_input(err)
525 perrdetail *err;
526{
527 object *v, *w;
528 char *msg = NULL;
529 v = mkvalue("(ziiz)", err->filename,
530 err->lineno, err->offset, err->text);
531 if (err->text != NULL) {
532 free(err->text);
533 err->text = NULL;
534 }
535 switch (err->error) {
536 case E_SYNTAX:
537 msg = "invalid syntax";
538 break;
539 case E_TOKEN:
540 msg = "invalid token";
541
542 break;
543 case E_INTR:
544 err_set(KeyboardInterrupt);
545 return;
546 case E_NOMEM:
547 err_nomem();
548 return;
549 case E_EOF:
550 msg = "unexpected EOF while parsing";
551 break;
552 default:
553 fprintf(stderr, "error=%d\n", err->error);
554 msg = "unknown parsing error";
555 break;
556 }
557 w = mkvalue("(sO)", msg, v);
558 XDECREF(v);
559 err_setval(SyntaxError, w);
560 XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000561}
562
563/* Print fatal error message and abort */
564
565void
566fatal(msg)
567 char *msg;
568{
Guido van Rossum83dd6c31994-09-29 09:38:33 +0000569 fprintf(stderr, "Fatal Python error: %s\n", msg);
Guido van Rossum8ae87c01995-01-26 00:40:38 +0000570#ifdef macintosh
571 for (;;);
572#endif
Guido van Rossuma44823b1995-03-14 15:01:17 +0000573#ifdef NT
574 OutputDebugString("Fatal Python error:");
575 OutputDebugString(msg);
576 OutputDebugString("\n");
577#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000578 abort();
579}
580
581/* Clean up and exit */
582
Guido van Rossuma110aa61994-08-29 12:50:44 +0000583#ifdef WITH_THREAD
584#include "thread.h"
585int threads_started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +0000586#endif
587
Guido van Rossum1662dd51994-09-07 14:38:28 +0000588#define NEXITFUNCS 32
589static void (*exitfuncs[NEXITFUNCS])();
590static int nexitfuncs = 0;
591
592int Py_AtExit(func)
593 void (*func) PROTO((void));
594{
595 if (nexitfuncs >= NEXITFUNCS)
596 return -1;
597 exitfuncs[nexitfuncs++] = func;
598 return 0;
599}
600
Guido van Rossuma110aa61994-08-29 12:50:44 +0000601void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000602cleanup()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000603{
Guido van Rossum59bff391992-09-03 20:28:00 +0000604 object *exitfunc = sysget("exitfunc");
605
606 if (exitfunc) {
Guido van Rossum59bff391992-09-03 20:28:00 +0000607 object *res;
608 sysset("exitfunc", (object *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000609 res = call_object(exitfunc, (object *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +0000610 if (res == NULL) {
611 fprintf(stderr, "Error in sys.exitfunc:\n");
612 print_error();
613 }
614 }
615
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000616 flushline();
Guido van Rossum1662dd51994-09-07 14:38:28 +0000617
618 while (nexitfuncs > 0)
619 (*exitfuncs[--nexitfuncs])();
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000620}
621
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000622#ifdef COUNT_ALLOCS
623extern void dump_counts PROTO((void));
624#endif
625
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000626void
627goaway(sts)
628 int sts;
629{
630 cleanup();
Guido van Rossumff4949e1992-08-05 19:58:53 +0000631
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000632#ifdef COUNT_ALLOCS
633 dump_counts();
634#endif
635
Guido van Rossuma110aa61994-08-29 12:50:44 +0000636#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000637
638 /* Other threads may still be active, so skip most of the
639 cleanup actions usually done (these are mostly for
640 debugging anyway). */
641
Guido van Rossumdf72a651992-08-12 15:27:32 +0000642 (void) save_thread();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000643#ifndef NO_EXIT_PROG
Guido van Rossumf9f2e821992-08-17 08:59:08 +0000644 if (threads_started)
645 _exit_prog(sts);
646 else
647 exit_prog(sts);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000648#else /* !NO_EXIT_PROG */
649 if (threads_started)
650 _exit(sts);
651 else
652 exit(sts);
653#endif /* !NO_EXIT_PROG */
Guido van Rossumff4949e1992-08-05 19:58:53 +0000654
Guido van Rossuma110aa61994-08-29 12:50:44 +0000655#else /* WITH_THREAD */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000656
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000657 doneimport();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000658
659 err_clear();
660
661#ifdef REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000662 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000663#endif
664
665#ifdef TRACE_REFS
666 if (askyesno("Print left references?")) {
667 printrefs(stderr);
668 }
669#endif /* TRACE_REFS */
670
Jack Jansen08e767b1995-02-02 14:30:20 +0000671 /* XXXX Jack thinks it would be nicer to pause if any output has
672 ** been generated since the last interaction with the user...
673 */
Guido van Rossum42a51241995-01-30 12:52:46 +0000674#ifdef THINK_C
675 if (sts == 0)
676 console_options.pause_atexit = 0;
677#endif
Jack Jansen08e767b1995-02-02 14:30:20 +0000678#ifdef __MWERKS__
679 if (sts == 0)
680 SIOUXSettings.autocloseonquit = 1;
Jack Jansenbd06e961995-02-13 11:44:56 +0000681 else
Jack Jansen21eb0b51995-07-29 13:55:06 +0000682 printf("\n[Terminated]\n");
Jack Jansen08e767b1995-02-02 14:30:20 +0000683#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000684 exit(sts);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000685#endif /* WITH_THREAD */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000686 /*NOTREACHED*/
687}
688
Guido van Rossuma110aa61994-08-29 12:50:44 +0000689#ifdef HAVE_SIGNAL_H
690static RETSIGTYPE
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000691sighandler(sig)
692 int sig;
693{
694 signal(sig, SIG_DFL); /* Don't catch recursive signals */
695 cleanup(); /* Do essential clean-up */
Guido van Rossuma110aa61994-08-29 12:50:44 +0000696#ifdef HAVE_GETPID
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000697 kill(getpid(), sig); /* Pretend the signal killed us */
Guido van Rossuma110aa61994-08-29 12:50:44 +0000698#else
699 exit(1);
700#endif
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000701 /*NOTREACHED*/
702}
703#endif
704
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000705static void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000706initsigs()
707{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000708 RETSIGTYPE (*t)();
709#ifdef HAVE_SIGNAL_H
710#ifdef SIGPIPE
711 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000712#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +0000713#ifdef SIGHUP
714 t = signal(SIGHUP, SIG_IGN);
715 if (t == SIG_DFL)
716 signal(SIGHUP, sighandler);
717 else
718 signal(SIGHUP, t);
719#endif
720#ifdef SIGTERM
721 t = signal(SIGTERM, SIG_IGN);
722 if (t == SIG_DFL)
723 signal(SIGTERM, sighandler);
724 else
725 signal(SIGTERM, t);
726#endif
727#endif /* HAVE_SIGNAL_H */
728 initintr(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000729}
730
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000731#ifdef TRACE_REFS
732/* Ask a yes/no question */
733
Guido van Rossum59bff391992-09-03 20:28:00 +0000734int
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000735askyesno(prompt)
736 char *prompt;
737{
738 char buf[256];
739
740 printf("%s [ny] ", prompt);
741 if (fgets(buf, sizeof buf, stdin) == NULL)
742 return 0;
743 return buf[0] == 'y' || buf[0] == 'Y';
744}
745#endif
746
Guido van Rossuma110aa61994-08-29 12:50:44 +0000747#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000748
749/* Check for file descriptor connected to interactive device.
750 Pretend that stdin is always interactive, other files never. */
751
752int
753isatty(fd)
754 int fd;
755{
756 return fd == fileno(stdin);
757}
758
759#endif