blob: 8219f7547add8f0e1d0199f3e22cf11b9b040cac [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 Rossuma110aa61994-08-29 12:50:44 +000050#ifdef HAVE_SIGNAL_H
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000051#include <signal.h>
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000052#endif
53
Guido van Rossum9b38a141996-09-11 23:12:24 +000054#ifdef MS_WIN32
Guido van Rossuma44823b1995-03-14 15:01:17 +000055#undef BYTE
Guido van Rossum4f1c59b1996-04-09 02:37:03 +000056#undef arglist
Guido van Rossuma44823b1995-03-14 15:01:17 +000057#include "windows.h"
58#endif
59
Guido van Rossum1984f1e1992-08-04 12:41:02 +000060extern char *getpythonpath();
61
62extern grammar gram; /* From graminit.c */
63
Guido van Rossumb73cc041993-11-01 16:28:59 +000064/* Forward */
Guido van Rossum6135a871995-01-09 17:53:26 +000065static void initmain PROTO((void));
Guido van Rossuma110aa61994-08-29 12:50:44 +000066static object *run_err_node PROTO((node *n, char *filename,
Guido van Rossumb73cc041993-11-01 16:28:59 +000067 object *globals, object *locals));
68static object *run_node PROTO((node *n, char *filename,
69 object *globals, object *locals));
Guido van Rossum262e1241995-02-07 15:30:45 +000070static object *run_pyc_file PROTO((FILE *fp, char *filename,
71 object *globals, object *locals));
Guido van Rossuma110aa61994-08-29 12:50:44 +000072static void err_input PROTO((perrdetail *));
Guido van Rossumb376a4a1993-11-23 17:53:17 +000073static void initsigs PROTO((void));
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000074
Guido van Rossum1984f1e1992-08-04 12:41:02 +000075int debugging; /* Needed by parser.c */
76int verbose; /* Needed by import.c */
Guido van Rossuma110aa61994-08-29 12:50:44 +000077int suppress_print; /* Needed by ceval.c */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000078
79/* Initialize all */
80
81void
82initall()
83{
84 static int inited;
85
86 if (inited)
87 return;
88 inited = 1;
89
90 initimport();
91
Guido van Rossuma110aa61994-08-29 12:50:44 +000092 /* Modules '__builtin__' and 'sys' are initialized here,
Guido van Rossum1984f1e1992-08-04 12:41:02 +000093 they are needed by random bits of the interpreter.
94 All other modules are optional and are initialized
95 when they are first imported. */
96
97 initbuiltin(); /* Also initializes builtin exceptions */
98 initsys();
Guido van Rossum1984f1e1992-08-04 12:41:02 +000099
100 setpythonpath(getpythonpath());
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000101
102 initsigs(); /* Signal handling stuff, including initintr() */
Guido van Rossum6135a871995-01-09 17:53:26 +0000103
104 initmain();
105}
106
107/* Create __main__ module */
108
109static void
110initmain()
111{
112 object *m, *d;
113 m = add_module("__main__");
114 if (m == NULL)
115 fatal("can't create __main__ module");
116 d = getmoduledict(m);
117 if (dictlookup(d, "__builtins__") == NULL) {
Guido van Rossum94390ec1995-01-12 11:37:57 +0000118 if (dictinsert(d, "__builtins__", getbuiltins()))
Guido van Rossum6135a871995-01-09 17:53:26 +0000119 fatal("can't add __builtins__ to __main__");
120 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000121}
122
123/* Parse input from a file and execute it */
124
125int
126run(fp, filename)
127 FILE *fp;
128 char *filename;
129{
130 if (filename == NULL)
131 filename = "???";
132 if (isatty((int)fileno(fp)))
133 return run_tty_loop(fp, filename);
134 else
135 return run_script(fp, filename);
136}
137
138int
139run_tty_loop(fp, filename)
140 FILE *fp;
141 char *filename;
142{
143 object *v;
144 int ret;
145 v = sysget("ps1");
146 if (v == NULL) {
147 sysset("ps1", v = newstringobject(">>> "));
148 XDECREF(v);
149 }
150 v = sysget("ps2");
151 if (v == NULL) {
152 sysset("ps2", v = newstringobject("... "));
153 XDECREF(v);
154 }
155 for (;;) {
156 ret = run_tty_1(fp, filename);
Guido van Rossumaae0d321996-05-22 16:35:33 +0000157#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000158 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000159#endif
160 if (ret == E_EOF)
161 return 0;
162 /*
163 if (ret == E_NOMEM)
164 return -1;
165 */
166 }
167}
168
169int
170run_tty_1(fp, filename)
171 FILE *fp;
172 char *filename;
173{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000174 object *m, *d, *v, *w;
175 node *n;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000176 perrdetail err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000177 char *ps1, *ps2;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000178 v = sysget("ps1");
179 w = sysget("ps2");
180 if (v != NULL && is_stringobject(v)) {
181 INCREF(v);
182 ps1 = getstringvalue(v);
183 }
184 else {
185 v = NULL;
186 ps1 = "";
187 }
188 if (w != NULL && is_stringobject(w)) {
189 INCREF(w);
190 ps2 = getstringvalue(w);
191 }
192 else {
193 w = NULL;
194 ps2 = "";
195 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000196 BGN_SAVE
Guido van Rossuma110aa61994-08-29 12:50:44 +0000197 n = parsefile(fp, filename, &gram, single_input, ps1, ps2, &err);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000198 END_SAVE
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000199 XDECREF(v);
200 XDECREF(w);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000201 if (n == NULL) {
202 if (err.error == E_EOF) {
203 if (err.text)
204 free(err.text);
205 return E_EOF;
206 }
207 err_input(&err);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000208 print_error();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000209 return err.error;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000210 }
211 m = add_module("__main__");
212 if (m == NULL)
213 return -1;
214 d = getmoduledict(m);
215 v = run_node(n, filename, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000216 if (v == NULL) {
217 print_error();
218 return -1;
219 }
220 DECREF(v);
Guido van Rossum6d023c91995-01-04 19:12:13 +0000221 flushline();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000222 return 0;
223}
224
225int
226run_script(fp, filename)
227 FILE *fp;
228 char *filename;
229{
230 object *m, *d, *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000231 char *ext;
232
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000233 m = add_module("__main__");
234 if (m == NULL)
235 return -1;
236 d = getmoduledict(m);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000237 ext = filename + strlen(filename) - 4;
Jack Jansenbd06e961995-02-13 11:44:56 +0000238#ifdef macintosh
239 /* On a mac, we also assume a pyc file for types 'PYC ' and 'APPL' */
240 if ( strcmp(ext, ".pyc") == 0 || getfiletype(filename) == 'PYC ' ||
241 getfiletype(filename) == 'APPL' ) {
242#else
Guido van Rossumfdef2711994-09-14 13:31:04 +0000243 if ( strcmp(ext, ".pyc") == 0 ) {
Jack Jansenbd06e961995-02-13 11:44:56 +0000244#endif /* macintosh */
Guido van Rossumfdef2711994-09-14 13:31:04 +0000245 /* Try to run a pyc file. First, re-open in binary */
Jack Jansene00637b1994-12-14 12:58:37 +0000246 /* Don't close, done in main: fclose(fp); */
Guido van Rossumfdef2711994-09-14 13:31:04 +0000247 if( (fp = fopen(filename, "rb")) == NULL ) {
248 fprintf(stderr, "python: Can't reopen .pyc file\n");
249 return -1;
250 }
251 v = run_pyc_file(fp, filename, d, d);
252 } else {
253 v = run_file(fp, filename, file_input, d, d);
254 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000255 if (v == NULL) {
256 print_error();
257 return -1;
258 }
259 DECREF(v);
Guido van Rossum6d023c91995-01-04 19:12:13 +0000260 flushline();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000261 return 0;
262}
263
264int
265run_command(command)
266 char *command;
267{
268 object *m, *d, *v;
269 m = add_module("__main__");
270 if (m == NULL)
271 return -1;
272 d = getmoduledict(m);
273 v = run_string(command, file_input, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000274 if (v == NULL) {
275 print_error();
276 return -1;
277 }
278 DECREF(v);
Guido van Rossum6d023c91995-01-04 19:12:13 +0000279 flushline();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000280 return 0;
281}
282
283void
284print_error()
285{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000286 object *exception, *v, *tb, *f;
287 err_fetch(&exception, &v, &tb);
Guido van Rossum6d023c91995-01-04 19:12:13 +0000288 flushline();
Guido van Rossum527c2641995-03-30 11:01:44 +0000289 fflush(stdout);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000290 if (exception == NULL)
291 fatal("print_error called but no exception");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000292 if (exception == SystemExit) {
293 if (v == NULL || v == None)
294 goaway(0);
295 if (is_intobject(v))
296 goaway((int)getintvalue(v));
297 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000298 /* OK to use real stderr here */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000299 printobject(v, stderr, PRINT_RAW);
300 fprintf(stderr, "\n");
301 goaway(1);
302 }
303 }
304 sysset("last_type", exception);
305 sysset("last_value", v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000306 sysset("last_traceback", tb);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000307 f = sysget("stderr");
308 if (f == NULL)
309 fprintf(stderr, "lost sys.stderr\n");
310 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000311 tb_print(tb, f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000312 if (exception == SyntaxError) {
313 object *message;
314 char *filename, *text;
315 int lineno, offset;
316 if (!getargs(v, "(O(ziiz))", &message,
317 &filename, &lineno, &offset, &text))
318 err_clear();
319 else {
320 char buf[10];
321 writestring(" File \"", f);
322 if (filename == NULL)
323 writestring("<string>", f);
324 else
325 writestring(filename, f);
326 writestring("\", line ", f);
327 sprintf(buf, "%d", lineno);
328 writestring(buf, f);
329 writestring("\n", f);
330 if (text != NULL) {
Guido van Rossum798199d1994-09-19 08:08:50 +0000331 char *nl;
332 if (offset > 0 &&
333 offset == strlen(text))
334 offset--;
335 for (;;) {
336 nl = strchr(text, '\n');
337 if (nl == NULL ||
338 nl-text >= offset)
339 break;
340 offset -= (nl+1-text);
341 text = nl+1;
342 }
Guido van Rossuma110aa61994-08-29 12:50:44 +0000343 while (*text == ' ' || *text == '\t') {
344 text++;
345 offset--;
346 }
347 writestring(" ", f);
348 writestring(text, f);
349 if (*text == '\0' ||
350 text[strlen(text)-1] != '\n')
351 writestring("\n", f);
352 writestring(" ", f);
353 offset--;
354 while (offset > 0) {
355 writestring(" ", f);
356 offset--;
357 }
358 writestring("^\n", f);
359 }
360 INCREF(message);
361 DECREF(v);
362 v = message;
363 }
364 }
Guido van Rossum262e1241995-02-07 15:30:45 +0000365 if (is_classobject(exception)) {
366 object* className = ((classobject*)exception)->cl_name;
367 if (className == NULL)
368 writestring("<unknown>", f);
369 else {
370 if (writeobject(className, f, PRINT_RAW) != 0)
371 err_clear();
372 }
373 } else {
374 if (writeobject(exception, f, PRINT_RAW) != 0)
375 err_clear();
376 }
Guido van Rossum3165fe61992-09-25 21:59:05 +0000377 if (v != NULL && v != None) {
378 writestring(": ", f);
379 if (writeobject(v, f, PRINT_RAW) != 0)
380 err_clear();
381 }
382 writestring("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000383 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000384 XDECREF(exception);
385 XDECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000386 XDECREF(tb);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000387}
388
389object *
390run_string(str, start, globals, locals)
391 char *str;
392 int start;
Guido van Rossum5b722181993-03-30 17:46:03 +0000393 object *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000394{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000395 return run_err_node(parse_string(str, start),
396 "<string>", globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000397}
398
399object *
400run_file(fp, filename, start, globals, locals)
401 FILE *fp;
402 char *filename;
403 int start;
Guido van Rossum5b722181993-03-30 17:46:03 +0000404 object *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000405{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000406 return run_err_node(parse_file(fp, filename, start),
407 filename, globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000408}
409
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000410static object *
Guido van Rossuma110aa61994-08-29 12:50:44 +0000411run_err_node(n, filename, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000412 node *n;
413 char *filename;
Guido van Rossum5b722181993-03-30 17:46:03 +0000414 object *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000415{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000416 if (n == NULL)
417 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000418 return run_node(n, filename, globals, locals);
419}
420
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000421static object *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000422run_node(n, filename, globals, locals)
423 node *n;
424 char *filename;
Guido van Rossum5b722181993-03-30 17:46:03 +0000425 object *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000426{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000427 codeobject *co;
428 object *v;
429 co = compile(n, filename);
430 freetree(n);
431 if (co == NULL)
432 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000433 v = eval_code(co, globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000434 DECREF(co);
435 return v;
436}
437
Guido van Rossum8ae87c01995-01-26 00:40:38 +0000438static object *
Guido van Rossumfdef2711994-09-14 13:31:04 +0000439run_pyc_file(fp, filename, globals, locals)
440 FILE *fp;
441 char *filename;
442 object *globals, *locals;
443{
444 codeobject *co;
445 object *v;
446 long magic;
447 long get_pyc_magic();
448
449 magic = rd_long(fp);
450 if (magic != get_pyc_magic()) {
451 err_setstr(RuntimeError,
452 "Bad magic number in .pyc file");
453 return NULL;
454 }
455 (void) rd_long(fp);
456 v = rd_object(fp);
457 fclose(fp);
458 if (v == NULL || !is_codeobject(v)) {
459 XDECREF(v);
460 err_setstr(RuntimeError,
461 "Bad code object in .pyc file");
462 return NULL;
463 }
464 co = (codeobject *)v;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000465 v = eval_code(co, globals, locals);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000466 DECREF(co);
467 return v;
468}
469
470object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000471compile_string(str, filename, start)
472 char *str;
473 char *filename;
474 int start;
475{
476 node *n;
Guido van Rossum5b722181993-03-30 17:46:03 +0000477 codeobject *co;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000478 n = parse_string(str, start);
479 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +0000480 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000481 co = compile(n, filename);
482 freetree(n);
483 return (object *)co;
484}
485
Guido van Rossuma110aa61994-08-29 12:50:44 +0000486/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000487
Guido van Rossuma110aa61994-08-29 12:50:44 +0000488node *
489parse_file(fp, filename, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000490 FILE *fp;
491 char *filename;
492 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000493{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000494 node *n;
495 perrdetail err;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000496 BGN_SAVE
Guido van Rossuma110aa61994-08-29 12:50:44 +0000497 n = parsefile(fp, filename, &gram, start,
498 (char *)0, (char *)0, &err);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000499 END_SAVE
Guido van Rossuma110aa61994-08-29 12:50:44 +0000500 if (n == NULL)
501 err_input(&err);
502 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000503}
504
Guido van Rossuma110aa61994-08-29 12:50:44 +0000505/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000506
Guido van Rossuma110aa61994-08-29 12:50:44 +0000507node *
508parse_string(str, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000509 char *str;
510 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000511{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000512 node *n;
513 perrdetail err;
514 n = parsestring(str, &gram, start, &err);
515 if (n == NULL)
516 err_input(&err);
517 return n;
518}
519
520/* Set the error appropriate to the given input error code (see errcode.h) */
521
522static void
523err_input(err)
524 perrdetail *err;
525{
526 object *v, *w;
527 char *msg = NULL;
528 v = mkvalue("(ziiz)", err->filename,
529 err->lineno, err->offset, err->text);
530 if (err->text != NULL) {
531 free(err->text);
532 err->text = NULL;
533 }
534 switch (err->error) {
535 case E_SYNTAX:
536 msg = "invalid syntax";
537 break;
538 case E_TOKEN:
539 msg = "invalid token";
540
541 break;
542 case E_INTR:
543 err_set(KeyboardInterrupt);
544 return;
545 case E_NOMEM:
546 err_nomem();
547 return;
548 case E_EOF:
549 msg = "unexpected EOF while parsing";
550 break;
551 default:
552 fprintf(stderr, "error=%d\n", err->error);
553 msg = "unknown parsing error";
554 break;
555 }
556 w = mkvalue("(sO)", msg, v);
557 XDECREF(v);
558 err_setval(SyntaxError, w);
559 XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000560}
561
562/* Print fatal error message and abort */
563
564void
565fatal(msg)
566 char *msg;
567{
Guido van Rossum83dd6c31994-09-29 09:38:33 +0000568 fprintf(stderr, "Fatal Python error: %s\n", msg);
Guido van Rossum8ae87c01995-01-26 00:40:38 +0000569#ifdef macintosh
570 for (;;);
571#endif
Guido van Rossum9b38a141996-09-11 23:12:24 +0000572#ifdef MS_WIN32
Guido van Rossuma44823b1995-03-14 15:01:17 +0000573 OutputDebugString("Fatal Python error:");
574 OutputDebugString(msg);
575 OutputDebugString("\n");
576#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000577 abort();
578}
579
580/* Clean up and exit */
581
Guido van Rossuma110aa61994-08-29 12:50:44 +0000582#ifdef WITH_THREAD
583#include "thread.h"
584int threads_started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +0000585#endif
586
Guido van Rossum1662dd51994-09-07 14:38:28 +0000587#define NEXITFUNCS 32
588static void (*exitfuncs[NEXITFUNCS])();
589static int nexitfuncs = 0;
590
591int Py_AtExit(func)
592 void (*func) PROTO((void));
593{
594 if (nexitfuncs >= NEXITFUNCS)
595 return -1;
596 exitfuncs[nexitfuncs++] = func;
597 return 0;
598}
599
Guido van Rossuma110aa61994-08-29 12:50:44 +0000600void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000601cleanup()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000602{
Guido van Rossum59bff391992-09-03 20:28:00 +0000603 object *exitfunc = sysget("exitfunc");
604
605 if (exitfunc) {
Guido van Rossum59bff391992-09-03 20:28:00 +0000606 object *res;
Guido van Rossum1c45ca31995-10-07 19:14:01 +0000607 INCREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +0000608 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 }
Guido van Rossum1c45ca31995-10-07 19:14:01 +0000614 DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +0000615 }
616
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000617 flushline();
Guido van Rossum1662dd51994-09-07 14:38:28 +0000618
619 while (nexitfuncs > 0)
620 (*exitfuncs[--nexitfuncs])();
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000621}
622
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000623#ifdef COUNT_ALLOCS
624extern void dump_counts PROTO((void));
625#endif
626
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000627void
628goaway(sts)
629 int sts;
630{
631 cleanup();
Guido van Rossumff4949e1992-08-05 19:58:53 +0000632
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000633#ifdef COUNT_ALLOCS
634 dump_counts();
635#endif
636
Guido van Rossuma110aa61994-08-29 12:50:44 +0000637#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000638
639 /* Other threads may still be active, so skip most of the
640 cleanup actions usually done (these are mostly for
641 debugging anyway). */
642
Guido van Rossumdf72a651992-08-12 15:27:32 +0000643 (void) save_thread();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000644#ifndef NO_EXIT_PROG
Guido van Rossumf9f2e821992-08-17 08:59:08 +0000645 if (threads_started)
646 _exit_prog(sts);
647 else
648 exit_prog(sts);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000649#else /* !NO_EXIT_PROG */
650 if (threads_started)
651 _exit(sts);
652 else
653 exit(sts);
654#endif /* !NO_EXIT_PROG */
Guido van Rossumff4949e1992-08-05 19:58:53 +0000655
Guido van Rossuma110aa61994-08-29 12:50:44 +0000656#else /* WITH_THREAD */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000657
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000658 doneimport();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000659
660 err_clear();
661
Guido van Rossumaae0d321996-05-22 16:35:33 +0000662#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000663 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000664#endif
665
Guido van Rossumaae0d321996-05-22 16:35:33 +0000666#ifdef Py_TRACE_REFS
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000667 if (askyesno("Print left references?")) {
Guido van Rossumded690f1996-05-24 20:48:31 +0000668 _Py_PrintReferences(stderr);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000669 }
Guido van Rossumaae0d321996-05-22 16:35:33 +0000670#endif /* Py_TRACE_REFS */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000671
Jack Jansen66a89771995-10-27 13:22:14 +0000672#ifdef macintosh
673 PyMac_Exit(sts);
674#else
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000675 exit(sts);
Jack Jansen66a89771995-10-27 13:22:14 +0000676#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +0000677#endif /* WITH_THREAD */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000678 /*NOTREACHED*/
679}
680
Guido van Rossuma110aa61994-08-29 12:50:44 +0000681#ifdef HAVE_SIGNAL_H
682static RETSIGTYPE
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000683sighandler(sig)
684 int sig;
685{
686 signal(sig, SIG_DFL); /* Don't catch recursive signals */
687 cleanup(); /* Do essential clean-up */
Guido van Rossuma110aa61994-08-29 12:50:44 +0000688#ifdef HAVE_GETPID
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000689 kill(getpid(), sig); /* Pretend the signal killed us */
Guido van Rossuma110aa61994-08-29 12:50:44 +0000690#else
691 exit(1);
692#endif
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000693 /*NOTREACHED*/
694}
695#endif
696
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000697static void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000698initsigs()
699{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000700 RETSIGTYPE (*t)();
701#ifdef HAVE_SIGNAL_H
702#ifdef SIGPIPE
703 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000704#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +0000705#ifdef SIGHUP
706 t = signal(SIGHUP, SIG_IGN);
707 if (t == SIG_DFL)
708 signal(SIGHUP, sighandler);
709 else
710 signal(SIGHUP, t);
711#endif
712#ifdef SIGTERM
713 t = signal(SIGTERM, SIG_IGN);
714 if (t == SIG_DFL)
715 signal(SIGTERM, sighandler);
716 else
717 signal(SIGTERM, t);
718#endif
719#endif /* HAVE_SIGNAL_H */
720 initintr(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000721}
722
Guido van Rossumaae0d321996-05-22 16:35:33 +0000723#ifdef Py_TRACE_REFS
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000724/* Ask a yes/no question */
725
Guido van Rossum59bff391992-09-03 20:28:00 +0000726int
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000727askyesno(prompt)
728 char *prompt;
729{
730 char buf[256];
731
732 printf("%s [ny] ", prompt);
733 if (fgets(buf, sizeof buf, stdin) == NULL)
734 return 0;
735 return buf[0] == 'y' || buf[0] == 'Y';
736}
737#endif
738
Guido van Rossuma110aa61994-08-29 12:50:44 +0000739#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000740
741/* Check for file descriptor connected to interactive device.
742 Pretend that stdin is always interactive, other files never. */
743
744int
745isatty(fd)
746 int fd;
747{
748 return fd == fileno(stdin);
749}
750
751#endif