blob: 7cdcf46cebbff3db02f5cb844cff3523c654ecb9 [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
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossum1984f1e1992-08-04 12:41:02 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossum1984f1e1992-08-04 12:41:02 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossum1984f1e1992-08-04 12:41:02 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossum1984f1e1992-08-04 12:41:02 +000029
30******************************************************************/
31
32/* Python interpreter top-level routines, including init/exit */
33
34#include "allobjects.h"
35
36#include "grammar.h"
37#include "node.h"
38#include "parsetok.h"
39#include "graminit.h"
Guido van Rossumbefa14f1995-09-18 21:42:42 +000040#undef argument /* Avoid conflict on Mac */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000041#include "errcode.h"
42#include "sysmodule.h"
Guido van Rossum6135a871995-01-09 17:53:26 +000043#include "bltinmodule.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000044#include "compile.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000045#include "eval.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000046#include "ceval.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000047#include "import.h"
Guido van Rossumfdef2711994-09-14 13:31:04 +000048#include "marshal.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000049
Guido van Rossum80bb9651996-12-05 23:27:02 +000050#ifdef HAVE_UNISTD_H
51#include <unistd.h>
52#endif
53
Guido van Rossuma110aa61994-08-29 12:50:44 +000054#ifdef HAVE_SIGNAL_H
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000055#include <signal.h>
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000056#endif
57
Guido van Rossum9b38a141996-09-11 23:12:24 +000058#ifdef MS_WIN32
Guido van Rossuma44823b1995-03-14 15:01:17 +000059#undef BYTE
Guido van Rossum4f1c59b1996-04-09 02:37:03 +000060#undef arglist
Guido van Rossuma44823b1995-03-14 15:01:17 +000061#include "windows.h"
62#endif
63
Guido van Rossum1984f1e1992-08-04 12:41:02 +000064extern char *getpythonpath();
65
66extern grammar gram; /* From graminit.c */
67
Guido van Rossumb73cc041993-11-01 16:28:59 +000068/* Forward */
Guido van Rossum6135a871995-01-09 17:53:26 +000069static void initmain PROTO((void));
Guido van Rossuma110aa61994-08-29 12:50:44 +000070static object *run_err_node PROTO((node *n, char *filename,
Guido van Rossumb73cc041993-11-01 16:28:59 +000071 object *globals, object *locals));
72static object *run_node PROTO((node *n, char *filename,
73 object *globals, object *locals));
Guido van Rossum262e1241995-02-07 15:30:45 +000074static object *run_pyc_file PROTO((FILE *fp, char *filename,
75 object *globals, object *locals));
Guido van Rossuma110aa61994-08-29 12:50:44 +000076static void err_input PROTO((perrdetail *));
Guido van Rossumb376a4a1993-11-23 17:53:17 +000077static void initsigs PROTO((void));
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000078
Guido van Rossum1984f1e1992-08-04 12:41:02 +000079int debugging; /* Needed by parser.c */
80int verbose; /* Needed by import.c */
Guido van Rossuma110aa61994-08-29 12:50:44 +000081int suppress_print; /* Needed by ceval.c */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000082
83/* Initialize all */
84
85void
86initall()
87{
88 static int inited;
89
90 if (inited)
91 return;
92 inited = 1;
93
94 initimport();
95
Guido van Rossuma110aa61994-08-29 12:50:44 +000096 /* Modules '__builtin__' and 'sys' are initialized here,
Guido van Rossum1984f1e1992-08-04 12:41:02 +000097 they are needed by random bits of the interpreter.
98 All other modules are optional and are initialized
99 when they are first imported. */
100
101 initbuiltin(); /* Also initializes builtin exceptions */
102 initsys();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000103
104 setpythonpath(getpythonpath());
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000105
106 initsigs(); /* Signal handling stuff, including initintr() */
Guido van Rossum6135a871995-01-09 17:53:26 +0000107
108 initmain();
109}
110
111/* Create __main__ module */
112
113static void
114initmain()
115{
116 object *m, *d;
117 m = add_module("__main__");
118 if (m == NULL)
119 fatal("can't create __main__ module");
120 d = getmoduledict(m);
121 if (dictlookup(d, "__builtins__") == NULL) {
Guido van Rossum94390ec1995-01-12 11:37:57 +0000122 if (dictinsert(d, "__builtins__", getbuiltins()))
Guido van Rossum6135a871995-01-09 17:53:26 +0000123 fatal("can't add __builtins__ to __main__");
124 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000125}
126
127/* Parse input from a file and execute it */
128
129int
130run(fp, filename)
131 FILE *fp;
132 char *filename;
133{
134 if (filename == NULL)
135 filename = "???";
136 if (isatty((int)fileno(fp)))
137 return run_tty_loop(fp, filename);
138 else
139 return run_script(fp, filename);
140}
141
142int
143run_tty_loop(fp, filename)
144 FILE *fp;
145 char *filename;
146{
147 object *v;
148 int ret;
149 v = sysget("ps1");
150 if (v == NULL) {
151 sysset("ps1", v = newstringobject(">>> "));
152 XDECREF(v);
153 }
154 v = sysget("ps2");
155 if (v == NULL) {
156 sysset("ps2", v = newstringobject("... "));
157 XDECREF(v);
158 }
159 for (;;) {
160 ret = run_tty_1(fp, filename);
Guido van Rossumaae0d321996-05-22 16:35:33 +0000161#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000162 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000163#endif
164 if (ret == E_EOF)
165 return 0;
166 /*
167 if (ret == E_NOMEM)
168 return -1;
169 */
170 }
171}
172
173int
174run_tty_1(fp, filename)
175 FILE *fp;
176 char *filename;
177{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000178 object *m, *d, *v, *w;
179 node *n;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000180 perrdetail err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000181 char *ps1, *ps2;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000182 v = sysget("ps1");
183 w = sysget("ps2");
184 if (v != NULL && is_stringobject(v)) {
185 INCREF(v);
186 ps1 = getstringvalue(v);
187 }
188 else {
189 v = NULL;
190 ps1 = "";
191 }
192 if (w != NULL && is_stringobject(w)) {
193 INCREF(w);
194 ps2 = getstringvalue(w);
195 }
196 else {
197 w = NULL;
198 ps2 = "";
199 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000200 BGN_SAVE
Guido van Rossuma110aa61994-08-29 12:50:44 +0000201 n = parsefile(fp, filename, &gram, single_input, ps1, ps2, &err);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000202 END_SAVE
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000203 XDECREF(v);
204 XDECREF(w);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000205 if (n == NULL) {
206 if (err.error == E_EOF) {
207 if (err.text)
208 free(err.text);
209 return E_EOF;
210 }
211 err_input(&err);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000212 print_error();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000213 return err.error;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000214 }
215 m = add_module("__main__");
216 if (m == NULL)
217 return -1;
218 d = getmoduledict(m);
219 v = run_node(n, filename, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000220 if (v == NULL) {
221 print_error();
222 return -1;
223 }
224 DECREF(v);
Guido van Rossum6d023c91995-01-04 19:12:13 +0000225 flushline();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000226 return 0;
227}
228
229int
230run_script(fp, filename)
231 FILE *fp;
232 char *filename;
233{
234 object *m, *d, *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000235 char *ext;
236
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000237 m = add_module("__main__");
238 if (m == NULL)
239 return -1;
240 d = getmoduledict(m);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000241 ext = filename + strlen(filename) - 4;
Jack Jansenbd06e961995-02-13 11:44:56 +0000242#ifdef macintosh
243 /* On a mac, we also assume a pyc file for types 'PYC ' and 'APPL' */
244 if ( strcmp(ext, ".pyc") == 0 || getfiletype(filename) == 'PYC ' ||
245 getfiletype(filename) == 'APPL' ) {
246#else
Guido van Rossumfdef2711994-09-14 13:31:04 +0000247 if ( strcmp(ext, ".pyc") == 0 ) {
Jack Jansenbd06e961995-02-13 11:44:56 +0000248#endif /* macintosh */
Guido van Rossumfdef2711994-09-14 13:31:04 +0000249 /* Try to run a pyc file. First, re-open in binary */
Jack Jansene00637b1994-12-14 12:58:37 +0000250 /* Don't close, done in main: fclose(fp); */
Guido van Rossumfdef2711994-09-14 13:31:04 +0000251 if( (fp = fopen(filename, "rb")) == NULL ) {
252 fprintf(stderr, "python: Can't reopen .pyc file\n");
253 return -1;
254 }
255 v = run_pyc_file(fp, filename, d, d);
256 } else {
257 v = run_file(fp, filename, file_input, d, d);
258 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000259 if (v == NULL) {
260 print_error();
261 return -1;
262 }
263 DECREF(v);
Guido van Rossum6d023c91995-01-04 19:12:13 +0000264 flushline();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000265 return 0;
266}
267
268int
269run_command(command)
270 char *command;
271{
272 object *m, *d, *v;
273 m = add_module("__main__");
274 if (m == NULL)
275 return -1;
276 d = getmoduledict(m);
277 v = run_string(command, file_input, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000278 if (v == NULL) {
279 print_error();
280 return -1;
281 }
282 DECREF(v);
Guido van Rossum6d023c91995-01-04 19:12:13 +0000283 flushline();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000284 return 0;
285}
286
287void
288print_error()
289{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000290 object *exception, *v, *tb, *f;
291 err_fetch(&exception, &v, &tb);
Guido van Rossum6d023c91995-01-04 19:12:13 +0000292 flushline();
Guido van Rossum527c2641995-03-30 11:01:44 +0000293 fflush(stdout);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000294 if (exception == NULL)
295 fatal("print_error called but no exception");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000296 if (exception == SystemExit) {
297 if (v == NULL || v == None)
298 goaway(0);
299 if (is_intobject(v))
300 goaway((int)getintvalue(v));
301 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000302 /* OK to use real stderr here */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000303 printobject(v, stderr, PRINT_RAW);
304 fprintf(stderr, "\n");
305 goaway(1);
306 }
307 }
308 sysset("last_type", exception);
309 sysset("last_value", v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000310 sysset("last_traceback", tb);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000311 f = sysget("stderr");
312 if (f == NULL)
313 fprintf(stderr, "lost sys.stderr\n");
314 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000315 tb_print(tb, f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000316 if (exception == SyntaxError) {
317 object *message;
318 char *filename, *text;
319 int lineno, offset;
320 if (!getargs(v, "(O(ziiz))", &message,
321 &filename, &lineno, &offset, &text))
322 err_clear();
323 else {
324 char buf[10];
325 writestring(" File \"", f);
326 if (filename == NULL)
327 writestring("<string>", f);
328 else
329 writestring(filename, f);
330 writestring("\", line ", f);
331 sprintf(buf, "%d", lineno);
332 writestring(buf, f);
333 writestring("\n", f);
334 if (text != NULL) {
Guido van Rossum798199d1994-09-19 08:08:50 +0000335 char *nl;
336 if (offset > 0 &&
337 offset == strlen(text))
338 offset--;
339 for (;;) {
340 nl = strchr(text, '\n');
341 if (nl == NULL ||
342 nl-text >= offset)
343 break;
344 offset -= (nl+1-text);
345 text = nl+1;
346 }
Guido van Rossuma110aa61994-08-29 12:50:44 +0000347 while (*text == ' ' || *text == '\t') {
348 text++;
349 offset--;
350 }
351 writestring(" ", f);
352 writestring(text, f);
353 if (*text == '\0' ||
354 text[strlen(text)-1] != '\n')
355 writestring("\n", f);
356 writestring(" ", f);
357 offset--;
358 while (offset > 0) {
359 writestring(" ", f);
360 offset--;
361 }
362 writestring("^\n", f);
363 }
364 INCREF(message);
365 DECREF(v);
366 v = message;
367 }
368 }
Guido van Rossum262e1241995-02-07 15:30:45 +0000369 if (is_classobject(exception)) {
370 object* className = ((classobject*)exception)->cl_name;
371 if (className == NULL)
372 writestring("<unknown>", f);
373 else {
374 if (writeobject(className, f, PRINT_RAW) != 0)
375 err_clear();
376 }
377 } else {
378 if (writeobject(exception, f, PRINT_RAW) != 0)
379 err_clear();
380 }
Guido van Rossum3165fe61992-09-25 21:59:05 +0000381 if (v != NULL && v != None) {
382 writestring(": ", f);
383 if (writeobject(v, f, PRINT_RAW) != 0)
384 err_clear();
385 }
386 writestring("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000387 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000388 XDECREF(exception);
389 XDECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000390 XDECREF(tb);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000391}
392
393object *
394run_string(str, start, globals, locals)
395 char *str;
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_string(str, start),
400 "<string>", globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000401}
402
403object *
404run_file(fp, filename, start, globals, locals)
405 FILE *fp;
406 char *filename;
407 int start;
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 return run_err_node(parse_file(fp, filename, start),
411 filename, globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000412}
413
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000414static object *
Guido van Rossuma110aa61994-08-29 12:50:44 +0000415run_err_node(n, filename, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000416 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 Rossuma110aa61994-08-29 12:50:44 +0000420 if (n == NULL)
421 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000422 return run_node(n, filename, globals, locals);
423}
424
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000425static object *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000426run_node(n, filename, globals, locals)
427 node *n;
428 char *filename;
Guido van Rossum5b722181993-03-30 17:46:03 +0000429 object *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000430{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000431 codeobject *co;
432 object *v;
433 co = compile(n, filename);
434 freetree(n);
435 if (co == NULL)
436 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000437 v = eval_code(co, globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000438 DECREF(co);
439 return v;
440}
441
Guido van Rossum8ae87c01995-01-26 00:40:38 +0000442static object *
Guido van Rossumfdef2711994-09-14 13:31:04 +0000443run_pyc_file(fp, filename, globals, locals)
444 FILE *fp;
445 char *filename;
446 object *globals, *locals;
447{
448 codeobject *co;
449 object *v;
450 long magic;
451 long get_pyc_magic();
452
453 magic = rd_long(fp);
454 if (magic != get_pyc_magic()) {
455 err_setstr(RuntimeError,
456 "Bad magic number in .pyc file");
457 return NULL;
458 }
459 (void) rd_long(fp);
460 v = rd_object(fp);
461 fclose(fp);
462 if (v == NULL || !is_codeobject(v)) {
463 XDECREF(v);
464 err_setstr(RuntimeError,
465 "Bad code object in .pyc file");
466 return NULL;
467 }
468 co = (codeobject *)v;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000469 v = eval_code(co, globals, locals);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000470 DECREF(co);
471 return v;
472}
473
474object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000475compile_string(str, filename, start)
476 char *str;
477 char *filename;
478 int start;
479{
480 node *n;
Guido van Rossum5b722181993-03-30 17:46:03 +0000481 codeobject *co;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000482 n = parse_string(str, start);
483 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +0000484 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000485 co = compile(n, filename);
486 freetree(n);
487 return (object *)co;
488}
489
Guido van Rossuma110aa61994-08-29 12:50:44 +0000490/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000491
Guido van Rossuma110aa61994-08-29 12:50:44 +0000492node *
493parse_file(fp, filename, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000494 FILE *fp;
495 char *filename;
496 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000497{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000498 node *n;
499 perrdetail err;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000500 BGN_SAVE
Guido van Rossuma110aa61994-08-29 12:50:44 +0000501 n = parsefile(fp, filename, &gram, start,
502 (char *)0, (char *)0, &err);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000503 END_SAVE
Guido van Rossuma110aa61994-08-29 12:50:44 +0000504 if (n == NULL)
505 err_input(&err);
506 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000507}
508
Guido van Rossuma110aa61994-08-29 12:50:44 +0000509/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000510
Guido van Rossuma110aa61994-08-29 12:50:44 +0000511node *
512parse_string(str, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000513 char *str;
514 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000515{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000516 node *n;
517 perrdetail err;
518 n = parsestring(str, &gram, start, &err);
519 if (n == NULL)
520 err_input(&err);
521 return n;
522}
523
524/* Set the error appropriate to the given input error code (see errcode.h) */
525
526static void
527err_input(err)
528 perrdetail *err;
529{
530 object *v, *w;
531 char *msg = NULL;
532 v = mkvalue("(ziiz)", err->filename,
533 err->lineno, err->offset, err->text);
534 if (err->text != NULL) {
535 free(err->text);
536 err->text = NULL;
537 }
538 switch (err->error) {
539 case E_SYNTAX:
540 msg = "invalid syntax";
541 break;
542 case E_TOKEN:
543 msg = "invalid token";
544
545 break;
546 case E_INTR:
547 err_set(KeyboardInterrupt);
548 return;
549 case E_NOMEM:
550 err_nomem();
551 return;
552 case E_EOF:
553 msg = "unexpected EOF while parsing";
554 break;
555 default:
556 fprintf(stderr, "error=%d\n", err->error);
557 msg = "unknown parsing error";
558 break;
559 }
560 w = mkvalue("(sO)", msg, v);
561 XDECREF(v);
562 err_setval(SyntaxError, w);
563 XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000564}
565
566/* Print fatal error message and abort */
567
568void
569fatal(msg)
570 char *msg;
571{
Guido van Rossum83dd6c31994-09-29 09:38:33 +0000572 fprintf(stderr, "Fatal Python error: %s\n", msg);
Guido van Rossum8ae87c01995-01-26 00:40:38 +0000573#ifdef macintosh
574 for (;;);
575#endif
Guido van Rossum9b38a141996-09-11 23:12:24 +0000576#ifdef MS_WIN32
Guido van Rossuma44823b1995-03-14 15:01:17 +0000577 OutputDebugString("Fatal Python error:");
578 OutputDebugString(msg);
579 OutputDebugString("\n");
580#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000581 abort();
582}
583
584/* Clean up and exit */
585
Guido van Rossuma110aa61994-08-29 12:50:44 +0000586#ifdef WITH_THREAD
587#include "thread.h"
588int threads_started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +0000589#endif
590
Guido van Rossum1662dd51994-09-07 14:38:28 +0000591#define NEXITFUNCS 32
592static void (*exitfuncs[NEXITFUNCS])();
593static int nexitfuncs = 0;
594
595int Py_AtExit(func)
596 void (*func) PROTO((void));
597{
598 if (nexitfuncs >= NEXITFUNCS)
599 return -1;
600 exitfuncs[nexitfuncs++] = func;
601 return 0;
602}
603
Guido van Rossuma110aa61994-08-29 12:50:44 +0000604void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000605cleanup()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000606{
Guido van Rossum59bff391992-09-03 20:28:00 +0000607 object *exitfunc = sysget("exitfunc");
608
609 if (exitfunc) {
Guido van Rossum59bff391992-09-03 20:28:00 +0000610 object *res;
Guido van Rossum1c45ca31995-10-07 19:14:01 +0000611 INCREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +0000612 sysset("exitfunc", (object *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000613 res = call_object(exitfunc, (object *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +0000614 if (res == NULL) {
615 fprintf(stderr, "Error in sys.exitfunc:\n");
616 print_error();
617 }
Guido van Rossum1c45ca31995-10-07 19:14:01 +0000618 DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +0000619 }
620
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000621 flushline();
Guido van Rossum1662dd51994-09-07 14:38:28 +0000622
623 while (nexitfuncs > 0)
624 (*exitfuncs[--nexitfuncs])();
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000625}
626
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000627#ifdef COUNT_ALLOCS
628extern void dump_counts PROTO((void));
629#endif
630
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000631void
632goaway(sts)
633 int sts;
634{
635 cleanup();
Guido van Rossumff4949e1992-08-05 19:58:53 +0000636
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000637#ifdef COUNT_ALLOCS
638 dump_counts();
639#endif
640
Guido van Rossuma110aa61994-08-29 12:50:44 +0000641#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000642
643 /* Other threads may still be active, so skip most of the
644 cleanup actions usually done (these are mostly for
645 debugging anyway). */
646
Guido van Rossumdf72a651992-08-12 15:27:32 +0000647 (void) save_thread();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000648#ifndef NO_EXIT_PROG
Guido van Rossumf9f2e821992-08-17 08:59:08 +0000649 if (threads_started)
650 _exit_prog(sts);
651 else
652 exit_prog(sts);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000653#else /* !NO_EXIT_PROG */
654 if (threads_started)
655 _exit(sts);
656 else
657 exit(sts);
658#endif /* !NO_EXIT_PROG */
Guido van Rossumff4949e1992-08-05 19:58:53 +0000659
Guido van Rossuma110aa61994-08-29 12:50:44 +0000660#else /* WITH_THREAD */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000661
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000662 doneimport();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000663
664 err_clear();
665
Guido van Rossumaae0d321996-05-22 16:35:33 +0000666#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000667 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000668#endif
669
Guido van Rossumaae0d321996-05-22 16:35:33 +0000670#ifdef Py_TRACE_REFS
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000671 if (askyesno("Print left references?")) {
Guido van Rossumded690f1996-05-24 20:48:31 +0000672 _Py_PrintReferences(stderr);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000673 }
Guido van Rossumaae0d321996-05-22 16:35:33 +0000674#endif /* Py_TRACE_REFS */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000675
Jack Jansen66a89771995-10-27 13:22:14 +0000676#ifdef macintosh
677 PyMac_Exit(sts);
678#else
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000679 exit(sts);
Jack Jansen66a89771995-10-27 13:22:14 +0000680#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +0000681#endif /* WITH_THREAD */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000682 /*NOTREACHED*/
683}
684
Guido van Rossuma110aa61994-08-29 12:50:44 +0000685#ifdef HAVE_SIGNAL_H
686static RETSIGTYPE
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000687sighandler(sig)
688 int sig;
689{
690 signal(sig, SIG_DFL); /* Don't catch recursive signals */
691 cleanup(); /* Do essential clean-up */
Guido van Rossuma110aa61994-08-29 12:50:44 +0000692#ifdef HAVE_GETPID
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000693 kill(getpid(), sig); /* Pretend the signal killed us */
Guido van Rossuma110aa61994-08-29 12:50:44 +0000694#else
695 exit(1);
696#endif
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000697 /*NOTREACHED*/
698}
699#endif
700
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000701static void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000702initsigs()
703{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000704 RETSIGTYPE (*t)();
705#ifdef HAVE_SIGNAL_H
706#ifdef SIGPIPE
707 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000708#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +0000709#ifdef SIGHUP
710 t = signal(SIGHUP, SIG_IGN);
711 if (t == SIG_DFL)
712 signal(SIGHUP, sighandler);
713 else
714 signal(SIGHUP, t);
715#endif
716#ifdef SIGTERM
717 t = signal(SIGTERM, SIG_IGN);
718 if (t == SIG_DFL)
719 signal(SIGTERM, sighandler);
720 else
721 signal(SIGTERM, t);
722#endif
723#endif /* HAVE_SIGNAL_H */
724 initintr(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000725}
726
Guido van Rossumaae0d321996-05-22 16:35:33 +0000727#ifdef Py_TRACE_REFS
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000728/* Ask a yes/no question */
729
Guido van Rossum59bff391992-09-03 20:28:00 +0000730int
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000731askyesno(prompt)
732 char *prompt;
733{
734 char buf[256];
735
736 printf("%s [ny] ", prompt);
737 if (fgets(buf, sizeof buf, stdin) == NULL)
738 return 0;
739 return buf[0] == 'y' || buf[0] == 'Y';
740}
741#endif
742
Guido van Rossuma110aa61994-08-29 12:50:44 +0000743#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000744
745/* Check for file descriptor connected to interactive device.
746 Pretend that stdin is always interactive, other files never. */
747
748int
749isatty(fd)
750 int fd;
751{
752 return fd == fileno(stdin);
753}
754
755#endif