blob: e4b0d345518fd35098dbdfa4ae48d4eaba9a5d2e [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 Rossum10dc2e81990-11-18 17:27:39 +000025/* Compile an expression node to intermediate code */
26
Guido van Rossum3f5da241990-12-20 15:06:42 +000027/* XXX TO DO:
28 XXX Compute maximum needed stack sizes while compiling
29 XXX Generate simple jump for break/return outside 'try...finally'
30 XXX Include function name in code (and module names?)
31*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +000032
Guido van Rossum3f5da241990-12-20 15:06:42 +000033#include "allobjects.h"
34
Guido van Rossum10dc2e81990-11-18 17:27:39 +000035#include "node.h"
36#include "token.h"
37#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000038#include "compile.h"
39#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000040#include "structmember.h"
41
42#include <ctype.h>
43
Guido van Rossum282914b1991-04-04 10:42:56 +000044extern int errno;
45
Guido van Rossum3f5da241990-12-20 15:06:42 +000046#define OFF(x) offsetof(codeobject, x)
47
48static struct memberlist code_memberlist[] = {
49 {"co_code", T_OBJECT, OFF(co_code)},
50 {"co_consts", T_OBJECT, OFF(co_consts)},
51 {"co_names", T_OBJECT, OFF(co_names)},
52 {"co_filename", T_OBJECT, OFF(co_filename)},
53 {NULL} /* Sentinel */
54};
55
56static object *
57code_getattr(co, name)
58 codeobject *co;
59 char *name;
60{
61 return getmember((char *)co, code_memberlist, name);
62}
Guido van Rossum10dc2e81990-11-18 17:27:39 +000063
64static void
Guido van Rossum3f5da241990-12-20 15:06:42 +000065code_dealloc(co)
66 codeobject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +000067{
Guido van Rossum3f5da241990-12-20 15:06:42 +000068 XDECREF(co->co_code);
69 XDECREF(co->co_consts);
70 XDECREF(co->co_names);
71 XDECREF(co->co_filename);
72 DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +000073}
74
75typeobject Codetype = {
76 OB_HEAD_INIT(&Typetype)
77 0,
78 "code",
79 sizeof(codeobject),
80 0,
81 code_dealloc, /*tp_dealloc*/
82 0, /*tp_print*/
Guido van Rossum3f5da241990-12-20 15:06:42 +000083 code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +000084 0, /*tp_setattr*/
85 0, /*tp_compare*/
86 0, /*tp_repr*/
87 0, /*tp_as_number*/
88 0, /*tp_as_sequence*/
89 0, /*tp_as_mapping*/
90};
91
Guido van Rossuma082ce41991-06-04 19:41:56 +000092codeobject *
Guido van Rossum3f5da241990-12-20 15:06:42 +000093newcodeobject(code, consts, names, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +000094 object *code;
95 object *consts;
96 object *names;
Guido van Rossuma082ce41991-06-04 19:41:56 +000097 object *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +000098{
99 codeobject *co;
100 int i;
101 /* Check argument types */
102 if (code == NULL || !is_stringobject(code) ||
103 consts == NULL || !is_listobject(consts) ||
104 names == NULL || !is_listobject(names)) {
105 err_badcall();
106 return NULL;
107 }
108 /* Make sure the list of names contains only strings */
109 for (i = getlistsize(names); --i >= 0; ) {
110 object *v = getlistitem(names, i);
111 if (v == NULL || !is_stringobject(v)) {
112 err_badcall();
113 return NULL;
114 }
115 }
116 co = NEWOBJ(codeobject, &Codetype);
117 if (co != NULL) {
118 INCREF(code);
119 co->co_code = (stringobject *)code;
120 INCREF(consts);
121 co->co_consts = consts;
122 INCREF(names);
123 co->co_names = names;
Guido van Rossuma082ce41991-06-04 19:41:56 +0000124 INCREF(filename);
125 co->co_filename = filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000126 }
127 return co;
128}
129
130
131/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000132
133#define MAXBLOCKS 20 /* Max static block nesting within a function */
134
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000135struct compiling {
136 object *c_code; /* string */
137 object *c_consts; /* list of objects */
138 object *c_names; /* list of strings (names) */
Guido van Rossumc5e96291991-12-10 13:53:51 +0000139 object *c_globals; /* dictionary */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000140 int c_nexti; /* index into c_code */
141 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000142 int c_infunction; /* set when compiling a function */
143 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000144 int c_begin; /* begin of current loop, for 'continue' */
145 int c_block[MAXBLOCKS]; /* stack of block types */
146 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000147 char *c_filename; /* filename of current node */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000148};
149
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000150
151/* Interface to the block stack */
152
153static void
154block_push(c, type)
155 struct compiling *c;
156 int type;
157{
158 if (c->c_nblocks >= MAXBLOCKS) {
159 err_setstr(TypeError, "too many statically nested blocks");
160 c->c_errors++;
161 }
162 else {
163 c->c_block[c->c_nblocks++] = type;
164 }
165}
166
167static void
168block_pop(c, type)
169 struct compiling *c;
170 int type;
171{
172 if (c->c_nblocks > 0)
173 c->c_nblocks--;
174 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
175 err_setstr(SystemError, "bad block pop");
176 c->c_errors++;
177 }
178}
179
180
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000181/* Prototypes */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000182
Guido van Rossum3f5da241990-12-20 15:06:42 +0000183static int com_init PROTO((struct compiling *, char *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000184static void com_free PROTO((struct compiling *));
185static void com_done PROTO((struct compiling *));
186static void com_node PROTO((struct compiling *, struct _node *));
187static void com_addbyte PROTO((struct compiling *, int));
188static void com_addint PROTO((struct compiling *, int));
189static void com_addoparg PROTO((struct compiling *, int, int));
190static void com_addfwref PROTO((struct compiling *, int, int *));
191static void com_backpatch PROTO((struct compiling *, int));
192static int com_add PROTO((struct compiling *, object *, object *));
193static int com_addconst PROTO((struct compiling *, object *));
194static int com_addname PROTO((struct compiling *, object *));
195static void com_addopname PROTO((struct compiling *, int, node *));
196
197static int
Guido van Rossum3f5da241990-12-20 15:06:42 +0000198com_init(c, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000199 struct compiling *c;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000200 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000201{
Guido van Rossum62d46241991-04-03 19:00:23 +0000202 if ((c->c_code = newsizedstringobject((char *)NULL, 1000)) == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000203 goto fail_3;
204 if ((c->c_consts = newlistobject(0)) == NULL)
205 goto fail_2;
206 if ((c->c_names = newlistobject(0)) == NULL)
207 goto fail_1;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000208 if ((c->c_globals = newdictobject()) == NULL)
209 goto fail_0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000210 c->c_nexti = 0;
211 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000212 c->c_infunction = 0;
213 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000214 c->c_begin = 0;
215 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000216 c->c_filename = filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000217 return 1;
218
Guido van Rossumc5e96291991-12-10 13:53:51 +0000219 fail_0:
220 DECREF(c->c_names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000221 fail_1:
222 DECREF(c->c_consts);
223 fail_2:
224 DECREF(c->c_code);
225 fail_3:
226 return 0;
227}
228
229static void
230com_free(c)
231 struct compiling *c;
232{
233 XDECREF(c->c_code);
234 XDECREF(c->c_consts);
235 XDECREF(c->c_names);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000236 XDECREF(c->c_globals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000237}
238
239static void
240com_done(c)
241 struct compiling *c;
242{
243 if (c->c_code != NULL)
244 resizestring(&c->c_code, c->c_nexti);
245}
246
247static void
248com_addbyte(c, byte)
249 struct compiling *c;
250 int byte;
251{
252 int len;
253 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000254 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000255 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
256 abort();
Guido van Rossum01cfd441991-10-20 20:12:38 +0000257 */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000258 err_setstr(SystemError, "com_addbyte: byte out of range");
259 c->c_errors++;
260 }
261 if (c->c_code == NULL)
262 return;
263 len = getstringsize(c->c_code);
264 if (c->c_nexti >= len) {
265 if (resizestring(&c->c_code, len+1000) != 0) {
266 c->c_errors++;
267 return;
268 }
269 }
270 getstringvalue(c->c_code)[c->c_nexti++] = byte;
271}
272
273static void
274com_addint(c, x)
275 struct compiling *c;
276 int x;
277{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000278 com_addbyte(c, x & 0xff);
279 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000280}
281
282static void
283com_addoparg(c, op, arg)
284 struct compiling *c;
285 int op;
286 int arg;
287{
288 com_addbyte(c, op);
289 com_addint(c, arg);
290}
291
292static void
293com_addfwref(c, op, p_anchor)
294 struct compiling *c;
295 int op;
296 int *p_anchor;
297{
298 /* Compile a forward reference for backpatching */
299 int here;
300 int anchor;
301 com_addbyte(c, op);
302 here = c->c_nexti;
303 anchor = *p_anchor;
304 *p_anchor = here;
305 com_addint(c, anchor == 0 ? 0 : here - anchor);
306}
307
308static void
309com_backpatch(c, anchor)
310 struct compiling *c;
311 int anchor; /* Must be nonzero */
312{
313 unsigned char *code = (unsigned char *) getstringvalue(c->c_code);
314 int target = c->c_nexti;
315 int lastanchor = 0;
316 int dist;
317 int prev;
318 for (;;) {
319 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000320 prev = code[anchor] + (code[anchor+1] << 8);
321 dist = target - (anchor+2);
322 code[anchor] = dist & 0xff;
323 code[anchor+1] = dist >> 8;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000324 if (!prev)
325 break;
326 lastanchor = anchor;
327 anchor -= prev;
328 }
329}
330
331/* Handle constants and names uniformly */
332
333static int
334com_add(c, list, v)
335 struct compiling *c;
336 object *list;
337 object *v;
338{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000339 int n = getlistsize(list);
340 int i;
341 for (i = n; --i >= 0; ) {
342 object *w = getlistitem(list, i);
Guido van Rossumefc0bd01991-07-01 18:44:20 +0000343 if (v->ob_type == w->ob_type && cmpobject(v, w) == 0)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000344 return i;
345 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000346 if (addlistitem(list, v) != 0)
347 c->c_errors++;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000348 return n;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000349}
350
351static int
352com_addconst(c, v)
353 struct compiling *c;
354 object *v;
355{
356 return com_add(c, c->c_consts, v);
357}
358
359static int
360com_addname(c, v)
361 struct compiling *c;
362 object *v;
363{
364 return com_add(c, c->c_names, v);
365}
366
367static void
368com_addopname(c, op, n)
369 struct compiling *c;
370 int op;
371 node *n;
372{
373 object *v;
374 int i;
375 char *name;
376 if (TYPE(n) == STAR)
377 name = "*";
378 else {
379 REQ(n, NAME);
380 name = STR(n);
381 }
382 if ((v = newstringobject(name)) == NULL) {
383 c->c_errors++;
384 i = 255;
385 }
386 else {
387 i = com_addname(c, v);
388 DECREF(v);
389 }
Guido van Rossumc5e96291991-12-10 13:53:51 +0000390 /* Hack to replace *_NAME opcodes by *_GLOBAL if necessary */
391 switch (op) {
392 case LOAD_NAME:
393 case STORE_NAME:
394 case DELETE_NAME:
395 if (dictlookup(c->c_globals, name) != NULL) {
396 switch (op) {
397 case LOAD_NAME: op = LOAD_GLOBAL; break;
398 case STORE_NAME: op = STORE_GLOBAL; break;
399 case DELETE_NAME: op = DELETE_GLOBAL; break;
400 }
401 }
402 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000403 com_addoparg(c, op, i);
404}
405
406static object *
407parsenumber(s)
408 char *s;
409{
410 extern long strtol();
Guido van Rossum282914b1991-04-04 10:42:56 +0000411 extern double strtod();
Guido van Rossumc5e96291991-12-10 13:53:51 +0000412 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000413 long x;
Guido van Rossum282914b1991-04-04 10:42:56 +0000414 double xx;
415 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000416 end = s + strlen(s) - 1;
417 if (*end == 'l' || *end == 'L') {
418 extern object *long_scan();
419 return long_scan(s, 0);
420 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000421 x = strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +0000422 if (*end == '\0') {
423 if (errno != 0) {
424 err_setstr(RuntimeError, "integer constant too large");
425 return NULL;
426 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000427 return newintobject(x);
Guido van Rossum282914b1991-04-04 10:42:56 +0000428 }
429 errno = 0;
430 xx = strtod(s, &end);
431 if (*end == '\0') {
432 if (errno != 0) {
433 err_setstr(RuntimeError, "float constant too large");
434 return NULL;
435 }
436 return newfloatobject(xx);
437 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000438 err_setstr(RuntimeError, "bad number syntax");
439 return NULL;
440}
441
442static object *
443parsestr(s)
444 char *s;
445{
446 object *v;
447 int len;
448 char *buf;
449 char *p;
450 int c;
451 if (*s != '\'') {
452 err_badcall();
453 return NULL;
454 }
455 s++;
456 len = strlen(s);
457 if (s[--len] != '\'') {
458 err_badcall();
459 return NULL;
460 }
461 if (strchr(s, '\\') == NULL)
462 return newsizedstringobject(s, len);
463 v = newsizedstringobject((char *)NULL, len);
464 p = buf = getstringvalue(v);
465 while (*s != '\0' && *s != '\'') {
466 if (*s != '\\') {
467 *p++ = *s++;
468 continue;
469 }
470 s++;
471 switch (*s++) {
472 /* XXX This assumes ASCII! */
473 case '\\': *p++ = '\\'; break;
474 case '\'': *p++ = '\''; break;
475 case 'b': *p++ = '\b'; break;
476 case 'f': *p++ = '\014'; break; /* FF */
477 case 't': *p++ = '\t'; break;
478 case 'n': *p++ = '\n'; break;
479 case 'r': *p++ = '\r'; break;
480 case 'v': *p++ = '\013'; break; /* VT */
481 case 'E': *p++ = '\033'; break; /* ESC, not C */
482 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
483 case '0': case '1': case '2': case '3':
484 case '4': case '5': case '6': case '7':
485 c = s[-1] - '0';
486 if ('0' <= *s && *s <= '7') {
487 c = (c<<3) + *s++ - '0';
488 if ('0' <= *s && *s <= '7')
489 c = (c<<3) + *s++ - '0';
490 }
491 *p++ = c;
492 break;
493 case 'x':
494 if (isxdigit(*s)) {
495 sscanf(s, "%x", &c);
496 *p++ = c;
497 do {
498 s++;
499 } while (isxdigit(*s));
500 break;
501 }
502 /* FALLTHROUGH */
503 default: *p++ = '\\'; *p++ = s[-1]; break;
504 }
505 }
506 resizestring(&v, (int)(p - buf));
507 return v;
508}
509
510static void
511com_list_constructor(c, n)
512 struct compiling *c;
513 node *n;
514{
515 int len;
516 int i;
517 object *v, *w;
518 if (TYPE(n) != testlist)
519 REQ(n, exprlist);
520 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
521 len = (NCH(n) + 1) / 2;
522 for (i = 0; i < NCH(n); i += 2)
523 com_node(c, CHILD(n, i));
524 com_addoparg(c, BUILD_LIST, len);
525}
526
527static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000528com_dictmaker(c, n)
529 struct compiling *c;
530 node *n;
531{
532 int i;
533 /* dictmaker: test ':' test (',' test ':' value)* [','] */
534 for (i = 0; i+2 < NCH(n); i += 4) {
535 /* We must arrange things just right for STORE_SUBSCR.
536 It wants the stack to look like (value) (dict) (key) */
537 com_addbyte(c, DUP_TOP);
538 com_node(c, CHILD(n, i+2)); /* value */
539 com_addbyte(c, ROT_TWO);
540 com_node(c, CHILD(n, i)); /* key */
541 com_addbyte(c, STORE_SUBSCR);
542 }
543}
544
545static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000546com_atom(c, n)
547 struct compiling *c;
548 node *n;
549{
550 node *ch;
551 object *v;
552 int i;
553 REQ(n, atom);
554 ch = CHILD(n, 0);
555 switch (TYPE(ch)) {
556 case LPAR:
557 if (TYPE(CHILD(n, 1)) == RPAR)
558 com_addoparg(c, BUILD_TUPLE, 0);
559 else
560 com_node(c, CHILD(n, 1));
561 break;
562 case LSQB:
563 if (TYPE(CHILD(n, 1)) == RSQB)
564 com_addoparg(c, BUILD_LIST, 0);
565 else
566 com_list_constructor(c, CHILD(n, 1));
567 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000568 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000569 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000570 if (TYPE(CHILD(n, 1)) != RBRACE)
571 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000572 break;
573 case BACKQUOTE:
574 com_node(c, CHILD(n, 1));
575 com_addbyte(c, UNARY_CONVERT);
576 break;
577 case NUMBER:
578 if ((v = parsenumber(STR(ch))) == NULL) {
579 c->c_errors++;
580 i = 255;
581 }
582 else {
583 i = com_addconst(c, v);
584 DECREF(v);
585 }
586 com_addoparg(c, LOAD_CONST, i);
587 break;
588 case STRING:
589 if ((v = parsestr(STR(ch))) == NULL) {
590 c->c_errors++;
591 i = 255;
592 }
593 else {
594 i = com_addconst(c, v);
595 DECREF(v);
596 }
597 com_addoparg(c, LOAD_CONST, i);
598 break;
599 case NAME:
600 com_addopname(c, LOAD_NAME, ch);
601 break;
602 default:
603 fprintf(stderr, "node type %d\n", TYPE(ch));
604 err_setstr(SystemError, "com_atom: unexpected node type");
605 c->c_errors++;
606 }
607}
608
609static void
610com_slice(c, n, op)
611 struct compiling *c;
612 node *n;
613 int op;
614{
615 if (NCH(n) == 1) {
616 com_addbyte(c, op);
617 }
618 else if (NCH(n) == 2) {
619 if (TYPE(CHILD(n, 0)) != COLON) {
620 com_node(c, CHILD(n, 0));
621 com_addbyte(c, op+1);
622 }
623 else {
624 com_node(c, CHILD(n, 1));
625 com_addbyte(c, op+2);
626 }
627 }
628 else {
629 com_node(c, CHILD(n, 0));
630 com_node(c, CHILD(n, 2));
631 com_addbyte(c, op+3);
632 }
633}
634
635static void
636com_apply_subscript(c, n)
637 struct compiling *c;
638 node *n;
639{
640 REQ(n, subscript);
641 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) != COLON) {
642 /* It's a single subscript */
643 com_node(c, CHILD(n, 0));
644 com_addbyte(c, BINARY_SUBSCR);
645 }
646 else {
647 /* It's a slice: [expr] ':' [expr] */
648 com_slice(c, n, SLICE);
649 }
650}
651
652static void
653com_call_function(c, n)
654 struct compiling *c;
655 node *n; /* EITHER testlist OR ')' */
656{
657 if (TYPE(n) == RPAR) {
658 com_addbyte(c, UNARY_CALL);
659 }
660 else {
661 com_node(c, n);
662 com_addbyte(c, BINARY_CALL);
663 }
664}
665
666static void
667com_select_member(c, n)
668 struct compiling *c;
669 node *n;
670{
671 com_addopname(c, LOAD_ATTR, n);
672}
673
674static void
675com_apply_trailer(c, n)
676 struct compiling *c;
677 node *n;
678{
679 REQ(n, trailer);
680 switch (TYPE(CHILD(n, 0))) {
681 case LPAR:
682 com_call_function(c, CHILD(n, 1));
683 break;
684 case DOT:
685 com_select_member(c, CHILD(n, 1));
686 break;
687 case LSQB:
688 com_apply_subscript(c, CHILD(n, 1));
689 break;
690 default:
691 err_setstr(SystemError,
692 "com_apply_trailer: unknown trailer type");
693 c->c_errors++;
694 }
695}
696
697static void
698com_factor(c, n)
699 struct compiling *c;
700 node *n;
701{
702 int i;
703 REQ(n, factor);
704 if (TYPE(CHILD(n, 0)) == PLUS) {
705 com_factor(c, CHILD(n, 1));
706 com_addbyte(c, UNARY_POSITIVE);
707 }
708 else if (TYPE(CHILD(n, 0)) == MINUS) {
709 com_factor(c, CHILD(n, 1));
710 com_addbyte(c, UNARY_NEGATIVE);
711 }
Guido van Rossum7928cd71991-10-24 14:59:31 +0000712 else if (TYPE(CHILD(n, 0)) == TILDE) {
713 com_factor(c, CHILD(n, 1));
714 com_addbyte(c, UNARY_INVERT);
715 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000716 else {
717 com_atom(c, CHILD(n, 0));
718 for (i = 1; i < NCH(n); i++)
719 com_apply_trailer(c, CHILD(n, i));
720 }
721}
722
723static void
724com_term(c, n)
725 struct compiling *c;
726 node *n;
727{
728 int i;
729 int op;
730 REQ(n, term);
731 com_factor(c, CHILD(n, 0));
732 for (i = 2; i < NCH(n); i += 2) {
733 com_factor(c, CHILD(n, i));
734 switch (TYPE(CHILD(n, i-1))) {
735 case STAR:
736 op = BINARY_MULTIPLY;
737 break;
738 case SLASH:
739 op = BINARY_DIVIDE;
740 break;
741 case PERCENT:
742 op = BINARY_MODULO;
743 break;
744 default:
745 err_setstr(SystemError,
Guido van Rossum7928cd71991-10-24 14:59:31 +0000746 "com_term: operator not *, / or %");
747 c->c_errors++;
748 op = 255;
749 }
750 com_addbyte(c, op);
751 }
752}
753
754static void
755com_arith_expr(c, n)
756 struct compiling *c;
757 node *n;
758{
759 int i;
760 int op;
761 REQ(n, arith_expr);
762 com_term(c, CHILD(n, 0));
763 for (i = 2; i < NCH(n); i += 2) {
764 com_term(c, CHILD(n, i));
765 switch (TYPE(CHILD(n, i-1))) {
766 case PLUS:
767 op = BINARY_ADD;
768 break;
769 case MINUS:
770 op = BINARY_SUBTRACT;
771 break;
772 default:
773 err_setstr(SystemError,
774 "com_arith_expr: operator not + or -");
775 c->c_errors++;
776 op = 255;
777 }
778 com_addbyte(c, op);
779 }
780}
781
782static void
783com_shift_expr(c, n)
784 struct compiling *c;
785 node *n;
786{
787 int i;
788 int op;
789 REQ(n, shift_expr);
790 com_arith_expr(c, CHILD(n, 0));
791 for (i = 2; i < NCH(n); i += 2) {
792 com_arith_expr(c, CHILD(n, i));
793 switch (TYPE(CHILD(n, i-1))) {
794 case LEFTSHIFT:
795 op = BINARY_LSHIFT;
796 break;
797 case RIGHTSHIFT:
798 op = BINARY_RSHIFT;
799 break;
800 default:
801 err_setstr(SystemError,
802 "com_shift_expr: operator not << or >>");
803 c->c_errors++;
804 op = 255;
805 }
806 com_addbyte(c, op);
807 }
808}
809
810static void
811com_and_expr(c, n)
812 struct compiling *c;
813 node *n;
814{
815 int i;
816 int op;
817 REQ(n, and_expr);
818 com_shift_expr(c, CHILD(n, 0));
819 for (i = 2; i < NCH(n); i += 2) {
820 com_shift_expr(c, CHILD(n, i));
821 if (TYPE(CHILD(n, i-1)) == AMPER) {
822 op = BINARY_AND;
823 }
824 else {
825 err_setstr(SystemError,
826 "com_and_expr: operator not &");
827 c->c_errors++;
828 op = 255;
829 }
830 com_addbyte(c, op);
831 }
832}
833
834static void
835com_xor_expr(c, n)
836 struct compiling *c;
837 node *n;
838{
839 int i;
840 int op;
841 REQ(n, xor_expr);
842 com_and_expr(c, CHILD(n, 0));
843 for (i = 2; i < NCH(n); i += 2) {
844 com_and_expr(c, CHILD(n, i));
845 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
846 op = BINARY_XOR;
847 }
848 else {
849 err_setstr(SystemError,
850 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000851 c->c_errors++;
852 op = 255;
853 }
854 com_addbyte(c, op);
855 }
856}
857
858static void
859com_expr(c, n)
860 struct compiling *c;
861 node *n;
862{
863 int i;
864 int op;
865 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000866 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000867 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +0000868 com_xor_expr(c, CHILD(n, i));
869 if (TYPE(CHILD(n, i-1)) == VBAR) {
870 op = BINARY_OR;
871 }
872 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000873 err_setstr(SystemError,
Guido van Rossum7928cd71991-10-24 14:59:31 +0000874 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000875 c->c_errors++;
876 op = 255;
877 }
878 com_addbyte(c, op);
879 }
880}
881
882static enum cmp_op
883cmp_type(n)
884 node *n;
885{
886 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +0000887 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000888 | 'in' | 'not' 'in' | 'is' | 'is' not' */
889 if (NCH(n) == 1) {
890 n = CHILD(n, 0);
891 switch (TYPE(n)) {
892 case LESS: return LT;
893 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +0000894 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000895 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +0000896 case LESSEQUAL: return LE;
897 case GREATEREQUAL: return GE;
898 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000899 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
900 if (strcmp(STR(n), "is") == 0) return IS;
901 }
902 }
903 else if (NCH(n) == 2) {
904 int t2 = TYPE(CHILD(n, 1));
905 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000906 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
907 return NOT_IN;
908 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
909 return IS_NOT;
910 }
911 }
912 return BAD;
913}
914
915static void
916com_comparison(c, n)
917 struct compiling *c;
918 node *n;
919{
920 int i;
921 enum cmp_op op;
922 int anchor;
923 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
924 com_expr(c, CHILD(n, 0));
925 if (NCH(n) == 1)
926 return;
927
928 /****************************************************************
929 The following code is generated for all but the last
930 comparison in a chain:
931
932 label: on stack: opcode: jump to:
933
934 a <code to load b>
935 a, b DUP_TOP
936 a, b, b ROT_THREE
937 b, a, b COMPARE_OP
938 b, 0-or-1 JUMP_IF_FALSE L1
939 b, 1 POP_TOP
940 b
941
942 We are now ready to repeat this sequence for the next
943 comparison in the chain.
944
945 For the last we generate:
946
947 b <code to load c>
948 b, c COMPARE_OP
949 0-or-1
950
951 If there were any jumps to L1 (i.e., there was more than one
952 comparison), we generate:
953
954 0-or-1 JUMP_FORWARD L2
955 L1: b, 0 ROT_TWO
956 0, b POP_TOP
957 0
958 L2:
959 ****************************************************************/
960
961 anchor = 0;
962
963 for (i = 2; i < NCH(n); i += 2) {
964 com_expr(c, CHILD(n, i));
965 if (i+2 < NCH(n)) {
966 com_addbyte(c, DUP_TOP);
967 com_addbyte(c, ROT_THREE);
968 }
969 op = cmp_type(CHILD(n, i-1));
970 if (op == BAD) {
971 err_setstr(SystemError,
972 "com_comparison: unknown comparison op");
973 c->c_errors++;
974 }
975 com_addoparg(c, COMPARE_OP, op);
976 if (i+2 < NCH(n)) {
977 com_addfwref(c, JUMP_IF_FALSE, &anchor);
978 com_addbyte(c, POP_TOP);
979 }
980 }
981
982 if (anchor) {
983 int anchor2 = 0;
984 com_addfwref(c, JUMP_FORWARD, &anchor2);
985 com_backpatch(c, anchor);
986 com_addbyte(c, ROT_TWO);
987 com_addbyte(c, POP_TOP);
988 com_backpatch(c, anchor2);
989 }
990}
991
992static void
993com_not_test(c, n)
994 struct compiling *c;
995 node *n;
996{
997 REQ(n, not_test); /* 'not' not_test | comparison */
998 if (NCH(n) == 1) {
999 com_comparison(c, CHILD(n, 0));
1000 }
1001 else {
1002 com_not_test(c, CHILD(n, 1));
1003 com_addbyte(c, UNARY_NOT);
1004 }
1005}
1006
1007static void
1008com_and_test(c, n)
1009 struct compiling *c;
1010 node *n;
1011{
1012 int i;
1013 int anchor;
1014 REQ(n, and_test); /* not_test ('and' not_test)* */
1015 anchor = 0;
1016 i = 0;
1017 for (;;) {
1018 com_not_test(c, CHILD(n, i));
1019 if ((i += 2) >= NCH(n))
1020 break;
1021 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1022 com_addbyte(c, POP_TOP);
1023 }
1024 if (anchor)
1025 com_backpatch(c, anchor);
1026}
1027
1028static void
1029com_test(c, n)
1030 struct compiling *c;
1031 node *n;
1032{
1033 int i;
1034 int anchor;
1035 REQ(n, test); /* and_test ('and' and_test)* */
1036 anchor = 0;
1037 i = 0;
1038 for (;;) {
1039 com_and_test(c, CHILD(n, i));
1040 if ((i += 2) >= NCH(n))
1041 break;
1042 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1043 com_addbyte(c, POP_TOP);
1044 }
1045 if (anchor)
1046 com_backpatch(c, anchor);
1047}
1048
1049static void
1050com_list(c, n)
1051 struct compiling *c;
1052 node *n;
1053{
1054 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
1055 if (NCH(n) == 1) {
1056 com_node(c, CHILD(n, 0));
1057 }
1058 else {
1059 int i;
1060 int len;
1061 len = (NCH(n) + 1) / 2;
1062 for (i = 0; i < NCH(n); i += 2)
1063 com_node(c, CHILD(n, i));
1064 com_addoparg(c, BUILD_TUPLE, len);
1065 }
1066}
1067
1068
1069/* Begin of assignment compilation */
1070
1071static void com_assign_name PROTO((struct compiling *, node *, int));
1072static void com_assign PROTO((struct compiling *, node *, int));
1073
1074static void
1075com_assign_attr(c, n, assigning)
1076 struct compiling *c;
1077 node *n;
1078 int assigning;
1079{
1080 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
1081}
1082
1083static void
1084com_assign_slice(c, n, assigning)
1085 struct compiling *c;
1086 node *n;
1087 int assigning;
1088{
1089 com_slice(c, n, assigning ? STORE_SLICE : DELETE_SLICE);
1090}
1091
1092static void
1093com_assign_subscript(c, n, assigning)
1094 struct compiling *c;
1095 node *n;
1096 int assigning;
1097{
1098 com_node(c, n);
1099 com_addbyte(c, assigning ? STORE_SUBSCR : DELETE_SUBSCR);
1100}
1101
1102static void
1103com_assign_trailer(c, n, assigning)
1104 struct compiling *c;
1105 node *n;
1106 int assigning;
1107{
1108 char *name;
1109 REQ(n, trailer);
1110 switch (TYPE(CHILD(n, 0))) {
1111 case LPAR: /* '(' [exprlist] ')' */
1112 err_setstr(TypeError, "can't assign to function call");
1113 c->c_errors++;
1114 break;
1115 case DOT: /* '.' NAME */
1116 com_assign_attr(c, CHILD(n, 1), assigning);
1117 break;
1118 case LSQB: /* '[' subscript ']' */
1119 n = CHILD(n, 1);
1120 REQ(n, subscript); /* subscript: expr | [expr] ':' [expr] */
1121 if (NCH(n) > 1 || TYPE(CHILD(n, 0)) == COLON)
1122 com_assign_slice(c, n, assigning);
1123 else
1124 com_assign_subscript(c, CHILD(n, 0), assigning);
1125 break;
1126 default:
1127 err_setstr(TypeError, "unknown trailer type");
1128 c->c_errors++;
1129 }
1130}
1131
1132static void
1133com_assign_tuple(c, n, assigning)
1134 struct compiling *c;
1135 node *n;
1136 int assigning;
1137{
1138 int i;
1139 if (TYPE(n) != testlist)
1140 REQ(n, exprlist);
1141 if (assigning)
1142 com_addoparg(c, UNPACK_TUPLE, (NCH(n)+1)/2);
1143 for (i = 0; i < NCH(n); i += 2)
1144 com_assign(c, CHILD(n, i), assigning);
1145}
1146
1147static void
1148com_assign_list(c, n, assigning)
1149 struct compiling *c;
1150 node *n;
1151 int assigning;
1152{
1153 int i;
1154 if (assigning)
1155 com_addoparg(c, UNPACK_LIST, (NCH(n)+1)/2);
1156 for (i = 0; i < NCH(n); i += 2)
1157 com_assign(c, CHILD(n, i), assigning);
1158}
1159
1160static void
1161com_assign_name(c, n, assigning)
1162 struct compiling *c;
1163 node *n;
1164 int assigning;
1165{
1166 REQ(n, NAME);
1167 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
1168}
1169
1170static void
1171com_assign(c, n, assigning)
1172 struct compiling *c;
1173 node *n;
1174 int assigning;
1175{
1176 /* Loop to avoid trivial recursion */
1177 for (;;) {
1178 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001179
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001180 case exprlist:
1181 case testlist:
1182 if (NCH(n) > 1) {
1183 com_assign_tuple(c, n, assigning);
1184 return;
1185 }
1186 n = CHILD(n, 0);
1187 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001188
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001189 case test:
1190 case and_test:
1191 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001192 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001193 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001194 case xor_expr:
1195 case and_expr:
1196 case shift_expr:
1197 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001198 case term:
1199 if (NCH(n) > 1) {
1200 err_setstr(TypeError,
1201 "can't assign to operator");
1202 c->c_errors++;
1203 return;
1204 }
1205 n = CHILD(n, 0);
1206 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001207
Guido van Rossum7928cd71991-10-24 14:59:31 +00001208 case factor: /* ('+'|'-'|'~') factor | atom trailer* */
1209 if (TYPE(CHILD(n, 0)) != atom) { /* '+'|'-'|'~' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001210 err_setstr(TypeError,
1211 "can't assign to operator");
1212 c->c_errors++;
1213 return;
1214 }
1215 if (NCH(n) > 1) { /* trailer present */
1216 int i;
1217 com_node(c, CHILD(n, 0));
1218 for (i = 1; i+1 < NCH(n); i++) {
1219 com_apply_trailer(c, CHILD(n, i));
1220 } /* NB i is still alive */
1221 com_assign_trailer(c,
1222 CHILD(n, i), assigning);
1223 return;
1224 }
1225 n = CHILD(n, 0);
1226 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001227
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001228 case atom:
1229 switch (TYPE(CHILD(n, 0))) {
1230 case LPAR:
1231 n = CHILD(n, 1);
1232 if (TYPE(n) == RPAR) {
1233 /* XXX Should allow () = () ??? */
1234 err_setstr(TypeError,
1235 "can't assign to ()");
1236 c->c_errors++;
1237 return;
1238 }
1239 break;
1240 case LSQB:
1241 n = CHILD(n, 1);
1242 if (TYPE(n) == RSQB) {
1243 err_setstr(TypeError,
1244 "can't assign to []");
1245 c->c_errors++;
1246 return;
1247 }
1248 com_assign_list(c, n, assigning);
1249 return;
1250 case NAME:
1251 com_assign_name(c, CHILD(n, 0), assigning);
1252 return;
1253 default:
1254 err_setstr(TypeError,
1255 "can't assign to constant");
1256 c->c_errors++;
1257 return;
1258 }
1259 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001260
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001261 default:
1262 fprintf(stderr, "node type %d\n", TYPE(n));
1263 err_setstr(SystemError, "com_assign: bad node");
1264 c->c_errors++;
1265 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001266
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001267 }
1268 }
1269}
1270
1271static void
1272com_expr_stmt(c, n)
1273 struct compiling *c;
1274 node *n;
1275{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001276 REQ(n, expr_stmt); /* exprlist ('=' exprlist)* */
1277 com_node(c, CHILD(n, NCH(n)-1));
1278 if (NCH(n) == 1) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001279 com_addbyte(c, PRINT_EXPR);
1280 }
1281 else {
1282 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001283 for (i = 0; i < NCH(n)-2; i+=2) {
1284 if (i+2 < NCH(n)-2)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001285 com_addbyte(c, DUP_TOP);
1286 com_assign(c, CHILD(n, i), 1/*assign*/);
1287 }
1288 }
1289}
1290
1291static void
1292com_print_stmt(c, n)
1293 struct compiling *c;
1294 node *n;
1295{
1296 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001297 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
1298 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001299 com_node(c, CHILD(n, i));
1300 com_addbyte(c, PRINT_ITEM);
1301 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001302 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001303 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001304 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001305}
1306
1307static void
1308com_return_stmt(c, n)
1309 struct compiling *c;
1310 node *n;
1311{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001312 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001313 if (!c->c_infunction) {
1314 err_setstr(TypeError, "'return' outside function");
1315 c->c_errors++;
1316 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001317 if (NCH(n) < 2)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001318 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1319 else
1320 com_node(c, CHILD(n, 1));
1321 com_addbyte(c, RETURN_VALUE);
1322}
1323
1324static void
1325com_raise_stmt(c, n)
1326 struct compiling *c;
1327 node *n;
1328{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001329 REQ(n, raise_stmt); /* 'raise' test [',' test] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001330 com_node(c, CHILD(n, 1));
1331 if (NCH(n) > 3)
1332 com_node(c, CHILD(n, 3));
1333 else
1334 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1335 com_addbyte(c, RAISE_EXCEPTION);
1336}
1337
1338static void
1339com_import_stmt(c, n)
1340 struct compiling *c;
1341 node *n;
1342{
1343 int i;
1344 REQ(n, import_stmt);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001345 /* 'import' NAME (',' NAME)* |
1346 'from' NAME 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001347 if (STR(CHILD(n, 0))[0] == 'f') {
1348 /* 'from' NAME 'import' ... */
1349 REQ(CHILD(n, 1), NAME);
1350 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
1351 for (i = 3; i < NCH(n); i += 2)
1352 com_addopname(c, IMPORT_FROM, CHILD(n, i));
1353 com_addbyte(c, POP_TOP);
1354 }
1355 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001356 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001357 for (i = 1; i < NCH(n); i += 2) {
1358 com_addopname(c, IMPORT_NAME, CHILD(n, i));
1359 com_addopname(c, STORE_NAME, CHILD(n, i));
1360 }
1361 }
1362}
1363
1364static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00001365com_global_stmt(c, n)
1366 struct compiling *c;
1367 node *n;
1368{
1369 int i;
1370 object *v;
1371 REQ(n, global_stmt);
1372 /* 'global' NAME (',' NAME)* */
1373 for (i = 1; i < NCH(n); i += 2) {
1374 if (dictinsert(c->c_globals, STR(CHILD(n, i)), None) != 0)
1375 c->c_errors++;
1376 }
1377}
1378
1379static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001380com_if_stmt(c, n)
1381 struct compiling *c;
1382 node *n;
1383{
1384 int i;
1385 int anchor = 0;
1386 REQ(n, if_stmt);
1387 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
1388 for (i = 0; i+3 < NCH(n); i+=4) {
1389 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001390 node *ch = CHILD(n, i+1);
1391 if (i > 0)
1392 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001393 com_node(c, CHILD(n, i+1));
1394 com_addfwref(c, JUMP_IF_FALSE, &a);
1395 com_addbyte(c, POP_TOP);
1396 com_node(c, CHILD(n, i+3));
1397 com_addfwref(c, JUMP_FORWARD, &anchor);
1398 com_backpatch(c, a);
1399 com_addbyte(c, POP_TOP);
1400 }
1401 if (i+2 < NCH(n))
1402 com_node(c, CHILD(n, i+2));
1403 com_backpatch(c, anchor);
1404}
1405
1406static void
1407com_while_stmt(c, n)
1408 struct compiling *c;
1409 node *n;
1410{
1411 int break_anchor = 0;
1412 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001413 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001414 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
1415 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001416 block_push(c, SETUP_LOOP);
1417 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001418 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001419 com_node(c, CHILD(n, 1));
1420 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1421 com_addbyte(c, POP_TOP);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001422 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001423 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001424 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001425 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1426 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001427 com_backpatch(c, anchor);
1428 com_addbyte(c, POP_TOP);
1429 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001430 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001431 if (NCH(n) > 4)
1432 com_node(c, CHILD(n, 6));
1433 com_backpatch(c, break_anchor);
1434}
1435
1436static void
1437com_for_stmt(c, n)
1438 struct compiling *c;
1439 node *n;
1440{
1441 object *v;
1442 int break_anchor = 0;
1443 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001444 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001445 REQ(n, for_stmt);
1446 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
1447 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001448 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001449 com_node(c, CHILD(n, 3));
1450 v = newintobject(0L);
1451 if (v == NULL)
1452 c->c_errors++;
1453 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
1454 XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001455 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001456 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001457 com_addfwref(c, FOR_LOOP, &anchor);
1458 com_assign(c, CHILD(n, 1), 1/*assigning*/);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001459 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001460 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001461 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001462 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1463 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001464 com_backpatch(c, anchor);
1465 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001466 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001467 if (NCH(n) > 8)
1468 com_node(c, CHILD(n, 8));
1469 com_backpatch(c, break_anchor);
1470}
1471
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001472/* Although 'execpt' and 'finally' clauses can be combined
1473 syntactically, they are compiled separately. In fact,
1474 try: S
1475 except E1: S1
1476 except E2: S2
1477 ...
1478 finally: Sf
1479 is equivalent to
1480 try:
1481 try: S
1482 except E1: S1
1483 except E2: S2
1484 ...
1485 finally: Sf
1486 meaning that the 'finally' clause is entered even if things
1487 go wrong again in an exception handler. Note that this is
1488 not the case for exception handlers: at most one is entered.
1489
1490 Code generated for "try: S finally: Sf" is as follows:
1491
1492 SETUP_FINALLY L
1493 <code for S>
1494 POP_BLOCK
1495 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001496 L: <code for Sf>
1497 END_FINALLY
1498
1499 The special instructions use the block stack. Each block
1500 stack entry contains the instruction that created it (here
1501 SETUP_FINALLY), the level of the value stack at the time the
1502 block stack entry was created, and a label (here L).
1503
1504 SETUP_FINALLY:
1505 Pushes the current value stack level and the label
1506 onto the block stack.
1507 POP_BLOCK:
1508 Pops en entry from the block stack, and pops the value
1509 stack until its level is the same as indicated on the
1510 block stack. (The label is ignored.)
1511 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001512 Pops a variable number of entries from the *value* stack
1513 and re-raises the exception they specify. The number of
1514 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001515
1516 The block stack is unwound when an exception is raised:
1517 when a SETUP_FINALLY entry is found, the exception is pushed
1518 onto the value stack (and the exception condition is cleared),
1519 and the interpreter jumps to the label gotten from the block
1520 stack.
1521
1522 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00001523 (The contents of the value stack is shown in [], with the top
1524 at the right; 'tb' is trace-back info, 'val' the exception's
1525 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001526
1527 Value stack Label Instruction Argument
1528 [] SETUP_EXCEPT L1
1529 [] <code for S>
1530 [] POP_BLOCK
1531 [] JUMP_FORWARD L0
1532
Guido van Rossum3f5da241990-12-20 15:06:42 +00001533 [tb, val, exc] L1: DUP )
1534 [tb, val, exc, exc] <evaluate E1> )
1535 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
1536 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
1537 [tb, val, exc, 1] POP )
1538 [tb, val, exc] POP
1539 [tb, val] <assign to V1> (or POP if no V1)
1540 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001541 [] <code for S1>
1542 JUMP_FORWARD L0
1543
Guido van Rossum3f5da241990-12-20 15:06:42 +00001544 [tb, val, exc, 0] L2: POP
1545 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001546 .............................etc.......................
1547
Guido van Rossum3f5da241990-12-20 15:06:42 +00001548 [tb, val, exc, 0] Ln+1: POP
1549 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001550
1551 [] L0: <next statement>
1552
1553 Of course, parts are not generated if Vi or Ei is not present.
1554*/
1555
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001556static void
1557com_try_stmt(c, n)
1558 struct compiling *c;
1559 node *n;
1560{
1561 int finally_anchor = 0;
1562 int except_anchor = 0;
1563 REQ(n, try_stmt);
1564 /* 'try' ':' suite (except_clause ':' suite)* ['finally' ':' suite] */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001565
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001566 if (NCH(n) > 3 && TYPE(CHILD(n, NCH(n)-3)) != except_clause) {
1567 /* Have a 'finally' clause */
1568 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001569 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001570 }
1571 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == except_clause) {
1572 /* Have an 'except' clause */
1573 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001574 block_push(c, SETUP_EXCEPT);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001575 }
1576 com_node(c, CHILD(n, 2));
1577 if (except_anchor) {
1578 int end_anchor = 0;
1579 int i;
1580 node *ch;
1581 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001582 block_pop(c, SETUP_EXCEPT);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001583 com_addfwref(c, JUMP_FORWARD, &end_anchor);
1584 com_backpatch(c, except_anchor);
1585 for (i = 3;
1586 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
1587 i += 3) {
1588 /* except_clause: 'except' [expr [',' expr]] */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001589 if (except_anchor == 0) {
1590 err_setstr(TypeError,
1591 "default 'except:' must be last");
1592 c->c_errors++;
1593 break;
1594 }
1595 except_anchor = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001596 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001597 if (NCH(ch) > 1) {
1598 com_addbyte(c, DUP_TOP);
1599 com_node(c, CHILD(ch, 1));
1600 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001601 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001602 com_addbyte(c, POP_TOP);
1603 }
1604 com_addbyte(c, POP_TOP);
1605 if (NCH(ch) > 3)
1606 com_assign(c, CHILD(ch, 3), 1/*assigning*/);
1607 else
1608 com_addbyte(c, POP_TOP);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001609 com_addbyte(c, POP_TOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001610 com_node(c, CHILD(n, i+2));
1611 com_addfwref(c, JUMP_FORWARD, &end_anchor);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001612 if (except_anchor) {
1613 com_backpatch(c, except_anchor);
1614 com_addbyte(c, POP_TOP);
1615 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001616 }
1617 com_addbyte(c, END_FINALLY);
1618 com_backpatch(c, end_anchor);
1619 }
1620 if (finally_anchor) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001621 node *ch;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001622 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001623 block_pop(c, SETUP_FINALLY);
1624 block_push(c, END_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001625 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001626 com_backpatch(c, finally_anchor);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001627 ch = CHILD(n, NCH(n)-1);
1628 com_addoparg(c, SET_LINENO, ch->n_lineno);
1629 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001630 com_addbyte(c, END_FINALLY);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001631 block_pop(c, END_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001632 }
1633}
1634
1635static void
1636com_suite(c, n)
1637 struct compiling *c;
1638 node *n;
1639{
1640 REQ(n, suite);
1641 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
1642 if (NCH(n) == 1) {
1643 com_node(c, CHILD(n, 0));
1644 }
1645 else {
1646 int i;
1647 for (i = 0; i < NCH(n); i++) {
1648 node *ch = CHILD(n, i);
1649 if (TYPE(ch) == stmt)
1650 com_node(c, ch);
1651 }
1652 }
1653}
1654
1655static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001656com_continue_stmt(c, n)
1657 struct compiling *c;
1658 node *n;
1659{
1660 int i = c->c_nblocks;
1661 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
1662 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1663 }
1664 else {
1665 err_setstr(TypeError, "'continue' not properly in loop");
1666 c->c_errors++;
1667 }
1668 /* XXX Could allow it inside a 'finally' clause
1669 XXX if we could pop the exception still on the stack */
1670}
1671
1672static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001673com_funcdef(c, n)
1674 struct compiling *c;
1675 node *n;
1676{
1677 object *v;
1678 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001679 v = (object *)compile(n, c->c_filename);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001680 if (v == NULL)
1681 c->c_errors++;
1682 else {
1683 int i = com_addconst(c, v);
1684 com_addoparg(c, LOAD_CONST, i);
1685 com_addbyte(c, BUILD_FUNCTION);
1686 com_addopname(c, STORE_NAME, CHILD(n, 1));
1687 DECREF(v);
1688 }
1689}
1690
1691static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00001692com_oldbases(c, n)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001693 struct compiling *c;
1694 node *n;
1695{
1696 int i, nbases;
1697 REQ(n, baselist);
1698 /*
1699 baselist: atom arguments (',' atom arguments)*
Guido van Rossumc5e96291991-12-10 13:53:51 +00001700 arguments: '(' ')'
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001701 */
1702 for (i = 0; i < NCH(n); i += 3)
1703 com_node(c, CHILD(n, i));
1704 com_addoparg(c, BUILD_TUPLE, (NCH(n)+1) / 3);
1705}
1706
1707static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00001708com_newbases(c, n)
1709 struct compiling *c;
1710 node *n;
1711{
1712 int i, nbases;
1713 REQ(n, testlist);
1714 /* testlist: test (',' test)* [','] */
1715 for (i = 0; i < NCH(n); i += 2)
1716 com_node(c, CHILD(n, i));
1717 com_addoparg(c, BUILD_TUPLE, (NCH(n)+1) / 2);
1718}
1719
1720static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001721com_classdef(c, n)
1722 struct compiling *c;
1723 node *n;
1724{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001725 object *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001726 REQ(n, classdef);
1727 /*
Guido van Rossumc5e96291991-12-10 13:53:51 +00001728 classdef: 'class' NAME
1729 ['(' testlist ')' |'(' ')' ['=' baselist]] ':' suite
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001730 baselist: atom arguments (',' atom arguments)*
Guido van Rossumc5e96291991-12-10 13:53:51 +00001731 arguments: '(' ')'
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001732 */
Guido van Rossumc5e96291991-12-10 13:53:51 +00001733 /* This piece of code must push a tuple on the stack (the bases) */
1734 if (TYPE(CHILD(n, 2)) != LPAR) {
1735 /* New syntax without base classes:
1736 class NAME ':' suite
1737 ___________^
1738 */
1739 com_addoparg(c, BUILD_TUPLE, 0);
1740 }
1741 else {
1742 if (TYPE(CHILD(n, 3)) == RPAR) {
1743 /* Old syntax with or without base classes:
1744 class NAME '(' ')' ['=' baselist] ':' suite
1745 _______________^....^...^
1746 */
1747 if (TYPE(CHILD(n, 4)) == EQUAL)
1748 com_oldbases(c, CHILD(n, 5));
1749 else
1750 com_addoparg(c, BUILD_TUPLE, 0);
1751 }
1752 else {
1753 /* New syntax with base classes:
1754 class NAME '(' testlist ')' ':' suite
1755 _______________^
1756 */
1757 com_newbases(c, CHILD(n, 3));
1758 }
1759 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001760 v = (object *)compile(n, c->c_filename);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001761 if (v == NULL)
1762 c->c_errors++;
1763 else {
1764 int i = com_addconst(c, v);
1765 com_addoparg(c, LOAD_CONST, i);
1766 com_addbyte(c, BUILD_FUNCTION);
1767 com_addbyte(c, UNARY_CALL);
1768 com_addbyte(c, BUILD_CLASS);
1769 com_addopname(c, STORE_NAME, CHILD(n, 1));
1770 DECREF(v);
1771 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001772}
1773
1774static void
1775com_node(c, n)
1776 struct compiling *c;
1777 node *n;
1778{
1779 switch (TYPE(n)) {
1780
1781 /* Definition nodes */
1782
1783 case funcdef:
1784 com_funcdef(c, n);
1785 break;
1786 case classdef:
1787 com_classdef(c, n);
1788 break;
1789
1790 /* Trivial parse tree nodes */
1791
1792 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001793 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001794 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001795 com_node(c, CHILD(n, 0));
1796 break;
1797
1798 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001799 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
1800 com_addoparg(c, SET_LINENO, n->n_lineno);
1801 {
1802 int i;
1803 for (i = 0; i < NCH(n)-1; i += 2)
1804 com_node(c, CHILD(n, i));
1805 }
1806 break;
1807
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001808 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001809 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001810 com_node(c, CHILD(n, 0));
1811 break;
1812
1813 /* Statement nodes */
1814
1815 case expr_stmt:
1816 com_expr_stmt(c, n);
1817 break;
1818 case print_stmt:
1819 com_print_stmt(c, n);
1820 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001821 case del_stmt: /* 'del' exprlist */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001822 com_assign(c, CHILD(n, 1), 0/*delete*/);
1823 break;
1824 case pass_stmt:
1825 break;
1826 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001827 if (c->c_loops == 0) {
1828 err_setstr(TypeError, "'break' outside loop");
1829 c->c_errors++;
1830 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001831 com_addbyte(c, BREAK_LOOP);
1832 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001833 case continue_stmt:
1834 com_continue_stmt(c, n);
1835 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001836 case return_stmt:
1837 com_return_stmt(c, n);
1838 break;
1839 case raise_stmt:
1840 com_raise_stmt(c, n);
1841 break;
1842 case import_stmt:
1843 com_import_stmt(c, n);
1844 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001845 case global_stmt:
1846 com_global_stmt(c, n);
1847 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001848 case if_stmt:
1849 com_if_stmt(c, n);
1850 break;
1851 case while_stmt:
1852 com_while_stmt(c, n);
1853 break;
1854 case for_stmt:
1855 com_for_stmt(c, n);
1856 break;
1857 case try_stmt:
1858 com_try_stmt(c, n);
1859 break;
1860 case suite:
1861 com_suite(c, n);
1862 break;
1863
1864 /* Expression nodes */
1865
1866 case testlist:
1867 com_list(c, n);
1868 break;
1869 case test:
1870 com_test(c, n);
1871 break;
1872 case and_test:
1873 com_and_test(c, n);
1874 break;
1875 case not_test:
1876 com_not_test(c, n);
1877 break;
1878 case comparison:
1879 com_comparison(c, n);
1880 break;
1881 case exprlist:
1882 com_list(c, n);
1883 break;
1884 case expr:
1885 com_expr(c, n);
1886 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001887 case xor_expr:
1888 com_xor_expr(c, n);
1889 break;
1890 case and_expr:
1891 com_and_expr(c, n);
1892 break;
1893 case shift_expr:
1894 com_shift_expr(c, n);
1895 break;
1896 case arith_expr:
1897 com_arith_expr(c, n);
1898 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001899 case term:
1900 com_term(c, n);
1901 break;
1902 case factor:
1903 com_factor(c, n);
1904 break;
1905 case atom:
1906 com_atom(c, n);
1907 break;
1908
1909 default:
1910 fprintf(stderr, "node type %d\n", TYPE(n));
1911 err_setstr(SystemError, "com_node: unexpected node type");
1912 c->c_errors++;
1913 }
1914}
1915
1916static void com_fplist PROTO((struct compiling *, node *));
1917
1918static void
1919com_fpdef(c, n)
1920 struct compiling *c;
1921 node *n;
1922{
1923 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
1924 if (TYPE(CHILD(n, 0)) == LPAR)
1925 com_fplist(c, CHILD(n, 1));
1926 else
1927 com_addopname(c, STORE_NAME, CHILD(n, 0));
1928}
1929
1930static void
1931com_fplist(c, n)
1932 struct compiling *c;
1933 node *n;
1934{
1935 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* */
1936 if (NCH(n) == 1) {
1937 com_fpdef(c, CHILD(n, 0));
1938 }
1939 else {
1940 int i;
1941 com_addoparg(c, UNPACK_TUPLE, (NCH(n)+1)/2);
1942 for (i = 0; i < NCH(n); i += 2)
1943 com_fpdef(c, CHILD(n, i));
1944 }
1945}
1946
1947static void
1948com_file_input(c, n)
1949 struct compiling *c;
1950 node *n;
1951{
1952 int i;
1953 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
1954 for (i = 0; i < NCH(n); i++) {
1955 node *ch = CHILD(n, i);
1956 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
1957 com_node(c, ch);
1958 }
1959}
1960
1961/* Top-level compile-node interface */
1962
1963static void
1964compile_funcdef(c, n)
1965 struct compiling *c;
1966 node *n;
1967{
1968 node *ch;
1969 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
1970 ch = CHILD(n, 2); /* parameters: '(' [fplist] ')' */
1971 ch = CHILD(ch, 1); /* ')' | fplist */
1972 if (TYPE(ch) == RPAR)
1973 com_addbyte(c, REFUSE_ARGS);
1974 else {
1975 com_addbyte(c, REQUIRE_ARGS);
1976 com_fplist(c, ch);
1977 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001978 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001979 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001980 c->c_infunction = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001981 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1982 com_addbyte(c, RETURN_VALUE);
1983}
1984
1985static void
1986compile_node(c, n)
1987 struct compiling *c;
1988 node *n;
1989{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001990 com_addoparg(c, SET_LINENO, n->n_lineno);
1991
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001992 switch (TYPE(n)) {
1993
Guido van Rossum4c417781991-01-21 16:09:22 +00001994 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001995 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001996 com_addbyte(c, REFUSE_ARGS);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001997 n = CHILD(n, 0);
1998 if (TYPE(n) != NEWLINE)
1999 com_node(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002000 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2001 com_addbyte(c, RETURN_VALUE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002002 break;
2003
Guido van Rossum4c417781991-01-21 16:09:22 +00002004 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002005 com_addbyte(c, REFUSE_ARGS);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002006 com_file_input(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002007 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2008 com_addbyte(c, RETURN_VALUE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002009 break;
2010
Guido van Rossum4c417781991-01-21 16:09:22 +00002011 case expr_input: /* Built-in function eval() */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002012 com_addbyte(c, REFUSE_ARGS);
2013 com_node(c, CHILD(n, 0));
2014 com_addbyte(c, RETURN_VALUE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002015 break;
2016
Guido van Rossum4c417781991-01-21 16:09:22 +00002017 case eval_input: /* Built-in function input() */
2018 com_addbyte(c, REFUSE_ARGS);
2019 com_node(c, CHILD(n, 0));
2020 com_addbyte(c, RETURN_VALUE);
2021 break;
2022
2023 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002024 compile_funcdef(c, n);
2025 break;
2026
Guido van Rossum4c417781991-01-21 16:09:22 +00002027 case classdef: /* A class definition */
Guido van Rossumc5e96291991-12-10 13:53:51 +00002028 /* classdef: 'class' NAME
2029 ['(' testlist ')' |'(' ')' ['=' baselist]]
2030 ':' suite */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002031 com_addbyte(c, REFUSE_ARGS);
Guido van Rossumc5e96291991-12-10 13:53:51 +00002032 com_node(c, CHILD(n, NCH(n)-1)); /* The suite */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002033 com_addbyte(c, LOAD_LOCALS);
2034 com_addbyte(c, RETURN_VALUE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002035 break;
2036
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002037 default:
2038 fprintf(stderr, "node type %d\n", TYPE(n));
2039 err_setstr(SystemError, "compile_node: unexpected node type");
2040 c->c_errors++;
2041 }
2042}
2043
Guido van Rossum282914b1991-04-04 10:42:56 +00002044/* Optimization for local and global variables.
2045
2046 Attempt to replace all LOAD_NAME instructions that refer to a local
2047 variable with LOAD_LOCAL instructions, and all that refer to a global
2048 variable with LOAD_GLOBAL instructions.
2049
2050 To find all local variables, we check all STORE_NAME and IMPORT_FROM
2051 instructions. This yields all local variables, including arguments,
2052 function definitions, class definitions and import statements.
2053
2054 There is one leak: 'from foo import *' introduces local variables
2055 that we can't know while compiling. If this is the case, LOAD_GLOBAL
2056 instructions are not generated -- LOAD_NAME is left in place for
2057 globals, since it first checks for globals (LOAD_LOCAL is still used
2058 for recognized locals, since it doesn't hurt).
2059
2060 This optimization means that using the same name as a global and
2061 as a local variable within the same scope is now illegal, which
2062 is a change to the language! Also using eval() to introduce new
2063 local variables won't work. But both were bad practice at best.
2064
2065 The optimization doesn't save much: basically, it saves one
2066 unsuccessful dictionary lookup per global (or built-in) variable
2067 reference. On the (slow!) Mac Plus, with 4 local variables,
2068 this saving was measured to be about 0.18 ms. We might save more
2069 by using a different data structure to hold local variables, like
2070 an array indexed by variable number.
2071
2072 NB: this modifies the string object co->co_code!
2073*/
2074
2075static void
2076optimizer(co)
2077 codeobject *co;
2078{
Guido van Rossum0a697f61991-04-16 08:39:12 +00002079 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00002080 object *locals;
2081 int opcode;
2082 int oparg;
2083 object *name;
2084 int star_used;
Guido van Rossum0a697f61991-04-16 08:39:12 +00002085
Guido van Rossum282914b1991-04-04 10:42:56 +00002086#define NEXTOP() (*next_instr++)
2087#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
2088#define GETITEM(v, i) (getlistitem((v), (i)))
2089#define GETNAMEOBJ(i) (GETITEM(co->co_names, (i)))
2090
2091 locals = newdictobject();
2092 if (locals == NULL) {
2093 err_clear();
2094 return; /* For now, this is OK */
2095 }
2096
Guido van Rossum0a697f61991-04-16 08:39:12 +00002097 next_instr = (unsigned char *) GETSTRINGVALUE(co->co_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00002098 for (;;) {
2099 opcode = NEXTOP();
2100 if (opcode == STOP_CODE)
2101 break;
2102 if (HAS_ARG(opcode))
2103 oparg = NEXTARG();
2104 if (opcode == STORE_NAME || opcode == IMPORT_FROM) {
2105 name = GETNAMEOBJ(oparg);
2106 if (dict2insert(locals, name, None) != 0) {
2107 DECREF(locals);
2108 return; /* Sorry */
2109 }
2110 }
2111 }
2112
2113 star_used = (dictlookup(locals, "*") != NULL);
Guido van Rossum0a697f61991-04-16 08:39:12 +00002114 next_instr = (unsigned char *) GETSTRINGVALUE(co->co_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00002115 for (;;) {
2116 cur_instr = next_instr;
2117 opcode = NEXTOP();
2118 if (opcode == STOP_CODE)
2119 break;
2120 if (HAS_ARG(opcode))
2121 oparg = NEXTARG();
2122 if (opcode == LOAD_NAME) {
2123 name = GETNAMEOBJ(oparg);
Guido van Rossum83163251991-08-16 08:58:43 +00002124 if (dict2lookup(locals, name) != NULL)
Guido van Rossum282914b1991-04-04 10:42:56 +00002125 *cur_instr = LOAD_LOCAL;
Guido van Rossum83163251991-08-16 08:58:43 +00002126 else {
2127 err_clear();
2128 if (!star_used)
2129 *cur_instr = LOAD_GLOBAL;
2130 }
Guido van Rossum282914b1991-04-04 10:42:56 +00002131 }
2132 }
2133
2134 DECREF(locals);
2135}
2136
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002137codeobject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002138compile(n, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002139 node *n;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002140 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002141{
2142 struct compiling sc;
2143 codeobject *co;
Guido van Rossuma082ce41991-06-04 19:41:56 +00002144 object *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002145 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002146 return NULL;
2147 compile_node(&sc, n);
2148 com_done(&sc);
Guido van Rossuma082ce41991-06-04 19:41:56 +00002149 if (sc.c_errors == 0 && (v = newstringobject(filename)) != NULL) {
2150 co = newcodeobject(sc.c_code, sc.c_consts, sc.c_names, v);
2151 DECREF(v);
2152 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002153 else
2154 co = NULL;
2155 com_free(&sc);
Guido van Rossumfb8edfc1991-05-14 11:56:03 +00002156 if (co != NULL && filename[0] != '<')
Guido van Rossum282914b1991-04-04 10:42:56 +00002157 optimizer(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002158 return co;
2159}