blob: 99aaf1b38471794f1931fe7d4b69842b61fb6795 [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 *));
Guido van Rossum288a60f1991-12-16 13:05:10 +0000196static void com_list PROTO((struct compiling *, node *, int));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000197
198static int
Guido van Rossum3f5da241990-12-20 15:06:42 +0000199com_init(c, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000200 struct compiling *c;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000201 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000202{
Guido van Rossum62d46241991-04-03 19:00:23 +0000203 if ((c->c_code = newsizedstringobject((char *)NULL, 1000)) == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000204 goto fail_3;
205 if ((c->c_consts = newlistobject(0)) == NULL)
206 goto fail_2;
207 if ((c->c_names = newlistobject(0)) == NULL)
208 goto fail_1;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000209 if ((c->c_globals = newdictobject()) == NULL)
210 goto fail_0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000211 c->c_nexti = 0;
212 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000213 c->c_infunction = 0;
214 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000215 c->c_begin = 0;
216 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000217 c->c_filename = filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000218 return 1;
219
Guido van Rossumc5e96291991-12-10 13:53:51 +0000220 fail_0:
221 DECREF(c->c_names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000222 fail_1:
223 DECREF(c->c_consts);
224 fail_2:
225 DECREF(c->c_code);
226 fail_3:
227 return 0;
228}
229
230static void
231com_free(c)
232 struct compiling *c;
233{
234 XDECREF(c->c_code);
235 XDECREF(c->c_consts);
236 XDECREF(c->c_names);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000237 XDECREF(c->c_globals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000238}
239
240static void
241com_done(c)
242 struct compiling *c;
243{
244 if (c->c_code != NULL)
245 resizestring(&c->c_code, c->c_nexti);
246}
247
248static void
249com_addbyte(c, byte)
250 struct compiling *c;
251 int byte;
252{
253 int len;
254 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000255 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000256 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
257 abort();
Guido van Rossum01cfd441991-10-20 20:12:38 +0000258 */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000259 err_setstr(SystemError, "com_addbyte: byte out of range");
260 c->c_errors++;
261 }
262 if (c->c_code == NULL)
263 return;
264 len = getstringsize(c->c_code);
265 if (c->c_nexti >= len) {
266 if (resizestring(&c->c_code, len+1000) != 0) {
267 c->c_errors++;
268 return;
269 }
270 }
271 getstringvalue(c->c_code)[c->c_nexti++] = byte;
272}
273
274static void
275com_addint(c, x)
276 struct compiling *c;
277 int x;
278{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000279 com_addbyte(c, x & 0xff);
280 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000281}
282
283static void
284com_addoparg(c, op, arg)
285 struct compiling *c;
286 int op;
287 int arg;
288{
289 com_addbyte(c, op);
290 com_addint(c, arg);
291}
292
293static void
294com_addfwref(c, op, p_anchor)
295 struct compiling *c;
296 int op;
297 int *p_anchor;
298{
299 /* Compile a forward reference for backpatching */
300 int here;
301 int anchor;
302 com_addbyte(c, op);
303 here = c->c_nexti;
304 anchor = *p_anchor;
305 *p_anchor = here;
306 com_addint(c, anchor == 0 ? 0 : here - anchor);
307}
308
309static void
310com_backpatch(c, anchor)
311 struct compiling *c;
312 int anchor; /* Must be nonzero */
313{
314 unsigned char *code = (unsigned char *) getstringvalue(c->c_code);
315 int target = c->c_nexti;
316 int lastanchor = 0;
317 int dist;
318 int prev;
319 for (;;) {
320 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000321 prev = code[anchor] + (code[anchor+1] << 8);
322 dist = target - (anchor+2);
323 code[anchor] = dist & 0xff;
324 code[anchor+1] = dist >> 8;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000325 if (!prev)
326 break;
327 lastanchor = anchor;
328 anchor -= prev;
329 }
330}
331
332/* Handle constants and names uniformly */
333
334static int
335com_add(c, list, v)
336 struct compiling *c;
337 object *list;
338 object *v;
339{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000340 int n = getlistsize(list);
341 int i;
342 for (i = n; --i >= 0; ) {
343 object *w = getlistitem(list, i);
Guido van Rossumefc0bd01991-07-01 18:44:20 +0000344 if (v->ob_type == w->ob_type && cmpobject(v, w) == 0)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000345 return i;
346 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000347 if (addlistitem(list, v) != 0)
348 c->c_errors++;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000349 return n;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000350}
351
352static int
353com_addconst(c, v)
354 struct compiling *c;
355 object *v;
356{
357 return com_add(c, c->c_consts, v);
358}
359
360static int
361com_addname(c, v)
362 struct compiling *c;
363 object *v;
364{
365 return com_add(c, c->c_names, v);
366}
367
368static void
369com_addopname(c, op, n)
370 struct compiling *c;
371 int op;
372 node *n;
373{
374 object *v;
375 int i;
376 char *name;
377 if (TYPE(n) == STAR)
378 name = "*";
379 else {
380 REQ(n, NAME);
381 name = STR(n);
382 }
383 if ((v = newstringobject(name)) == NULL) {
384 c->c_errors++;
385 i = 255;
386 }
387 else {
388 i = com_addname(c, v);
389 DECREF(v);
390 }
Guido van Rossumc5e96291991-12-10 13:53:51 +0000391 /* Hack to replace *_NAME opcodes by *_GLOBAL if necessary */
392 switch (op) {
393 case LOAD_NAME:
394 case STORE_NAME:
395 case DELETE_NAME:
396 if (dictlookup(c->c_globals, name) != NULL) {
397 switch (op) {
398 case LOAD_NAME: op = LOAD_GLOBAL; break;
399 case STORE_NAME: op = STORE_GLOBAL; break;
400 case DELETE_NAME: op = DELETE_GLOBAL; break;
401 }
402 }
403 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000404 com_addoparg(c, op, i);
405}
406
407static object *
408parsenumber(s)
409 char *s;
410{
411 extern long strtol();
Guido van Rossum282914b1991-04-04 10:42:56 +0000412 extern double strtod();
Guido van Rossumc5e96291991-12-10 13:53:51 +0000413 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000414 long x;
Guido van Rossum282914b1991-04-04 10:42:56 +0000415 double xx;
416 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000417 end = s + strlen(s) - 1;
418 if (*end == 'l' || *end == 'L') {
419 extern object *long_scan();
420 return long_scan(s, 0);
421 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000422 x = strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +0000423 if (*end == '\0') {
424 if (errno != 0) {
425 err_setstr(RuntimeError, "integer constant too large");
426 return NULL;
427 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000428 return newintobject(x);
Guido van Rossum282914b1991-04-04 10:42:56 +0000429 }
430 errno = 0;
431 xx = strtod(s, &end);
432 if (*end == '\0') {
433 if (errno != 0) {
434 err_setstr(RuntimeError, "float constant too large");
435 return NULL;
436 }
437 return newfloatobject(xx);
438 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000439 err_setstr(RuntimeError, "bad number syntax");
440 return NULL;
441}
442
443static object *
444parsestr(s)
445 char *s;
446{
447 object *v;
448 int len;
449 char *buf;
450 char *p;
451 int c;
452 if (*s != '\'') {
453 err_badcall();
454 return NULL;
455 }
456 s++;
457 len = strlen(s);
458 if (s[--len] != '\'') {
459 err_badcall();
460 return NULL;
461 }
462 if (strchr(s, '\\') == NULL)
463 return newsizedstringobject(s, len);
464 v = newsizedstringobject((char *)NULL, len);
465 p = buf = getstringvalue(v);
466 while (*s != '\0' && *s != '\'') {
467 if (*s != '\\') {
468 *p++ = *s++;
469 continue;
470 }
471 s++;
472 switch (*s++) {
473 /* XXX This assumes ASCII! */
474 case '\\': *p++ = '\\'; break;
475 case '\'': *p++ = '\''; break;
476 case 'b': *p++ = '\b'; break;
477 case 'f': *p++ = '\014'; break; /* FF */
478 case 't': *p++ = '\t'; break;
479 case 'n': *p++ = '\n'; break;
480 case 'r': *p++ = '\r'; break;
481 case 'v': *p++ = '\013'; break; /* VT */
482 case 'E': *p++ = '\033'; break; /* ESC, not C */
483 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
484 case '0': case '1': case '2': case '3':
485 case '4': case '5': case '6': case '7':
486 c = s[-1] - '0';
487 if ('0' <= *s && *s <= '7') {
488 c = (c<<3) + *s++ - '0';
489 if ('0' <= *s && *s <= '7')
490 c = (c<<3) + *s++ - '0';
491 }
492 *p++ = c;
493 break;
494 case 'x':
495 if (isxdigit(*s)) {
496 sscanf(s, "%x", &c);
497 *p++ = c;
498 do {
499 s++;
500 } while (isxdigit(*s));
501 break;
502 }
503 /* FALLTHROUGH */
504 default: *p++ = '\\'; *p++ = s[-1]; break;
505 }
506 }
507 resizestring(&v, (int)(p - buf));
508 return v;
509}
510
511static void
512com_list_constructor(c, n)
513 struct compiling *c;
514 node *n;
515{
516 int len;
517 int i;
518 object *v, *w;
519 if (TYPE(n) != testlist)
520 REQ(n, exprlist);
521 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
522 len = (NCH(n) + 1) / 2;
523 for (i = 0; i < NCH(n); i += 2)
524 com_node(c, CHILD(n, i));
525 com_addoparg(c, BUILD_LIST, len);
526}
527
528static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000529com_dictmaker(c, n)
530 struct compiling *c;
531 node *n;
532{
533 int i;
534 /* dictmaker: test ':' test (',' test ':' value)* [','] */
535 for (i = 0; i+2 < NCH(n); i += 4) {
536 /* We must arrange things just right for STORE_SUBSCR.
537 It wants the stack to look like (value) (dict) (key) */
538 com_addbyte(c, DUP_TOP);
539 com_node(c, CHILD(n, i+2)); /* value */
540 com_addbyte(c, ROT_TWO);
541 com_node(c, CHILD(n, i)); /* key */
542 com_addbyte(c, STORE_SUBSCR);
543 }
544}
545
546static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000547com_atom(c, n)
548 struct compiling *c;
549 node *n;
550{
551 node *ch;
552 object *v;
553 int i;
554 REQ(n, atom);
555 ch = CHILD(n, 0);
556 switch (TYPE(ch)) {
557 case LPAR:
558 if (TYPE(CHILD(n, 1)) == RPAR)
559 com_addoparg(c, BUILD_TUPLE, 0);
560 else
561 com_node(c, CHILD(n, 1));
562 break;
563 case LSQB:
564 if (TYPE(CHILD(n, 1)) == RSQB)
565 com_addoparg(c, BUILD_LIST, 0);
566 else
567 com_list_constructor(c, CHILD(n, 1));
568 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000569 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000570 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000571 if (TYPE(CHILD(n, 1)) != RBRACE)
572 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000573 break;
574 case BACKQUOTE:
575 com_node(c, CHILD(n, 1));
576 com_addbyte(c, UNARY_CONVERT);
577 break;
578 case NUMBER:
579 if ((v = parsenumber(STR(ch))) == NULL) {
580 c->c_errors++;
581 i = 255;
582 }
583 else {
584 i = com_addconst(c, v);
585 DECREF(v);
586 }
587 com_addoparg(c, LOAD_CONST, i);
588 break;
589 case STRING:
590 if ((v = parsestr(STR(ch))) == NULL) {
591 c->c_errors++;
592 i = 255;
593 }
594 else {
595 i = com_addconst(c, v);
596 DECREF(v);
597 }
598 com_addoparg(c, LOAD_CONST, i);
599 break;
600 case NAME:
601 com_addopname(c, LOAD_NAME, ch);
602 break;
603 default:
604 fprintf(stderr, "node type %d\n", TYPE(ch));
605 err_setstr(SystemError, "com_atom: unexpected node type");
606 c->c_errors++;
607 }
608}
609
610static void
611com_slice(c, n, op)
612 struct compiling *c;
613 node *n;
614 int op;
615{
616 if (NCH(n) == 1) {
617 com_addbyte(c, op);
618 }
619 else if (NCH(n) == 2) {
620 if (TYPE(CHILD(n, 0)) != COLON) {
621 com_node(c, CHILD(n, 0));
622 com_addbyte(c, op+1);
623 }
624 else {
625 com_node(c, CHILD(n, 1));
626 com_addbyte(c, op+2);
627 }
628 }
629 else {
630 com_node(c, CHILD(n, 0));
631 com_node(c, CHILD(n, 2));
632 com_addbyte(c, op+3);
633 }
634}
635
636static void
637com_apply_subscript(c, n)
638 struct compiling *c;
639 node *n;
640{
641 REQ(n, subscript);
642 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) != COLON) {
643 /* It's a single subscript */
644 com_node(c, CHILD(n, 0));
645 com_addbyte(c, BINARY_SUBSCR);
646 }
647 else {
648 /* It's a slice: [expr] ':' [expr] */
649 com_slice(c, n, SLICE);
650 }
651}
652
653static void
654com_call_function(c, n)
655 struct compiling *c;
656 node *n; /* EITHER testlist OR ')' */
657{
658 if (TYPE(n) == RPAR) {
Guido van Rossum288a60f1991-12-16 13:05:10 +0000659 com_addoparg(c, BUILD_TUPLE, 0);
660 com_addbyte(c, BINARY_CALL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000661 }
662 else {
Guido van Rossum288a60f1991-12-16 13:05:10 +0000663 int i;
664 REQ(n, testlist);
665 com_list(c, n, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000666 com_addbyte(c, BINARY_CALL);
667 }
668}
669
670static void
671com_select_member(c, n)
672 struct compiling *c;
673 node *n;
674{
675 com_addopname(c, LOAD_ATTR, n);
676}
677
678static void
679com_apply_trailer(c, n)
680 struct compiling *c;
681 node *n;
682{
683 REQ(n, trailer);
684 switch (TYPE(CHILD(n, 0))) {
685 case LPAR:
686 com_call_function(c, CHILD(n, 1));
687 break;
688 case DOT:
689 com_select_member(c, CHILD(n, 1));
690 break;
691 case LSQB:
692 com_apply_subscript(c, CHILD(n, 1));
693 break;
694 default:
695 err_setstr(SystemError,
696 "com_apply_trailer: unknown trailer type");
697 c->c_errors++;
698 }
699}
700
701static void
702com_factor(c, n)
703 struct compiling *c;
704 node *n;
705{
706 int i;
707 REQ(n, factor);
708 if (TYPE(CHILD(n, 0)) == PLUS) {
709 com_factor(c, CHILD(n, 1));
710 com_addbyte(c, UNARY_POSITIVE);
711 }
712 else if (TYPE(CHILD(n, 0)) == MINUS) {
713 com_factor(c, CHILD(n, 1));
714 com_addbyte(c, UNARY_NEGATIVE);
715 }
Guido van Rossum7928cd71991-10-24 14:59:31 +0000716 else if (TYPE(CHILD(n, 0)) == TILDE) {
717 com_factor(c, CHILD(n, 1));
718 com_addbyte(c, UNARY_INVERT);
719 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000720 else {
721 com_atom(c, CHILD(n, 0));
722 for (i = 1; i < NCH(n); i++)
723 com_apply_trailer(c, CHILD(n, i));
724 }
725}
726
727static void
728com_term(c, n)
729 struct compiling *c;
730 node *n;
731{
732 int i;
733 int op;
734 REQ(n, term);
735 com_factor(c, CHILD(n, 0));
736 for (i = 2; i < NCH(n); i += 2) {
737 com_factor(c, CHILD(n, i));
738 switch (TYPE(CHILD(n, i-1))) {
739 case STAR:
740 op = BINARY_MULTIPLY;
741 break;
742 case SLASH:
743 op = BINARY_DIVIDE;
744 break;
745 case PERCENT:
746 op = BINARY_MODULO;
747 break;
748 default:
749 err_setstr(SystemError,
Guido van Rossum7928cd71991-10-24 14:59:31 +0000750 "com_term: operator not *, / or %");
751 c->c_errors++;
752 op = 255;
753 }
754 com_addbyte(c, op);
755 }
756}
757
758static void
759com_arith_expr(c, n)
760 struct compiling *c;
761 node *n;
762{
763 int i;
764 int op;
765 REQ(n, arith_expr);
766 com_term(c, CHILD(n, 0));
767 for (i = 2; i < NCH(n); i += 2) {
768 com_term(c, CHILD(n, i));
769 switch (TYPE(CHILD(n, i-1))) {
770 case PLUS:
771 op = BINARY_ADD;
772 break;
773 case MINUS:
774 op = BINARY_SUBTRACT;
775 break;
776 default:
777 err_setstr(SystemError,
778 "com_arith_expr: operator not + or -");
779 c->c_errors++;
780 op = 255;
781 }
782 com_addbyte(c, op);
783 }
784}
785
786static void
787com_shift_expr(c, n)
788 struct compiling *c;
789 node *n;
790{
791 int i;
792 int op;
793 REQ(n, shift_expr);
794 com_arith_expr(c, CHILD(n, 0));
795 for (i = 2; i < NCH(n); i += 2) {
796 com_arith_expr(c, CHILD(n, i));
797 switch (TYPE(CHILD(n, i-1))) {
798 case LEFTSHIFT:
799 op = BINARY_LSHIFT;
800 break;
801 case RIGHTSHIFT:
802 op = BINARY_RSHIFT;
803 break;
804 default:
805 err_setstr(SystemError,
806 "com_shift_expr: operator not << or >>");
807 c->c_errors++;
808 op = 255;
809 }
810 com_addbyte(c, op);
811 }
812}
813
814static void
815com_and_expr(c, n)
816 struct compiling *c;
817 node *n;
818{
819 int i;
820 int op;
821 REQ(n, and_expr);
822 com_shift_expr(c, CHILD(n, 0));
823 for (i = 2; i < NCH(n); i += 2) {
824 com_shift_expr(c, CHILD(n, i));
825 if (TYPE(CHILD(n, i-1)) == AMPER) {
826 op = BINARY_AND;
827 }
828 else {
829 err_setstr(SystemError,
830 "com_and_expr: operator not &");
831 c->c_errors++;
832 op = 255;
833 }
834 com_addbyte(c, op);
835 }
836}
837
838static void
839com_xor_expr(c, n)
840 struct compiling *c;
841 node *n;
842{
843 int i;
844 int op;
845 REQ(n, xor_expr);
846 com_and_expr(c, CHILD(n, 0));
847 for (i = 2; i < NCH(n); i += 2) {
848 com_and_expr(c, CHILD(n, i));
849 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
850 op = BINARY_XOR;
851 }
852 else {
853 err_setstr(SystemError,
854 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000855 c->c_errors++;
856 op = 255;
857 }
858 com_addbyte(c, op);
859 }
860}
861
862static void
863com_expr(c, n)
864 struct compiling *c;
865 node *n;
866{
867 int i;
868 int op;
869 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000870 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000871 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +0000872 com_xor_expr(c, CHILD(n, i));
873 if (TYPE(CHILD(n, i-1)) == VBAR) {
874 op = BINARY_OR;
875 }
876 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000877 err_setstr(SystemError,
Guido van Rossum7928cd71991-10-24 14:59:31 +0000878 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000879 c->c_errors++;
880 op = 255;
881 }
882 com_addbyte(c, op);
883 }
884}
885
886static enum cmp_op
887cmp_type(n)
888 node *n;
889{
890 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +0000891 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000892 | 'in' | 'not' 'in' | 'is' | 'is' not' */
893 if (NCH(n) == 1) {
894 n = CHILD(n, 0);
895 switch (TYPE(n)) {
896 case LESS: return LT;
897 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +0000898 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000899 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +0000900 case LESSEQUAL: return LE;
901 case GREATEREQUAL: return GE;
902 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000903 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
904 if (strcmp(STR(n), "is") == 0) return IS;
905 }
906 }
907 else if (NCH(n) == 2) {
908 int t2 = TYPE(CHILD(n, 1));
909 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000910 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
911 return NOT_IN;
912 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
913 return IS_NOT;
914 }
915 }
916 return BAD;
917}
918
919static void
920com_comparison(c, n)
921 struct compiling *c;
922 node *n;
923{
924 int i;
925 enum cmp_op op;
926 int anchor;
927 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
928 com_expr(c, CHILD(n, 0));
929 if (NCH(n) == 1)
930 return;
931
932 /****************************************************************
933 The following code is generated for all but the last
934 comparison in a chain:
935
936 label: on stack: opcode: jump to:
937
938 a <code to load b>
939 a, b DUP_TOP
940 a, b, b ROT_THREE
941 b, a, b COMPARE_OP
942 b, 0-or-1 JUMP_IF_FALSE L1
943 b, 1 POP_TOP
944 b
945
946 We are now ready to repeat this sequence for the next
947 comparison in the chain.
948
949 For the last we generate:
950
951 b <code to load c>
952 b, c COMPARE_OP
953 0-or-1
954
955 If there were any jumps to L1 (i.e., there was more than one
956 comparison), we generate:
957
958 0-or-1 JUMP_FORWARD L2
959 L1: b, 0 ROT_TWO
960 0, b POP_TOP
961 0
962 L2:
963 ****************************************************************/
964
965 anchor = 0;
966
967 for (i = 2; i < NCH(n); i += 2) {
968 com_expr(c, CHILD(n, i));
969 if (i+2 < NCH(n)) {
970 com_addbyte(c, DUP_TOP);
971 com_addbyte(c, ROT_THREE);
972 }
973 op = cmp_type(CHILD(n, i-1));
974 if (op == BAD) {
975 err_setstr(SystemError,
976 "com_comparison: unknown comparison op");
977 c->c_errors++;
978 }
979 com_addoparg(c, COMPARE_OP, op);
980 if (i+2 < NCH(n)) {
981 com_addfwref(c, JUMP_IF_FALSE, &anchor);
982 com_addbyte(c, POP_TOP);
983 }
984 }
985
986 if (anchor) {
987 int anchor2 = 0;
988 com_addfwref(c, JUMP_FORWARD, &anchor2);
989 com_backpatch(c, anchor);
990 com_addbyte(c, ROT_TWO);
991 com_addbyte(c, POP_TOP);
992 com_backpatch(c, anchor2);
993 }
994}
995
996static void
997com_not_test(c, n)
998 struct compiling *c;
999 node *n;
1000{
1001 REQ(n, not_test); /* 'not' not_test | comparison */
1002 if (NCH(n) == 1) {
1003 com_comparison(c, CHILD(n, 0));
1004 }
1005 else {
1006 com_not_test(c, CHILD(n, 1));
1007 com_addbyte(c, UNARY_NOT);
1008 }
1009}
1010
1011static void
1012com_and_test(c, n)
1013 struct compiling *c;
1014 node *n;
1015{
1016 int i;
1017 int anchor;
1018 REQ(n, and_test); /* not_test ('and' not_test)* */
1019 anchor = 0;
1020 i = 0;
1021 for (;;) {
1022 com_not_test(c, CHILD(n, i));
1023 if ((i += 2) >= NCH(n))
1024 break;
1025 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1026 com_addbyte(c, POP_TOP);
1027 }
1028 if (anchor)
1029 com_backpatch(c, anchor);
1030}
1031
1032static void
1033com_test(c, n)
1034 struct compiling *c;
1035 node *n;
1036{
1037 int i;
1038 int anchor;
1039 REQ(n, test); /* and_test ('and' and_test)* */
1040 anchor = 0;
1041 i = 0;
1042 for (;;) {
1043 com_and_test(c, CHILD(n, i));
1044 if ((i += 2) >= NCH(n))
1045 break;
1046 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1047 com_addbyte(c, POP_TOP);
1048 }
1049 if (anchor)
1050 com_backpatch(c, anchor);
1051}
1052
1053static void
Guido van Rossum288a60f1991-12-16 13:05:10 +00001054com_list(c, n, toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001055 struct compiling *c;
1056 node *n;
Guido van Rossum288a60f1991-12-16 13:05:10 +00001057 int toplevel; /* If nonzero, *always* build a tuple */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001058{
1059 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001060 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001061 com_node(c, CHILD(n, 0));
1062 }
1063 else {
1064 int i;
1065 int len;
1066 len = (NCH(n) + 1) / 2;
1067 for (i = 0; i < NCH(n); i += 2)
1068 com_node(c, CHILD(n, i));
1069 com_addoparg(c, BUILD_TUPLE, len);
1070 }
1071}
1072
1073
1074/* Begin of assignment compilation */
1075
1076static void com_assign_name PROTO((struct compiling *, node *, int));
1077static void com_assign PROTO((struct compiling *, node *, int));
1078
1079static void
1080com_assign_attr(c, n, assigning)
1081 struct compiling *c;
1082 node *n;
1083 int assigning;
1084{
1085 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
1086}
1087
1088static void
1089com_assign_slice(c, n, assigning)
1090 struct compiling *c;
1091 node *n;
1092 int assigning;
1093{
1094 com_slice(c, n, assigning ? STORE_SLICE : DELETE_SLICE);
1095}
1096
1097static void
1098com_assign_subscript(c, n, assigning)
1099 struct compiling *c;
1100 node *n;
1101 int assigning;
1102{
1103 com_node(c, n);
1104 com_addbyte(c, assigning ? STORE_SUBSCR : DELETE_SUBSCR);
1105}
1106
1107static void
1108com_assign_trailer(c, n, assigning)
1109 struct compiling *c;
1110 node *n;
1111 int assigning;
1112{
1113 char *name;
1114 REQ(n, trailer);
1115 switch (TYPE(CHILD(n, 0))) {
1116 case LPAR: /* '(' [exprlist] ')' */
1117 err_setstr(TypeError, "can't assign to function call");
1118 c->c_errors++;
1119 break;
1120 case DOT: /* '.' NAME */
1121 com_assign_attr(c, CHILD(n, 1), assigning);
1122 break;
1123 case LSQB: /* '[' subscript ']' */
1124 n = CHILD(n, 1);
1125 REQ(n, subscript); /* subscript: expr | [expr] ':' [expr] */
1126 if (NCH(n) > 1 || TYPE(CHILD(n, 0)) == COLON)
1127 com_assign_slice(c, n, assigning);
1128 else
1129 com_assign_subscript(c, CHILD(n, 0), assigning);
1130 break;
1131 default:
1132 err_setstr(TypeError, "unknown trailer type");
1133 c->c_errors++;
1134 }
1135}
1136
1137static void
1138com_assign_tuple(c, n, assigning)
1139 struct compiling *c;
1140 node *n;
1141 int assigning;
1142{
1143 int i;
1144 if (TYPE(n) != testlist)
1145 REQ(n, exprlist);
1146 if (assigning)
1147 com_addoparg(c, UNPACK_TUPLE, (NCH(n)+1)/2);
1148 for (i = 0; i < NCH(n); i += 2)
1149 com_assign(c, CHILD(n, i), assigning);
1150}
1151
1152static void
1153com_assign_list(c, n, assigning)
1154 struct compiling *c;
1155 node *n;
1156 int assigning;
1157{
1158 int i;
1159 if (assigning)
1160 com_addoparg(c, UNPACK_LIST, (NCH(n)+1)/2);
1161 for (i = 0; i < NCH(n); i += 2)
1162 com_assign(c, CHILD(n, i), assigning);
1163}
1164
1165static void
1166com_assign_name(c, n, assigning)
1167 struct compiling *c;
1168 node *n;
1169 int assigning;
1170{
1171 REQ(n, NAME);
1172 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
1173}
1174
1175static void
1176com_assign(c, n, assigning)
1177 struct compiling *c;
1178 node *n;
1179 int assigning;
1180{
1181 /* Loop to avoid trivial recursion */
1182 for (;;) {
1183 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001184
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001185 case exprlist:
1186 case testlist:
1187 if (NCH(n) > 1) {
1188 com_assign_tuple(c, n, assigning);
1189 return;
1190 }
1191 n = CHILD(n, 0);
1192 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001193
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001194 case test:
1195 case and_test:
1196 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001197 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001198 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001199 case xor_expr:
1200 case and_expr:
1201 case shift_expr:
1202 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001203 case term:
1204 if (NCH(n) > 1) {
1205 err_setstr(TypeError,
1206 "can't assign to operator");
1207 c->c_errors++;
1208 return;
1209 }
1210 n = CHILD(n, 0);
1211 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001212
Guido van Rossum7928cd71991-10-24 14:59:31 +00001213 case factor: /* ('+'|'-'|'~') factor | atom trailer* */
1214 if (TYPE(CHILD(n, 0)) != atom) { /* '+'|'-'|'~' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001215 err_setstr(TypeError,
1216 "can't assign to operator");
1217 c->c_errors++;
1218 return;
1219 }
1220 if (NCH(n) > 1) { /* trailer present */
1221 int i;
1222 com_node(c, CHILD(n, 0));
1223 for (i = 1; i+1 < NCH(n); i++) {
1224 com_apply_trailer(c, CHILD(n, i));
1225 } /* NB i is still alive */
1226 com_assign_trailer(c,
1227 CHILD(n, i), assigning);
1228 return;
1229 }
1230 n = CHILD(n, 0);
1231 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001232
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001233 case atom:
1234 switch (TYPE(CHILD(n, 0))) {
1235 case LPAR:
1236 n = CHILD(n, 1);
1237 if (TYPE(n) == RPAR) {
1238 /* XXX Should allow () = () ??? */
1239 err_setstr(TypeError,
1240 "can't assign to ()");
1241 c->c_errors++;
1242 return;
1243 }
1244 break;
1245 case LSQB:
1246 n = CHILD(n, 1);
1247 if (TYPE(n) == RSQB) {
1248 err_setstr(TypeError,
1249 "can't assign to []");
1250 c->c_errors++;
1251 return;
1252 }
1253 com_assign_list(c, n, assigning);
1254 return;
1255 case NAME:
1256 com_assign_name(c, CHILD(n, 0), assigning);
1257 return;
1258 default:
1259 err_setstr(TypeError,
1260 "can't assign to constant");
1261 c->c_errors++;
1262 return;
1263 }
1264 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001265
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001266 default:
1267 fprintf(stderr, "node type %d\n", TYPE(n));
1268 err_setstr(SystemError, "com_assign: bad node");
1269 c->c_errors++;
1270 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001271
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001272 }
1273 }
1274}
1275
1276static void
1277com_expr_stmt(c, n)
1278 struct compiling *c;
1279 node *n;
1280{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001281 REQ(n, expr_stmt); /* exprlist ('=' exprlist)* */
1282 com_node(c, CHILD(n, NCH(n)-1));
1283 if (NCH(n) == 1) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001284 com_addbyte(c, PRINT_EXPR);
1285 }
1286 else {
1287 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001288 for (i = 0; i < NCH(n)-2; i+=2) {
1289 if (i+2 < NCH(n)-2)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001290 com_addbyte(c, DUP_TOP);
1291 com_assign(c, CHILD(n, i), 1/*assign*/);
1292 }
1293 }
1294}
1295
1296static void
1297com_print_stmt(c, n)
1298 struct compiling *c;
1299 node *n;
1300{
1301 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001302 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
1303 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001304 com_node(c, CHILD(n, i));
1305 com_addbyte(c, PRINT_ITEM);
1306 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001307 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001308 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001309 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001310}
1311
1312static void
1313com_return_stmt(c, n)
1314 struct compiling *c;
1315 node *n;
1316{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001317 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001318 if (!c->c_infunction) {
1319 err_setstr(TypeError, "'return' outside function");
1320 c->c_errors++;
1321 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001322 if (NCH(n) < 2)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001323 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1324 else
1325 com_node(c, CHILD(n, 1));
1326 com_addbyte(c, RETURN_VALUE);
1327}
1328
1329static void
1330com_raise_stmt(c, n)
1331 struct compiling *c;
1332 node *n;
1333{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001334 REQ(n, raise_stmt); /* 'raise' test [',' test] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001335 com_node(c, CHILD(n, 1));
1336 if (NCH(n) > 3)
1337 com_node(c, CHILD(n, 3));
1338 else
1339 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1340 com_addbyte(c, RAISE_EXCEPTION);
1341}
1342
1343static void
1344com_import_stmt(c, n)
1345 struct compiling *c;
1346 node *n;
1347{
1348 int i;
1349 REQ(n, import_stmt);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001350 /* 'import' NAME (',' NAME)* |
1351 'from' NAME 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001352 if (STR(CHILD(n, 0))[0] == 'f') {
1353 /* 'from' NAME 'import' ... */
1354 REQ(CHILD(n, 1), NAME);
1355 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
1356 for (i = 3; i < NCH(n); i += 2)
1357 com_addopname(c, IMPORT_FROM, CHILD(n, i));
1358 com_addbyte(c, POP_TOP);
1359 }
1360 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001361 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001362 for (i = 1; i < NCH(n); i += 2) {
1363 com_addopname(c, IMPORT_NAME, CHILD(n, i));
1364 com_addopname(c, STORE_NAME, CHILD(n, i));
1365 }
1366 }
1367}
1368
1369static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00001370com_global_stmt(c, n)
1371 struct compiling *c;
1372 node *n;
1373{
1374 int i;
1375 object *v;
1376 REQ(n, global_stmt);
1377 /* 'global' NAME (',' NAME)* */
1378 for (i = 1; i < NCH(n); i += 2) {
1379 if (dictinsert(c->c_globals, STR(CHILD(n, i)), None) != 0)
1380 c->c_errors++;
1381 }
1382}
1383
1384static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001385com_if_stmt(c, n)
1386 struct compiling *c;
1387 node *n;
1388{
1389 int i;
1390 int anchor = 0;
1391 REQ(n, if_stmt);
1392 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
1393 for (i = 0; i+3 < NCH(n); i+=4) {
1394 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001395 node *ch = CHILD(n, i+1);
1396 if (i > 0)
1397 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001398 com_node(c, CHILD(n, i+1));
1399 com_addfwref(c, JUMP_IF_FALSE, &a);
1400 com_addbyte(c, POP_TOP);
1401 com_node(c, CHILD(n, i+3));
1402 com_addfwref(c, JUMP_FORWARD, &anchor);
1403 com_backpatch(c, a);
1404 com_addbyte(c, POP_TOP);
1405 }
1406 if (i+2 < NCH(n))
1407 com_node(c, CHILD(n, i+2));
1408 com_backpatch(c, anchor);
1409}
1410
1411static void
1412com_while_stmt(c, n)
1413 struct compiling *c;
1414 node *n;
1415{
1416 int break_anchor = 0;
1417 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001418 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001419 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
1420 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001421 block_push(c, SETUP_LOOP);
1422 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001423 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001424 com_node(c, CHILD(n, 1));
1425 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1426 com_addbyte(c, POP_TOP);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001427 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001428 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001429 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001430 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1431 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001432 com_backpatch(c, anchor);
1433 com_addbyte(c, POP_TOP);
1434 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001435 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001436 if (NCH(n) > 4)
1437 com_node(c, CHILD(n, 6));
1438 com_backpatch(c, break_anchor);
1439}
1440
1441static void
1442com_for_stmt(c, n)
1443 struct compiling *c;
1444 node *n;
1445{
1446 object *v;
1447 int break_anchor = 0;
1448 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001449 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001450 REQ(n, for_stmt);
1451 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
1452 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001453 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001454 com_node(c, CHILD(n, 3));
1455 v = newintobject(0L);
1456 if (v == NULL)
1457 c->c_errors++;
1458 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
1459 XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001460 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001461 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001462 com_addfwref(c, FOR_LOOP, &anchor);
1463 com_assign(c, CHILD(n, 1), 1/*assigning*/);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001464 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001465 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001466 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001467 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1468 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001469 com_backpatch(c, anchor);
1470 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001471 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001472 if (NCH(n) > 8)
1473 com_node(c, CHILD(n, 8));
1474 com_backpatch(c, break_anchor);
1475}
1476
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001477/* Although 'execpt' and 'finally' clauses can be combined
1478 syntactically, they are compiled separately. In fact,
1479 try: S
1480 except E1: S1
1481 except E2: S2
1482 ...
1483 finally: Sf
1484 is equivalent to
1485 try:
1486 try: S
1487 except E1: S1
1488 except E2: S2
1489 ...
1490 finally: Sf
1491 meaning that the 'finally' clause is entered even if things
1492 go wrong again in an exception handler. Note that this is
1493 not the case for exception handlers: at most one is entered.
1494
1495 Code generated for "try: S finally: Sf" is as follows:
1496
1497 SETUP_FINALLY L
1498 <code for S>
1499 POP_BLOCK
1500 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001501 L: <code for Sf>
1502 END_FINALLY
1503
1504 The special instructions use the block stack. Each block
1505 stack entry contains the instruction that created it (here
1506 SETUP_FINALLY), the level of the value stack at the time the
1507 block stack entry was created, and a label (here L).
1508
1509 SETUP_FINALLY:
1510 Pushes the current value stack level and the label
1511 onto the block stack.
1512 POP_BLOCK:
1513 Pops en entry from the block stack, and pops the value
1514 stack until its level is the same as indicated on the
1515 block stack. (The label is ignored.)
1516 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001517 Pops a variable number of entries from the *value* stack
1518 and re-raises the exception they specify. The number of
1519 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001520
1521 The block stack is unwound when an exception is raised:
1522 when a SETUP_FINALLY entry is found, the exception is pushed
1523 onto the value stack (and the exception condition is cleared),
1524 and the interpreter jumps to the label gotten from the block
1525 stack.
1526
1527 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00001528 (The contents of the value stack is shown in [], with the top
1529 at the right; 'tb' is trace-back info, 'val' the exception's
1530 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001531
1532 Value stack Label Instruction Argument
1533 [] SETUP_EXCEPT L1
1534 [] <code for S>
1535 [] POP_BLOCK
1536 [] JUMP_FORWARD L0
1537
Guido van Rossum3f5da241990-12-20 15:06:42 +00001538 [tb, val, exc] L1: DUP )
1539 [tb, val, exc, exc] <evaluate E1> )
1540 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
1541 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
1542 [tb, val, exc, 1] POP )
1543 [tb, val, exc] POP
1544 [tb, val] <assign to V1> (or POP if no V1)
1545 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001546 [] <code for S1>
1547 JUMP_FORWARD L0
1548
Guido van Rossum3f5da241990-12-20 15:06:42 +00001549 [tb, val, exc, 0] L2: POP
1550 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001551 .............................etc.......................
1552
Guido van Rossum3f5da241990-12-20 15:06:42 +00001553 [tb, val, exc, 0] Ln+1: POP
1554 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001555
1556 [] L0: <next statement>
1557
1558 Of course, parts are not generated if Vi or Ei is not present.
1559*/
1560
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001561static void
1562com_try_stmt(c, n)
1563 struct compiling *c;
1564 node *n;
1565{
1566 int finally_anchor = 0;
1567 int except_anchor = 0;
1568 REQ(n, try_stmt);
1569 /* 'try' ':' suite (except_clause ':' suite)* ['finally' ':' suite] */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001570
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001571 if (NCH(n) > 3 && TYPE(CHILD(n, NCH(n)-3)) != except_clause) {
1572 /* Have a 'finally' clause */
1573 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001574 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001575 }
1576 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == except_clause) {
1577 /* Have an 'except' clause */
1578 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001579 block_push(c, SETUP_EXCEPT);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001580 }
1581 com_node(c, CHILD(n, 2));
1582 if (except_anchor) {
1583 int end_anchor = 0;
1584 int i;
1585 node *ch;
1586 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001587 block_pop(c, SETUP_EXCEPT);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001588 com_addfwref(c, JUMP_FORWARD, &end_anchor);
1589 com_backpatch(c, except_anchor);
1590 for (i = 3;
1591 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
1592 i += 3) {
1593 /* except_clause: 'except' [expr [',' expr]] */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001594 if (except_anchor == 0) {
1595 err_setstr(TypeError,
1596 "default 'except:' must be last");
1597 c->c_errors++;
1598 break;
1599 }
1600 except_anchor = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001601 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001602 if (NCH(ch) > 1) {
1603 com_addbyte(c, DUP_TOP);
1604 com_node(c, CHILD(ch, 1));
1605 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001606 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001607 com_addbyte(c, POP_TOP);
1608 }
1609 com_addbyte(c, POP_TOP);
1610 if (NCH(ch) > 3)
1611 com_assign(c, CHILD(ch, 3), 1/*assigning*/);
1612 else
1613 com_addbyte(c, POP_TOP);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001614 com_addbyte(c, POP_TOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001615 com_node(c, CHILD(n, i+2));
1616 com_addfwref(c, JUMP_FORWARD, &end_anchor);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001617 if (except_anchor) {
1618 com_backpatch(c, except_anchor);
1619 com_addbyte(c, POP_TOP);
1620 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001621 }
1622 com_addbyte(c, END_FINALLY);
1623 com_backpatch(c, end_anchor);
1624 }
1625 if (finally_anchor) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001626 node *ch;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001627 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001628 block_pop(c, SETUP_FINALLY);
1629 block_push(c, END_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001630 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001631 com_backpatch(c, finally_anchor);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001632 ch = CHILD(n, NCH(n)-1);
1633 com_addoparg(c, SET_LINENO, ch->n_lineno);
1634 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001635 com_addbyte(c, END_FINALLY);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001636 block_pop(c, END_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001637 }
1638}
1639
1640static void
1641com_suite(c, n)
1642 struct compiling *c;
1643 node *n;
1644{
1645 REQ(n, suite);
1646 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
1647 if (NCH(n) == 1) {
1648 com_node(c, CHILD(n, 0));
1649 }
1650 else {
1651 int i;
1652 for (i = 0; i < NCH(n); i++) {
1653 node *ch = CHILD(n, i);
1654 if (TYPE(ch) == stmt)
1655 com_node(c, ch);
1656 }
1657 }
1658}
1659
1660static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001661com_continue_stmt(c, n)
1662 struct compiling *c;
1663 node *n;
1664{
1665 int i = c->c_nblocks;
1666 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
1667 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1668 }
1669 else {
1670 err_setstr(TypeError, "'continue' not properly in loop");
1671 c->c_errors++;
1672 }
1673 /* XXX Could allow it inside a 'finally' clause
1674 XXX if we could pop the exception still on the stack */
1675}
1676
1677static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001678com_funcdef(c, n)
1679 struct compiling *c;
1680 node *n;
1681{
1682 object *v;
1683 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001684 v = (object *)compile(n, c->c_filename);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001685 if (v == NULL)
1686 c->c_errors++;
1687 else {
1688 int i = com_addconst(c, v);
1689 com_addoparg(c, LOAD_CONST, i);
1690 com_addbyte(c, BUILD_FUNCTION);
1691 com_addopname(c, STORE_NAME, CHILD(n, 1));
1692 DECREF(v);
1693 }
1694}
1695
1696static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00001697com_oldbases(c, n)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001698 struct compiling *c;
1699 node *n;
1700{
1701 int i, nbases;
1702 REQ(n, baselist);
1703 /*
1704 baselist: atom arguments (',' atom arguments)*
Guido van Rossumc5e96291991-12-10 13:53:51 +00001705 arguments: '(' ')'
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001706 */
1707 for (i = 0; i < NCH(n); i += 3)
1708 com_node(c, CHILD(n, i));
1709 com_addoparg(c, BUILD_TUPLE, (NCH(n)+1) / 3);
1710}
1711
1712static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00001713com_newbases(c, n)
1714 struct compiling *c;
1715 node *n;
1716{
1717 int i, nbases;
1718 REQ(n, testlist);
1719 /* testlist: test (',' test)* [','] */
1720 for (i = 0; i < NCH(n); i += 2)
1721 com_node(c, CHILD(n, i));
1722 com_addoparg(c, BUILD_TUPLE, (NCH(n)+1) / 2);
1723}
1724
1725static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001726com_classdef(c, n)
1727 struct compiling *c;
1728 node *n;
1729{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001730 object *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001731 REQ(n, classdef);
1732 /*
Guido van Rossumc5e96291991-12-10 13:53:51 +00001733 classdef: 'class' NAME
1734 ['(' testlist ')' |'(' ')' ['=' baselist]] ':' suite
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001735 baselist: atom arguments (',' atom arguments)*
Guido van Rossumc5e96291991-12-10 13:53:51 +00001736 arguments: '(' ')'
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001737 */
Guido van Rossumc5e96291991-12-10 13:53:51 +00001738 /* This piece of code must push a tuple on the stack (the bases) */
1739 if (TYPE(CHILD(n, 2)) != LPAR) {
1740 /* New syntax without base classes:
1741 class NAME ':' suite
1742 ___________^
1743 */
1744 com_addoparg(c, BUILD_TUPLE, 0);
1745 }
1746 else {
1747 if (TYPE(CHILD(n, 3)) == RPAR) {
1748 /* Old syntax with or without base classes:
1749 class NAME '(' ')' ['=' baselist] ':' suite
1750 _______________^....^...^
1751 */
1752 if (TYPE(CHILD(n, 4)) == EQUAL)
1753 com_oldbases(c, CHILD(n, 5));
1754 else
1755 com_addoparg(c, BUILD_TUPLE, 0);
1756 }
1757 else {
1758 /* New syntax with base classes:
1759 class NAME '(' testlist ')' ':' suite
1760 _______________^
1761 */
1762 com_newbases(c, CHILD(n, 3));
1763 }
1764 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001765 v = (object *)compile(n, c->c_filename);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001766 if (v == NULL)
1767 c->c_errors++;
1768 else {
1769 int i = com_addconst(c, v);
1770 com_addoparg(c, LOAD_CONST, i);
1771 com_addbyte(c, BUILD_FUNCTION);
1772 com_addbyte(c, UNARY_CALL);
1773 com_addbyte(c, BUILD_CLASS);
1774 com_addopname(c, STORE_NAME, CHILD(n, 1));
1775 DECREF(v);
1776 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001777}
1778
1779static void
1780com_node(c, n)
1781 struct compiling *c;
1782 node *n;
1783{
1784 switch (TYPE(n)) {
1785
1786 /* Definition nodes */
1787
1788 case funcdef:
1789 com_funcdef(c, n);
1790 break;
1791 case classdef:
1792 com_classdef(c, n);
1793 break;
1794
1795 /* Trivial parse tree nodes */
1796
1797 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001798 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001799 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001800 com_node(c, CHILD(n, 0));
1801 break;
1802
1803 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001804 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
1805 com_addoparg(c, SET_LINENO, n->n_lineno);
1806 {
1807 int i;
1808 for (i = 0; i < NCH(n)-1; i += 2)
1809 com_node(c, CHILD(n, i));
1810 }
1811 break;
1812
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001813 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001814 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001815 com_node(c, CHILD(n, 0));
1816 break;
1817
1818 /* Statement nodes */
1819
1820 case expr_stmt:
1821 com_expr_stmt(c, n);
1822 break;
1823 case print_stmt:
1824 com_print_stmt(c, n);
1825 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001826 case del_stmt: /* 'del' exprlist */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001827 com_assign(c, CHILD(n, 1), 0/*delete*/);
1828 break;
1829 case pass_stmt:
1830 break;
1831 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001832 if (c->c_loops == 0) {
1833 err_setstr(TypeError, "'break' outside loop");
1834 c->c_errors++;
1835 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001836 com_addbyte(c, BREAK_LOOP);
1837 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001838 case continue_stmt:
1839 com_continue_stmt(c, n);
1840 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001841 case return_stmt:
1842 com_return_stmt(c, n);
1843 break;
1844 case raise_stmt:
1845 com_raise_stmt(c, n);
1846 break;
1847 case import_stmt:
1848 com_import_stmt(c, n);
1849 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001850 case global_stmt:
1851 com_global_stmt(c, n);
1852 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001853 case if_stmt:
1854 com_if_stmt(c, n);
1855 break;
1856 case while_stmt:
1857 com_while_stmt(c, n);
1858 break;
1859 case for_stmt:
1860 com_for_stmt(c, n);
1861 break;
1862 case try_stmt:
1863 com_try_stmt(c, n);
1864 break;
1865 case suite:
1866 com_suite(c, n);
1867 break;
1868
1869 /* Expression nodes */
1870
1871 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00001872 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001873 break;
1874 case test:
1875 com_test(c, n);
1876 break;
1877 case and_test:
1878 com_and_test(c, n);
1879 break;
1880 case not_test:
1881 com_not_test(c, n);
1882 break;
1883 case comparison:
1884 com_comparison(c, n);
1885 break;
1886 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00001887 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001888 break;
1889 case expr:
1890 com_expr(c, n);
1891 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001892 case xor_expr:
1893 com_xor_expr(c, n);
1894 break;
1895 case and_expr:
1896 com_and_expr(c, n);
1897 break;
1898 case shift_expr:
1899 com_shift_expr(c, n);
1900 break;
1901 case arith_expr:
1902 com_arith_expr(c, n);
1903 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001904 case term:
1905 com_term(c, n);
1906 break;
1907 case factor:
1908 com_factor(c, n);
1909 break;
1910 case atom:
1911 com_atom(c, n);
1912 break;
1913
1914 default:
1915 fprintf(stderr, "node type %d\n", TYPE(n));
1916 err_setstr(SystemError, "com_node: unexpected node type");
1917 c->c_errors++;
1918 }
1919}
1920
1921static void com_fplist PROTO((struct compiling *, node *));
1922
1923static void
1924com_fpdef(c, n)
1925 struct compiling *c;
1926 node *n;
1927{
1928 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
1929 if (TYPE(CHILD(n, 0)) == LPAR)
1930 com_fplist(c, CHILD(n, 1));
1931 else
1932 com_addopname(c, STORE_NAME, CHILD(n, 0));
1933}
1934
1935static void
1936com_fplist(c, n)
1937 struct compiling *c;
1938 node *n;
1939{
1940 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* */
1941 if (NCH(n) == 1) {
1942 com_fpdef(c, CHILD(n, 0));
1943 }
1944 else {
1945 int i;
1946 com_addoparg(c, UNPACK_TUPLE, (NCH(n)+1)/2);
1947 for (i = 0; i < NCH(n); i += 2)
1948 com_fpdef(c, CHILD(n, i));
1949 }
1950}
1951
1952static void
1953com_file_input(c, n)
1954 struct compiling *c;
1955 node *n;
1956{
1957 int i;
1958 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
1959 for (i = 0; i < NCH(n); i++) {
1960 node *ch = CHILD(n, i);
1961 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
1962 com_node(c, ch);
1963 }
1964}
1965
1966/* Top-level compile-node interface */
1967
1968static void
1969compile_funcdef(c, n)
1970 struct compiling *c;
1971 node *n;
1972{
1973 node *ch;
1974 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
1975 ch = CHILD(n, 2); /* parameters: '(' [fplist] ')' */
1976 ch = CHILD(ch, 1); /* ')' | fplist */
1977 if (TYPE(ch) == RPAR)
Guido van Rossum288a60f1991-12-16 13:05:10 +00001978 com_addoparg(c, UNPACK_ARG, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001979 else {
Guido van Rossum288a60f1991-12-16 13:05:10 +00001980 int i;
1981 REQ(ch, fplist); /* fplist: fpdef (',' fpdef)* */
1982 com_addoparg(c, UNPACK_ARG, (NCH(ch)+1)/2);
1983 for (i = 0; i < NCH(ch); i += 2)
1984 com_fpdef(c, CHILD(ch, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001985 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001986 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001987 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001988 c->c_infunction = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001989 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1990 com_addbyte(c, RETURN_VALUE);
1991}
1992
1993static void
1994compile_node(c, n)
1995 struct compiling *c;
1996 node *n;
1997{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001998 com_addoparg(c, SET_LINENO, n->n_lineno);
1999
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002000 switch (TYPE(n)) {
2001
Guido van Rossum4c417781991-01-21 16:09:22 +00002002 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002003 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
2004 n = CHILD(n, 0);
2005 if (TYPE(n) != NEWLINE)
2006 com_node(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 file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002012 com_file_input(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002013 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
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 expr_input: /* Built-in function eval() */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002018 com_node(c, CHILD(n, 0));
2019 com_addbyte(c, RETURN_VALUE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002020 break;
2021
Guido van Rossum4c417781991-01-21 16:09:22 +00002022 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00002023 com_node(c, CHILD(n, 0));
2024 com_addbyte(c, RETURN_VALUE);
2025 break;
2026
2027 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002028 compile_funcdef(c, n);
2029 break;
2030
Guido van Rossum4c417781991-01-21 16:09:22 +00002031 case classdef: /* A class definition */
Guido van Rossumc5e96291991-12-10 13:53:51 +00002032 /* classdef: 'class' NAME
2033 ['(' testlist ')' |'(' ')' ['=' baselist]]
2034 ':' suite */
Guido van Rossumc5e96291991-12-10 13:53:51 +00002035 com_node(c, CHILD(n, NCH(n)-1)); /* The suite */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002036 com_addbyte(c, LOAD_LOCALS);
2037 com_addbyte(c, RETURN_VALUE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002038 break;
2039
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002040 default:
2041 fprintf(stderr, "node type %d\n", TYPE(n));
2042 err_setstr(SystemError, "compile_node: unexpected node type");
2043 c->c_errors++;
2044 }
2045}
2046
Guido van Rossum282914b1991-04-04 10:42:56 +00002047/* Optimization for local and global variables.
2048
2049 Attempt to replace all LOAD_NAME instructions that refer to a local
2050 variable with LOAD_LOCAL instructions, and all that refer to a global
2051 variable with LOAD_GLOBAL instructions.
2052
2053 To find all local variables, we check all STORE_NAME and IMPORT_FROM
2054 instructions. This yields all local variables, including arguments,
2055 function definitions, class definitions and import statements.
2056
2057 There is one leak: 'from foo import *' introduces local variables
2058 that we can't know while compiling. If this is the case, LOAD_GLOBAL
2059 instructions are not generated -- LOAD_NAME is left in place for
2060 globals, since it first checks for globals (LOAD_LOCAL is still used
2061 for recognized locals, since it doesn't hurt).
2062
2063 This optimization means that using the same name as a global and
2064 as a local variable within the same scope is now illegal, which
2065 is a change to the language! Also using eval() to introduce new
2066 local variables won't work. But both were bad practice at best.
2067
2068 The optimization doesn't save much: basically, it saves one
2069 unsuccessful dictionary lookup per global (or built-in) variable
2070 reference. On the (slow!) Mac Plus, with 4 local variables,
2071 this saving was measured to be about 0.18 ms. We might save more
2072 by using a different data structure to hold local variables, like
2073 an array indexed by variable number.
2074
2075 NB: this modifies the string object co->co_code!
2076*/
2077
2078static void
2079optimizer(co)
2080 codeobject *co;
2081{
Guido van Rossum0a697f61991-04-16 08:39:12 +00002082 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00002083 object *locals;
2084 int opcode;
2085 int oparg;
2086 object *name;
2087 int star_used;
Guido van Rossum0a697f61991-04-16 08:39:12 +00002088
Guido van Rossum282914b1991-04-04 10:42:56 +00002089#define NEXTOP() (*next_instr++)
2090#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
2091#define GETITEM(v, i) (getlistitem((v), (i)))
2092#define GETNAMEOBJ(i) (GETITEM(co->co_names, (i)))
2093
2094 locals = newdictobject();
2095 if (locals == NULL) {
2096 err_clear();
2097 return; /* For now, this is OK */
2098 }
2099
Guido van Rossum0a697f61991-04-16 08:39:12 +00002100 next_instr = (unsigned char *) GETSTRINGVALUE(co->co_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00002101 for (;;) {
2102 opcode = NEXTOP();
2103 if (opcode == STOP_CODE)
2104 break;
2105 if (HAS_ARG(opcode))
2106 oparg = NEXTARG();
2107 if (opcode == STORE_NAME || opcode == IMPORT_FROM) {
2108 name = GETNAMEOBJ(oparg);
2109 if (dict2insert(locals, name, None) != 0) {
2110 DECREF(locals);
2111 return; /* Sorry */
2112 }
2113 }
2114 }
2115
2116 star_used = (dictlookup(locals, "*") != NULL);
Guido van Rossum0a697f61991-04-16 08:39:12 +00002117 next_instr = (unsigned char *) GETSTRINGVALUE(co->co_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00002118 for (;;) {
2119 cur_instr = next_instr;
2120 opcode = NEXTOP();
2121 if (opcode == STOP_CODE)
2122 break;
2123 if (HAS_ARG(opcode))
2124 oparg = NEXTARG();
2125 if (opcode == LOAD_NAME) {
2126 name = GETNAMEOBJ(oparg);
Guido van Rossum83163251991-08-16 08:58:43 +00002127 if (dict2lookup(locals, name) != NULL)
Guido van Rossum282914b1991-04-04 10:42:56 +00002128 *cur_instr = LOAD_LOCAL;
Guido van Rossum83163251991-08-16 08:58:43 +00002129 else {
2130 err_clear();
2131 if (!star_used)
2132 *cur_instr = LOAD_GLOBAL;
2133 }
Guido van Rossum282914b1991-04-04 10:42:56 +00002134 }
2135 }
2136
2137 DECREF(locals);
2138}
2139
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002140codeobject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002141compile(n, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002142 node *n;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002143 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002144{
2145 struct compiling sc;
2146 codeobject *co;
Guido van Rossuma082ce41991-06-04 19:41:56 +00002147 object *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002148 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002149 return NULL;
2150 compile_node(&sc, n);
2151 com_done(&sc);
Guido van Rossuma082ce41991-06-04 19:41:56 +00002152 if (sc.c_errors == 0 && (v = newstringobject(filename)) != NULL) {
2153 co = newcodeobject(sc.c_code, sc.c_consts, sc.c_names, v);
2154 DECREF(v);
2155 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002156 else
2157 co = NULL;
2158 com_free(&sc);
Guido van Rossumfb8edfc1991-05-14 11:56:03 +00002159 if (co != NULL && filename[0] != '<')
Guido van Rossum282914b1991-04-04 10:42:56 +00002160 optimizer(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002161 return co;
2162}