blob: 6fbe4eca4a91d2bf6d1b3b6f11ed343d43f5858d [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 Rossum7433b121997-02-14 19:45:36 +000082int Py_InteractiveFlag; /* Needed by Py_FdIsInteractive() below */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000083
84/* Initialize all */
85
86void
87initall()
88{
89 static int inited;
90
91 if (inited)
92 return;
93 inited = 1;
94
95 initimport();
96
Guido van Rossuma110aa61994-08-29 12:50:44 +000097 /* Modules '__builtin__' and 'sys' are initialized here,
Guido van Rossum1984f1e1992-08-04 12:41:02 +000098 they are needed by random bits of the interpreter.
99 All other modules are optional and are initialized
100 when they are first imported. */
101
102 initbuiltin(); /* Also initializes builtin exceptions */
103 initsys();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000104
105 setpythonpath(getpythonpath());
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000106
107 initsigs(); /* Signal handling stuff, including initintr() */
Guido van Rossum6135a871995-01-09 17:53:26 +0000108
109 initmain();
110}
111
112/* Create __main__ module */
113
114static void
115initmain()
116{
117 object *m, *d;
118 m = add_module("__main__");
119 if (m == NULL)
120 fatal("can't create __main__ module");
121 d = getmoduledict(m);
122 if (dictlookup(d, "__builtins__") == NULL) {
Guido van Rossum94390ec1995-01-12 11:37:57 +0000123 if (dictinsert(d, "__builtins__", getbuiltins()))
Guido van Rossum6135a871995-01-09 17:53:26 +0000124 fatal("can't add __builtins__ to __main__");
125 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000126}
127
128/* Parse input from a file and execute it */
129
130int
131run(fp, filename)
132 FILE *fp;
133 char *filename;
134{
135 if (filename == NULL)
136 filename = "???";
Guido van Rossum7433b121997-02-14 19:45:36 +0000137 if (Py_FdIsInteractive(fp, filename))
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000138 return run_tty_loop(fp, filename);
139 else
140 return run_script(fp, filename);
141}
142
143int
144run_tty_loop(fp, filename)
145 FILE *fp;
146 char *filename;
147{
148 object *v;
149 int ret;
150 v = sysget("ps1");
151 if (v == NULL) {
152 sysset("ps1", v = newstringobject(">>> "));
153 XDECREF(v);
154 }
155 v = sysget("ps2");
156 if (v == NULL) {
157 sysset("ps2", v = newstringobject("... "));
158 XDECREF(v);
159 }
160 for (;;) {
161 ret = run_tty_1(fp, filename);
Guido van Rossumaae0d321996-05-22 16:35:33 +0000162#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000163 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000164#endif
165 if (ret == E_EOF)
166 return 0;
167 /*
168 if (ret == E_NOMEM)
169 return -1;
170 */
171 }
172}
173
174int
175run_tty_1(fp, filename)
176 FILE *fp;
177 char *filename;
178{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000179 object *m, *d, *v, *w;
180 node *n;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000181 perrdetail err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000182 char *ps1, *ps2;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000183 v = sysget("ps1");
184 w = sysget("ps2");
185 if (v != NULL && is_stringobject(v)) {
186 INCREF(v);
187 ps1 = getstringvalue(v);
188 }
189 else {
190 v = NULL;
191 ps1 = "";
192 }
193 if (w != NULL && is_stringobject(w)) {
194 INCREF(w);
195 ps2 = getstringvalue(w);
196 }
197 else {
198 w = NULL;
199 ps2 = "";
200 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000201 BGN_SAVE
Guido van Rossuma110aa61994-08-29 12:50:44 +0000202 n = parsefile(fp, filename, &gram, single_input, ps1, ps2, &err);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000203 END_SAVE
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000204 XDECREF(v);
205 XDECREF(w);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000206 if (n == NULL) {
207 if (err.error == E_EOF) {
208 if (err.text)
209 free(err.text);
210 return E_EOF;
211 }
212 err_input(&err);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000213 print_error();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000214 return err.error;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000215 }
216 m = add_module("__main__");
217 if (m == NULL)
218 return -1;
219 d = getmoduledict(m);
220 v = run_node(n, filename, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000221 if (v == NULL) {
222 print_error();
223 return -1;
224 }
225 DECREF(v);
Guido van Rossum6d023c91995-01-04 19:12:13 +0000226 flushline();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000227 return 0;
228}
229
230int
231run_script(fp, filename)
232 FILE *fp;
233 char *filename;
234{
235 object *m, *d, *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000236 char *ext;
237
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000238 m = add_module("__main__");
239 if (m == NULL)
240 return -1;
241 d = getmoduledict(m);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000242 ext = filename + strlen(filename) - 4;
Jack Jansenbd06e961995-02-13 11:44:56 +0000243#ifdef macintosh
244 /* On a mac, we also assume a pyc file for types 'PYC ' and 'APPL' */
245 if ( strcmp(ext, ".pyc") == 0 || getfiletype(filename) == 'PYC ' ||
246 getfiletype(filename) == 'APPL' ) {
247#else
Guido van Rossumfdef2711994-09-14 13:31:04 +0000248 if ( strcmp(ext, ".pyc") == 0 ) {
Jack Jansenbd06e961995-02-13 11:44:56 +0000249#endif /* macintosh */
Guido van Rossumfdef2711994-09-14 13:31:04 +0000250 /* Try to run a pyc file. First, re-open in binary */
Jack Jansene00637b1994-12-14 12:58:37 +0000251 /* Don't close, done in main: fclose(fp); */
Guido van Rossumfdef2711994-09-14 13:31:04 +0000252 if( (fp = fopen(filename, "rb")) == NULL ) {
253 fprintf(stderr, "python: Can't reopen .pyc file\n");
254 return -1;
255 }
256 v = run_pyc_file(fp, filename, d, d);
257 } else {
258 v = run_file(fp, filename, file_input, d, d);
259 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000260 if (v == NULL) {
261 print_error();
262 return -1;
263 }
264 DECREF(v);
Guido van Rossum6d023c91995-01-04 19:12:13 +0000265 flushline();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000266 return 0;
267}
268
269int
270run_command(command)
271 char *command;
272{
273 object *m, *d, *v;
274 m = add_module("__main__");
275 if (m == NULL)
276 return -1;
277 d = getmoduledict(m);
278 v = run_string(command, file_input, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000279 if (v == NULL) {
280 print_error();
281 return -1;
282 }
283 DECREF(v);
Guido van Rossum6d023c91995-01-04 19:12:13 +0000284 flushline();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000285 return 0;
286}
287
288void
289print_error()
290{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000291 object *exception, *v, *tb, *f;
292 err_fetch(&exception, &v, &tb);
Guido van Rossum6d023c91995-01-04 19:12:13 +0000293 flushline();
Guido van Rossum527c2641995-03-30 11:01:44 +0000294 fflush(stdout);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000295 if (exception == NULL)
296 fatal("print_error called but no exception");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000297 if (exception == SystemExit) {
298 if (v == NULL || v == None)
299 goaway(0);
300 if (is_intobject(v))
301 goaway((int)getintvalue(v));
302 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000303 /* OK to use real stderr here */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000304 printobject(v, stderr, PRINT_RAW);
305 fprintf(stderr, "\n");
306 goaway(1);
307 }
308 }
309 sysset("last_type", exception);
310 sysset("last_value", v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000311 sysset("last_traceback", tb);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000312 f = sysget("stderr");
313 if (f == NULL)
314 fprintf(stderr, "lost sys.stderr\n");
315 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000316 tb_print(tb, f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000317 if (exception == SyntaxError) {
318 object *message;
319 char *filename, *text;
320 int lineno, offset;
321 if (!getargs(v, "(O(ziiz))", &message,
322 &filename, &lineno, &offset, &text))
323 err_clear();
324 else {
325 char buf[10];
326 writestring(" File \"", f);
327 if (filename == NULL)
328 writestring("<string>", f);
329 else
330 writestring(filename, f);
331 writestring("\", line ", f);
332 sprintf(buf, "%d", lineno);
333 writestring(buf, f);
334 writestring("\n", f);
335 if (text != NULL) {
Guido van Rossum798199d1994-09-19 08:08:50 +0000336 char *nl;
337 if (offset > 0 &&
338 offset == strlen(text))
339 offset--;
340 for (;;) {
341 nl = strchr(text, '\n');
342 if (nl == NULL ||
343 nl-text >= offset)
344 break;
345 offset -= (nl+1-text);
346 text = nl+1;
347 }
Guido van Rossuma110aa61994-08-29 12:50:44 +0000348 while (*text == ' ' || *text == '\t') {
349 text++;
350 offset--;
351 }
352 writestring(" ", f);
353 writestring(text, f);
354 if (*text == '\0' ||
355 text[strlen(text)-1] != '\n')
356 writestring("\n", f);
357 writestring(" ", f);
358 offset--;
359 while (offset > 0) {
360 writestring(" ", f);
361 offset--;
362 }
363 writestring("^\n", f);
364 }
365 INCREF(message);
366 DECREF(v);
367 v = message;
368 }
369 }
Guido van Rossum262e1241995-02-07 15:30:45 +0000370 if (is_classobject(exception)) {
371 object* className = ((classobject*)exception)->cl_name;
372 if (className == NULL)
373 writestring("<unknown>", f);
374 else {
375 if (writeobject(className, f, PRINT_RAW) != 0)
376 err_clear();
377 }
378 } else {
379 if (writeobject(exception, f, PRINT_RAW) != 0)
380 err_clear();
381 }
Guido van Rossum3165fe61992-09-25 21:59:05 +0000382 if (v != NULL && v != None) {
383 writestring(": ", f);
384 if (writeobject(v, f, PRINT_RAW) != 0)
385 err_clear();
386 }
387 writestring("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000388 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000389 XDECREF(exception);
390 XDECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000391 XDECREF(tb);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000392}
393
394object *
395run_string(str, start, globals, locals)
396 char *str;
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_string(str, start),
401 "<string>", globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000402}
403
404object *
405run_file(fp, filename, start, globals, locals)
406 FILE *fp;
407 char *filename;
408 int start;
Guido van Rossum5b722181993-03-30 17:46:03 +0000409 object *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000410{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000411 return run_err_node(parse_file(fp, filename, start),
412 filename, globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000413}
414
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000415static object *
Guido van Rossuma110aa61994-08-29 12:50:44 +0000416run_err_node(n, filename, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000417 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 Rossuma110aa61994-08-29 12:50:44 +0000421 if (n == NULL)
422 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000423 return run_node(n, filename, globals, locals);
424}
425
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000426static object *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000427run_node(n, filename, globals, locals)
428 node *n;
429 char *filename;
Guido van Rossum5b722181993-03-30 17:46:03 +0000430 object *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000431{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000432 codeobject *co;
433 object *v;
434 co = compile(n, filename);
435 freetree(n);
436 if (co == NULL)
437 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000438 v = eval_code(co, globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000439 DECREF(co);
440 return v;
441}
442
Guido van Rossum8ae87c01995-01-26 00:40:38 +0000443static object *
Guido van Rossumfdef2711994-09-14 13:31:04 +0000444run_pyc_file(fp, filename, globals, locals)
445 FILE *fp;
446 char *filename;
447 object *globals, *locals;
448{
449 codeobject *co;
450 object *v;
451 long magic;
452 long get_pyc_magic();
453
454 magic = rd_long(fp);
455 if (magic != get_pyc_magic()) {
456 err_setstr(RuntimeError,
457 "Bad magic number in .pyc file");
458 return NULL;
459 }
460 (void) rd_long(fp);
461 v = rd_object(fp);
462 fclose(fp);
463 if (v == NULL || !is_codeobject(v)) {
464 XDECREF(v);
465 err_setstr(RuntimeError,
466 "Bad code object in .pyc file");
467 return NULL;
468 }
469 co = (codeobject *)v;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000470 v = eval_code(co, globals, locals);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000471 DECREF(co);
472 return v;
473}
474
475object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000476compile_string(str, filename, start)
477 char *str;
478 char *filename;
479 int start;
480{
481 node *n;
Guido van Rossum5b722181993-03-30 17:46:03 +0000482 codeobject *co;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000483 n = parse_string(str, start);
484 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +0000485 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000486 co = compile(n, filename);
487 freetree(n);
488 return (object *)co;
489}
490
Guido van Rossuma110aa61994-08-29 12:50:44 +0000491/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000492
Guido van Rossuma110aa61994-08-29 12:50:44 +0000493node *
494parse_file(fp, filename, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000495 FILE *fp;
496 char *filename;
497 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000498{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000499 node *n;
500 perrdetail err;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000501 BGN_SAVE
Guido van Rossuma110aa61994-08-29 12:50:44 +0000502 n = parsefile(fp, filename, &gram, start,
503 (char *)0, (char *)0, &err);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000504 END_SAVE
Guido van Rossuma110aa61994-08-29 12:50:44 +0000505 if (n == NULL)
506 err_input(&err);
507 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000508}
509
Guido van Rossuma110aa61994-08-29 12:50:44 +0000510/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000511
Guido van Rossuma110aa61994-08-29 12:50:44 +0000512node *
513parse_string(str, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000514 char *str;
515 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000516{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000517 node *n;
518 perrdetail err;
519 n = parsestring(str, &gram, start, &err);
520 if (n == NULL)
521 err_input(&err);
522 return n;
523}
524
525/* Set the error appropriate to the given input error code (see errcode.h) */
526
527static void
528err_input(err)
529 perrdetail *err;
530{
531 object *v, *w;
532 char *msg = NULL;
533 v = mkvalue("(ziiz)", err->filename,
534 err->lineno, err->offset, err->text);
535 if (err->text != NULL) {
536 free(err->text);
537 err->text = NULL;
538 }
539 switch (err->error) {
540 case E_SYNTAX:
541 msg = "invalid syntax";
542 break;
543 case E_TOKEN:
544 msg = "invalid token";
545
546 break;
547 case E_INTR:
548 err_set(KeyboardInterrupt);
549 return;
550 case E_NOMEM:
551 err_nomem();
552 return;
553 case E_EOF:
554 msg = "unexpected EOF while parsing";
555 break;
556 default:
557 fprintf(stderr, "error=%d\n", err->error);
558 msg = "unknown parsing error";
559 break;
560 }
561 w = mkvalue("(sO)", msg, v);
562 XDECREF(v);
563 err_setval(SyntaxError, w);
564 XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000565}
566
567/* Print fatal error message and abort */
568
569void
570fatal(msg)
571 char *msg;
572{
Guido van Rossum83dd6c31994-09-29 09:38:33 +0000573 fprintf(stderr, "Fatal Python error: %s\n", msg);
Guido van Rossum8ae87c01995-01-26 00:40:38 +0000574#ifdef macintosh
575 for (;;);
576#endif
Guido van Rossum9b38a141996-09-11 23:12:24 +0000577#ifdef MS_WIN32
Guido van Rossuma44823b1995-03-14 15:01:17 +0000578 OutputDebugString("Fatal Python error:");
579 OutputDebugString(msg);
580 OutputDebugString("\n");
581#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000582 abort();
583}
584
585/* Clean up and exit */
586
Guido van Rossuma110aa61994-08-29 12:50:44 +0000587#ifdef WITH_THREAD
588#include "thread.h"
589int threads_started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +0000590#endif
591
Guido van Rossum1662dd51994-09-07 14:38:28 +0000592#define NEXITFUNCS 32
593static void (*exitfuncs[NEXITFUNCS])();
594static int nexitfuncs = 0;
595
596int Py_AtExit(func)
597 void (*func) PROTO((void));
598{
599 if (nexitfuncs >= NEXITFUNCS)
600 return -1;
601 exitfuncs[nexitfuncs++] = func;
602 return 0;
603}
604
Guido van Rossuma110aa61994-08-29 12:50:44 +0000605void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000606cleanup()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000607{
Guido van Rossum59bff391992-09-03 20:28:00 +0000608 object *exitfunc = sysget("exitfunc");
609
610 if (exitfunc) {
Guido van Rossum59bff391992-09-03 20:28:00 +0000611 object *res;
Guido van Rossum1c45ca31995-10-07 19:14:01 +0000612 INCREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +0000613 sysset("exitfunc", (object *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000614 res = call_object(exitfunc, (object *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +0000615 if (res == NULL) {
616 fprintf(stderr, "Error in sys.exitfunc:\n");
617 print_error();
618 }
Guido van Rossum1c45ca31995-10-07 19:14:01 +0000619 DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +0000620 }
621
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000622 flushline();
Guido van Rossum1662dd51994-09-07 14:38:28 +0000623
624 while (nexitfuncs > 0)
625 (*exitfuncs[--nexitfuncs])();
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000626}
627
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000628#ifdef COUNT_ALLOCS
629extern void dump_counts PROTO((void));
630#endif
631
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000632void
633goaway(sts)
634 int sts;
635{
636 cleanup();
Guido van Rossumff4949e1992-08-05 19:58:53 +0000637
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000638#ifdef COUNT_ALLOCS
639 dump_counts();
640#endif
641
Guido van Rossuma110aa61994-08-29 12:50:44 +0000642#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000643
644 /* Other threads may still be active, so skip most of the
645 cleanup actions usually done (these are mostly for
646 debugging anyway). */
647
Guido van Rossumdf72a651992-08-12 15:27:32 +0000648 (void) save_thread();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000649#ifndef NO_EXIT_PROG
Guido van Rossumf9f2e821992-08-17 08:59:08 +0000650 if (threads_started)
651 _exit_prog(sts);
652 else
653 exit_prog(sts);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000654#else /* !NO_EXIT_PROG */
655 if (threads_started)
656 _exit(sts);
657 else
658 exit(sts);
659#endif /* !NO_EXIT_PROG */
Guido van Rossumff4949e1992-08-05 19:58:53 +0000660
Guido van Rossuma110aa61994-08-29 12:50:44 +0000661#else /* WITH_THREAD */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000662
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000663 doneimport();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000664
665 err_clear();
666
Guido van Rossumaae0d321996-05-22 16:35:33 +0000667#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000668 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000669#endif
670
Guido van Rossumaae0d321996-05-22 16:35:33 +0000671#ifdef Py_TRACE_REFS
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000672 if (askyesno("Print left references?")) {
Guido van Rossumded690f1996-05-24 20:48:31 +0000673 _Py_PrintReferences(stderr);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000674 }
Guido van Rossumaae0d321996-05-22 16:35:33 +0000675#endif /* Py_TRACE_REFS */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000676
Jack Jansen66a89771995-10-27 13:22:14 +0000677#ifdef macintosh
678 PyMac_Exit(sts);
679#else
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000680 exit(sts);
Jack Jansen66a89771995-10-27 13:22:14 +0000681#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +0000682#endif /* WITH_THREAD */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000683 /*NOTREACHED*/
684}
685
Guido van Rossuma110aa61994-08-29 12:50:44 +0000686#ifdef HAVE_SIGNAL_H
687static RETSIGTYPE
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000688sighandler(sig)
689 int sig;
690{
691 signal(sig, SIG_DFL); /* Don't catch recursive signals */
692 cleanup(); /* Do essential clean-up */
Guido van Rossuma110aa61994-08-29 12:50:44 +0000693#ifdef HAVE_GETPID
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000694 kill(getpid(), sig); /* Pretend the signal killed us */
Guido van Rossuma110aa61994-08-29 12:50:44 +0000695#else
696 exit(1);
697#endif
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000698 /*NOTREACHED*/
699}
700#endif
701
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000702static void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000703initsigs()
704{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000705 RETSIGTYPE (*t)();
706#ifdef HAVE_SIGNAL_H
707#ifdef SIGPIPE
708 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000709#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +0000710#ifdef SIGHUP
711 t = signal(SIGHUP, SIG_IGN);
712 if (t == SIG_DFL)
713 signal(SIGHUP, sighandler);
714 else
715 signal(SIGHUP, t);
716#endif
717#ifdef SIGTERM
718 t = signal(SIGTERM, SIG_IGN);
719 if (t == SIG_DFL)
720 signal(SIGTERM, sighandler);
721 else
722 signal(SIGTERM, t);
723#endif
724#endif /* HAVE_SIGNAL_H */
725 initintr(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000726}
727
Guido van Rossumaae0d321996-05-22 16:35:33 +0000728#ifdef Py_TRACE_REFS
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000729/* Ask a yes/no question */
730
Guido van Rossum59bff391992-09-03 20:28:00 +0000731int
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000732askyesno(prompt)
733 char *prompt;
734{
735 char buf[256];
736
737 printf("%s [ny] ", prompt);
738 if (fgets(buf, sizeof buf, stdin) == NULL)
739 return 0;
740 return buf[0] == 'y' || buf[0] == 'Y';
741}
742#endif
743
Guido van Rossuma110aa61994-08-29 12:50:44 +0000744#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000745
746/* Check for file descriptor connected to interactive device.
747 Pretend that stdin is always interactive, other files never. */
748
749int
750isatty(fd)
751 int fd;
752{
753 return fd == fileno(stdin);
754}
755
756#endif
Guido van Rossum7433b121997-02-14 19:45:36 +0000757
758/*
759 * The file descriptor fd is considered ``interactive'' if either
760 * a) isatty(fd) is TRUE, or
761 * b) the -i flag was given, and the filename associated with
762 * the descriptor is NULL or "<stdin>" or "???".
763 */
764int
765Py_FdIsInteractive(fp, filename)
766 FILE *fp;
767 char *filename;
768{
769 if (isatty((int)fileno(fp)))
770 return 1;
771 if (!Py_InteractiveFlag)
772 return 0;
773 return (filename == NULL) ||
774 (strcmp(filename, "<stdin>") == 0) ||
775 (strcmp(filename, "???") == 0);
776}