blob: 031593c670f0ac98375cdb0ce8f88b6ce2331fb4 [file] [log] [blame]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001/* Python interpreter main program */
2
Guido van Rossum3f5da241990-12-20 15:06:42 +00003#include "allobjects.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00004
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00005#include "grammar.h"
6#include "node.h"
7#include "parsetok.h"
8#include "graminit.h"
9#include "errcode.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000010#include "sysmodule.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000011#include "compile.h"
12#include "ceval.h"
13#include "pythonrun.h"
14#include "import.h"
15
16extern char *getpythonpath();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000017
18extern grammar gram; /* From graminit.c */
19
Guido van Rossum3f5da241990-12-20 15:06:42 +000020#ifdef DEBUG
21int debugging; /* Needed by parser.c */
22#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000023
24main(argc, argv)
25 int argc;
26 char **argv;
27{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000028 char *filename = NULL;
29 FILE *fp = stdin;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000030
Guido van Rossum3f5da241990-12-20 15:06:42 +000031 initargs(&argc, &argv);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000032
33 if (argc > 1 && strcmp(argv[1], "-") != 0)
34 filename = argv[1];
Guido van Rossum3f5da241990-12-20 15:06:42 +000035
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000036 if (filename != NULL) {
37 if ((fp = fopen(filename, "r")) == NULL) {
38 fprintf(stderr, "python: can't open file '%s'\n",
39 filename);
40 exit(2);
41 }
42 }
43
Guido van Rossum3f5da241990-12-20 15:06:42 +000044 initall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000045
Guido van Rossumda0c6bd1990-11-18 17:28:24 +000046 setpythonpath(getpythonpath());
Guido van Rossum3f5da241990-12-20 15:06:42 +000047 setpythonargv(argc-1, argv+1);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000048
Guido van Rossum3f5da241990-12-20 15:06:42 +000049 goaway(run(fp, filename == NULL ? "<stdin>" : filename));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000050 /*NOTREACHED*/
51}
52
Guido van Rossum3f5da241990-12-20 15:06:42 +000053/* Initialize all */
54
55void
56initall()
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000057{
Guido van Rossum3f5da241990-12-20 15:06:42 +000058 static int inited;
59
60 if (inited)
61 return;
Guido van Rossum6c4f4a91990-12-20 23:11:33 +000062 inited = 1;
Guido van Rossum3f5da241990-12-20 15:06:42 +000063
64 initimport();
65
Guido van Rossum6c4f4a91990-12-20 23:11:33 +000066 /* Modules 'builtin' and 'sys' are initialized here,
67 they are needed by random bits of the interpreter.
68 All other modules are optional and should be initialized
69 by the initcalls() of a specific configuration. */
70
Guido van Rossum3f5da241990-12-20 15:06:42 +000071 initbuiltin(); /* Also initializes builtin exceptions */
72 initsys();
Guido van Rossum3f5da241990-12-20 15:06:42 +000073
74 initcalls(); /* Configuration-dependent initializations */
75
76 initintr(); /* For intrcheck() */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000077}
78
79/* Parse input from a file and execute it */
80
Guido van Rossum3f5da241990-12-20 15:06:42 +000081int
82run(fp, filename)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000083 FILE *fp;
Guido van Rossum3f5da241990-12-20 15:06:42 +000084 char *filename;
85{
86 if (filename == NULL)
87 filename = "???";
88 if (isatty(fileno(fp)))
89 return run_tty_loop(fp, filename);
90 else
91 return run_script(fp, filename);
92}
93
94int
95run_tty_loop(fp, filename)
96 FILE *fp;
97 char *filename;
98{
99 object *v;
100 int ret;
101 v = sysget("ps1");
102 if (v == NULL) {
103 sysset("ps1", v = newstringobject(">>> "));
104 XDECREF(v);
105 }
106 v = sysget("ps2");
107 if (v == NULL) {
108 sysset("ps2", v = newstringobject("... "));
109 XDECREF(v);
110 }
111 for (;;) {
112 ret = run_tty_1(fp, filename);
113#ifdef REF_DEBUG
114 fprintf(stderr, "[%ld refs]\n", ref_total);
115#endif
116 if (ret == E_EOF)
117 return 0;
118 /*
119 if (ret == E_NOMEM)
120 return -1;
121 */
122 }
123}
124
125int
126run_tty_1(fp, filename)
127 FILE *fp;
128 char *filename;
129{
130 object *m, *d, *v, *w;
131 node *n;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000132 char *ps1, *ps2;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000133 int err;
134 v = sysget("ps1");
135 w = sysget("ps2");
136 if (v != NULL && is_stringobject(v)) {
137 INCREF(v);
138 ps1 = getstringvalue(v);
139 }
140 else {
141 v = NULL;
142 ps1 = "";
143 }
144 if (w != NULL && is_stringobject(w)) {
145 INCREF(w);
146 ps2 = getstringvalue(w);
147 }
148 else {
149 w = NULL;
150 ps2 = "";
151 }
152 err = parsefile(fp, filename, &gram, single_input, ps1, ps2, &n);
153 XDECREF(v);
154 XDECREF(w);
155 if (err == E_EOF)
156 return E_EOF;
157 if (err != E_DONE) {
158 err_input(err);
159 print_error();
160 return err;
161 }
162 m = add_module("__main__");
163 if (m == NULL)
164 return -1;
165 d = getmoduledict(m);
166 v = run_node(n, filename, d, d);
167 flushline();
168 if (v == NULL) {
169 print_error();
170 return -1;
171 }
172 DECREF(v);
173 return 0;
174}
175
176int
177run_script(fp, filename)
178 FILE *fp;
179 char *filename;
180{
181 object *m, *d, *v;
182 m = add_module("__main__");
183 if (m == NULL)
184 return -1;
185 d = getmoduledict(m);
186 v = run_file(fp, filename, file_input, d, d);
187 flushline();
188 if (v == NULL) {
189 print_error();
190 return -1;
191 }
192 DECREF(v);
193 return 0;
194}
195
196void
197print_error()
198{
199 object *exception, *v;
200 err_get(&exception, &v);
201 fprintf(stderr, "Unhandled exception: ");
202 printobject(exception, stderr, PRINT_RAW);
203 if (v != NULL && v != None) {
204 fprintf(stderr, ": ");
205 printobject(v, stderr, PRINT_RAW);
206 }
207 fprintf(stderr, "\n");
208 XDECREF(exception);
209 XDECREF(v);
210 printtraceback(stderr);
211}
212
213object *
214run_string(str, start, globals, locals)
215 char *str;
216 int start;
217 /*dict*/object *globals, *locals;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000218{
219 node *n;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000220 int err;
221 err = parse_string(str, start, &n);
222 return run_err_node(err, n, "<string>", globals, locals);
223}
224
225object *
226run_file(fp, filename, start, globals, locals)
227 FILE *fp;
228 char *filename;
229 int start;
230 /*dict*/object *globals, *locals;
231{
232 node *n;
233 int err;
234 err = parse_file(fp, filename, start, &n);
235 return run_err_node(err, n, filename, globals, locals);
236}
237
238object *
239run_err_node(err, n, filename, globals, locals)
240 int err;
241 node *n;
242 char *filename;
243 /*dict*/object *globals, *locals;
244{
245 if (err != E_DONE) {
246 err_input(err);
247 return NULL;
248 }
249 return run_node(n, filename, globals, locals);
250}
251
252object *
253run_node(n, filename, globals, locals)
254 node *n;
255 char *filename;
256 /*dict*/object *globals, *locals;
257{
258 if (globals == NULL) {
259 globals = getglobals();
260 if (locals == NULL)
261 locals = getlocals();
262 }
263 else {
264 if (locals == NULL)
265 locals = globals;
266 }
267 return eval_node(n, filename, globals, locals);
268}
269
270object *
271eval_node(n, filename, globals, locals)
272 node *n;
273 char *filename;
274 object *globals;
275 object *locals;
276{
277 codeobject *co;
278 object *v;
279 co = compile(n, filename);
280 freetree(n);
281 if (co == NULL)
282 return NULL;
283 v = eval_code(co, globals, locals, (object *)NULL);
284 DECREF(co);
285 return v;
286}
287
288/* Simplified interface to parsefile */
289
290int
291parse_file(fp, filename, start, n_ret)
292 FILE *fp;
293 char *filename;
294 int start;
295 node **n_ret;
296{
297 return parsefile(fp, filename, &gram, start,
298 (char *)0, (char *)0, n_ret);
299}
300
301/* Simplified interface to parsestring */
302
303int
304parse_string(str, start, n_ret)
305 char *str;
306 int start;
307 node **n_ret;
308{
309 int err = parsestring(str, &gram, start, n_ret);
310 /* Don't confuse early end of string with early end of input */
311 if (err == E_EOF)
312 err = E_SYNTAX;
313 return err;
314}
315
316/* Print fatal error message and abort */
317
318void
319fatal(msg)
320 char *msg;
321{
322 fprintf(stderr, "Fatal error: %s\n", msg);
323 abort();
324}
325
326/* Clean up and exit */
327
328void
329goaway(sts)
330 int sts;
331{
332 flushline();
333
334 /* XXX Call doneimport() before donecalls(), since donecalls()
335 calls wdone(), and doneimport() may close windows */
336 doneimport();
337 donecalls();
338
339 err_clear();
340
341#ifdef REF_DEBUG
342 fprintf(stderr, "[%ld refs]\n", ref_total);
343#endif
344
Guido van Rossum6c4f4a91990-12-20 23:11:33 +0000345#ifdef THINK_C_3_0
Guido van Rossum3f5da241990-12-20 15:06:42 +0000346 if (sts == 0)
347 Click_On(0);
348#endif
349
350#ifdef TRACE_REFS
351 if (askyesno("Print left references?")) {
Guido van Rossum6c4f4a91990-12-20 23:11:33 +0000352#ifdef THINK_C_3_0
Guido van Rossum3f5da241990-12-20 15:06:42 +0000353 Click_On(1);
354#endif
355 printrefs(stderr);
356 }
357#endif /* TRACE_REFS */
358
359 exit(sts);
360 /*NOTREACHED*/
361}
362
363static
364finaloutput()
365{
366#ifdef TRACE_REFS
367 if (!askyesno("Print left references?"))
368 return;
Guido van Rossum6c4f4a91990-12-20 23:11:33 +0000369#ifdef THINK_C_3_0
Guido van Rossum3f5da241990-12-20 15:06:42 +0000370 Click_On(1);
Guido van Rossum6c4f4a91990-12-20 23:11:33 +0000371#endif
Guido van Rossum3f5da241990-12-20 15:06:42 +0000372 printrefs(stderr);
373#endif /* TRACE_REFS */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000374}
375
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000376/* Ask a yes/no question */
377
Guido van Rossum3f5da241990-12-20 15:06:42 +0000378static int
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000379askyesno(prompt)
380 char *prompt;
381{
382 char buf[256];
383
384 printf("%s [ny] ", prompt);
385 if (fgets(buf, sizeof buf, stdin) == NULL)
386 return 0;
387 return buf[0] == 'y' || buf[0] == 'Y';
388}
389
Guido van Rossum6c4f4a91990-12-20 23:11:33 +0000390#ifdef THINK_C_3_0
Guido van Rossumda0c6bd1990-11-18 17:28:24 +0000391
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000392/* Check for file descriptor connected to interactive device.
393 Pretend that stdin is always interactive, other files never. */
394
395int
396isatty(fd)
397 int fd;
398{
399 return fd == fileno(stdin);
400}
401
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000402#endif
403
Guido van Rossum3f5da241990-12-20 15:06:42 +0000404/* XXX WISH LIST
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000405
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000406 - possible new types:
407 - iterator (for range, keys, ...)
408 - improve interpreter error handling, e.g., true tracebacks
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000409 - save precompiled modules on file?
410 - fork threads, locking
411 - allow syntax extensions
412*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000413
414/* "Floccinaucinihilipilification" */