blob: 85cb65048df7b623f1b23d9bf36809a2a3c4567b [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
2Copyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The
3Netherlands.
4
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
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000025/* Python interpreter main program */
26
Guido van Rossum3f5da241990-12-20 15:06:42 +000027#include "allobjects.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000028
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000029#include "grammar.h"
30#include "node.h"
31#include "parsetok.h"
32#include "graminit.h"
33#include "errcode.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000034#include "sysmodule.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000035#include "compile.h"
36#include "ceval.h"
37#include "pythonrun.h"
38#include "import.h"
39
40extern char *getpythonpath();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000041
42extern grammar gram; /* From graminit.c */
43
Guido van Rossum3f5da241990-12-20 15:06:42 +000044#ifdef DEBUG
45int debugging; /* Needed by parser.c */
46#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000047
48main(argc, argv)
49 int argc;
50 char **argv;
51{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000052 char *filename = NULL;
53 FILE *fp = stdin;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000054
Guido van Rossum3f5da241990-12-20 15:06:42 +000055 initargs(&argc, &argv);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000056
57 if (argc > 1 && strcmp(argv[1], "-") != 0)
58 filename = argv[1];
Guido van Rossum3f5da241990-12-20 15:06:42 +000059
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000060 if (filename != NULL) {
61 if ((fp = fopen(filename, "r")) == NULL) {
62 fprintf(stderr, "python: can't open file '%s'\n",
63 filename);
64 exit(2);
65 }
66 }
67
Guido van Rossum3f5da241990-12-20 15:06:42 +000068 initall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000069
Guido van Rossumda0c6bd1990-11-18 17:28:24 +000070 setpythonpath(getpythonpath());
Guido van Rossum3f5da241990-12-20 15:06:42 +000071 setpythonargv(argc-1, argv+1);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000072
Guido van Rossum3f5da241990-12-20 15:06:42 +000073 goaway(run(fp, filename == NULL ? "<stdin>" : filename));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000074 /*NOTREACHED*/
75}
76
Guido van Rossum3f5da241990-12-20 15:06:42 +000077/* Initialize all */
78
79void
80initall()
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000081{
Guido van Rossum3f5da241990-12-20 15:06:42 +000082 static int inited;
83
84 if (inited)
85 return;
Guido van Rossum6c4f4a91990-12-20 23:11:33 +000086 inited = 1;
Guido van Rossum3f5da241990-12-20 15:06:42 +000087
88 initimport();
89
Guido van Rossum6c4f4a91990-12-20 23:11:33 +000090 /* Modules 'builtin' and 'sys' are initialized here,
91 they are needed by random bits of the interpreter.
92 All other modules are optional and should be initialized
93 by the initcalls() of a specific configuration. */
94
Guido van Rossum3f5da241990-12-20 15:06:42 +000095 initbuiltin(); /* Also initializes builtin exceptions */
96 initsys();
Guido van Rossum3f5da241990-12-20 15:06:42 +000097
98 initcalls(); /* Configuration-dependent initializations */
99
100 initintr(); /* For intrcheck() */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000101}
102
103/* Parse input from a file and execute it */
104
Guido van Rossum3f5da241990-12-20 15:06:42 +0000105int
106run(fp, filename)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000107 FILE *fp;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000108 char *filename;
109{
110 if (filename == NULL)
111 filename = "???";
112 if (isatty(fileno(fp)))
113 return run_tty_loop(fp, filename);
114 else
115 return run_script(fp, filename);
116}
117
118int
119run_tty_loop(fp, filename)
120 FILE *fp;
121 char *filename;
122{
123 object *v;
124 int ret;
125 v = sysget("ps1");
126 if (v == NULL) {
127 sysset("ps1", v = newstringobject(">>> "));
128 XDECREF(v);
129 }
130 v = sysget("ps2");
131 if (v == NULL) {
132 sysset("ps2", v = newstringobject("... "));
133 XDECREF(v);
134 }
135 for (;;) {
136 ret = run_tty_1(fp, filename);
137#ifdef REF_DEBUG
138 fprintf(stderr, "[%ld refs]\n", ref_total);
139#endif
140 if (ret == E_EOF)
141 return 0;
142 /*
143 if (ret == E_NOMEM)
144 return -1;
145 */
146 }
147}
148
149int
150run_tty_1(fp, filename)
151 FILE *fp;
152 char *filename;
153{
154 object *m, *d, *v, *w;
155 node *n;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000156 char *ps1, *ps2;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000157 int err;
158 v = sysget("ps1");
159 w = sysget("ps2");
160 if (v != NULL && is_stringobject(v)) {
161 INCREF(v);
162 ps1 = getstringvalue(v);
163 }
164 else {
165 v = NULL;
166 ps1 = "";
167 }
168 if (w != NULL && is_stringobject(w)) {
169 INCREF(w);
170 ps2 = getstringvalue(w);
171 }
172 else {
173 w = NULL;
174 ps2 = "";
175 }
176 err = parsefile(fp, filename, &gram, single_input, ps1, ps2, &n);
177 XDECREF(v);
178 XDECREF(w);
179 if (err == E_EOF)
180 return E_EOF;
181 if (err != E_DONE) {
182 err_input(err);
183 print_error();
184 return err;
185 }
186 m = add_module("__main__");
187 if (m == NULL)
188 return -1;
189 d = getmoduledict(m);
190 v = run_node(n, filename, d, d);
191 flushline();
192 if (v == NULL) {
193 print_error();
194 return -1;
195 }
196 DECREF(v);
197 return 0;
198}
199
200int
201run_script(fp, filename)
202 FILE *fp;
203 char *filename;
204{
205 object *m, *d, *v;
206 m = add_module("__main__");
207 if (m == NULL)
208 return -1;
209 d = getmoduledict(m);
210 v = run_file(fp, filename, file_input, d, d);
211 flushline();
212 if (v == NULL) {
213 print_error();
214 return -1;
215 }
216 DECREF(v);
217 return 0;
218}
219
220void
221print_error()
222{
223 object *exception, *v;
224 err_get(&exception, &v);
225 fprintf(stderr, "Unhandled exception: ");
226 printobject(exception, stderr, PRINT_RAW);
227 if (v != NULL && v != None) {
228 fprintf(stderr, ": ");
229 printobject(v, stderr, PRINT_RAW);
230 }
231 fprintf(stderr, "\n");
232 XDECREF(exception);
233 XDECREF(v);
234 printtraceback(stderr);
235}
236
237object *
238run_string(str, start, globals, locals)
239 char *str;
240 int start;
241 /*dict*/object *globals, *locals;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000242{
243 node *n;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000244 int err;
245 err = parse_string(str, start, &n);
246 return run_err_node(err, n, "<string>", globals, locals);
247}
248
249object *
250run_file(fp, filename, start, globals, locals)
251 FILE *fp;
252 char *filename;
253 int start;
254 /*dict*/object *globals, *locals;
255{
256 node *n;
257 int err;
258 err = parse_file(fp, filename, start, &n);
259 return run_err_node(err, n, filename, globals, locals);
260}
261
262object *
263run_err_node(err, n, filename, globals, locals)
264 int err;
265 node *n;
266 char *filename;
267 /*dict*/object *globals, *locals;
268{
269 if (err != E_DONE) {
270 err_input(err);
271 return NULL;
272 }
273 return run_node(n, filename, globals, locals);
274}
275
276object *
277run_node(n, filename, globals, locals)
278 node *n;
279 char *filename;
280 /*dict*/object *globals, *locals;
281{
282 if (globals == NULL) {
283 globals = getglobals();
284 if (locals == NULL)
285 locals = getlocals();
286 }
287 else {
288 if (locals == NULL)
289 locals = globals;
290 }
291 return eval_node(n, filename, globals, locals);
292}
293
294object *
295eval_node(n, filename, globals, locals)
296 node *n;
297 char *filename;
298 object *globals;
299 object *locals;
300{
301 codeobject *co;
302 object *v;
303 co = compile(n, filename);
304 freetree(n);
305 if (co == NULL)
306 return NULL;
307 v = eval_code(co, globals, locals, (object *)NULL);
308 DECREF(co);
309 return v;
310}
311
312/* Simplified interface to parsefile */
313
314int
315parse_file(fp, filename, start, n_ret)
316 FILE *fp;
317 char *filename;
318 int start;
319 node **n_ret;
320{
321 return parsefile(fp, filename, &gram, start,
322 (char *)0, (char *)0, n_ret);
323}
324
325/* Simplified interface to parsestring */
326
327int
328parse_string(str, start, n_ret)
329 char *str;
330 int start;
331 node **n_ret;
332{
333 int err = parsestring(str, &gram, start, n_ret);
334 /* Don't confuse early end of string with early end of input */
335 if (err == E_EOF)
336 err = E_SYNTAX;
337 return err;
338}
339
340/* Print fatal error message and abort */
341
342void
343fatal(msg)
344 char *msg;
345{
346 fprintf(stderr, "Fatal error: %s\n", msg);
347 abort();
348}
349
350/* Clean up and exit */
351
352void
353goaway(sts)
354 int sts;
355{
356 flushline();
357
358 /* XXX Call doneimport() before donecalls(), since donecalls()
359 calls wdone(), and doneimport() may close windows */
360 doneimport();
361 donecalls();
362
363 err_clear();
364
365#ifdef REF_DEBUG
366 fprintf(stderr, "[%ld refs]\n", ref_total);
367#endif
368
Guido van Rossum6c4f4a91990-12-20 23:11:33 +0000369#ifdef THINK_C_3_0
Guido van Rossum3f5da241990-12-20 15:06:42 +0000370 if (sts == 0)
371 Click_On(0);
372#endif
373
374#ifdef TRACE_REFS
375 if (askyesno("Print left references?")) {
Guido van Rossum6c4f4a91990-12-20 23:11:33 +0000376#ifdef THINK_C_3_0
Guido van Rossum3f5da241990-12-20 15:06:42 +0000377 Click_On(1);
378#endif
379 printrefs(stderr);
380 }
381#endif /* TRACE_REFS */
382
383 exit(sts);
384 /*NOTREACHED*/
385}
386
387static
388finaloutput()
389{
390#ifdef TRACE_REFS
391 if (!askyesno("Print left references?"))
392 return;
Guido van Rossum6c4f4a91990-12-20 23:11:33 +0000393#ifdef THINK_C_3_0
Guido van Rossum3f5da241990-12-20 15:06:42 +0000394 Click_On(1);
Guido van Rossum6c4f4a91990-12-20 23:11:33 +0000395#endif
Guido van Rossum3f5da241990-12-20 15:06:42 +0000396 printrefs(stderr);
397#endif /* TRACE_REFS */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000398}
399
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000400/* Ask a yes/no question */
401
Guido van Rossum3f5da241990-12-20 15:06:42 +0000402static int
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000403askyesno(prompt)
404 char *prompt;
405{
406 char buf[256];
407
408 printf("%s [ny] ", prompt);
409 if (fgets(buf, sizeof buf, stdin) == NULL)
410 return 0;
411 return buf[0] == 'y' || buf[0] == 'Y';
412}
413
Guido van Rossum6c4f4a91990-12-20 23:11:33 +0000414#ifdef THINK_C_3_0
Guido van Rossumda0c6bd1990-11-18 17:28:24 +0000415
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000416/* Check for file descriptor connected to interactive device.
417 Pretend that stdin is always interactive, other files never. */
418
419int
420isatty(fd)
421 int fd;
422{
423 return fd == fileno(stdin);
424}
425
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000426#endif
427
Guido van Rossum3f5da241990-12-20 15:06:42 +0000428/* XXX WISH LIST
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000429
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000430 - possible new types:
431 - iterator (for range, keys, ...)
432 - improve interpreter error handling, e.g., true tracebacks
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000433 - save precompiled modules on file?
434 - fork threads, locking
435 - allow syntax extensions
436*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000437
438/* "Floccinaucinihilipilification" */