blob: e69ae6e34b5e7b6c6b25ca764bb063999755e3ea [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
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000332/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000333
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) {
Guido van Rossumefb087b1991-12-16 15:41:41 +0000425 err_setstr(OverflowError,
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000426 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000427 return NULL;
428 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000429 return newintobject(x);
Guido van Rossum282914b1991-04-04 10:42:56 +0000430 }
431 errno = 0;
432 xx = strtod(s, &end);
433 if (*end == '\0') {
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000434#ifndef BROKEN_STRTOD
435 /* Some strtod() versions (e.g., in older SunOS systems)
436 set errno incorrectly; better to ignore overflows
437 than not to be able to use float literals at all! */
Guido van Rossum282914b1991-04-04 10:42:56 +0000438 if (errno != 0) {
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000439 err_setstr(OverflowError, "float literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000440 return NULL;
441 }
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000442#endif
Guido van Rossum282914b1991-04-04 10:42:56 +0000443 return newfloatobject(xx);
444 }
Guido van Rossumefb087b1991-12-16 15:41:41 +0000445 err_setstr(SystemError, "bad number syntax?!?!");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000446 return NULL;
447}
448
449static object *
450parsestr(s)
451 char *s;
452{
453 object *v;
454 int len;
455 char *buf;
456 char *p;
457 int c;
458 if (*s != '\'') {
459 err_badcall();
460 return NULL;
461 }
462 s++;
463 len = strlen(s);
464 if (s[--len] != '\'') {
465 err_badcall();
466 return NULL;
467 }
468 if (strchr(s, '\\') == NULL)
469 return newsizedstringobject(s, len);
470 v = newsizedstringobject((char *)NULL, len);
471 p = buf = getstringvalue(v);
472 while (*s != '\0' && *s != '\'') {
473 if (*s != '\\') {
474 *p++ = *s++;
475 continue;
476 }
477 s++;
478 switch (*s++) {
479 /* XXX This assumes ASCII! */
480 case '\\': *p++ = '\\'; break;
481 case '\'': *p++ = '\''; break;
482 case 'b': *p++ = '\b'; break;
483 case 'f': *p++ = '\014'; break; /* FF */
484 case 't': *p++ = '\t'; break;
485 case 'n': *p++ = '\n'; break;
486 case 'r': *p++ = '\r'; break;
487 case 'v': *p++ = '\013'; break; /* VT */
488 case 'E': *p++ = '\033'; break; /* ESC, not C */
489 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
490 case '0': case '1': case '2': case '3':
491 case '4': case '5': case '6': case '7':
492 c = s[-1] - '0';
493 if ('0' <= *s && *s <= '7') {
494 c = (c<<3) + *s++ - '0';
495 if ('0' <= *s && *s <= '7')
496 c = (c<<3) + *s++ - '0';
497 }
498 *p++ = c;
499 break;
500 case 'x':
501 if (isxdigit(*s)) {
502 sscanf(s, "%x", &c);
503 *p++ = c;
504 do {
505 s++;
506 } while (isxdigit(*s));
507 break;
508 }
509 /* FALLTHROUGH */
510 default: *p++ = '\\'; *p++ = s[-1]; break;
511 }
512 }
513 resizestring(&v, (int)(p - buf));
514 return v;
515}
516
517static void
518com_list_constructor(c, n)
519 struct compiling *c;
520 node *n;
521{
522 int len;
523 int i;
524 object *v, *w;
525 if (TYPE(n) != testlist)
526 REQ(n, exprlist);
527 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
528 len = (NCH(n) + 1) / 2;
529 for (i = 0; i < NCH(n); i += 2)
530 com_node(c, CHILD(n, i));
531 com_addoparg(c, BUILD_LIST, len);
532}
533
534static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000535com_dictmaker(c, n)
536 struct compiling *c;
537 node *n;
538{
539 int i;
540 /* dictmaker: test ':' test (',' test ':' value)* [','] */
541 for (i = 0; i+2 < NCH(n); i += 4) {
542 /* We must arrange things just right for STORE_SUBSCR.
543 It wants the stack to look like (value) (dict) (key) */
544 com_addbyte(c, DUP_TOP);
545 com_node(c, CHILD(n, i+2)); /* value */
546 com_addbyte(c, ROT_TWO);
547 com_node(c, CHILD(n, i)); /* key */
548 com_addbyte(c, STORE_SUBSCR);
549 }
550}
551
552static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000553com_atom(c, n)
554 struct compiling *c;
555 node *n;
556{
557 node *ch;
558 object *v;
559 int i;
560 REQ(n, atom);
561 ch = CHILD(n, 0);
562 switch (TYPE(ch)) {
563 case LPAR:
564 if (TYPE(CHILD(n, 1)) == RPAR)
565 com_addoparg(c, BUILD_TUPLE, 0);
566 else
567 com_node(c, CHILD(n, 1));
568 break;
569 case LSQB:
570 if (TYPE(CHILD(n, 1)) == RSQB)
571 com_addoparg(c, BUILD_LIST, 0);
572 else
573 com_list_constructor(c, CHILD(n, 1));
574 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000575 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000576 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000577 if (TYPE(CHILD(n, 1)) != RBRACE)
578 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000579 break;
580 case BACKQUOTE:
581 com_node(c, CHILD(n, 1));
582 com_addbyte(c, UNARY_CONVERT);
583 break;
584 case NUMBER:
585 if ((v = parsenumber(STR(ch))) == NULL) {
586 c->c_errors++;
587 i = 255;
588 }
589 else {
590 i = com_addconst(c, v);
591 DECREF(v);
592 }
593 com_addoparg(c, LOAD_CONST, i);
594 break;
595 case STRING:
596 if ((v = parsestr(STR(ch))) == NULL) {
597 c->c_errors++;
598 i = 255;
599 }
600 else {
601 i = com_addconst(c, v);
602 DECREF(v);
603 }
604 com_addoparg(c, LOAD_CONST, i);
605 break;
606 case NAME:
607 com_addopname(c, LOAD_NAME, ch);
608 break;
609 default:
610 fprintf(stderr, "node type %d\n", TYPE(ch));
611 err_setstr(SystemError, "com_atom: unexpected node type");
612 c->c_errors++;
613 }
614}
615
616static void
617com_slice(c, n, op)
618 struct compiling *c;
619 node *n;
620 int op;
621{
622 if (NCH(n) == 1) {
623 com_addbyte(c, op);
624 }
625 else if (NCH(n) == 2) {
626 if (TYPE(CHILD(n, 0)) != COLON) {
627 com_node(c, CHILD(n, 0));
628 com_addbyte(c, op+1);
629 }
630 else {
631 com_node(c, CHILD(n, 1));
632 com_addbyte(c, op+2);
633 }
634 }
635 else {
636 com_node(c, CHILD(n, 0));
637 com_node(c, CHILD(n, 2));
638 com_addbyte(c, op+3);
639 }
640}
641
642static void
643com_apply_subscript(c, n)
644 struct compiling *c;
645 node *n;
646{
647 REQ(n, subscript);
648 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) != COLON) {
649 /* It's a single subscript */
650 com_node(c, CHILD(n, 0));
651 com_addbyte(c, BINARY_SUBSCR);
652 }
653 else {
654 /* It's a slice: [expr] ':' [expr] */
655 com_slice(c, n, SLICE);
656 }
657}
658
659static void
660com_call_function(c, n)
661 struct compiling *c;
662 node *n; /* EITHER testlist OR ')' */
663{
664 if (TYPE(n) == RPAR) {
Guido van Rossum288a60f1991-12-16 13:05:10 +0000665 com_addoparg(c, BUILD_TUPLE, 0);
666 com_addbyte(c, BINARY_CALL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000667 }
668 else {
Guido van Rossum288a60f1991-12-16 13:05:10 +0000669 int i;
670 REQ(n, testlist);
671 com_list(c, n, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000672 com_addbyte(c, BINARY_CALL);
673 }
674}
675
676static void
677com_select_member(c, n)
678 struct compiling *c;
679 node *n;
680{
681 com_addopname(c, LOAD_ATTR, n);
682}
683
684static void
685com_apply_trailer(c, n)
686 struct compiling *c;
687 node *n;
688{
689 REQ(n, trailer);
690 switch (TYPE(CHILD(n, 0))) {
691 case LPAR:
692 com_call_function(c, CHILD(n, 1));
693 break;
694 case DOT:
695 com_select_member(c, CHILD(n, 1));
696 break;
697 case LSQB:
698 com_apply_subscript(c, CHILD(n, 1));
699 break;
700 default:
701 err_setstr(SystemError,
702 "com_apply_trailer: unknown trailer type");
703 c->c_errors++;
704 }
705}
706
707static void
708com_factor(c, n)
709 struct compiling *c;
710 node *n;
711{
712 int i;
713 REQ(n, factor);
714 if (TYPE(CHILD(n, 0)) == PLUS) {
715 com_factor(c, CHILD(n, 1));
716 com_addbyte(c, UNARY_POSITIVE);
717 }
718 else if (TYPE(CHILD(n, 0)) == MINUS) {
719 com_factor(c, CHILD(n, 1));
720 com_addbyte(c, UNARY_NEGATIVE);
721 }
Guido van Rossum7928cd71991-10-24 14:59:31 +0000722 else if (TYPE(CHILD(n, 0)) == TILDE) {
723 com_factor(c, CHILD(n, 1));
724 com_addbyte(c, UNARY_INVERT);
725 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000726 else {
727 com_atom(c, CHILD(n, 0));
728 for (i = 1; i < NCH(n); i++)
729 com_apply_trailer(c, CHILD(n, i));
730 }
731}
732
733static void
734com_term(c, n)
735 struct compiling *c;
736 node *n;
737{
738 int i;
739 int op;
740 REQ(n, term);
741 com_factor(c, CHILD(n, 0));
742 for (i = 2; i < NCH(n); i += 2) {
743 com_factor(c, CHILD(n, i));
744 switch (TYPE(CHILD(n, i-1))) {
745 case STAR:
746 op = BINARY_MULTIPLY;
747 break;
748 case SLASH:
749 op = BINARY_DIVIDE;
750 break;
751 case PERCENT:
752 op = BINARY_MODULO;
753 break;
754 default:
755 err_setstr(SystemError,
Guido van Rossum7928cd71991-10-24 14:59:31 +0000756 "com_term: operator not *, / or %");
757 c->c_errors++;
758 op = 255;
759 }
760 com_addbyte(c, op);
761 }
762}
763
764static void
765com_arith_expr(c, n)
766 struct compiling *c;
767 node *n;
768{
769 int i;
770 int op;
771 REQ(n, arith_expr);
772 com_term(c, CHILD(n, 0));
773 for (i = 2; i < NCH(n); i += 2) {
774 com_term(c, CHILD(n, i));
775 switch (TYPE(CHILD(n, i-1))) {
776 case PLUS:
777 op = BINARY_ADD;
778 break;
779 case MINUS:
780 op = BINARY_SUBTRACT;
781 break;
782 default:
783 err_setstr(SystemError,
784 "com_arith_expr: operator not + or -");
785 c->c_errors++;
786 op = 255;
787 }
788 com_addbyte(c, op);
789 }
790}
791
792static void
793com_shift_expr(c, n)
794 struct compiling *c;
795 node *n;
796{
797 int i;
798 int op;
799 REQ(n, shift_expr);
800 com_arith_expr(c, CHILD(n, 0));
801 for (i = 2; i < NCH(n); i += 2) {
802 com_arith_expr(c, CHILD(n, i));
803 switch (TYPE(CHILD(n, i-1))) {
804 case LEFTSHIFT:
805 op = BINARY_LSHIFT;
806 break;
807 case RIGHTSHIFT:
808 op = BINARY_RSHIFT;
809 break;
810 default:
811 err_setstr(SystemError,
812 "com_shift_expr: operator not << or >>");
813 c->c_errors++;
814 op = 255;
815 }
816 com_addbyte(c, op);
817 }
818}
819
820static void
821com_and_expr(c, n)
822 struct compiling *c;
823 node *n;
824{
825 int i;
826 int op;
827 REQ(n, and_expr);
828 com_shift_expr(c, CHILD(n, 0));
829 for (i = 2; i < NCH(n); i += 2) {
830 com_shift_expr(c, CHILD(n, i));
831 if (TYPE(CHILD(n, i-1)) == AMPER) {
832 op = BINARY_AND;
833 }
834 else {
835 err_setstr(SystemError,
836 "com_and_expr: operator not &");
837 c->c_errors++;
838 op = 255;
839 }
840 com_addbyte(c, op);
841 }
842}
843
844static void
845com_xor_expr(c, n)
846 struct compiling *c;
847 node *n;
848{
849 int i;
850 int op;
851 REQ(n, xor_expr);
852 com_and_expr(c, CHILD(n, 0));
853 for (i = 2; i < NCH(n); i += 2) {
854 com_and_expr(c, CHILD(n, i));
855 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
856 op = BINARY_XOR;
857 }
858 else {
859 err_setstr(SystemError,
860 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000861 c->c_errors++;
862 op = 255;
863 }
864 com_addbyte(c, op);
865 }
866}
867
868static void
869com_expr(c, n)
870 struct compiling *c;
871 node *n;
872{
873 int i;
874 int op;
875 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000876 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000877 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +0000878 com_xor_expr(c, CHILD(n, i));
879 if (TYPE(CHILD(n, i-1)) == VBAR) {
880 op = BINARY_OR;
881 }
882 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000883 err_setstr(SystemError,
Guido van Rossum7928cd71991-10-24 14:59:31 +0000884 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000885 c->c_errors++;
886 op = 255;
887 }
888 com_addbyte(c, op);
889 }
890}
891
892static enum cmp_op
893cmp_type(n)
894 node *n;
895{
896 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +0000897 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000898 | 'in' | 'not' 'in' | 'is' | 'is' not' */
899 if (NCH(n) == 1) {
900 n = CHILD(n, 0);
901 switch (TYPE(n)) {
902 case LESS: return LT;
903 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +0000904 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000905 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +0000906 case LESSEQUAL: return LE;
907 case GREATEREQUAL: return GE;
908 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000909 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
910 if (strcmp(STR(n), "is") == 0) return IS;
911 }
912 }
913 else if (NCH(n) == 2) {
914 int t2 = TYPE(CHILD(n, 1));
915 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000916 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
917 return NOT_IN;
918 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
919 return IS_NOT;
920 }
921 }
922 return BAD;
923}
924
925static void
926com_comparison(c, n)
927 struct compiling *c;
928 node *n;
929{
930 int i;
931 enum cmp_op op;
932 int anchor;
933 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
934 com_expr(c, CHILD(n, 0));
935 if (NCH(n) == 1)
936 return;
937
938 /****************************************************************
939 The following code is generated for all but the last
940 comparison in a chain:
941
942 label: on stack: opcode: jump to:
943
944 a <code to load b>
945 a, b DUP_TOP
946 a, b, b ROT_THREE
947 b, a, b COMPARE_OP
948 b, 0-or-1 JUMP_IF_FALSE L1
949 b, 1 POP_TOP
950 b
951
952 We are now ready to repeat this sequence for the next
953 comparison in the chain.
954
955 For the last we generate:
956
957 b <code to load c>
958 b, c COMPARE_OP
959 0-or-1
960
961 If there were any jumps to L1 (i.e., there was more than one
962 comparison), we generate:
963
964 0-or-1 JUMP_FORWARD L2
965 L1: b, 0 ROT_TWO
966 0, b POP_TOP
967 0
968 L2:
969 ****************************************************************/
970
971 anchor = 0;
972
973 for (i = 2; i < NCH(n); i += 2) {
974 com_expr(c, CHILD(n, i));
975 if (i+2 < NCH(n)) {
976 com_addbyte(c, DUP_TOP);
977 com_addbyte(c, ROT_THREE);
978 }
979 op = cmp_type(CHILD(n, i-1));
980 if (op == BAD) {
981 err_setstr(SystemError,
982 "com_comparison: unknown comparison op");
983 c->c_errors++;
984 }
985 com_addoparg(c, COMPARE_OP, op);
986 if (i+2 < NCH(n)) {
987 com_addfwref(c, JUMP_IF_FALSE, &anchor);
988 com_addbyte(c, POP_TOP);
989 }
990 }
991
992 if (anchor) {
993 int anchor2 = 0;
994 com_addfwref(c, JUMP_FORWARD, &anchor2);
995 com_backpatch(c, anchor);
996 com_addbyte(c, ROT_TWO);
997 com_addbyte(c, POP_TOP);
998 com_backpatch(c, anchor2);
999 }
1000}
1001
1002static void
1003com_not_test(c, n)
1004 struct compiling *c;
1005 node *n;
1006{
1007 REQ(n, not_test); /* 'not' not_test | comparison */
1008 if (NCH(n) == 1) {
1009 com_comparison(c, CHILD(n, 0));
1010 }
1011 else {
1012 com_not_test(c, CHILD(n, 1));
1013 com_addbyte(c, UNARY_NOT);
1014 }
1015}
1016
1017static void
1018com_and_test(c, n)
1019 struct compiling *c;
1020 node *n;
1021{
1022 int i;
1023 int anchor;
1024 REQ(n, and_test); /* not_test ('and' not_test)* */
1025 anchor = 0;
1026 i = 0;
1027 for (;;) {
1028 com_not_test(c, CHILD(n, i));
1029 if ((i += 2) >= NCH(n))
1030 break;
1031 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1032 com_addbyte(c, POP_TOP);
1033 }
1034 if (anchor)
1035 com_backpatch(c, anchor);
1036}
1037
1038static void
1039com_test(c, n)
1040 struct compiling *c;
1041 node *n;
1042{
1043 int i;
1044 int anchor;
1045 REQ(n, test); /* and_test ('and' and_test)* */
1046 anchor = 0;
1047 i = 0;
1048 for (;;) {
1049 com_and_test(c, CHILD(n, i));
1050 if ((i += 2) >= NCH(n))
1051 break;
1052 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1053 com_addbyte(c, POP_TOP);
1054 }
1055 if (anchor)
1056 com_backpatch(c, anchor);
1057}
1058
1059static void
Guido van Rossum288a60f1991-12-16 13:05:10 +00001060com_list(c, n, toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001061 struct compiling *c;
1062 node *n;
Guido van Rossum288a60f1991-12-16 13:05:10 +00001063 int toplevel; /* If nonzero, *always* build a tuple */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001064{
1065 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001066 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001067 com_node(c, CHILD(n, 0));
1068 }
1069 else {
1070 int i;
1071 int len;
1072 len = (NCH(n) + 1) / 2;
1073 for (i = 0; i < NCH(n); i += 2)
1074 com_node(c, CHILD(n, i));
1075 com_addoparg(c, BUILD_TUPLE, len);
1076 }
1077}
1078
1079
1080/* Begin of assignment compilation */
1081
1082static void com_assign_name PROTO((struct compiling *, node *, int));
1083static void com_assign PROTO((struct compiling *, node *, int));
1084
1085static void
1086com_assign_attr(c, n, assigning)
1087 struct compiling *c;
1088 node *n;
1089 int assigning;
1090{
1091 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
1092}
1093
1094static void
1095com_assign_slice(c, n, assigning)
1096 struct compiling *c;
1097 node *n;
1098 int assigning;
1099{
1100 com_slice(c, n, assigning ? STORE_SLICE : DELETE_SLICE);
1101}
1102
1103static void
1104com_assign_subscript(c, n, assigning)
1105 struct compiling *c;
1106 node *n;
1107 int assigning;
1108{
1109 com_node(c, n);
1110 com_addbyte(c, assigning ? STORE_SUBSCR : DELETE_SUBSCR);
1111}
1112
1113static void
1114com_assign_trailer(c, n, assigning)
1115 struct compiling *c;
1116 node *n;
1117 int assigning;
1118{
1119 char *name;
1120 REQ(n, trailer);
1121 switch (TYPE(CHILD(n, 0))) {
1122 case LPAR: /* '(' [exprlist] ')' */
1123 err_setstr(TypeError, "can't assign to function call");
1124 c->c_errors++;
1125 break;
1126 case DOT: /* '.' NAME */
1127 com_assign_attr(c, CHILD(n, 1), assigning);
1128 break;
1129 case LSQB: /* '[' subscript ']' */
1130 n = CHILD(n, 1);
1131 REQ(n, subscript); /* subscript: expr | [expr] ':' [expr] */
1132 if (NCH(n) > 1 || TYPE(CHILD(n, 0)) == COLON)
1133 com_assign_slice(c, n, assigning);
1134 else
1135 com_assign_subscript(c, CHILD(n, 0), assigning);
1136 break;
1137 default:
1138 err_setstr(TypeError, "unknown trailer type");
1139 c->c_errors++;
1140 }
1141}
1142
1143static void
1144com_assign_tuple(c, n, assigning)
1145 struct compiling *c;
1146 node *n;
1147 int assigning;
1148{
1149 int i;
1150 if (TYPE(n) != testlist)
1151 REQ(n, exprlist);
1152 if (assigning)
1153 com_addoparg(c, UNPACK_TUPLE, (NCH(n)+1)/2);
1154 for (i = 0; i < NCH(n); i += 2)
1155 com_assign(c, CHILD(n, i), assigning);
1156}
1157
1158static void
1159com_assign_list(c, n, assigning)
1160 struct compiling *c;
1161 node *n;
1162 int assigning;
1163{
1164 int i;
1165 if (assigning)
1166 com_addoparg(c, UNPACK_LIST, (NCH(n)+1)/2);
1167 for (i = 0; i < NCH(n); i += 2)
1168 com_assign(c, CHILD(n, i), assigning);
1169}
1170
1171static void
1172com_assign_name(c, n, assigning)
1173 struct compiling *c;
1174 node *n;
1175 int assigning;
1176{
1177 REQ(n, NAME);
1178 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
1179}
1180
1181static void
1182com_assign(c, n, assigning)
1183 struct compiling *c;
1184 node *n;
1185 int assigning;
1186{
1187 /* Loop to avoid trivial recursion */
1188 for (;;) {
1189 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001190
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001191 case exprlist:
1192 case testlist:
1193 if (NCH(n) > 1) {
1194 com_assign_tuple(c, n, assigning);
1195 return;
1196 }
1197 n = CHILD(n, 0);
1198 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001199
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001200 case test:
1201 case and_test:
1202 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001203 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001204 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001205 case xor_expr:
1206 case and_expr:
1207 case shift_expr:
1208 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001209 case term:
1210 if (NCH(n) > 1) {
1211 err_setstr(TypeError,
1212 "can't assign to operator");
1213 c->c_errors++;
1214 return;
1215 }
1216 n = CHILD(n, 0);
1217 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001218
Guido van Rossum7928cd71991-10-24 14:59:31 +00001219 case factor: /* ('+'|'-'|'~') factor | atom trailer* */
1220 if (TYPE(CHILD(n, 0)) != atom) { /* '+'|'-'|'~' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001221 err_setstr(TypeError,
1222 "can't assign to operator");
1223 c->c_errors++;
1224 return;
1225 }
1226 if (NCH(n) > 1) { /* trailer present */
1227 int i;
1228 com_node(c, CHILD(n, 0));
1229 for (i = 1; i+1 < NCH(n); i++) {
1230 com_apply_trailer(c, CHILD(n, i));
1231 } /* NB i is still alive */
1232 com_assign_trailer(c,
1233 CHILD(n, i), assigning);
1234 return;
1235 }
1236 n = CHILD(n, 0);
1237 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001238
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001239 case atom:
1240 switch (TYPE(CHILD(n, 0))) {
1241 case LPAR:
1242 n = CHILD(n, 1);
1243 if (TYPE(n) == RPAR) {
1244 /* XXX Should allow () = () ??? */
1245 err_setstr(TypeError,
1246 "can't assign to ()");
1247 c->c_errors++;
1248 return;
1249 }
1250 break;
1251 case LSQB:
1252 n = CHILD(n, 1);
1253 if (TYPE(n) == RSQB) {
1254 err_setstr(TypeError,
1255 "can't assign to []");
1256 c->c_errors++;
1257 return;
1258 }
1259 com_assign_list(c, n, assigning);
1260 return;
1261 case NAME:
1262 com_assign_name(c, CHILD(n, 0), assigning);
1263 return;
1264 default:
1265 err_setstr(TypeError,
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001266 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001267 c->c_errors++;
1268 return;
1269 }
1270 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001271
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001272 default:
1273 fprintf(stderr, "node type %d\n", TYPE(n));
1274 err_setstr(SystemError, "com_assign: bad node");
1275 c->c_errors++;
1276 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001277
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001278 }
1279 }
1280}
1281
1282static void
1283com_expr_stmt(c, n)
1284 struct compiling *c;
1285 node *n;
1286{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001287 REQ(n, expr_stmt); /* exprlist ('=' exprlist)* */
1288 com_node(c, CHILD(n, NCH(n)-1));
1289 if (NCH(n) == 1) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001290 com_addbyte(c, PRINT_EXPR);
1291 }
1292 else {
1293 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001294 for (i = 0; i < NCH(n)-2; i+=2) {
1295 if (i+2 < NCH(n)-2)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001296 com_addbyte(c, DUP_TOP);
1297 com_assign(c, CHILD(n, i), 1/*assign*/);
1298 }
1299 }
1300}
1301
1302static void
1303com_print_stmt(c, n)
1304 struct compiling *c;
1305 node *n;
1306{
1307 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001308 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
1309 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001310 com_node(c, CHILD(n, i));
1311 com_addbyte(c, PRINT_ITEM);
1312 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001313 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001314 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001315 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001316}
1317
1318static void
1319com_return_stmt(c, n)
1320 struct compiling *c;
1321 node *n;
1322{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001323 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001324 if (!c->c_infunction) {
1325 err_setstr(TypeError, "'return' outside function");
1326 c->c_errors++;
1327 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001328 if (NCH(n) < 2)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001329 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1330 else
1331 com_node(c, CHILD(n, 1));
1332 com_addbyte(c, RETURN_VALUE);
1333}
1334
1335static void
1336com_raise_stmt(c, n)
1337 struct compiling *c;
1338 node *n;
1339{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001340 REQ(n, raise_stmt); /* 'raise' test [',' test] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001341 com_node(c, CHILD(n, 1));
1342 if (NCH(n) > 3)
1343 com_node(c, CHILD(n, 3));
1344 else
1345 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1346 com_addbyte(c, RAISE_EXCEPTION);
1347}
1348
1349static void
1350com_import_stmt(c, n)
1351 struct compiling *c;
1352 node *n;
1353{
1354 int i;
1355 REQ(n, import_stmt);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001356 /* 'import' NAME (',' NAME)* |
1357 'from' NAME 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001358 if (STR(CHILD(n, 0))[0] == 'f') {
1359 /* 'from' NAME 'import' ... */
1360 REQ(CHILD(n, 1), NAME);
1361 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
1362 for (i = 3; i < NCH(n); i += 2)
1363 com_addopname(c, IMPORT_FROM, CHILD(n, i));
1364 com_addbyte(c, POP_TOP);
1365 }
1366 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001367 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001368 for (i = 1; i < NCH(n); i += 2) {
1369 com_addopname(c, IMPORT_NAME, CHILD(n, i));
1370 com_addopname(c, STORE_NAME, CHILD(n, i));
1371 }
1372 }
1373}
1374
1375static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00001376com_global_stmt(c, n)
1377 struct compiling *c;
1378 node *n;
1379{
1380 int i;
1381 object *v;
1382 REQ(n, global_stmt);
1383 /* 'global' NAME (',' NAME)* */
1384 for (i = 1; i < NCH(n); i += 2) {
1385 if (dictinsert(c->c_globals, STR(CHILD(n, i)), None) != 0)
1386 c->c_errors++;
1387 }
1388}
1389
1390static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001391com_if_stmt(c, n)
1392 struct compiling *c;
1393 node *n;
1394{
1395 int i;
1396 int anchor = 0;
1397 REQ(n, if_stmt);
1398 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
1399 for (i = 0; i+3 < NCH(n); i+=4) {
1400 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001401 node *ch = CHILD(n, i+1);
1402 if (i > 0)
1403 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001404 com_node(c, CHILD(n, i+1));
1405 com_addfwref(c, JUMP_IF_FALSE, &a);
1406 com_addbyte(c, POP_TOP);
1407 com_node(c, CHILD(n, i+3));
1408 com_addfwref(c, JUMP_FORWARD, &anchor);
1409 com_backpatch(c, a);
1410 com_addbyte(c, POP_TOP);
1411 }
1412 if (i+2 < NCH(n))
1413 com_node(c, CHILD(n, i+2));
1414 com_backpatch(c, anchor);
1415}
1416
1417static void
1418com_while_stmt(c, n)
1419 struct compiling *c;
1420 node *n;
1421{
1422 int break_anchor = 0;
1423 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001424 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001425 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
1426 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001427 block_push(c, SETUP_LOOP);
1428 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001429 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001430 com_node(c, CHILD(n, 1));
1431 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1432 com_addbyte(c, POP_TOP);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001433 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001434 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001435 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001436 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1437 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001438 com_backpatch(c, anchor);
1439 com_addbyte(c, POP_TOP);
1440 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001441 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001442 if (NCH(n) > 4)
1443 com_node(c, CHILD(n, 6));
1444 com_backpatch(c, break_anchor);
1445}
1446
1447static void
1448com_for_stmt(c, n)
1449 struct compiling *c;
1450 node *n;
1451{
1452 object *v;
1453 int break_anchor = 0;
1454 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001455 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001456 REQ(n, for_stmt);
1457 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
1458 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001459 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001460 com_node(c, CHILD(n, 3));
1461 v = newintobject(0L);
1462 if (v == NULL)
1463 c->c_errors++;
1464 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
1465 XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001466 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001467 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001468 com_addfwref(c, FOR_LOOP, &anchor);
1469 com_assign(c, CHILD(n, 1), 1/*assigning*/);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001470 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001471 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001472 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001473 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1474 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001475 com_backpatch(c, anchor);
1476 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001477 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001478 if (NCH(n) > 8)
1479 com_node(c, CHILD(n, 8));
1480 com_backpatch(c, break_anchor);
1481}
1482
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001483/* Although 'execpt' and 'finally' clauses can be combined
1484 syntactically, they are compiled separately. In fact,
1485 try: S
1486 except E1: S1
1487 except E2: S2
1488 ...
1489 finally: Sf
1490 is equivalent to
1491 try:
1492 try: S
1493 except E1: S1
1494 except E2: S2
1495 ...
1496 finally: Sf
1497 meaning that the 'finally' clause is entered even if things
1498 go wrong again in an exception handler. Note that this is
1499 not the case for exception handlers: at most one is entered.
1500
1501 Code generated for "try: S finally: Sf" is as follows:
1502
1503 SETUP_FINALLY L
1504 <code for S>
1505 POP_BLOCK
1506 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001507 L: <code for Sf>
1508 END_FINALLY
1509
1510 The special instructions use the block stack. Each block
1511 stack entry contains the instruction that created it (here
1512 SETUP_FINALLY), the level of the value stack at the time the
1513 block stack entry was created, and a label (here L).
1514
1515 SETUP_FINALLY:
1516 Pushes the current value stack level and the label
1517 onto the block stack.
1518 POP_BLOCK:
1519 Pops en entry from the block stack, and pops the value
1520 stack until its level is the same as indicated on the
1521 block stack. (The label is ignored.)
1522 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001523 Pops a variable number of entries from the *value* stack
1524 and re-raises the exception they specify. The number of
1525 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001526
1527 The block stack is unwound when an exception is raised:
1528 when a SETUP_FINALLY entry is found, the exception is pushed
1529 onto the value stack (and the exception condition is cleared),
1530 and the interpreter jumps to the label gotten from the block
1531 stack.
1532
1533 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00001534 (The contents of the value stack is shown in [], with the top
1535 at the right; 'tb' is trace-back info, 'val' the exception's
1536 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001537
1538 Value stack Label Instruction Argument
1539 [] SETUP_EXCEPT L1
1540 [] <code for S>
1541 [] POP_BLOCK
1542 [] JUMP_FORWARD L0
1543
Guido van Rossum3f5da241990-12-20 15:06:42 +00001544 [tb, val, exc] L1: DUP )
1545 [tb, val, exc, exc] <evaluate E1> )
1546 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
1547 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
1548 [tb, val, exc, 1] POP )
1549 [tb, val, exc] POP
1550 [tb, val] <assign to V1> (or POP if no V1)
1551 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001552 [] <code for S1>
1553 JUMP_FORWARD L0
1554
Guido van Rossum3f5da241990-12-20 15:06:42 +00001555 [tb, val, exc, 0] L2: POP
1556 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001557 .............................etc.......................
1558
Guido van Rossum3f5da241990-12-20 15:06:42 +00001559 [tb, val, exc, 0] Ln+1: POP
1560 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001561
1562 [] L0: <next statement>
1563
1564 Of course, parts are not generated if Vi or Ei is not present.
1565*/
1566
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001567static void
1568com_try_stmt(c, n)
1569 struct compiling *c;
1570 node *n;
1571{
1572 int finally_anchor = 0;
1573 int except_anchor = 0;
1574 REQ(n, try_stmt);
1575 /* 'try' ':' suite (except_clause ':' suite)* ['finally' ':' suite] */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001576
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001577 if (NCH(n) > 3 && TYPE(CHILD(n, NCH(n)-3)) != except_clause) {
1578 /* Have a 'finally' clause */
1579 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001580 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001581 }
1582 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == except_clause) {
1583 /* Have an 'except' clause */
1584 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001585 block_push(c, SETUP_EXCEPT);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001586 }
1587 com_node(c, CHILD(n, 2));
1588 if (except_anchor) {
1589 int end_anchor = 0;
1590 int i;
1591 node *ch;
1592 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001593 block_pop(c, SETUP_EXCEPT);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001594 com_addfwref(c, JUMP_FORWARD, &end_anchor);
1595 com_backpatch(c, except_anchor);
1596 for (i = 3;
1597 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
1598 i += 3) {
1599 /* except_clause: 'except' [expr [',' expr]] */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001600 if (except_anchor == 0) {
1601 err_setstr(TypeError,
1602 "default 'except:' must be last");
1603 c->c_errors++;
1604 break;
1605 }
1606 except_anchor = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001607 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001608 if (NCH(ch) > 1) {
1609 com_addbyte(c, DUP_TOP);
1610 com_node(c, CHILD(ch, 1));
1611 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001612 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001613 com_addbyte(c, POP_TOP);
1614 }
1615 com_addbyte(c, POP_TOP);
1616 if (NCH(ch) > 3)
1617 com_assign(c, CHILD(ch, 3), 1/*assigning*/);
1618 else
1619 com_addbyte(c, POP_TOP);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001620 com_addbyte(c, POP_TOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001621 com_node(c, CHILD(n, i+2));
1622 com_addfwref(c, JUMP_FORWARD, &end_anchor);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001623 if (except_anchor) {
1624 com_backpatch(c, except_anchor);
1625 com_addbyte(c, POP_TOP);
1626 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001627 }
1628 com_addbyte(c, END_FINALLY);
1629 com_backpatch(c, end_anchor);
1630 }
1631 if (finally_anchor) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001632 node *ch;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001633 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001634 block_pop(c, SETUP_FINALLY);
1635 block_push(c, END_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001636 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001637 com_backpatch(c, finally_anchor);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001638 ch = CHILD(n, NCH(n)-1);
1639 com_addoparg(c, SET_LINENO, ch->n_lineno);
1640 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001641 com_addbyte(c, END_FINALLY);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001642 block_pop(c, END_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001643 }
1644}
1645
1646static void
1647com_suite(c, n)
1648 struct compiling *c;
1649 node *n;
1650{
1651 REQ(n, suite);
1652 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
1653 if (NCH(n) == 1) {
1654 com_node(c, CHILD(n, 0));
1655 }
1656 else {
1657 int i;
1658 for (i = 0; i < NCH(n); i++) {
1659 node *ch = CHILD(n, i);
1660 if (TYPE(ch) == stmt)
1661 com_node(c, ch);
1662 }
1663 }
1664}
1665
1666static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001667com_continue_stmt(c, n)
1668 struct compiling *c;
1669 node *n;
1670{
1671 int i = c->c_nblocks;
1672 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
1673 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1674 }
1675 else {
1676 err_setstr(TypeError, "'continue' not properly in loop");
1677 c->c_errors++;
1678 }
1679 /* XXX Could allow it inside a 'finally' clause
1680 XXX if we could pop the exception still on the stack */
1681}
1682
1683static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001684com_funcdef(c, n)
1685 struct compiling *c;
1686 node *n;
1687{
1688 object *v;
1689 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001690 v = (object *)compile(n, c->c_filename);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001691 if (v == NULL)
1692 c->c_errors++;
1693 else {
1694 int i = com_addconst(c, v);
1695 com_addoparg(c, LOAD_CONST, i);
1696 com_addbyte(c, BUILD_FUNCTION);
1697 com_addopname(c, STORE_NAME, CHILD(n, 1));
1698 DECREF(v);
1699 }
1700}
1701
1702static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00001703com_oldbases(c, n)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001704 struct compiling *c;
1705 node *n;
1706{
1707 int i, nbases;
1708 REQ(n, baselist);
1709 /*
1710 baselist: atom arguments (',' atom arguments)*
Guido van Rossumc5e96291991-12-10 13:53:51 +00001711 arguments: '(' ')'
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001712 */
1713 for (i = 0; i < NCH(n); i += 3)
1714 com_node(c, CHILD(n, i));
1715 com_addoparg(c, BUILD_TUPLE, (NCH(n)+1) / 3);
1716}
1717
1718static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00001719com_newbases(c, n)
1720 struct compiling *c;
1721 node *n;
1722{
1723 int i, nbases;
1724 REQ(n, testlist);
1725 /* testlist: test (',' test)* [','] */
1726 for (i = 0; i < NCH(n); i += 2)
1727 com_node(c, CHILD(n, i));
1728 com_addoparg(c, BUILD_TUPLE, (NCH(n)+1) / 2);
1729}
1730
1731static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001732com_classdef(c, n)
1733 struct compiling *c;
1734 node *n;
1735{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001736 object *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001737 REQ(n, classdef);
1738 /*
Guido van Rossumc5e96291991-12-10 13:53:51 +00001739 classdef: 'class' NAME
1740 ['(' testlist ')' |'(' ')' ['=' baselist]] ':' suite
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001741 baselist: atom arguments (',' atom arguments)*
Guido van Rossumc5e96291991-12-10 13:53:51 +00001742 arguments: '(' ')'
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001743 */
Guido van Rossumc5e96291991-12-10 13:53:51 +00001744 /* This piece of code must push a tuple on the stack (the bases) */
1745 if (TYPE(CHILD(n, 2)) != LPAR) {
1746 /* New syntax without base classes:
1747 class NAME ':' suite
1748 ___________^
1749 */
1750 com_addoparg(c, BUILD_TUPLE, 0);
1751 }
1752 else {
1753 if (TYPE(CHILD(n, 3)) == RPAR) {
1754 /* Old syntax with or without base classes:
1755 class NAME '(' ')' ['=' baselist] ':' suite
1756 _______________^....^...^
1757 */
1758 if (TYPE(CHILD(n, 4)) == EQUAL)
1759 com_oldbases(c, CHILD(n, 5));
1760 else
1761 com_addoparg(c, BUILD_TUPLE, 0);
1762 }
1763 else {
1764 /* New syntax with base classes:
1765 class NAME '(' testlist ')' ':' suite
1766 _______________^
1767 */
1768 com_newbases(c, CHILD(n, 3));
1769 }
1770 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001771 v = (object *)compile(n, c->c_filename);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001772 if (v == NULL)
1773 c->c_errors++;
1774 else {
1775 int i = com_addconst(c, v);
1776 com_addoparg(c, LOAD_CONST, i);
1777 com_addbyte(c, BUILD_FUNCTION);
1778 com_addbyte(c, UNARY_CALL);
1779 com_addbyte(c, BUILD_CLASS);
1780 com_addopname(c, STORE_NAME, CHILD(n, 1));
1781 DECREF(v);
1782 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001783}
1784
1785static void
1786com_node(c, n)
1787 struct compiling *c;
1788 node *n;
1789{
1790 switch (TYPE(n)) {
1791
1792 /* Definition nodes */
1793
1794 case funcdef:
1795 com_funcdef(c, n);
1796 break;
1797 case classdef:
1798 com_classdef(c, n);
1799 break;
1800
1801 /* Trivial parse tree nodes */
1802
1803 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001804 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001805 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001806 com_node(c, CHILD(n, 0));
1807 break;
1808
1809 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001810 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
1811 com_addoparg(c, SET_LINENO, n->n_lineno);
1812 {
1813 int i;
1814 for (i = 0; i < NCH(n)-1; i += 2)
1815 com_node(c, CHILD(n, i));
1816 }
1817 break;
1818
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001819 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001820 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001821 com_node(c, CHILD(n, 0));
1822 break;
1823
1824 /* Statement nodes */
1825
1826 case expr_stmt:
1827 com_expr_stmt(c, n);
1828 break;
1829 case print_stmt:
1830 com_print_stmt(c, n);
1831 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001832 case del_stmt: /* 'del' exprlist */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001833 com_assign(c, CHILD(n, 1), 0/*delete*/);
1834 break;
1835 case pass_stmt:
1836 break;
1837 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001838 if (c->c_loops == 0) {
1839 err_setstr(TypeError, "'break' outside loop");
1840 c->c_errors++;
1841 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001842 com_addbyte(c, BREAK_LOOP);
1843 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001844 case continue_stmt:
1845 com_continue_stmt(c, n);
1846 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001847 case return_stmt:
1848 com_return_stmt(c, n);
1849 break;
1850 case raise_stmt:
1851 com_raise_stmt(c, n);
1852 break;
1853 case import_stmt:
1854 com_import_stmt(c, n);
1855 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001856 case global_stmt:
1857 com_global_stmt(c, n);
1858 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001859 case if_stmt:
1860 com_if_stmt(c, n);
1861 break;
1862 case while_stmt:
1863 com_while_stmt(c, n);
1864 break;
1865 case for_stmt:
1866 com_for_stmt(c, n);
1867 break;
1868 case try_stmt:
1869 com_try_stmt(c, n);
1870 break;
1871 case suite:
1872 com_suite(c, n);
1873 break;
1874
1875 /* Expression nodes */
1876
1877 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00001878 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001879 break;
1880 case test:
1881 com_test(c, n);
1882 break;
1883 case and_test:
1884 com_and_test(c, n);
1885 break;
1886 case not_test:
1887 com_not_test(c, n);
1888 break;
1889 case comparison:
1890 com_comparison(c, n);
1891 break;
1892 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00001893 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001894 break;
1895 case expr:
1896 com_expr(c, n);
1897 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001898 case xor_expr:
1899 com_xor_expr(c, n);
1900 break;
1901 case and_expr:
1902 com_and_expr(c, n);
1903 break;
1904 case shift_expr:
1905 com_shift_expr(c, n);
1906 break;
1907 case arith_expr:
1908 com_arith_expr(c, n);
1909 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001910 case term:
1911 com_term(c, n);
1912 break;
1913 case factor:
1914 com_factor(c, n);
1915 break;
1916 case atom:
1917 com_atom(c, n);
1918 break;
1919
1920 default:
1921 fprintf(stderr, "node type %d\n", TYPE(n));
1922 err_setstr(SystemError, "com_node: unexpected node type");
1923 c->c_errors++;
1924 }
1925}
1926
1927static void com_fplist PROTO((struct compiling *, node *));
1928
1929static void
1930com_fpdef(c, n)
1931 struct compiling *c;
1932 node *n;
1933{
1934 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
1935 if (TYPE(CHILD(n, 0)) == LPAR)
1936 com_fplist(c, CHILD(n, 1));
1937 else
1938 com_addopname(c, STORE_NAME, CHILD(n, 0));
1939}
1940
1941static void
1942com_fplist(c, n)
1943 struct compiling *c;
1944 node *n;
1945{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001946 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001947 if (NCH(n) == 1) {
1948 com_fpdef(c, CHILD(n, 0));
1949 }
1950 else {
1951 int i;
1952 com_addoparg(c, UNPACK_TUPLE, (NCH(n)+1)/2);
1953 for (i = 0; i < NCH(n); i += 2)
1954 com_fpdef(c, CHILD(n, i));
1955 }
1956}
1957
1958static void
1959com_file_input(c, n)
1960 struct compiling *c;
1961 node *n;
1962{
1963 int i;
1964 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
1965 for (i = 0; i < NCH(n); i++) {
1966 node *ch = CHILD(n, i);
1967 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
1968 com_node(c, ch);
1969 }
1970}
1971
1972/* Top-level compile-node interface */
1973
1974static void
1975compile_funcdef(c, n)
1976 struct compiling *c;
1977 node *n;
1978{
1979 node *ch;
1980 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
1981 ch = CHILD(n, 2); /* parameters: '(' [fplist] ')' */
1982 ch = CHILD(ch, 1); /* ')' | fplist */
1983 if (TYPE(ch) == RPAR)
Guido van Rossum288a60f1991-12-16 13:05:10 +00001984 com_addoparg(c, UNPACK_ARG, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001985 else {
Guido van Rossum288a60f1991-12-16 13:05:10 +00001986 int i;
1987 REQ(ch, fplist); /* fplist: fpdef (',' fpdef)* */
1988 com_addoparg(c, UNPACK_ARG, (NCH(ch)+1)/2);
1989 for (i = 0; i < NCH(ch); i += 2)
1990 com_fpdef(c, CHILD(ch, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001991 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001992 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001993 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001994 c->c_infunction = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001995 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1996 com_addbyte(c, RETURN_VALUE);
1997}
1998
1999static void
2000compile_node(c, n)
2001 struct compiling *c;
2002 node *n;
2003{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002004 com_addoparg(c, SET_LINENO, n->n_lineno);
2005
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002006 switch (TYPE(n)) {
2007
Guido van Rossum4c417781991-01-21 16:09:22 +00002008 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002009 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
2010 n = CHILD(n, 0);
2011 if (TYPE(n) != NEWLINE)
2012 com_node(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 file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002018 com_file_input(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002019 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2020 com_addbyte(c, RETURN_VALUE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002021 break;
2022
Guido van Rossum4c417781991-01-21 16:09:22 +00002023 case expr_input: /* Built-in function eval() */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002024 com_node(c, CHILD(n, 0));
2025 com_addbyte(c, RETURN_VALUE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002026 break;
2027
Guido van Rossum4c417781991-01-21 16:09:22 +00002028 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00002029 com_node(c, CHILD(n, 0));
2030 com_addbyte(c, RETURN_VALUE);
2031 break;
2032
2033 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002034 compile_funcdef(c, n);
2035 break;
2036
Guido van Rossum4c417781991-01-21 16:09:22 +00002037 case classdef: /* A class definition */
Guido van Rossumc5e96291991-12-10 13:53:51 +00002038 /* classdef: 'class' NAME
2039 ['(' testlist ')' |'(' ')' ['=' baselist]]
2040 ':' suite */
Guido van Rossumc5e96291991-12-10 13:53:51 +00002041 com_node(c, CHILD(n, NCH(n)-1)); /* The suite */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002042 com_addbyte(c, LOAD_LOCALS);
2043 com_addbyte(c, RETURN_VALUE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002044 break;
2045
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002046 default:
2047 fprintf(stderr, "node type %d\n", TYPE(n));
2048 err_setstr(SystemError, "compile_node: unexpected node type");
2049 c->c_errors++;
2050 }
2051}
2052
Guido van Rossum282914b1991-04-04 10:42:56 +00002053/* Optimization for local and global variables.
2054
2055 Attempt to replace all LOAD_NAME instructions that refer to a local
2056 variable with LOAD_LOCAL instructions, and all that refer to a global
2057 variable with LOAD_GLOBAL instructions.
2058
2059 To find all local variables, we check all STORE_NAME and IMPORT_FROM
2060 instructions. This yields all local variables, including arguments,
2061 function definitions, class definitions and import statements.
2062
2063 There is one leak: 'from foo import *' introduces local variables
2064 that we can't know while compiling. If this is the case, LOAD_GLOBAL
2065 instructions are not generated -- LOAD_NAME is left in place for
2066 globals, since it first checks for globals (LOAD_LOCAL is still used
2067 for recognized locals, since it doesn't hurt).
2068
2069 This optimization means that using the same name as a global and
2070 as a local variable within the same scope is now illegal, which
2071 is a change to the language! Also using eval() to introduce new
2072 local variables won't work. But both were bad practice at best.
2073
2074 The optimization doesn't save much: basically, it saves one
2075 unsuccessful dictionary lookup per global (or built-in) variable
2076 reference. On the (slow!) Mac Plus, with 4 local variables,
2077 this saving was measured to be about 0.18 ms. We might save more
2078 by using a different data structure to hold local variables, like
2079 an array indexed by variable number.
2080
2081 NB: this modifies the string object co->co_code!
2082*/
2083
2084static void
2085optimizer(co)
2086 codeobject *co;
2087{
Guido van Rossum0a697f61991-04-16 08:39:12 +00002088 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00002089 object *locals;
2090 int opcode;
2091 int oparg;
2092 object *name;
2093 int star_used;
Guido van Rossum0a697f61991-04-16 08:39:12 +00002094
Guido van Rossum282914b1991-04-04 10:42:56 +00002095#define NEXTOP() (*next_instr++)
2096#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
2097#define GETITEM(v, i) (getlistitem((v), (i)))
2098#define GETNAMEOBJ(i) (GETITEM(co->co_names, (i)))
2099
2100 locals = newdictobject();
2101 if (locals == NULL) {
2102 err_clear();
2103 return; /* For now, this is OK */
2104 }
2105
Guido van Rossum0a697f61991-04-16 08:39:12 +00002106 next_instr = (unsigned char *) GETSTRINGVALUE(co->co_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00002107 for (;;) {
2108 opcode = NEXTOP();
2109 if (opcode == STOP_CODE)
2110 break;
2111 if (HAS_ARG(opcode))
2112 oparg = NEXTARG();
2113 if (opcode == STORE_NAME || opcode == IMPORT_FROM) {
2114 name = GETNAMEOBJ(oparg);
2115 if (dict2insert(locals, name, None) != 0) {
2116 DECREF(locals);
2117 return; /* Sorry */
2118 }
2119 }
2120 }
2121
2122 star_used = (dictlookup(locals, "*") != NULL);
Guido van Rossum0a697f61991-04-16 08:39:12 +00002123 next_instr = (unsigned char *) GETSTRINGVALUE(co->co_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00002124 for (;;) {
2125 cur_instr = next_instr;
2126 opcode = NEXTOP();
2127 if (opcode == STOP_CODE)
2128 break;
2129 if (HAS_ARG(opcode))
2130 oparg = NEXTARG();
2131 if (opcode == LOAD_NAME) {
2132 name = GETNAMEOBJ(oparg);
Guido van Rossum83163251991-08-16 08:58:43 +00002133 if (dict2lookup(locals, name) != NULL)
Guido van Rossum282914b1991-04-04 10:42:56 +00002134 *cur_instr = LOAD_LOCAL;
Guido van Rossum83163251991-08-16 08:58:43 +00002135 else {
2136 err_clear();
2137 if (!star_used)
2138 *cur_instr = LOAD_GLOBAL;
2139 }
Guido van Rossum282914b1991-04-04 10:42:56 +00002140 }
2141 }
2142
2143 DECREF(locals);
2144}
2145
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002146codeobject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002147compile(n, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002148 node *n;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002149 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002150{
2151 struct compiling sc;
2152 codeobject *co;
Guido van Rossuma082ce41991-06-04 19:41:56 +00002153 object *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002154 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002155 return NULL;
2156 compile_node(&sc, n);
2157 com_done(&sc);
Guido van Rossuma082ce41991-06-04 19:41:56 +00002158 if (sc.c_errors == 0 && (v = newstringobject(filename)) != NULL) {
2159 co = newcodeobject(sc.c_code, sc.c_consts, sc.c_names, v);
2160 DECREF(v);
2161 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002162 else
2163 co = NULL;
2164 com_free(&sc);
Guido van Rossumfb8edfc1991-05-14 11:56:03 +00002165 if (co != NULL && filename[0] != '<')
Guido van Rossum282914b1991-04-04 10:42:56 +00002166 optimizer(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002167 return co;
2168}