blob: 09d461a49ab5f65eb5c18654289d6129db62399d [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) */
139 int c_nexti; /* index into c_code */
140 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000141 int c_infunction; /* set when compiling a function */
142 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000143 int c_begin; /* begin of current loop, for 'continue' */
144 int c_block[MAXBLOCKS]; /* stack of block types */
145 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000146 char *c_filename; /* filename of current node */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000147};
148
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000149
150/* Interface to the block stack */
151
152static void
153block_push(c, type)
154 struct compiling *c;
155 int type;
156{
157 if (c->c_nblocks >= MAXBLOCKS) {
158 err_setstr(TypeError, "too many statically nested blocks");
159 c->c_errors++;
160 }
161 else {
162 c->c_block[c->c_nblocks++] = type;
163 }
164}
165
166static void
167block_pop(c, type)
168 struct compiling *c;
169 int type;
170{
171 if (c->c_nblocks > 0)
172 c->c_nblocks--;
173 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
174 err_setstr(SystemError, "bad block pop");
175 c->c_errors++;
176 }
177}
178
179
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000180/* Prototypes */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000181
Guido van Rossum3f5da241990-12-20 15:06:42 +0000182static int com_init PROTO((struct compiling *, char *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000183static void com_free PROTO((struct compiling *));
184static void com_done PROTO((struct compiling *));
185static void com_node PROTO((struct compiling *, struct _node *));
186static void com_addbyte PROTO((struct compiling *, int));
187static void com_addint PROTO((struct compiling *, int));
188static void com_addoparg PROTO((struct compiling *, int, int));
189static void com_addfwref PROTO((struct compiling *, int, int *));
190static void com_backpatch PROTO((struct compiling *, int));
191static int com_add PROTO((struct compiling *, object *, object *));
192static int com_addconst PROTO((struct compiling *, object *));
193static int com_addname PROTO((struct compiling *, object *));
194static void com_addopname PROTO((struct compiling *, int, node *));
195
196static int
Guido van Rossum3f5da241990-12-20 15:06:42 +0000197com_init(c, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000198 struct compiling *c;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000199 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000200{
Guido van Rossum62d46241991-04-03 19:00:23 +0000201 if ((c->c_code = newsizedstringobject((char *)NULL, 1000)) == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000202 goto fail_3;
203 if ((c->c_consts = newlistobject(0)) == NULL)
204 goto fail_2;
205 if ((c->c_names = newlistobject(0)) == NULL)
206 goto fail_1;
207 c->c_nexti = 0;
208 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000209 c->c_infunction = 0;
210 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000211 c->c_begin = 0;
212 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000213 c->c_filename = filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000214 return 1;
215
216 fail_1:
217 DECREF(c->c_consts);
218 fail_2:
219 DECREF(c->c_code);
220 fail_3:
221 return 0;
222}
223
224static void
225com_free(c)
226 struct compiling *c;
227{
228 XDECREF(c->c_code);
229 XDECREF(c->c_consts);
230 XDECREF(c->c_names);
231}
232
233static void
234com_done(c)
235 struct compiling *c;
236{
237 if (c->c_code != NULL)
238 resizestring(&c->c_code, c->c_nexti);
239}
240
241static void
242com_addbyte(c, byte)
243 struct compiling *c;
244 int byte;
245{
246 int len;
247 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000248 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000249 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
250 abort();
Guido van Rossum01cfd441991-10-20 20:12:38 +0000251 */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000252 err_setstr(SystemError, "com_addbyte: byte out of range");
253 c->c_errors++;
254 }
255 if (c->c_code == NULL)
256 return;
257 len = getstringsize(c->c_code);
258 if (c->c_nexti >= len) {
259 if (resizestring(&c->c_code, len+1000) != 0) {
260 c->c_errors++;
261 return;
262 }
263 }
264 getstringvalue(c->c_code)[c->c_nexti++] = byte;
265}
266
267static void
268com_addint(c, x)
269 struct compiling *c;
270 int x;
271{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000272 com_addbyte(c, x & 0xff);
273 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000274}
275
276static void
277com_addoparg(c, op, arg)
278 struct compiling *c;
279 int op;
280 int arg;
281{
282 com_addbyte(c, op);
283 com_addint(c, arg);
284}
285
286static void
287com_addfwref(c, op, p_anchor)
288 struct compiling *c;
289 int op;
290 int *p_anchor;
291{
292 /* Compile a forward reference for backpatching */
293 int here;
294 int anchor;
295 com_addbyte(c, op);
296 here = c->c_nexti;
297 anchor = *p_anchor;
298 *p_anchor = here;
299 com_addint(c, anchor == 0 ? 0 : here - anchor);
300}
301
302static void
303com_backpatch(c, anchor)
304 struct compiling *c;
305 int anchor; /* Must be nonzero */
306{
307 unsigned char *code = (unsigned char *) getstringvalue(c->c_code);
308 int target = c->c_nexti;
309 int lastanchor = 0;
310 int dist;
311 int prev;
312 for (;;) {
313 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000314 prev = code[anchor] + (code[anchor+1] << 8);
315 dist = target - (anchor+2);
316 code[anchor] = dist & 0xff;
317 code[anchor+1] = dist >> 8;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000318 if (!prev)
319 break;
320 lastanchor = anchor;
321 anchor -= prev;
322 }
323}
324
325/* Handle constants and names uniformly */
326
327static int
328com_add(c, list, v)
329 struct compiling *c;
330 object *list;
331 object *v;
332{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000333 int n = getlistsize(list);
334 int i;
335 for (i = n; --i >= 0; ) {
336 object *w = getlistitem(list, i);
Guido van Rossumefc0bd01991-07-01 18:44:20 +0000337 if (v->ob_type == w->ob_type && cmpobject(v, w) == 0)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000338 return i;
339 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000340 if (addlistitem(list, v) != 0)
341 c->c_errors++;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000342 return n;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000343}
344
345static int
346com_addconst(c, v)
347 struct compiling *c;
348 object *v;
349{
350 return com_add(c, c->c_consts, v);
351}
352
353static int
354com_addname(c, v)
355 struct compiling *c;
356 object *v;
357{
358 return com_add(c, c->c_names, v);
359}
360
361static void
362com_addopname(c, op, n)
363 struct compiling *c;
364 int op;
365 node *n;
366{
367 object *v;
368 int i;
369 char *name;
370 if (TYPE(n) == STAR)
371 name = "*";
372 else {
373 REQ(n, NAME);
374 name = STR(n);
375 }
376 if ((v = newstringobject(name)) == NULL) {
377 c->c_errors++;
378 i = 255;
379 }
380 else {
381 i = com_addname(c, v);
382 DECREF(v);
383 }
384 com_addoparg(c, op, i);
385}
386
387static object *
388parsenumber(s)
389 char *s;
390{
391 extern long strtol();
Guido van Rossum282914b1991-04-04 10:42:56 +0000392 extern double strtod();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000393 char *end = s;
394 long x;
Guido van Rossum282914b1991-04-04 10:42:56 +0000395 double xx;
396 errno = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000397 x = strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +0000398 if (*end == '\0') {
399 if (errno != 0) {
400 err_setstr(RuntimeError, "integer constant too large");
401 return NULL;
402 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000403 return newintobject(x);
Guido van Rossum282914b1991-04-04 10:42:56 +0000404 }
Guido van Rossume3a204f1991-05-05 20:05:35 +0000405 if (*end == 'l' || *end == 'L') {
406 extern object *long_scan();
407 return long_scan(s, 0);
408 }
Guido van Rossum282914b1991-04-04 10:42:56 +0000409 errno = 0;
410 xx = strtod(s, &end);
411 if (*end == '\0') {
412 if (errno != 0) {
413 err_setstr(RuntimeError, "float constant too large");
414 return NULL;
415 }
416 return newfloatobject(xx);
417 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000418 err_setstr(RuntimeError, "bad number syntax");
419 return NULL;
420}
421
422static object *
423parsestr(s)
424 char *s;
425{
426 object *v;
427 int len;
428 char *buf;
429 char *p;
430 int c;
431 if (*s != '\'') {
432 err_badcall();
433 return NULL;
434 }
435 s++;
436 len = strlen(s);
437 if (s[--len] != '\'') {
438 err_badcall();
439 return NULL;
440 }
441 if (strchr(s, '\\') == NULL)
442 return newsizedstringobject(s, len);
443 v = newsizedstringobject((char *)NULL, len);
444 p = buf = getstringvalue(v);
445 while (*s != '\0' && *s != '\'') {
446 if (*s != '\\') {
447 *p++ = *s++;
448 continue;
449 }
450 s++;
451 switch (*s++) {
452 /* XXX This assumes ASCII! */
453 case '\\': *p++ = '\\'; break;
454 case '\'': *p++ = '\''; break;
455 case 'b': *p++ = '\b'; break;
456 case 'f': *p++ = '\014'; break; /* FF */
457 case 't': *p++ = '\t'; break;
458 case 'n': *p++ = '\n'; break;
459 case 'r': *p++ = '\r'; break;
460 case 'v': *p++ = '\013'; break; /* VT */
461 case 'E': *p++ = '\033'; break; /* ESC, not C */
462 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
463 case '0': case '1': case '2': case '3':
464 case '4': case '5': case '6': case '7':
465 c = s[-1] - '0';
466 if ('0' <= *s && *s <= '7') {
467 c = (c<<3) + *s++ - '0';
468 if ('0' <= *s && *s <= '7')
469 c = (c<<3) + *s++ - '0';
470 }
471 *p++ = c;
472 break;
473 case 'x':
474 if (isxdigit(*s)) {
475 sscanf(s, "%x", &c);
476 *p++ = c;
477 do {
478 s++;
479 } while (isxdigit(*s));
480 break;
481 }
482 /* FALLTHROUGH */
483 default: *p++ = '\\'; *p++ = s[-1]; break;
484 }
485 }
486 resizestring(&v, (int)(p - buf));
487 return v;
488}
489
490static void
491com_list_constructor(c, n)
492 struct compiling *c;
493 node *n;
494{
495 int len;
496 int i;
497 object *v, *w;
498 if (TYPE(n) != testlist)
499 REQ(n, exprlist);
500 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
501 len = (NCH(n) + 1) / 2;
502 for (i = 0; i < NCH(n); i += 2)
503 com_node(c, CHILD(n, i));
504 com_addoparg(c, BUILD_LIST, len);
505}
506
507static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000508com_dictmaker(c, n)
509 struct compiling *c;
510 node *n;
511{
512 int i;
513 /* dictmaker: test ':' test (',' test ':' value)* [','] */
514 for (i = 0; i+2 < NCH(n); i += 4) {
515 /* We must arrange things just right for STORE_SUBSCR.
516 It wants the stack to look like (value) (dict) (key) */
517 com_addbyte(c, DUP_TOP);
518 com_node(c, CHILD(n, i+2)); /* value */
519 com_addbyte(c, ROT_TWO);
520 com_node(c, CHILD(n, i)); /* key */
521 com_addbyte(c, STORE_SUBSCR);
522 }
523}
524
525static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000526com_atom(c, n)
527 struct compiling *c;
528 node *n;
529{
530 node *ch;
531 object *v;
532 int i;
533 REQ(n, atom);
534 ch = CHILD(n, 0);
535 switch (TYPE(ch)) {
536 case LPAR:
537 if (TYPE(CHILD(n, 1)) == RPAR)
538 com_addoparg(c, BUILD_TUPLE, 0);
539 else
540 com_node(c, CHILD(n, 1));
541 break;
542 case LSQB:
543 if (TYPE(CHILD(n, 1)) == RSQB)
544 com_addoparg(c, BUILD_LIST, 0);
545 else
546 com_list_constructor(c, CHILD(n, 1));
547 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000548 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000549 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000550 if (TYPE(CHILD(n, 1)) != RBRACE)
551 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000552 break;
553 case BACKQUOTE:
554 com_node(c, CHILD(n, 1));
555 com_addbyte(c, UNARY_CONVERT);
556 break;
557 case NUMBER:
558 if ((v = parsenumber(STR(ch))) == NULL) {
559 c->c_errors++;
560 i = 255;
561 }
562 else {
563 i = com_addconst(c, v);
564 DECREF(v);
565 }
566 com_addoparg(c, LOAD_CONST, i);
567 break;
568 case STRING:
569 if ((v = parsestr(STR(ch))) == NULL) {
570 c->c_errors++;
571 i = 255;
572 }
573 else {
574 i = com_addconst(c, v);
575 DECREF(v);
576 }
577 com_addoparg(c, LOAD_CONST, i);
578 break;
579 case NAME:
580 com_addopname(c, LOAD_NAME, ch);
581 break;
582 default:
583 fprintf(stderr, "node type %d\n", TYPE(ch));
584 err_setstr(SystemError, "com_atom: unexpected node type");
585 c->c_errors++;
586 }
587}
588
589static void
590com_slice(c, n, op)
591 struct compiling *c;
592 node *n;
593 int op;
594{
595 if (NCH(n) == 1) {
596 com_addbyte(c, op);
597 }
598 else if (NCH(n) == 2) {
599 if (TYPE(CHILD(n, 0)) != COLON) {
600 com_node(c, CHILD(n, 0));
601 com_addbyte(c, op+1);
602 }
603 else {
604 com_node(c, CHILD(n, 1));
605 com_addbyte(c, op+2);
606 }
607 }
608 else {
609 com_node(c, CHILD(n, 0));
610 com_node(c, CHILD(n, 2));
611 com_addbyte(c, op+3);
612 }
613}
614
615static void
616com_apply_subscript(c, n)
617 struct compiling *c;
618 node *n;
619{
620 REQ(n, subscript);
621 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) != COLON) {
622 /* It's a single subscript */
623 com_node(c, CHILD(n, 0));
624 com_addbyte(c, BINARY_SUBSCR);
625 }
626 else {
627 /* It's a slice: [expr] ':' [expr] */
628 com_slice(c, n, SLICE);
629 }
630}
631
632static void
633com_call_function(c, n)
634 struct compiling *c;
635 node *n; /* EITHER testlist OR ')' */
636{
637 if (TYPE(n) == RPAR) {
638 com_addbyte(c, UNARY_CALL);
639 }
640 else {
641 com_node(c, n);
642 com_addbyte(c, BINARY_CALL);
643 }
644}
645
646static void
647com_select_member(c, n)
648 struct compiling *c;
649 node *n;
650{
651 com_addopname(c, LOAD_ATTR, n);
652}
653
654static void
655com_apply_trailer(c, n)
656 struct compiling *c;
657 node *n;
658{
659 REQ(n, trailer);
660 switch (TYPE(CHILD(n, 0))) {
661 case LPAR:
662 com_call_function(c, CHILD(n, 1));
663 break;
664 case DOT:
665 com_select_member(c, CHILD(n, 1));
666 break;
667 case LSQB:
668 com_apply_subscript(c, CHILD(n, 1));
669 break;
670 default:
671 err_setstr(SystemError,
672 "com_apply_trailer: unknown trailer type");
673 c->c_errors++;
674 }
675}
676
677static void
678com_factor(c, n)
679 struct compiling *c;
680 node *n;
681{
682 int i;
683 REQ(n, factor);
684 if (TYPE(CHILD(n, 0)) == PLUS) {
685 com_factor(c, CHILD(n, 1));
686 com_addbyte(c, UNARY_POSITIVE);
687 }
688 else if (TYPE(CHILD(n, 0)) == MINUS) {
689 com_factor(c, CHILD(n, 1));
690 com_addbyte(c, UNARY_NEGATIVE);
691 }
Guido van Rossum7928cd71991-10-24 14:59:31 +0000692 else if (TYPE(CHILD(n, 0)) == TILDE) {
693 com_factor(c, CHILD(n, 1));
694 com_addbyte(c, UNARY_INVERT);
695 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000696 else {
697 com_atom(c, CHILD(n, 0));
698 for (i = 1; i < NCH(n); i++)
699 com_apply_trailer(c, CHILD(n, i));
700 }
701}
702
703static void
704com_term(c, n)
705 struct compiling *c;
706 node *n;
707{
708 int i;
709 int op;
710 REQ(n, term);
711 com_factor(c, CHILD(n, 0));
712 for (i = 2; i < NCH(n); i += 2) {
713 com_factor(c, CHILD(n, i));
714 switch (TYPE(CHILD(n, i-1))) {
715 case STAR:
716 op = BINARY_MULTIPLY;
717 break;
718 case SLASH:
719 op = BINARY_DIVIDE;
720 break;
721 case PERCENT:
722 op = BINARY_MODULO;
723 break;
724 default:
725 err_setstr(SystemError,
Guido van Rossum7928cd71991-10-24 14:59:31 +0000726 "com_term: operator not *, / or %");
727 c->c_errors++;
728 op = 255;
729 }
730 com_addbyte(c, op);
731 }
732}
733
734static void
735com_arith_expr(c, n)
736 struct compiling *c;
737 node *n;
738{
739 int i;
740 int op;
741 REQ(n, arith_expr);
742 com_term(c, CHILD(n, 0));
743 for (i = 2; i < NCH(n); i += 2) {
744 com_term(c, CHILD(n, i));
745 switch (TYPE(CHILD(n, i-1))) {
746 case PLUS:
747 op = BINARY_ADD;
748 break;
749 case MINUS:
750 op = BINARY_SUBTRACT;
751 break;
752 default:
753 err_setstr(SystemError,
754 "com_arith_expr: operator not + or -");
755 c->c_errors++;
756 op = 255;
757 }
758 com_addbyte(c, op);
759 }
760}
761
762static void
763com_shift_expr(c, n)
764 struct compiling *c;
765 node *n;
766{
767 int i;
768 int op;
769 REQ(n, shift_expr);
770 com_arith_expr(c, CHILD(n, 0));
771 for (i = 2; i < NCH(n); i += 2) {
772 com_arith_expr(c, CHILD(n, i));
773 switch (TYPE(CHILD(n, i-1))) {
774 case LEFTSHIFT:
775 op = BINARY_LSHIFT;
776 break;
777 case RIGHTSHIFT:
778 op = BINARY_RSHIFT;
779 break;
780 default:
781 err_setstr(SystemError,
782 "com_shift_expr: operator not << or >>");
783 c->c_errors++;
784 op = 255;
785 }
786 com_addbyte(c, op);
787 }
788}
789
790static void
791com_and_expr(c, n)
792 struct compiling *c;
793 node *n;
794{
795 int i;
796 int op;
797 REQ(n, and_expr);
798 com_shift_expr(c, CHILD(n, 0));
799 for (i = 2; i < NCH(n); i += 2) {
800 com_shift_expr(c, CHILD(n, i));
801 if (TYPE(CHILD(n, i-1)) == AMPER) {
802 op = BINARY_AND;
803 }
804 else {
805 err_setstr(SystemError,
806 "com_and_expr: operator not &");
807 c->c_errors++;
808 op = 255;
809 }
810 com_addbyte(c, op);
811 }
812}
813
814static void
815com_xor_expr(c, n)
816 struct compiling *c;
817 node *n;
818{
819 int i;
820 int op;
821 REQ(n, xor_expr);
822 com_and_expr(c, CHILD(n, 0));
823 for (i = 2; i < NCH(n); i += 2) {
824 com_and_expr(c, CHILD(n, i));
825 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
826 op = BINARY_XOR;
827 }
828 else {
829 err_setstr(SystemError,
830 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000831 c->c_errors++;
832 op = 255;
833 }
834 com_addbyte(c, op);
835 }
836}
837
838static void
839com_expr(c, n)
840 struct compiling *c;
841 node *n;
842{
843 int i;
844 int op;
845 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000846 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000847 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +0000848 com_xor_expr(c, CHILD(n, i));
849 if (TYPE(CHILD(n, i-1)) == VBAR) {
850 op = BINARY_OR;
851 }
852 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000853 err_setstr(SystemError,
Guido van Rossum7928cd71991-10-24 14:59:31 +0000854 "com_expr: 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 enum cmp_op
863cmp_type(n)
864 node *n;
865{
866 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +0000867 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000868 | 'in' | 'not' 'in' | 'is' | 'is' not' */
869 if (NCH(n) == 1) {
870 n = CHILD(n, 0);
871 switch (TYPE(n)) {
872 case LESS: return LT;
873 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +0000874 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000875 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +0000876 case LESSEQUAL: return LE;
877 case GREATEREQUAL: return GE;
878 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000879 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
880 if (strcmp(STR(n), "is") == 0) return IS;
881 }
882 }
883 else if (NCH(n) == 2) {
884 int t2 = TYPE(CHILD(n, 1));
885 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000886 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
887 return NOT_IN;
888 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
889 return IS_NOT;
890 }
891 }
892 return BAD;
893}
894
895static void
896com_comparison(c, n)
897 struct compiling *c;
898 node *n;
899{
900 int i;
901 enum cmp_op op;
902 int anchor;
903 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
904 com_expr(c, CHILD(n, 0));
905 if (NCH(n) == 1)
906 return;
907
908 /****************************************************************
909 The following code is generated for all but the last
910 comparison in a chain:
911
912 label: on stack: opcode: jump to:
913
914 a <code to load b>
915 a, b DUP_TOP
916 a, b, b ROT_THREE
917 b, a, b COMPARE_OP
918 b, 0-or-1 JUMP_IF_FALSE L1
919 b, 1 POP_TOP
920 b
921
922 We are now ready to repeat this sequence for the next
923 comparison in the chain.
924
925 For the last we generate:
926
927 b <code to load c>
928 b, c COMPARE_OP
929 0-or-1
930
931 If there were any jumps to L1 (i.e., there was more than one
932 comparison), we generate:
933
934 0-or-1 JUMP_FORWARD L2
935 L1: b, 0 ROT_TWO
936 0, b POP_TOP
937 0
938 L2:
939 ****************************************************************/
940
941 anchor = 0;
942
943 for (i = 2; i < NCH(n); i += 2) {
944 com_expr(c, CHILD(n, i));
945 if (i+2 < NCH(n)) {
946 com_addbyte(c, DUP_TOP);
947 com_addbyte(c, ROT_THREE);
948 }
949 op = cmp_type(CHILD(n, i-1));
950 if (op == BAD) {
951 err_setstr(SystemError,
952 "com_comparison: unknown comparison op");
953 c->c_errors++;
954 }
955 com_addoparg(c, COMPARE_OP, op);
956 if (i+2 < NCH(n)) {
957 com_addfwref(c, JUMP_IF_FALSE, &anchor);
958 com_addbyte(c, POP_TOP);
959 }
960 }
961
962 if (anchor) {
963 int anchor2 = 0;
964 com_addfwref(c, JUMP_FORWARD, &anchor2);
965 com_backpatch(c, anchor);
966 com_addbyte(c, ROT_TWO);
967 com_addbyte(c, POP_TOP);
968 com_backpatch(c, anchor2);
969 }
970}
971
972static void
973com_not_test(c, n)
974 struct compiling *c;
975 node *n;
976{
977 REQ(n, not_test); /* 'not' not_test | comparison */
978 if (NCH(n) == 1) {
979 com_comparison(c, CHILD(n, 0));
980 }
981 else {
982 com_not_test(c, CHILD(n, 1));
983 com_addbyte(c, UNARY_NOT);
984 }
985}
986
987static void
988com_and_test(c, n)
989 struct compiling *c;
990 node *n;
991{
992 int i;
993 int anchor;
994 REQ(n, and_test); /* not_test ('and' not_test)* */
995 anchor = 0;
996 i = 0;
997 for (;;) {
998 com_not_test(c, CHILD(n, i));
999 if ((i += 2) >= NCH(n))
1000 break;
1001 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1002 com_addbyte(c, POP_TOP);
1003 }
1004 if (anchor)
1005 com_backpatch(c, anchor);
1006}
1007
1008static void
1009com_test(c, n)
1010 struct compiling *c;
1011 node *n;
1012{
1013 int i;
1014 int anchor;
1015 REQ(n, test); /* and_test ('and' and_test)* */
1016 anchor = 0;
1017 i = 0;
1018 for (;;) {
1019 com_and_test(c, CHILD(n, i));
1020 if ((i += 2) >= NCH(n))
1021 break;
1022 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1023 com_addbyte(c, POP_TOP);
1024 }
1025 if (anchor)
1026 com_backpatch(c, anchor);
1027}
1028
1029static void
1030com_list(c, n)
1031 struct compiling *c;
1032 node *n;
1033{
1034 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
1035 if (NCH(n) == 1) {
1036 com_node(c, CHILD(n, 0));
1037 }
1038 else {
1039 int i;
1040 int len;
1041 len = (NCH(n) + 1) / 2;
1042 for (i = 0; i < NCH(n); i += 2)
1043 com_node(c, CHILD(n, i));
1044 com_addoparg(c, BUILD_TUPLE, len);
1045 }
1046}
1047
1048
1049/* Begin of assignment compilation */
1050
1051static void com_assign_name PROTO((struct compiling *, node *, int));
1052static void com_assign PROTO((struct compiling *, node *, int));
1053
1054static void
1055com_assign_attr(c, n, assigning)
1056 struct compiling *c;
1057 node *n;
1058 int assigning;
1059{
1060 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
1061}
1062
1063static void
1064com_assign_slice(c, n, assigning)
1065 struct compiling *c;
1066 node *n;
1067 int assigning;
1068{
1069 com_slice(c, n, assigning ? STORE_SLICE : DELETE_SLICE);
1070}
1071
1072static void
1073com_assign_subscript(c, n, assigning)
1074 struct compiling *c;
1075 node *n;
1076 int assigning;
1077{
1078 com_node(c, n);
1079 com_addbyte(c, assigning ? STORE_SUBSCR : DELETE_SUBSCR);
1080}
1081
1082static void
1083com_assign_trailer(c, n, assigning)
1084 struct compiling *c;
1085 node *n;
1086 int assigning;
1087{
1088 char *name;
1089 REQ(n, trailer);
1090 switch (TYPE(CHILD(n, 0))) {
1091 case LPAR: /* '(' [exprlist] ')' */
1092 err_setstr(TypeError, "can't assign to function call");
1093 c->c_errors++;
1094 break;
1095 case DOT: /* '.' NAME */
1096 com_assign_attr(c, CHILD(n, 1), assigning);
1097 break;
1098 case LSQB: /* '[' subscript ']' */
1099 n = CHILD(n, 1);
1100 REQ(n, subscript); /* subscript: expr | [expr] ':' [expr] */
1101 if (NCH(n) > 1 || TYPE(CHILD(n, 0)) == COLON)
1102 com_assign_slice(c, n, assigning);
1103 else
1104 com_assign_subscript(c, CHILD(n, 0), assigning);
1105 break;
1106 default:
1107 err_setstr(TypeError, "unknown trailer type");
1108 c->c_errors++;
1109 }
1110}
1111
1112static void
1113com_assign_tuple(c, n, assigning)
1114 struct compiling *c;
1115 node *n;
1116 int assigning;
1117{
1118 int i;
1119 if (TYPE(n) != testlist)
1120 REQ(n, exprlist);
1121 if (assigning)
1122 com_addoparg(c, UNPACK_TUPLE, (NCH(n)+1)/2);
1123 for (i = 0; i < NCH(n); i += 2)
1124 com_assign(c, CHILD(n, i), assigning);
1125}
1126
1127static void
1128com_assign_list(c, n, assigning)
1129 struct compiling *c;
1130 node *n;
1131 int assigning;
1132{
1133 int i;
1134 if (assigning)
1135 com_addoparg(c, UNPACK_LIST, (NCH(n)+1)/2);
1136 for (i = 0; i < NCH(n); i += 2)
1137 com_assign(c, CHILD(n, i), assigning);
1138}
1139
1140static void
1141com_assign_name(c, n, assigning)
1142 struct compiling *c;
1143 node *n;
1144 int assigning;
1145{
1146 REQ(n, NAME);
1147 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
1148}
1149
1150static void
1151com_assign(c, n, assigning)
1152 struct compiling *c;
1153 node *n;
1154 int assigning;
1155{
1156 /* Loop to avoid trivial recursion */
1157 for (;;) {
1158 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001159
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001160 case exprlist:
1161 case testlist:
1162 if (NCH(n) > 1) {
1163 com_assign_tuple(c, n, assigning);
1164 return;
1165 }
1166 n = CHILD(n, 0);
1167 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001168
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001169 case test:
1170 case and_test:
1171 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001172 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001173 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001174 case xor_expr:
1175 case and_expr:
1176 case shift_expr:
1177 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001178 case term:
1179 if (NCH(n) > 1) {
1180 err_setstr(TypeError,
1181 "can't assign to operator");
1182 c->c_errors++;
1183 return;
1184 }
1185 n = CHILD(n, 0);
1186 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001187
Guido van Rossum7928cd71991-10-24 14:59:31 +00001188 case factor: /* ('+'|'-'|'~') factor | atom trailer* */
1189 if (TYPE(CHILD(n, 0)) != atom) { /* '+'|'-'|'~' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001190 err_setstr(TypeError,
1191 "can't assign to operator");
1192 c->c_errors++;
1193 return;
1194 }
1195 if (NCH(n) > 1) { /* trailer present */
1196 int i;
1197 com_node(c, CHILD(n, 0));
1198 for (i = 1; i+1 < NCH(n); i++) {
1199 com_apply_trailer(c, CHILD(n, i));
1200 } /* NB i is still alive */
1201 com_assign_trailer(c,
1202 CHILD(n, i), assigning);
1203 return;
1204 }
1205 n = CHILD(n, 0);
1206 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001207
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001208 case atom:
1209 switch (TYPE(CHILD(n, 0))) {
1210 case LPAR:
1211 n = CHILD(n, 1);
1212 if (TYPE(n) == RPAR) {
1213 /* XXX Should allow () = () ??? */
1214 err_setstr(TypeError,
1215 "can't assign to ()");
1216 c->c_errors++;
1217 return;
1218 }
1219 break;
1220 case LSQB:
1221 n = CHILD(n, 1);
1222 if (TYPE(n) == RSQB) {
1223 err_setstr(TypeError,
1224 "can't assign to []");
1225 c->c_errors++;
1226 return;
1227 }
1228 com_assign_list(c, n, assigning);
1229 return;
1230 case NAME:
1231 com_assign_name(c, CHILD(n, 0), assigning);
1232 return;
1233 default:
1234 err_setstr(TypeError,
1235 "can't assign to constant");
1236 c->c_errors++;
1237 return;
1238 }
1239 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001240
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001241 default:
1242 fprintf(stderr, "node type %d\n", TYPE(n));
1243 err_setstr(SystemError, "com_assign: bad node");
1244 c->c_errors++;
1245 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001246
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001247 }
1248 }
1249}
1250
1251static void
1252com_expr_stmt(c, n)
1253 struct compiling *c;
1254 node *n;
1255{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001256 REQ(n, expr_stmt); /* exprlist ('=' exprlist)* */
1257 com_node(c, CHILD(n, NCH(n)-1));
1258 if (NCH(n) == 1) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001259 com_addbyte(c, PRINT_EXPR);
1260 }
1261 else {
1262 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001263 for (i = 0; i < NCH(n)-2; i+=2) {
1264 if (i+2 < NCH(n)-2)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001265 com_addbyte(c, DUP_TOP);
1266 com_assign(c, CHILD(n, i), 1/*assign*/);
1267 }
1268 }
1269}
1270
1271static void
1272com_print_stmt(c, n)
1273 struct compiling *c;
1274 node *n;
1275{
1276 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001277 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
1278 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001279 com_node(c, CHILD(n, i));
1280 com_addbyte(c, PRINT_ITEM);
1281 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001282 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001283 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001284 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001285}
1286
1287static void
1288com_return_stmt(c, n)
1289 struct compiling *c;
1290 node *n;
1291{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001292 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001293 if (!c->c_infunction) {
1294 err_setstr(TypeError, "'return' outside function");
1295 c->c_errors++;
1296 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001297 if (NCH(n) < 2)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001298 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1299 else
1300 com_node(c, CHILD(n, 1));
1301 com_addbyte(c, RETURN_VALUE);
1302}
1303
1304static void
1305com_raise_stmt(c, n)
1306 struct compiling *c;
1307 node *n;
1308{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001309 REQ(n, raise_stmt); /* 'raise' test [',' test] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001310 com_node(c, CHILD(n, 1));
1311 if (NCH(n) > 3)
1312 com_node(c, CHILD(n, 3));
1313 else
1314 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1315 com_addbyte(c, RAISE_EXCEPTION);
1316}
1317
1318static void
1319com_import_stmt(c, n)
1320 struct compiling *c;
1321 node *n;
1322{
1323 int i;
1324 REQ(n, import_stmt);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001325 /* 'import' NAME (',' NAME)* |
1326 'from' NAME 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001327 if (STR(CHILD(n, 0))[0] == 'f') {
1328 /* 'from' NAME 'import' ... */
1329 REQ(CHILD(n, 1), NAME);
1330 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
1331 for (i = 3; i < NCH(n); i += 2)
1332 com_addopname(c, IMPORT_FROM, CHILD(n, i));
1333 com_addbyte(c, POP_TOP);
1334 }
1335 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001336 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001337 for (i = 1; i < NCH(n); i += 2) {
1338 com_addopname(c, IMPORT_NAME, CHILD(n, i));
1339 com_addopname(c, STORE_NAME, CHILD(n, i));
1340 }
1341 }
1342}
1343
1344static void
1345com_if_stmt(c, n)
1346 struct compiling *c;
1347 node *n;
1348{
1349 int i;
1350 int anchor = 0;
1351 REQ(n, if_stmt);
1352 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
1353 for (i = 0; i+3 < NCH(n); i+=4) {
1354 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001355 node *ch = CHILD(n, i+1);
1356 if (i > 0)
1357 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001358 com_node(c, CHILD(n, i+1));
1359 com_addfwref(c, JUMP_IF_FALSE, &a);
1360 com_addbyte(c, POP_TOP);
1361 com_node(c, CHILD(n, i+3));
1362 com_addfwref(c, JUMP_FORWARD, &anchor);
1363 com_backpatch(c, a);
1364 com_addbyte(c, POP_TOP);
1365 }
1366 if (i+2 < NCH(n))
1367 com_node(c, CHILD(n, i+2));
1368 com_backpatch(c, anchor);
1369}
1370
1371static void
1372com_while_stmt(c, n)
1373 struct compiling *c;
1374 node *n;
1375{
1376 int break_anchor = 0;
1377 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001378 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001379 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
1380 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001381 block_push(c, SETUP_LOOP);
1382 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001383 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001384 com_node(c, CHILD(n, 1));
1385 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1386 com_addbyte(c, POP_TOP);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001387 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001388 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001389 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001390 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1391 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001392 com_backpatch(c, anchor);
1393 com_addbyte(c, POP_TOP);
1394 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001395 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001396 if (NCH(n) > 4)
1397 com_node(c, CHILD(n, 6));
1398 com_backpatch(c, break_anchor);
1399}
1400
1401static void
1402com_for_stmt(c, n)
1403 struct compiling *c;
1404 node *n;
1405{
1406 object *v;
1407 int break_anchor = 0;
1408 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001409 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001410 REQ(n, for_stmt);
1411 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
1412 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001413 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001414 com_node(c, CHILD(n, 3));
1415 v = newintobject(0L);
1416 if (v == NULL)
1417 c->c_errors++;
1418 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
1419 XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001420 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001421 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001422 com_addfwref(c, FOR_LOOP, &anchor);
1423 com_assign(c, CHILD(n, 1), 1/*assigning*/);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001424 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001425 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001426 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001427 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1428 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001429 com_backpatch(c, anchor);
1430 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001431 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001432 if (NCH(n) > 8)
1433 com_node(c, CHILD(n, 8));
1434 com_backpatch(c, break_anchor);
1435}
1436
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001437/* Although 'execpt' and 'finally' clauses can be combined
1438 syntactically, they are compiled separately. In fact,
1439 try: S
1440 except E1: S1
1441 except E2: S2
1442 ...
1443 finally: Sf
1444 is equivalent to
1445 try:
1446 try: S
1447 except E1: S1
1448 except E2: S2
1449 ...
1450 finally: Sf
1451 meaning that the 'finally' clause is entered even if things
1452 go wrong again in an exception handler. Note that this is
1453 not the case for exception handlers: at most one is entered.
1454
1455 Code generated for "try: S finally: Sf" is as follows:
1456
1457 SETUP_FINALLY L
1458 <code for S>
1459 POP_BLOCK
1460 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001461 L: <code for Sf>
1462 END_FINALLY
1463
1464 The special instructions use the block stack. Each block
1465 stack entry contains the instruction that created it (here
1466 SETUP_FINALLY), the level of the value stack at the time the
1467 block stack entry was created, and a label (here L).
1468
1469 SETUP_FINALLY:
1470 Pushes the current value stack level and the label
1471 onto the block stack.
1472 POP_BLOCK:
1473 Pops en entry from the block stack, and pops the value
1474 stack until its level is the same as indicated on the
1475 block stack. (The label is ignored.)
1476 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001477 Pops a variable number of entries from the *value* stack
1478 and re-raises the exception they specify. The number of
1479 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001480
1481 The block stack is unwound when an exception is raised:
1482 when a SETUP_FINALLY entry is found, the exception is pushed
1483 onto the value stack (and the exception condition is cleared),
1484 and the interpreter jumps to the label gotten from the block
1485 stack.
1486
1487 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00001488 (The contents of the value stack is shown in [], with the top
1489 at the right; 'tb' is trace-back info, 'val' the exception's
1490 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001491
1492 Value stack Label Instruction Argument
1493 [] SETUP_EXCEPT L1
1494 [] <code for S>
1495 [] POP_BLOCK
1496 [] JUMP_FORWARD L0
1497
Guido van Rossum3f5da241990-12-20 15:06:42 +00001498 [tb, val, exc] L1: DUP )
1499 [tb, val, exc, exc] <evaluate E1> )
1500 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
1501 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
1502 [tb, val, exc, 1] POP )
1503 [tb, val, exc] POP
1504 [tb, val] <assign to V1> (or POP if no V1)
1505 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001506 [] <code for S1>
1507 JUMP_FORWARD L0
1508
Guido van Rossum3f5da241990-12-20 15:06:42 +00001509 [tb, val, exc, 0] L2: POP
1510 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001511 .............................etc.......................
1512
Guido van Rossum3f5da241990-12-20 15:06:42 +00001513 [tb, val, exc, 0] Ln+1: POP
1514 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001515
1516 [] L0: <next statement>
1517
1518 Of course, parts are not generated if Vi or Ei is not present.
1519*/
1520
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001521static void
1522com_try_stmt(c, n)
1523 struct compiling *c;
1524 node *n;
1525{
1526 int finally_anchor = 0;
1527 int except_anchor = 0;
1528 REQ(n, try_stmt);
1529 /* 'try' ':' suite (except_clause ':' suite)* ['finally' ':' suite] */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001530
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001531 if (NCH(n) > 3 && TYPE(CHILD(n, NCH(n)-3)) != except_clause) {
1532 /* Have a 'finally' clause */
1533 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001534 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001535 }
1536 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == except_clause) {
1537 /* Have an 'except' clause */
1538 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001539 block_push(c, SETUP_EXCEPT);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001540 }
1541 com_node(c, CHILD(n, 2));
1542 if (except_anchor) {
1543 int end_anchor = 0;
1544 int i;
1545 node *ch;
1546 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001547 block_pop(c, SETUP_EXCEPT);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001548 com_addfwref(c, JUMP_FORWARD, &end_anchor);
1549 com_backpatch(c, except_anchor);
1550 for (i = 3;
1551 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
1552 i += 3) {
1553 /* except_clause: 'except' [expr [',' expr]] */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001554 if (except_anchor == 0) {
1555 err_setstr(TypeError,
1556 "default 'except:' must be last");
1557 c->c_errors++;
1558 break;
1559 }
1560 except_anchor = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001561 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001562 if (NCH(ch) > 1) {
1563 com_addbyte(c, DUP_TOP);
1564 com_node(c, CHILD(ch, 1));
1565 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001566 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001567 com_addbyte(c, POP_TOP);
1568 }
1569 com_addbyte(c, POP_TOP);
1570 if (NCH(ch) > 3)
1571 com_assign(c, CHILD(ch, 3), 1/*assigning*/);
1572 else
1573 com_addbyte(c, POP_TOP);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001574 com_addbyte(c, POP_TOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001575 com_node(c, CHILD(n, i+2));
1576 com_addfwref(c, JUMP_FORWARD, &end_anchor);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001577 if (except_anchor) {
1578 com_backpatch(c, except_anchor);
1579 com_addbyte(c, POP_TOP);
1580 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001581 }
1582 com_addbyte(c, END_FINALLY);
1583 com_backpatch(c, end_anchor);
1584 }
1585 if (finally_anchor) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001586 node *ch;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001587 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001588 block_pop(c, SETUP_FINALLY);
1589 block_push(c, END_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001590 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001591 com_backpatch(c, finally_anchor);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001592 ch = CHILD(n, NCH(n)-1);
1593 com_addoparg(c, SET_LINENO, ch->n_lineno);
1594 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001595 com_addbyte(c, END_FINALLY);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001596 block_pop(c, END_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001597 }
1598}
1599
1600static void
1601com_suite(c, n)
1602 struct compiling *c;
1603 node *n;
1604{
1605 REQ(n, suite);
1606 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
1607 if (NCH(n) == 1) {
1608 com_node(c, CHILD(n, 0));
1609 }
1610 else {
1611 int i;
1612 for (i = 0; i < NCH(n); i++) {
1613 node *ch = CHILD(n, i);
1614 if (TYPE(ch) == stmt)
1615 com_node(c, ch);
1616 }
1617 }
1618}
1619
1620static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001621com_continue_stmt(c, n)
1622 struct compiling *c;
1623 node *n;
1624{
1625 int i = c->c_nblocks;
1626 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
1627 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1628 }
1629 else {
1630 err_setstr(TypeError, "'continue' not properly in loop");
1631 c->c_errors++;
1632 }
1633 /* XXX Could allow it inside a 'finally' clause
1634 XXX if we could pop the exception still on the stack */
1635}
1636
1637static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001638com_funcdef(c, n)
1639 struct compiling *c;
1640 node *n;
1641{
1642 object *v;
1643 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001644 v = (object *)compile(n, c->c_filename);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001645 if (v == NULL)
1646 c->c_errors++;
1647 else {
1648 int i = com_addconst(c, v);
1649 com_addoparg(c, LOAD_CONST, i);
1650 com_addbyte(c, BUILD_FUNCTION);
1651 com_addopname(c, STORE_NAME, CHILD(n, 1));
1652 DECREF(v);
1653 }
1654}
1655
1656static void
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001657com_bases(c, n)
1658 struct compiling *c;
1659 node *n;
1660{
1661 int i, nbases;
1662 REQ(n, baselist);
1663 /*
1664 baselist: atom arguments (',' atom arguments)*
1665 arguments: '(' [testlist] ')'
1666 */
1667 for (i = 0; i < NCH(n); i += 3)
1668 com_node(c, CHILD(n, i));
1669 com_addoparg(c, BUILD_TUPLE, (NCH(n)+1) / 3);
1670}
1671
1672static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001673com_classdef(c, n)
1674 struct compiling *c;
1675 node *n;
1676{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001677 object *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001678 REQ(n, classdef);
1679 /*
1680 classdef: 'class' NAME parameters ['=' baselist] ':' suite
1681 baselist: atom arguments (',' atom arguments)*
1682 arguments: '(' [testlist] ')'
1683 */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001684 if (NCH(n) == 7)
1685 com_bases(c, CHILD(n, 4));
1686 else
1687 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001688 v = (object *)compile(n, c->c_filename);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001689 if (v == NULL)
1690 c->c_errors++;
1691 else {
1692 int i = com_addconst(c, v);
1693 com_addoparg(c, LOAD_CONST, i);
1694 com_addbyte(c, BUILD_FUNCTION);
1695 com_addbyte(c, UNARY_CALL);
1696 com_addbyte(c, BUILD_CLASS);
1697 com_addopname(c, STORE_NAME, CHILD(n, 1));
1698 DECREF(v);
1699 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001700}
1701
1702static void
1703com_node(c, n)
1704 struct compiling *c;
1705 node *n;
1706{
1707 switch (TYPE(n)) {
1708
1709 /* Definition nodes */
1710
1711 case funcdef:
1712 com_funcdef(c, n);
1713 break;
1714 case classdef:
1715 com_classdef(c, n);
1716 break;
1717
1718 /* Trivial parse tree nodes */
1719
1720 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001721 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001722 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001723 com_node(c, CHILD(n, 0));
1724 break;
1725
1726 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001727 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
1728 com_addoparg(c, SET_LINENO, n->n_lineno);
1729 {
1730 int i;
1731 for (i = 0; i < NCH(n)-1; i += 2)
1732 com_node(c, CHILD(n, i));
1733 }
1734 break;
1735
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001736 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001737 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001738 com_node(c, CHILD(n, 0));
1739 break;
1740
1741 /* Statement nodes */
1742
1743 case expr_stmt:
1744 com_expr_stmt(c, n);
1745 break;
1746 case print_stmt:
1747 com_print_stmt(c, n);
1748 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001749 case del_stmt: /* 'del' exprlist */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001750 com_assign(c, CHILD(n, 1), 0/*delete*/);
1751 break;
1752 case pass_stmt:
1753 break;
1754 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001755 if (c->c_loops == 0) {
1756 err_setstr(TypeError, "'break' outside loop");
1757 c->c_errors++;
1758 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001759 com_addbyte(c, BREAK_LOOP);
1760 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001761 case continue_stmt:
1762 com_continue_stmt(c, n);
1763 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001764 case return_stmt:
1765 com_return_stmt(c, n);
1766 break;
1767 case raise_stmt:
1768 com_raise_stmt(c, n);
1769 break;
1770 case import_stmt:
1771 com_import_stmt(c, n);
1772 break;
1773 case if_stmt:
1774 com_if_stmt(c, n);
1775 break;
1776 case while_stmt:
1777 com_while_stmt(c, n);
1778 break;
1779 case for_stmt:
1780 com_for_stmt(c, n);
1781 break;
1782 case try_stmt:
1783 com_try_stmt(c, n);
1784 break;
1785 case suite:
1786 com_suite(c, n);
1787 break;
1788
1789 /* Expression nodes */
1790
1791 case testlist:
1792 com_list(c, n);
1793 break;
1794 case test:
1795 com_test(c, n);
1796 break;
1797 case and_test:
1798 com_and_test(c, n);
1799 break;
1800 case not_test:
1801 com_not_test(c, n);
1802 break;
1803 case comparison:
1804 com_comparison(c, n);
1805 break;
1806 case exprlist:
1807 com_list(c, n);
1808 break;
1809 case expr:
1810 com_expr(c, n);
1811 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001812 case xor_expr:
1813 com_xor_expr(c, n);
1814 break;
1815 case and_expr:
1816 com_and_expr(c, n);
1817 break;
1818 case shift_expr:
1819 com_shift_expr(c, n);
1820 break;
1821 case arith_expr:
1822 com_arith_expr(c, n);
1823 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001824 case term:
1825 com_term(c, n);
1826 break;
1827 case factor:
1828 com_factor(c, n);
1829 break;
1830 case atom:
1831 com_atom(c, n);
1832 break;
1833
1834 default:
1835 fprintf(stderr, "node type %d\n", TYPE(n));
1836 err_setstr(SystemError, "com_node: unexpected node type");
1837 c->c_errors++;
1838 }
1839}
1840
1841static void com_fplist PROTO((struct compiling *, node *));
1842
1843static void
1844com_fpdef(c, n)
1845 struct compiling *c;
1846 node *n;
1847{
1848 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
1849 if (TYPE(CHILD(n, 0)) == LPAR)
1850 com_fplist(c, CHILD(n, 1));
1851 else
1852 com_addopname(c, STORE_NAME, CHILD(n, 0));
1853}
1854
1855static void
1856com_fplist(c, n)
1857 struct compiling *c;
1858 node *n;
1859{
1860 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* */
1861 if (NCH(n) == 1) {
1862 com_fpdef(c, CHILD(n, 0));
1863 }
1864 else {
1865 int i;
1866 com_addoparg(c, UNPACK_TUPLE, (NCH(n)+1)/2);
1867 for (i = 0; i < NCH(n); i += 2)
1868 com_fpdef(c, CHILD(n, i));
1869 }
1870}
1871
1872static void
1873com_file_input(c, n)
1874 struct compiling *c;
1875 node *n;
1876{
1877 int i;
1878 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
1879 for (i = 0; i < NCH(n); i++) {
1880 node *ch = CHILD(n, i);
1881 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
1882 com_node(c, ch);
1883 }
1884}
1885
1886/* Top-level compile-node interface */
1887
1888static void
1889compile_funcdef(c, n)
1890 struct compiling *c;
1891 node *n;
1892{
1893 node *ch;
1894 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
1895 ch = CHILD(n, 2); /* parameters: '(' [fplist] ')' */
1896 ch = CHILD(ch, 1); /* ')' | fplist */
1897 if (TYPE(ch) == RPAR)
1898 com_addbyte(c, REFUSE_ARGS);
1899 else {
1900 com_addbyte(c, REQUIRE_ARGS);
1901 com_fplist(c, ch);
1902 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001903 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001904 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001905 c->c_infunction = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001906 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1907 com_addbyte(c, RETURN_VALUE);
1908}
1909
1910static void
1911compile_node(c, n)
1912 struct compiling *c;
1913 node *n;
1914{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001915 com_addoparg(c, SET_LINENO, n->n_lineno);
1916
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001917 switch (TYPE(n)) {
1918
Guido van Rossum4c417781991-01-21 16:09:22 +00001919 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001920 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001921 com_addbyte(c, REFUSE_ARGS);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001922 n = CHILD(n, 0);
1923 if (TYPE(n) != NEWLINE)
1924 com_node(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001925 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1926 com_addbyte(c, RETURN_VALUE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001927 break;
1928
Guido van Rossum4c417781991-01-21 16:09:22 +00001929 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001930 com_addbyte(c, REFUSE_ARGS);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001931 com_file_input(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001932 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1933 com_addbyte(c, RETURN_VALUE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001934 break;
1935
Guido van Rossum4c417781991-01-21 16:09:22 +00001936 case expr_input: /* Built-in function eval() */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001937 com_addbyte(c, REFUSE_ARGS);
1938 com_node(c, CHILD(n, 0));
1939 com_addbyte(c, RETURN_VALUE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001940 break;
1941
Guido van Rossum4c417781991-01-21 16:09:22 +00001942 case eval_input: /* Built-in function input() */
1943 com_addbyte(c, REFUSE_ARGS);
1944 com_node(c, CHILD(n, 0));
1945 com_addbyte(c, RETURN_VALUE);
1946 break;
1947
1948 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001949 compile_funcdef(c, n);
1950 break;
1951
Guido van Rossum4c417781991-01-21 16:09:22 +00001952 case classdef: /* A class definition */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001953 /* 'class' NAME parameters ['=' baselist] ':' suite */
1954 com_addbyte(c, REFUSE_ARGS);
1955 com_node(c, CHILD(n, NCH(n)-1));
1956 com_addbyte(c, LOAD_LOCALS);
1957 com_addbyte(c, RETURN_VALUE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001958 break;
1959
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001960 default:
1961 fprintf(stderr, "node type %d\n", TYPE(n));
1962 err_setstr(SystemError, "compile_node: unexpected node type");
1963 c->c_errors++;
1964 }
1965}
1966
Guido van Rossum282914b1991-04-04 10:42:56 +00001967/* Optimization for local and global variables.
1968
1969 Attempt to replace all LOAD_NAME instructions that refer to a local
1970 variable with LOAD_LOCAL instructions, and all that refer to a global
1971 variable with LOAD_GLOBAL instructions.
1972
1973 To find all local variables, we check all STORE_NAME and IMPORT_FROM
1974 instructions. This yields all local variables, including arguments,
1975 function definitions, class definitions and import statements.
1976
1977 There is one leak: 'from foo import *' introduces local variables
1978 that we can't know while compiling. If this is the case, LOAD_GLOBAL
1979 instructions are not generated -- LOAD_NAME is left in place for
1980 globals, since it first checks for globals (LOAD_LOCAL is still used
1981 for recognized locals, since it doesn't hurt).
1982
1983 This optimization means that using the same name as a global and
1984 as a local variable within the same scope is now illegal, which
1985 is a change to the language! Also using eval() to introduce new
1986 local variables won't work. But both were bad practice at best.
1987
1988 The optimization doesn't save much: basically, it saves one
1989 unsuccessful dictionary lookup per global (or built-in) variable
1990 reference. On the (slow!) Mac Plus, with 4 local variables,
1991 this saving was measured to be about 0.18 ms. We might save more
1992 by using a different data structure to hold local variables, like
1993 an array indexed by variable number.
1994
1995 NB: this modifies the string object co->co_code!
1996*/
1997
1998static void
1999optimizer(co)
2000 codeobject *co;
2001{
Guido van Rossum0a697f61991-04-16 08:39:12 +00002002 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00002003 object *locals;
2004 int opcode;
2005 int oparg;
2006 object *name;
2007 int star_used;
Guido van Rossum0a697f61991-04-16 08:39:12 +00002008
Guido van Rossum282914b1991-04-04 10:42:56 +00002009#define NEXTOP() (*next_instr++)
2010#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
2011#define GETITEM(v, i) (getlistitem((v), (i)))
2012#define GETNAMEOBJ(i) (GETITEM(co->co_names, (i)))
2013
2014 locals = newdictobject();
2015 if (locals == NULL) {
2016 err_clear();
2017 return; /* For now, this is OK */
2018 }
2019
Guido van Rossum0a697f61991-04-16 08:39:12 +00002020 next_instr = (unsigned char *) GETSTRINGVALUE(co->co_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00002021 for (;;) {
2022 opcode = NEXTOP();
2023 if (opcode == STOP_CODE)
2024 break;
2025 if (HAS_ARG(opcode))
2026 oparg = NEXTARG();
2027 if (opcode == STORE_NAME || opcode == IMPORT_FROM) {
2028 name = GETNAMEOBJ(oparg);
2029 if (dict2insert(locals, name, None) != 0) {
2030 DECREF(locals);
2031 return; /* Sorry */
2032 }
2033 }
2034 }
2035
2036 star_used = (dictlookup(locals, "*") != NULL);
Guido van Rossum0a697f61991-04-16 08:39:12 +00002037 next_instr = (unsigned char *) GETSTRINGVALUE(co->co_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00002038 for (;;) {
2039 cur_instr = next_instr;
2040 opcode = NEXTOP();
2041 if (opcode == STOP_CODE)
2042 break;
2043 if (HAS_ARG(opcode))
2044 oparg = NEXTARG();
2045 if (opcode == LOAD_NAME) {
2046 name = GETNAMEOBJ(oparg);
Guido van Rossum83163251991-08-16 08:58:43 +00002047 if (dict2lookup(locals, name) != NULL)
Guido van Rossum282914b1991-04-04 10:42:56 +00002048 *cur_instr = LOAD_LOCAL;
Guido van Rossum83163251991-08-16 08:58:43 +00002049 else {
2050 err_clear();
2051 if (!star_used)
2052 *cur_instr = LOAD_GLOBAL;
2053 }
Guido van Rossum282914b1991-04-04 10:42:56 +00002054 }
2055 }
2056
2057 DECREF(locals);
2058}
2059
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002060codeobject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002061compile(n, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002062 node *n;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002063 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002064{
2065 struct compiling sc;
2066 codeobject *co;
Guido van Rossuma082ce41991-06-04 19:41:56 +00002067 object *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002068 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002069 return NULL;
2070 compile_node(&sc, n);
2071 com_done(&sc);
Guido van Rossuma082ce41991-06-04 19:41:56 +00002072 if (sc.c_errors == 0 && (v = newstringobject(filename)) != NULL) {
2073 co = newcodeobject(sc.c_code, sc.c_consts, sc.c_names, v);
2074 DECREF(v);
2075 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002076 else
2077 co = NULL;
2078 com_free(&sc);
Guido van Rossumfb8edfc1991-05-14 11:56:03 +00002079 if (co != NULL && filename[0] != '<')
Guido van Rossum282914b1991-04-04 10:42:56 +00002080 optimizer(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002081 return co;
2082}