blob: 483e5247b4abe047cde50511e61cc168201ce106 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
Guido van Rossumf70e43a1991-02-19 12:39:46 +00003Netherlands.
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[] = {
Guido van Rossum39d942d1992-01-12 02:30:05 +000049 {"co_code", T_OBJECT, OFF(co_code), READONLY},
50 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
51 {"co_names", T_OBJECT, OFF(co_names), READONLY},
52 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000053 {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
Guido van Rossum2dff9911992-09-03 20:50:59 +000075static object *
76code_repr(co)
77 codeobject *co;
78{
79 char buf[500];
80 int lineno = -1;
81 char *p = GETSTRINGVALUE(co->co_code);
82 char *filename = "???";
83 if (*p == SET_LINENO)
84 lineno = (p[1] & 0xff) | ((p[2] & 0xff) << 8);
85 if (co->co_filename && is_stringobject(co->co_filename))
86 filename = getstringvalue(co->co_filename);
87 sprintf(buf, "<code object at %lx, file \"%.400s\", line %d>",
88 (long)co, filename, lineno);
89 return newstringobject(buf);
90}
91
Guido van Rossum10dc2e81990-11-18 17:27:39 +000092typeobject Codetype = {
93 OB_HEAD_INIT(&Typetype)
94 0,
95 "code",
96 sizeof(codeobject),
97 0,
98 code_dealloc, /*tp_dealloc*/
99 0, /*tp_print*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000100 code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000101 0, /*tp_setattr*/
102 0, /*tp_compare*/
Guido van Rossum2dff9911992-09-03 20:50:59 +0000103 code_repr, /*tp_repr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000104 0, /*tp_as_number*/
105 0, /*tp_as_sequence*/
106 0, /*tp_as_mapping*/
107};
108
Guido van Rossuma082ce41991-06-04 19:41:56 +0000109codeobject *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000110newcodeobject(code, consts, names, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000111 object *code;
112 object *consts;
113 object *names;
Guido van Rossuma082ce41991-06-04 19:41:56 +0000114 object *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000115{
116 codeobject *co;
117 int i;
118 /* Check argument types */
119 if (code == NULL || !is_stringobject(code) ||
120 consts == NULL || !is_listobject(consts) ||
121 names == NULL || !is_listobject(names)) {
122 err_badcall();
123 return NULL;
124 }
125 /* Make sure the list of names contains only strings */
126 for (i = getlistsize(names); --i >= 0; ) {
127 object *v = getlistitem(names, i);
128 if (v == NULL || !is_stringobject(v)) {
129 err_badcall();
130 return NULL;
131 }
132 }
133 co = NEWOBJ(codeobject, &Codetype);
134 if (co != NULL) {
135 INCREF(code);
136 co->co_code = (stringobject *)code;
137 INCREF(consts);
138 co->co_consts = consts;
139 INCREF(names);
140 co->co_names = names;
Guido van Rossuma082ce41991-06-04 19:41:56 +0000141 INCREF(filename);
142 co->co_filename = filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000143 }
144 return co;
145}
146
147
148/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000149
150#define MAXBLOCKS 20 /* Max static block nesting within a function */
151
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000152struct compiling {
153 object *c_code; /* string */
154 object *c_consts; /* list of objects */
155 object *c_names; /* list of strings (names) */
Guido van Rossumc5e96291991-12-10 13:53:51 +0000156 object *c_globals; /* dictionary */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000157 int c_nexti; /* index into c_code */
158 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000159 int c_infunction; /* set when compiling a function */
160 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000161 int c_begin; /* begin of current loop, for 'continue' */
162 int c_block[MAXBLOCKS]; /* stack of block types */
163 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000164 char *c_filename; /* filename of current node */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000165};
166
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000167
168/* Interface to the block stack */
169
170static void
171block_push(c, type)
172 struct compiling *c;
173 int type;
174{
175 if (c->c_nblocks >= MAXBLOCKS) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +0000176 err_setstr(SystemError, "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000177 c->c_errors++;
178 }
179 else {
180 c->c_block[c->c_nblocks++] = type;
181 }
182}
183
184static void
185block_pop(c, type)
186 struct compiling *c;
187 int type;
188{
189 if (c->c_nblocks > 0)
190 c->c_nblocks--;
191 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
192 err_setstr(SystemError, "bad block pop");
193 c->c_errors++;
194 }
195}
196
197
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000198/* Prototypes */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000199
Guido van Rossum3f5da241990-12-20 15:06:42 +0000200static int com_init PROTO((struct compiling *, char *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000201static void com_free PROTO((struct compiling *));
202static void com_done PROTO((struct compiling *));
203static void com_node PROTO((struct compiling *, struct _node *));
204static void com_addbyte PROTO((struct compiling *, int));
205static void com_addint PROTO((struct compiling *, int));
206static void com_addoparg PROTO((struct compiling *, int, int));
207static void com_addfwref PROTO((struct compiling *, int, int *));
208static void com_backpatch PROTO((struct compiling *, int));
209static int com_add PROTO((struct compiling *, object *, object *));
210static int com_addconst PROTO((struct compiling *, object *));
211static int com_addname PROTO((struct compiling *, object *));
212static void com_addopname PROTO((struct compiling *, int, node *));
Guido van Rossum288a60f1991-12-16 13:05:10 +0000213static void com_list PROTO((struct compiling *, node *, int));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000214
215static int
Guido van Rossum3f5da241990-12-20 15:06:42 +0000216com_init(c, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000217 struct compiling *c;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000218 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000219{
Guido van Rossum62d46241991-04-03 19:00:23 +0000220 if ((c->c_code = newsizedstringobject((char *)NULL, 1000)) == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000221 goto fail_3;
222 if ((c->c_consts = newlistobject(0)) == NULL)
223 goto fail_2;
224 if ((c->c_names = newlistobject(0)) == NULL)
225 goto fail_1;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000226 if ((c->c_globals = newdictobject()) == NULL)
227 goto fail_0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000228 c->c_nexti = 0;
229 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000230 c->c_infunction = 0;
231 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000232 c->c_begin = 0;
233 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000234 c->c_filename = filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000235 return 1;
236
Guido van Rossumc5e96291991-12-10 13:53:51 +0000237 fail_0:
238 DECREF(c->c_names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000239 fail_1:
240 DECREF(c->c_consts);
241 fail_2:
242 DECREF(c->c_code);
243 fail_3:
244 return 0;
245}
246
247static void
248com_free(c)
249 struct compiling *c;
250{
251 XDECREF(c->c_code);
252 XDECREF(c->c_consts);
253 XDECREF(c->c_names);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000254 XDECREF(c->c_globals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000255}
256
257static void
258com_done(c)
259 struct compiling *c;
260{
261 if (c->c_code != NULL)
262 resizestring(&c->c_code, c->c_nexti);
263}
264
265static void
266com_addbyte(c, byte)
267 struct compiling *c;
268 int byte;
269{
270 int len;
271 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000272 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000273 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
274 abort();
Guido van Rossum01cfd441991-10-20 20:12:38 +0000275 */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000276 err_setstr(SystemError, "com_addbyte: byte out of range");
277 c->c_errors++;
278 }
279 if (c->c_code == NULL)
280 return;
281 len = getstringsize(c->c_code);
282 if (c->c_nexti >= len) {
283 if (resizestring(&c->c_code, len+1000) != 0) {
284 c->c_errors++;
285 return;
286 }
287 }
288 getstringvalue(c->c_code)[c->c_nexti++] = byte;
289}
290
291static void
292com_addint(c, x)
293 struct compiling *c;
294 int x;
295{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000296 com_addbyte(c, x & 0xff);
297 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000298}
299
300static void
301com_addoparg(c, op, arg)
302 struct compiling *c;
303 int op;
304 int arg;
305{
306 com_addbyte(c, op);
307 com_addint(c, arg);
308}
309
310static void
311com_addfwref(c, op, p_anchor)
312 struct compiling *c;
313 int op;
314 int *p_anchor;
315{
316 /* Compile a forward reference for backpatching */
317 int here;
318 int anchor;
319 com_addbyte(c, op);
320 here = c->c_nexti;
321 anchor = *p_anchor;
322 *p_anchor = here;
323 com_addint(c, anchor == 0 ? 0 : here - anchor);
324}
325
326static void
327com_backpatch(c, anchor)
328 struct compiling *c;
329 int anchor; /* Must be nonzero */
330{
331 unsigned char *code = (unsigned char *) getstringvalue(c->c_code);
332 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000333 int dist;
334 int prev;
335 for (;;) {
336 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000337 prev = code[anchor] + (code[anchor+1] << 8);
338 dist = target - (anchor+2);
339 code[anchor] = dist & 0xff;
340 code[anchor+1] = dist >> 8;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000341 if (!prev)
342 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000343 anchor -= prev;
344 }
345}
346
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000347/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000348
349static int
350com_add(c, list, v)
351 struct compiling *c;
352 object *list;
353 object *v;
354{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000355 int n = getlistsize(list);
356 int i;
357 for (i = n; --i >= 0; ) {
358 object *w = getlistitem(list, i);
Guido van Rossumefc0bd01991-07-01 18:44:20 +0000359 if (v->ob_type == w->ob_type && cmpobject(v, w) == 0)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000360 return i;
361 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000362 if (addlistitem(list, v) != 0)
363 c->c_errors++;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000364 return n;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000365}
366
367static int
368com_addconst(c, v)
369 struct compiling *c;
370 object *v;
371{
372 return com_add(c, c->c_consts, v);
373}
374
375static int
376com_addname(c, v)
377 struct compiling *c;
378 object *v;
379{
380 return com_add(c, c->c_names, v);
381}
382
383static void
384com_addopname(c, op, n)
385 struct compiling *c;
386 int op;
387 node *n;
388{
389 object *v;
390 int i;
391 char *name;
392 if (TYPE(n) == STAR)
393 name = "*";
394 else {
395 REQ(n, NAME);
396 name = STR(n);
397 }
398 if ((v = newstringobject(name)) == NULL) {
399 c->c_errors++;
400 i = 255;
401 }
402 else {
403 i = com_addname(c, v);
404 DECREF(v);
405 }
Guido van Rossumc5e96291991-12-10 13:53:51 +0000406 /* Hack to replace *_NAME opcodes by *_GLOBAL if necessary */
407 switch (op) {
408 case LOAD_NAME:
409 case STORE_NAME:
410 case DELETE_NAME:
411 if (dictlookup(c->c_globals, name) != NULL) {
412 switch (op) {
413 case LOAD_NAME: op = LOAD_GLOBAL; break;
414 case STORE_NAME: op = STORE_GLOBAL; break;
415 case DELETE_NAME: op = DELETE_GLOBAL; break;
416 }
417 }
418 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000419 com_addoparg(c, op, i);
420}
421
422static object *
423parsenumber(s)
424 char *s;
425{
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000426 extern long strtol PROTO((const char *, char **, int));
427 extern unsigned long strtoul PROTO((const char *, char **, int));
428 extern double strtod PROTO((const char *, char **));
Guido van Rossumc5e96291991-12-10 13:53:51 +0000429 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000430 long x;
Guido van Rossum282914b1991-04-04 10:42:56 +0000431 double xx;
432 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000433 end = s + strlen(s) - 1;
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000434 if (*end == 'l' || *end == 'L')
Guido van Rossumc5e96291991-12-10 13:53:51 +0000435 return long_scan(s, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000436 if (s[0] == '0')
437 x = (long) strtoul(s, &end, 0);
438 else
439 x = strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +0000440 if (*end == '\0') {
441 if (errno != 0) {
Guido van Rossumefb087b1991-12-16 15:41:41 +0000442 err_setstr(OverflowError,
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000443 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000444 return NULL;
445 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000446 return newintobject(x);
Guido van Rossum282914b1991-04-04 10:42:56 +0000447 }
448 errno = 0;
449 xx = strtod(s, &end);
450 if (*end == '\0') {
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000451#ifndef BROKEN_STRTOD
452 /* Some strtod() versions (e.g., in older SunOS systems)
453 set errno incorrectly; better to ignore overflows
454 than not to be able to use float literals at all! */
Guido van Rossum282914b1991-04-04 10:42:56 +0000455 if (errno != 0) {
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000456 err_setstr(OverflowError, "float literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000457 return NULL;
458 }
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000459#endif
Guido van Rossum282914b1991-04-04 10:42:56 +0000460 return newfloatobject(xx);
461 }
Guido van Rossumefb087b1991-12-16 15:41:41 +0000462 err_setstr(SystemError, "bad number syntax?!?!");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000463 return NULL;
464}
465
466static object *
467parsestr(s)
468 char *s;
469{
470 object *v;
471 int len;
472 char *buf;
473 char *p;
474 int c;
475 if (*s != '\'') {
476 err_badcall();
477 return NULL;
478 }
479 s++;
480 len = strlen(s);
481 if (s[--len] != '\'') {
482 err_badcall();
483 return NULL;
484 }
485 if (strchr(s, '\\') == NULL)
486 return newsizedstringobject(s, len);
487 v = newsizedstringobject((char *)NULL, len);
488 p = buf = getstringvalue(v);
489 while (*s != '\0' && *s != '\'') {
490 if (*s != '\\') {
491 *p++ = *s++;
492 continue;
493 }
494 s++;
495 switch (*s++) {
496 /* XXX This assumes ASCII! */
497 case '\\': *p++ = '\\'; break;
498 case '\'': *p++ = '\''; break;
499 case 'b': *p++ = '\b'; break;
500 case 'f': *p++ = '\014'; break; /* FF */
501 case 't': *p++ = '\t'; break;
502 case 'n': *p++ = '\n'; break;
503 case 'r': *p++ = '\r'; break;
504 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000505 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
506 case '0': case '1': case '2': case '3':
507 case '4': case '5': case '6': case '7':
508 c = s[-1] - '0';
509 if ('0' <= *s && *s <= '7') {
510 c = (c<<3) + *s++ - '0';
511 if ('0' <= *s && *s <= '7')
512 c = (c<<3) + *s++ - '0';
513 }
514 *p++ = c;
515 break;
516 case 'x':
517 if (isxdigit(*s)) {
518 sscanf(s, "%x", &c);
519 *p++ = c;
520 do {
521 s++;
522 } while (isxdigit(*s));
523 break;
524 }
525 /* FALLTHROUGH */
526 default: *p++ = '\\'; *p++ = s[-1]; break;
527 }
528 }
529 resizestring(&v, (int)(p - buf));
530 return v;
531}
532
533static void
534com_list_constructor(c, n)
535 struct compiling *c;
536 node *n;
537{
538 int len;
539 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000540 if (TYPE(n) != testlist)
541 REQ(n, exprlist);
542 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
543 len = (NCH(n) + 1) / 2;
544 for (i = 0; i < NCH(n); i += 2)
545 com_node(c, CHILD(n, i));
546 com_addoparg(c, BUILD_LIST, len);
547}
548
549static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000550com_dictmaker(c, n)
551 struct compiling *c;
552 node *n;
553{
554 int i;
555 /* dictmaker: test ':' test (',' test ':' value)* [','] */
556 for (i = 0; i+2 < NCH(n); i += 4) {
557 /* We must arrange things just right for STORE_SUBSCR.
558 It wants the stack to look like (value) (dict) (key) */
559 com_addbyte(c, DUP_TOP);
560 com_node(c, CHILD(n, i+2)); /* value */
561 com_addbyte(c, ROT_TWO);
562 com_node(c, CHILD(n, i)); /* key */
563 com_addbyte(c, STORE_SUBSCR);
564 }
565}
566
567static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000568com_atom(c, n)
569 struct compiling *c;
570 node *n;
571{
572 node *ch;
573 object *v;
574 int i;
575 REQ(n, atom);
576 ch = CHILD(n, 0);
577 switch (TYPE(ch)) {
578 case LPAR:
579 if (TYPE(CHILD(n, 1)) == RPAR)
580 com_addoparg(c, BUILD_TUPLE, 0);
581 else
582 com_node(c, CHILD(n, 1));
583 break;
584 case LSQB:
585 if (TYPE(CHILD(n, 1)) == RSQB)
586 com_addoparg(c, BUILD_LIST, 0);
587 else
588 com_list_constructor(c, CHILD(n, 1));
589 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000590 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000591 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000592 if (TYPE(CHILD(n, 1)) != RBRACE)
593 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000594 break;
595 case BACKQUOTE:
596 com_node(c, CHILD(n, 1));
597 com_addbyte(c, UNARY_CONVERT);
598 break;
599 case NUMBER:
600 if ((v = parsenumber(STR(ch))) == NULL) {
601 c->c_errors++;
602 i = 255;
603 }
604 else {
605 i = com_addconst(c, v);
606 DECREF(v);
607 }
608 com_addoparg(c, LOAD_CONST, i);
609 break;
610 case STRING:
611 if ((v = parsestr(STR(ch))) == NULL) {
612 c->c_errors++;
613 i = 255;
614 }
615 else {
616 i = com_addconst(c, v);
617 DECREF(v);
618 }
619 com_addoparg(c, LOAD_CONST, i);
620 break;
621 case NAME:
622 com_addopname(c, LOAD_NAME, ch);
623 break;
624 default:
625 fprintf(stderr, "node type %d\n", TYPE(ch));
626 err_setstr(SystemError, "com_atom: unexpected node type");
627 c->c_errors++;
628 }
629}
630
631static void
632com_slice(c, n, op)
633 struct compiling *c;
634 node *n;
635 int op;
636{
637 if (NCH(n) == 1) {
638 com_addbyte(c, op);
639 }
640 else if (NCH(n) == 2) {
641 if (TYPE(CHILD(n, 0)) != COLON) {
642 com_node(c, CHILD(n, 0));
643 com_addbyte(c, op+1);
644 }
645 else {
646 com_node(c, CHILD(n, 1));
647 com_addbyte(c, op+2);
648 }
649 }
650 else {
651 com_node(c, CHILD(n, 0));
652 com_node(c, CHILD(n, 2));
653 com_addbyte(c, op+3);
654 }
655}
656
657static void
658com_apply_subscript(c, n)
659 struct compiling *c;
660 node *n;
661{
662 REQ(n, subscript);
663 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) != COLON) {
664 /* It's a single subscript */
665 com_node(c, CHILD(n, 0));
666 com_addbyte(c, BINARY_SUBSCR);
667 }
668 else {
669 /* It's a slice: [expr] ':' [expr] */
670 com_slice(c, n, SLICE);
671 }
672}
673
674static void
675com_call_function(c, n)
676 struct compiling *c;
677 node *n; /* EITHER testlist OR ')' */
678{
679 if (TYPE(n) == RPAR) {
Guido van Rossum288a60f1991-12-16 13:05:10 +0000680 com_addoparg(c, BUILD_TUPLE, 0);
681 com_addbyte(c, BINARY_CALL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000682 }
683 else {
Guido van Rossum288a60f1991-12-16 13:05:10 +0000684 REQ(n, testlist);
685 com_list(c, n, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000686 com_addbyte(c, BINARY_CALL);
687 }
688}
689
690static void
691com_select_member(c, n)
692 struct compiling *c;
693 node *n;
694{
695 com_addopname(c, LOAD_ATTR, n);
696}
697
698static void
699com_apply_trailer(c, n)
700 struct compiling *c;
701 node *n;
702{
703 REQ(n, trailer);
704 switch (TYPE(CHILD(n, 0))) {
705 case LPAR:
706 com_call_function(c, CHILD(n, 1));
707 break;
708 case DOT:
709 com_select_member(c, CHILD(n, 1));
710 break;
711 case LSQB:
712 com_apply_subscript(c, CHILD(n, 1));
713 break;
714 default:
715 err_setstr(SystemError,
716 "com_apply_trailer: unknown trailer type");
717 c->c_errors++;
718 }
719}
720
721static void
722com_factor(c, n)
723 struct compiling *c;
724 node *n;
725{
726 int i;
727 REQ(n, factor);
728 if (TYPE(CHILD(n, 0)) == PLUS) {
729 com_factor(c, CHILD(n, 1));
730 com_addbyte(c, UNARY_POSITIVE);
731 }
732 else if (TYPE(CHILD(n, 0)) == MINUS) {
733 com_factor(c, CHILD(n, 1));
734 com_addbyte(c, UNARY_NEGATIVE);
735 }
Guido van Rossum7928cd71991-10-24 14:59:31 +0000736 else if (TYPE(CHILD(n, 0)) == TILDE) {
737 com_factor(c, CHILD(n, 1));
738 com_addbyte(c, UNARY_INVERT);
739 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000740 else {
741 com_atom(c, CHILD(n, 0));
742 for (i = 1; i < NCH(n); i++)
743 com_apply_trailer(c, CHILD(n, i));
744 }
745}
746
747static void
748com_term(c, n)
749 struct compiling *c;
750 node *n;
751{
752 int i;
753 int op;
754 REQ(n, term);
755 com_factor(c, CHILD(n, 0));
756 for (i = 2; i < NCH(n); i += 2) {
757 com_factor(c, CHILD(n, i));
758 switch (TYPE(CHILD(n, i-1))) {
759 case STAR:
760 op = BINARY_MULTIPLY;
761 break;
762 case SLASH:
763 op = BINARY_DIVIDE;
764 break;
765 case PERCENT:
766 op = BINARY_MODULO;
767 break;
768 default:
769 err_setstr(SystemError,
Guido van Rossum7928cd71991-10-24 14:59:31 +0000770 "com_term: operator not *, / or %");
771 c->c_errors++;
772 op = 255;
773 }
774 com_addbyte(c, op);
775 }
776}
777
778static void
779com_arith_expr(c, n)
780 struct compiling *c;
781 node *n;
782{
783 int i;
784 int op;
785 REQ(n, arith_expr);
786 com_term(c, CHILD(n, 0));
787 for (i = 2; i < NCH(n); i += 2) {
788 com_term(c, CHILD(n, i));
789 switch (TYPE(CHILD(n, i-1))) {
790 case PLUS:
791 op = BINARY_ADD;
792 break;
793 case MINUS:
794 op = BINARY_SUBTRACT;
795 break;
796 default:
797 err_setstr(SystemError,
798 "com_arith_expr: operator not + or -");
799 c->c_errors++;
800 op = 255;
801 }
802 com_addbyte(c, op);
803 }
804}
805
806static void
807com_shift_expr(c, n)
808 struct compiling *c;
809 node *n;
810{
811 int i;
812 int op;
813 REQ(n, shift_expr);
814 com_arith_expr(c, CHILD(n, 0));
815 for (i = 2; i < NCH(n); i += 2) {
816 com_arith_expr(c, CHILD(n, i));
817 switch (TYPE(CHILD(n, i-1))) {
818 case LEFTSHIFT:
819 op = BINARY_LSHIFT;
820 break;
821 case RIGHTSHIFT:
822 op = BINARY_RSHIFT;
823 break;
824 default:
825 err_setstr(SystemError,
826 "com_shift_expr: operator not << or >>");
827 c->c_errors++;
828 op = 255;
829 }
830 com_addbyte(c, op);
831 }
832}
833
834static void
835com_and_expr(c, n)
836 struct compiling *c;
837 node *n;
838{
839 int i;
840 int op;
841 REQ(n, and_expr);
842 com_shift_expr(c, CHILD(n, 0));
843 for (i = 2; i < NCH(n); i += 2) {
844 com_shift_expr(c, CHILD(n, i));
845 if (TYPE(CHILD(n, i-1)) == AMPER) {
846 op = BINARY_AND;
847 }
848 else {
849 err_setstr(SystemError,
850 "com_and_expr: operator not &");
851 c->c_errors++;
852 op = 255;
853 }
854 com_addbyte(c, op);
855 }
856}
857
858static void
859com_xor_expr(c, n)
860 struct compiling *c;
861 node *n;
862{
863 int i;
864 int op;
865 REQ(n, xor_expr);
866 com_and_expr(c, CHILD(n, 0));
867 for (i = 2; i < NCH(n); i += 2) {
868 com_and_expr(c, CHILD(n, i));
869 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
870 op = BINARY_XOR;
871 }
872 else {
873 err_setstr(SystemError,
874 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000875 c->c_errors++;
876 op = 255;
877 }
878 com_addbyte(c, op);
879 }
880}
881
882static void
883com_expr(c, n)
884 struct compiling *c;
885 node *n;
886{
887 int i;
888 int op;
889 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000890 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000891 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +0000892 com_xor_expr(c, CHILD(n, i));
893 if (TYPE(CHILD(n, i-1)) == VBAR) {
894 op = BINARY_OR;
895 }
896 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000897 err_setstr(SystemError,
Guido van Rossum7928cd71991-10-24 14:59:31 +0000898 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000899 c->c_errors++;
900 op = 255;
901 }
902 com_addbyte(c, op);
903 }
904}
905
906static enum cmp_op
907cmp_type(n)
908 node *n;
909{
910 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +0000911 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000912 | 'in' | 'not' 'in' | 'is' | 'is' not' */
913 if (NCH(n) == 1) {
914 n = CHILD(n, 0);
915 switch (TYPE(n)) {
916 case LESS: return LT;
917 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +0000918 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000919 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +0000920 case LESSEQUAL: return LE;
921 case GREATEREQUAL: return GE;
922 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000923 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
924 if (strcmp(STR(n), "is") == 0) return IS;
925 }
926 }
927 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000928 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000929 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
930 return NOT_IN;
931 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
932 return IS_NOT;
933 }
934 }
935 return BAD;
936}
937
938static void
939com_comparison(c, n)
940 struct compiling *c;
941 node *n;
942{
943 int i;
944 enum cmp_op op;
945 int anchor;
946 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
947 com_expr(c, CHILD(n, 0));
948 if (NCH(n) == 1)
949 return;
950
951 /****************************************************************
952 The following code is generated for all but the last
953 comparison in a chain:
954
955 label: on stack: opcode: jump to:
956
957 a <code to load b>
958 a, b DUP_TOP
959 a, b, b ROT_THREE
960 b, a, b COMPARE_OP
961 b, 0-or-1 JUMP_IF_FALSE L1
962 b, 1 POP_TOP
963 b
964
965 We are now ready to repeat this sequence for the next
966 comparison in the chain.
967
968 For the last we generate:
969
970 b <code to load c>
971 b, c COMPARE_OP
972 0-or-1
973
974 If there were any jumps to L1 (i.e., there was more than one
975 comparison), we generate:
976
977 0-or-1 JUMP_FORWARD L2
978 L1: b, 0 ROT_TWO
979 0, b POP_TOP
980 0
981 L2:
982 ****************************************************************/
983
984 anchor = 0;
985
986 for (i = 2; i < NCH(n); i += 2) {
987 com_expr(c, CHILD(n, i));
988 if (i+2 < NCH(n)) {
989 com_addbyte(c, DUP_TOP);
990 com_addbyte(c, ROT_THREE);
991 }
992 op = cmp_type(CHILD(n, i-1));
993 if (op == BAD) {
994 err_setstr(SystemError,
995 "com_comparison: unknown comparison op");
996 c->c_errors++;
997 }
998 com_addoparg(c, COMPARE_OP, op);
999 if (i+2 < NCH(n)) {
1000 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1001 com_addbyte(c, POP_TOP);
1002 }
1003 }
1004
1005 if (anchor) {
1006 int anchor2 = 0;
1007 com_addfwref(c, JUMP_FORWARD, &anchor2);
1008 com_backpatch(c, anchor);
1009 com_addbyte(c, ROT_TWO);
1010 com_addbyte(c, POP_TOP);
1011 com_backpatch(c, anchor2);
1012 }
1013}
1014
1015static void
1016com_not_test(c, n)
1017 struct compiling *c;
1018 node *n;
1019{
1020 REQ(n, not_test); /* 'not' not_test | comparison */
1021 if (NCH(n) == 1) {
1022 com_comparison(c, CHILD(n, 0));
1023 }
1024 else {
1025 com_not_test(c, CHILD(n, 1));
1026 com_addbyte(c, UNARY_NOT);
1027 }
1028}
1029
1030static void
1031com_and_test(c, n)
1032 struct compiling *c;
1033 node *n;
1034{
1035 int i;
1036 int anchor;
1037 REQ(n, and_test); /* not_test ('and' not_test)* */
1038 anchor = 0;
1039 i = 0;
1040 for (;;) {
1041 com_not_test(c, CHILD(n, i));
1042 if ((i += 2) >= NCH(n))
1043 break;
1044 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1045 com_addbyte(c, POP_TOP);
1046 }
1047 if (anchor)
1048 com_backpatch(c, anchor);
1049}
1050
1051static void
1052com_test(c, n)
1053 struct compiling *c;
1054 node *n;
1055{
1056 int i;
1057 int anchor;
1058 REQ(n, test); /* and_test ('and' and_test)* */
1059 anchor = 0;
1060 i = 0;
1061 for (;;) {
1062 com_and_test(c, CHILD(n, i));
1063 if ((i += 2) >= NCH(n))
1064 break;
1065 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1066 com_addbyte(c, POP_TOP);
1067 }
1068 if (anchor)
1069 com_backpatch(c, anchor);
1070}
1071
1072static void
Guido van Rossum288a60f1991-12-16 13:05:10 +00001073com_list(c, n, toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001074 struct compiling *c;
1075 node *n;
Guido van Rossum288a60f1991-12-16 13:05:10 +00001076 int toplevel; /* If nonzero, *always* build a tuple */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001077{
1078 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001079 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001080 com_node(c, CHILD(n, 0));
1081 }
1082 else {
1083 int i;
1084 int len;
1085 len = (NCH(n) + 1) / 2;
1086 for (i = 0; i < NCH(n); i += 2)
1087 com_node(c, CHILD(n, i));
1088 com_addoparg(c, BUILD_TUPLE, len);
1089 }
1090}
1091
1092
1093/* Begin of assignment compilation */
1094
1095static void com_assign_name PROTO((struct compiling *, node *, int));
1096static void com_assign PROTO((struct compiling *, node *, int));
1097
1098static void
1099com_assign_attr(c, n, assigning)
1100 struct compiling *c;
1101 node *n;
1102 int assigning;
1103{
1104 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
1105}
1106
1107static void
1108com_assign_slice(c, n, assigning)
1109 struct compiling *c;
1110 node *n;
1111 int assigning;
1112{
1113 com_slice(c, n, assigning ? STORE_SLICE : DELETE_SLICE);
1114}
1115
1116static void
1117com_assign_subscript(c, n, assigning)
1118 struct compiling *c;
1119 node *n;
1120 int assigning;
1121{
1122 com_node(c, n);
1123 com_addbyte(c, assigning ? STORE_SUBSCR : DELETE_SUBSCR);
1124}
1125
1126static void
1127com_assign_trailer(c, n, assigning)
1128 struct compiling *c;
1129 node *n;
1130 int assigning;
1131{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001132 REQ(n, trailer);
1133 switch (TYPE(CHILD(n, 0))) {
1134 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001135 err_setstr(SyntaxError, "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001136 c->c_errors++;
1137 break;
1138 case DOT: /* '.' NAME */
1139 com_assign_attr(c, CHILD(n, 1), assigning);
1140 break;
1141 case LSQB: /* '[' subscript ']' */
1142 n = CHILD(n, 1);
1143 REQ(n, subscript); /* subscript: expr | [expr] ':' [expr] */
1144 if (NCH(n) > 1 || TYPE(CHILD(n, 0)) == COLON)
1145 com_assign_slice(c, n, assigning);
1146 else
1147 com_assign_subscript(c, CHILD(n, 0), assigning);
1148 break;
1149 default:
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001150 err_setstr(SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001151 c->c_errors++;
1152 }
1153}
1154
1155static void
1156com_assign_tuple(c, n, assigning)
1157 struct compiling *c;
1158 node *n;
1159 int assigning;
1160{
1161 int i;
1162 if (TYPE(n) != testlist)
1163 REQ(n, exprlist);
1164 if (assigning)
1165 com_addoparg(c, UNPACK_TUPLE, (NCH(n)+1)/2);
1166 for (i = 0; i < NCH(n); i += 2)
1167 com_assign(c, CHILD(n, i), assigning);
1168}
1169
1170static void
1171com_assign_list(c, n, assigning)
1172 struct compiling *c;
1173 node *n;
1174 int assigning;
1175{
1176 int i;
1177 if (assigning)
1178 com_addoparg(c, UNPACK_LIST, (NCH(n)+1)/2);
1179 for (i = 0; i < NCH(n); i += 2)
1180 com_assign(c, CHILD(n, i), assigning);
1181}
1182
1183static void
1184com_assign_name(c, n, assigning)
1185 struct compiling *c;
1186 node *n;
1187 int assigning;
1188{
1189 REQ(n, NAME);
1190 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
1191}
1192
1193static void
1194com_assign(c, n, assigning)
1195 struct compiling *c;
1196 node *n;
1197 int assigning;
1198{
1199 /* Loop to avoid trivial recursion */
1200 for (;;) {
1201 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001202
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001203 case exprlist:
1204 case testlist:
1205 if (NCH(n) > 1) {
1206 com_assign_tuple(c, n, assigning);
1207 return;
1208 }
1209 n = CHILD(n, 0);
1210 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001211
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001212 case test:
1213 case and_test:
1214 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001215 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001216 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001217 case xor_expr:
1218 case and_expr:
1219 case shift_expr:
1220 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001221 case term:
1222 if (NCH(n) > 1) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001223 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001224 "can't assign to operator");
1225 c->c_errors++;
1226 return;
1227 }
1228 n = CHILD(n, 0);
1229 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001230
Guido van Rossum7928cd71991-10-24 14:59:31 +00001231 case factor: /* ('+'|'-'|'~') factor | atom trailer* */
1232 if (TYPE(CHILD(n, 0)) != atom) { /* '+'|'-'|'~' */
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001233 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001234 "can't assign to operator");
1235 c->c_errors++;
1236 return;
1237 }
1238 if (NCH(n) > 1) { /* trailer present */
1239 int i;
1240 com_node(c, CHILD(n, 0));
1241 for (i = 1; i+1 < NCH(n); i++) {
1242 com_apply_trailer(c, CHILD(n, i));
1243 } /* NB i is still alive */
1244 com_assign_trailer(c,
1245 CHILD(n, i), assigning);
1246 return;
1247 }
1248 n = CHILD(n, 0);
1249 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001250
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001251 case atom:
1252 switch (TYPE(CHILD(n, 0))) {
1253 case LPAR:
1254 n = CHILD(n, 1);
1255 if (TYPE(n) == RPAR) {
1256 /* XXX Should allow () = () ??? */
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001257 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001258 "can't assign to ()");
1259 c->c_errors++;
1260 return;
1261 }
1262 break;
1263 case LSQB:
1264 n = CHILD(n, 1);
1265 if (TYPE(n) == RSQB) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001266 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001267 "can't assign to []");
1268 c->c_errors++;
1269 return;
1270 }
1271 com_assign_list(c, n, assigning);
1272 return;
1273 case NAME:
1274 com_assign_name(c, CHILD(n, 0), assigning);
1275 return;
1276 default:
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001277 err_setstr(SyntaxError,
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001278 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001279 c->c_errors++;
1280 return;
1281 }
1282 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001283
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001284 default:
1285 fprintf(stderr, "node type %d\n", TYPE(n));
1286 err_setstr(SystemError, "com_assign: bad node");
1287 c->c_errors++;
1288 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001289
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001290 }
1291 }
1292}
1293
1294static void
1295com_expr_stmt(c, n)
1296 struct compiling *c;
1297 node *n;
1298{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001299 REQ(n, expr_stmt); /* exprlist ('=' exprlist)* */
1300 com_node(c, CHILD(n, NCH(n)-1));
1301 if (NCH(n) == 1) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001302 com_addbyte(c, PRINT_EXPR);
1303 }
1304 else {
1305 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001306 for (i = 0; i < NCH(n)-2; i+=2) {
1307 if (i+2 < NCH(n)-2)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001308 com_addbyte(c, DUP_TOP);
1309 com_assign(c, CHILD(n, i), 1/*assign*/);
1310 }
1311 }
1312}
1313
1314static void
1315com_print_stmt(c, n)
1316 struct compiling *c;
1317 node *n;
1318{
1319 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001320 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
1321 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001322 com_node(c, CHILD(n, i));
1323 com_addbyte(c, PRINT_ITEM);
1324 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001325 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001326 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001327 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001328}
1329
1330static void
1331com_return_stmt(c, n)
1332 struct compiling *c;
1333 node *n;
1334{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001335 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001336 if (!c->c_infunction) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001337 err_setstr(SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001338 c->c_errors++;
1339 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001340 if (NCH(n) < 2)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001341 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1342 else
1343 com_node(c, CHILD(n, 1));
1344 com_addbyte(c, RETURN_VALUE);
1345}
1346
1347static void
1348com_raise_stmt(c, n)
1349 struct compiling *c;
1350 node *n;
1351{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001352 REQ(n, raise_stmt); /* 'raise' test [',' test] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001353 com_node(c, CHILD(n, 1));
1354 if (NCH(n) > 3)
1355 com_node(c, CHILD(n, 3));
1356 else
1357 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1358 com_addbyte(c, RAISE_EXCEPTION);
1359}
1360
1361static void
1362com_import_stmt(c, n)
1363 struct compiling *c;
1364 node *n;
1365{
1366 int i;
1367 REQ(n, import_stmt);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001368 /* 'import' NAME (',' NAME)* |
1369 'from' NAME 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001370 if (STR(CHILD(n, 0))[0] == 'f') {
1371 /* 'from' NAME 'import' ... */
1372 REQ(CHILD(n, 1), NAME);
1373 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
1374 for (i = 3; i < NCH(n); i += 2)
1375 com_addopname(c, IMPORT_FROM, CHILD(n, i));
1376 com_addbyte(c, POP_TOP);
1377 }
1378 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001379 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001380 for (i = 1; i < NCH(n); i += 2) {
1381 com_addopname(c, IMPORT_NAME, CHILD(n, i));
1382 com_addopname(c, STORE_NAME, CHILD(n, i));
1383 }
1384 }
1385}
1386
1387static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00001388com_global_stmt(c, n)
1389 struct compiling *c;
1390 node *n;
1391{
1392 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001393 REQ(n, global_stmt);
1394 /* 'global' NAME (',' NAME)* */
1395 for (i = 1; i < NCH(n); i += 2) {
1396 if (dictinsert(c->c_globals, STR(CHILD(n, i)), None) != 0)
1397 c->c_errors++;
1398 }
1399}
1400
1401static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001402com_if_stmt(c, n)
1403 struct compiling *c;
1404 node *n;
1405{
1406 int i;
1407 int anchor = 0;
1408 REQ(n, if_stmt);
1409 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
1410 for (i = 0; i+3 < NCH(n); i+=4) {
1411 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001412 node *ch = CHILD(n, i+1);
1413 if (i > 0)
1414 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001415 com_node(c, CHILD(n, i+1));
1416 com_addfwref(c, JUMP_IF_FALSE, &a);
1417 com_addbyte(c, POP_TOP);
1418 com_node(c, CHILD(n, i+3));
1419 com_addfwref(c, JUMP_FORWARD, &anchor);
1420 com_backpatch(c, a);
1421 com_addbyte(c, POP_TOP);
1422 }
1423 if (i+2 < NCH(n))
1424 com_node(c, CHILD(n, i+2));
1425 com_backpatch(c, anchor);
1426}
1427
1428static void
1429com_while_stmt(c, n)
1430 struct compiling *c;
1431 node *n;
1432{
1433 int break_anchor = 0;
1434 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001435 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001436 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
1437 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001438 block_push(c, SETUP_LOOP);
1439 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001440 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001441 com_node(c, CHILD(n, 1));
1442 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1443 com_addbyte(c, POP_TOP);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001444 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001445 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001446 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001447 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1448 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001449 com_backpatch(c, anchor);
1450 com_addbyte(c, POP_TOP);
1451 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001452 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001453 if (NCH(n) > 4)
1454 com_node(c, CHILD(n, 6));
1455 com_backpatch(c, break_anchor);
1456}
1457
1458static void
1459com_for_stmt(c, n)
1460 struct compiling *c;
1461 node *n;
1462{
1463 object *v;
1464 int break_anchor = 0;
1465 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001466 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001467 REQ(n, for_stmt);
1468 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
1469 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001470 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001471 com_node(c, CHILD(n, 3));
1472 v = newintobject(0L);
1473 if (v == NULL)
1474 c->c_errors++;
1475 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
1476 XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001477 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001478 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001479 com_addfwref(c, FOR_LOOP, &anchor);
1480 com_assign(c, CHILD(n, 1), 1/*assigning*/);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001481 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001482 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001483 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001484 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1485 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001486 com_backpatch(c, anchor);
1487 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001488 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001489 if (NCH(n) > 8)
1490 com_node(c, CHILD(n, 8));
1491 com_backpatch(c, break_anchor);
1492}
1493
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001494/* Although 'execpt' and 'finally' clauses can be combined
1495 syntactically, they are compiled separately. In fact,
1496 try: S
1497 except E1: S1
1498 except E2: S2
1499 ...
1500 finally: Sf
1501 is equivalent to
1502 try:
1503 try: S
1504 except E1: S1
1505 except E2: S2
1506 ...
1507 finally: Sf
1508 meaning that the 'finally' clause is entered even if things
1509 go wrong again in an exception handler. Note that this is
1510 not the case for exception handlers: at most one is entered.
1511
1512 Code generated for "try: S finally: Sf" is as follows:
1513
1514 SETUP_FINALLY L
1515 <code for S>
1516 POP_BLOCK
1517 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001518 L: <code for Sf>
1519 END_FINALLY
1520
1521 The special instructions use the block stack. Each block
1522 stack entry contains the instruction that created it (here
1523 SETUP_FINALLY), the level of the value stack at the time the
1524 block stack entry was created, and a label (here L).
1525
1526 SETUP_FINALLY:
1527 Pushes the current value stack level and the label
1528 onto the block stack.
1529 POP_BLOCK:
1530 Pops en entry from the block stack, and pops the value
1531 stack until its level is the same as indicated on the
1532 block stack. (The label is ignored.)
1533 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001534 Pops a variable number of entries from the *value* stack
1535 and re-raises the exception they specify. The number of
1536 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001537
1538 The block stack is unwound when an exception is raised:
1539 when a SETUP_FINALLY entry is found, the exception is pushed
1540 onto the value stack (and the exception condition is cleared),
1541 and the interpreter jumps to the label gotten from the block
1542 stack.
1543
1544 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00001545 (The contents of the value stack is shown in [], with the top
1546 at the right; 'tb' is trace-back info, 'val' the exception's
1547 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001548
1549 Value stack Label Instruction Argument
1550 [] SETUP_EXCEPT L1
1551 [] <code for S>
1552 [] POP_BLOCK
1553 [] JUMP_FORWARD L0
1554
Guido van Rossum3f5da241990-12-20 15:06:42 +00001555 [tb, val, exc] L1: DUP )
1556 [tb, val, exc, exc] <evaluate E1> )
1557 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
1558 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
1559 [tb, val, exc, 1] POP )
1560 [tb, val, exc] POP
1561 [tb, val] <assign to V1> (or POP if no V1)
1562 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001563 [] <code for S1>
1564 JUMP_FORWARD L0
1565
Guido van Rossum3f5da241990-12-20 15:06:42 +00001566 [tb, val, exc, 0] L2: POP
1567 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001568 .............................etc.......................
1569
Guido van Rossum3f5da241990-12-20 15:06:42 +00001570 [tb, val, exc, 0] Ln+1: POP
1571 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001572
1573 [] L0: <next statement>
1574
1575 Of course, parts are not generated if Vi or Ei is not present.
1576*/
1577
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001578static void
1579com_try_stmt(c, n)
1580 struct compiling *c;
1581 node *n;
1582{
1583 int finally_anchor = 0;
1584 int except_anchor = 0;
1585 REQ(n, try_stmt);
Guido van Rossum94fb82e1992-04-05 14:24:50 +00001586 /* 'try' ':' suite (except_clause ':' suite)*
1587 | 'try' ':' 'finally' ':' suite */
1588
1589 /* XXX This can be simplified because except and finally can
1590 no longer be mixed in a single try statement */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001591
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001592 if (NCH(n) > 3 && TYPE(CHILD(n, NCH(n)-3)) != except_clause) {
1593 /* Have a 'finally' clause */
1594 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001595 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001596 }
1597 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == except_clause) {
1598 /* Have an 'except' clause */
1599 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001600 block_push(c, SETUP_EXCEPT);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001601 }
1602 com_node(c, CHILD(n, 2));
1603 if (except_anchor) {
1604 int end_anchor = 0;
1605 int i;
1606 node *ch;
1607 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001608 block_pop(c, SETUP_EXCEPT);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001609 com_addfwref(c, JUMP_FORWARD, &end_anchor);
1610 com_backpatch(c, except_anchor);
1611 for (i = 3;
1612 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
1613 i += 3) {
1614 /* except_clause: 'except' [expr [',' expr]] */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001615 if (except_anchor == 0) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001616 err_setstr(SyntaxError,
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001617 "default 'except:' must be last");
1618 c->c_errors++;
1619 break;
1620 }
1621 except_anchor = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001622 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001623 if (NCH(ch) > 1) {
1624 com_addbyte(c, DUP_TOP);
1625 com_node(c, CHILD(ch, 1));
1626 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001627 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001628 com_addbyte(c, POP_TOP);
1629 }
1630 com_addbyte(c, POP_TOP);
1631 if (NCH(ch) > 3)
1632 com_assign(c, CHILD(ch, 3), 1/*assigning*/);
1633 else
1634 com_addbyte(c, POP_TOP);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001635 com_addbyte(c, POP_TOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001636 com_node(c, CHILD(n, i+2));
1637 com_addfwref(c, JUMP_FORWARD, &end_anchor);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001638 if (except_anchor) {
1639 com_backpatch(c, except_anchor);
1640 com_addbyte(c, POP_TOP);
1641 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001642 }
1643 com_addbyte(c, END_FINALLY);
1644 com_backpatch(c, end_anchor);
1645 }
1646 if (finally_anchor) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001647 node *ch;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001648 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001649 block_pop(c, SETUP_FINALLY);
1650 block_push(c, END_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001651 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001652 com_backpatch(c, finally_anchor);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001653 ch = CHILD(n, NCH(n)-1);
1654 com_addoparg(c, SET_LINENO, ch->n_lineno);
1655 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001656 com_addbyte(c, END_FINALLY);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001657 block_pop(c, END_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001658 }
1659}
1660
1661static void
1662com_suite(c, n)
1663 struct compiling *c;
1664 node *n;
1665{
1666 REQ(n, suite);
1667 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
1668 if (NCH(n) == 1) {
1669 com_node(c, CHILD(n, 0));
1670 }
1671 else {
1672 int i;
1673 for (i = 0; i < NCH(n); i++) {
1674 node *ch = CHILD(n, i);
1675 if (TYPE(ch) == stmt)
1676 com_node(c, ch);
1677 }
1678 }
1679}
1680
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001681/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001682static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001683com_continue_stmt(c, n)
1684 struct compiling *c;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001685 node *n; /* Not used, but passed for consistency */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001686{
1687 int i = c->c_nblocks;
1688 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
1689 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1690 }
1691 else {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001692 err_setstr(SyntaxError, "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001693 c->c_errors++;
1694 }
1695 /* XXX Could allow it inside a 'finally' clause
1696 XXX if we could pop the exception still on the stack */
1697}
1698
1699static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001700com_funcdef(c, n)
1701 struct compiling *c;
1702 node *n;
1703{
1704 object *v;
1705 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001706 v = (object *)compile(n, c->c_filename);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001707 if (v == NULL)
1708 c->c_errors++;
1709 else {
1710 int i = com_addconst(c, v);
1711 com_addoparg(c, LOAD_CONST, i);
1712 com_addbyte(c, BUILD_FUNCTION);
1713 com_addopname(c, STORE_NAME, CHILD(n, 1));
1714 DECREF(v);
1715 }
1716}
1717
1718static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00001719com_oldbases(c, n)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001720 struct compiling *c;
1721 node *n;
1722{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001723 int i;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001724 REQ(n, baselist);
1725 /*
1726 baselist: atom arguments (',' atom arguments)*
Guido van Rossumc5e96291991-12-10 13:53:51 +00001727 arguments: '(' ')'
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001728 */
1729 for (i = 0; i < NCH(n); i += 3)
1730 com_node(c, CHILD(n, i));
1731 com_addoparg(c, BUILD_TUPLE, (NCH(n)+1) / 3);
1732}
1733
1734static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00001735com_newbases(c, n)
1736 struct compiling *c;
1737 node *n;
1738{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001739 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001740 REQ(n, testlist);
1741 /* testlist: test (',' test)* [','] */
1742 for (i = 0; i < NCH(n); i += 2)
1743 com_node(c, CHILD(n, i));
1744 com_addoparg(c, BUILD_TUPLE, (NCH(n)+1) / 2);
1745}
1746
1747static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001748com_classdef(c, n)
1749 struct compiling *c;
1750 node *n;
1751{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001752 object *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001753 REQ(n, classdef);
1754 /*
Guido van Rossumc5e96291991-12-10 13:53:51 +00001755 classdef: 'class' NAME
1756 ['(' testlist ')' |'(' ')' ['=' baselist]] ':' suite
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001757 baselist: atom arguments (',' atom arguments)*
Guido van Rossumc5e96291991-12-10 13:53:51 +00001758 arguments: '(' ')'
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001759 */
Guido van Rossumc5e96291991-12-10 13:53:51 +00001760 /* This piece of code must push a tuple on the stack (the bases) */
1761 if (TYPE(CHILD(n, 2)) != LPAR) {
1762 /* New syntax without base classes:
1763 class NAME ':' suite
1764 ___________^
1765 */
1766 com_addoparg(c, BUILD_TUPLE, 0);
1767 }
1768 else {
1769 if (TYPE(CHILD(n, 3)) == RPAR) {
1770 /* Old syntax with or without base classes:
1771 class NAME '(' ')' ['=' baselist] ':' suite
1772 _______________^....^...^
1773 */
1774 if (TYPE(CHILD(n, 4)) == EQUAL)
1775 com_oldbases(c, CHILD(n, 5));
1776 else
1777 com_addoparg(c, BUILD_TUPLE, 0);
1778 }
1779 else {
1780 /* New syntax with base classes:
1781 class NAME '(' testlist ')' ':' suite
1782 _______________^
1783 */
1784 com_newbases(c, CHILD(n, 3));
1785 }
1786 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001787 v = (object *)compile(n, c->c_filename);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001788 if (v == NULL)
1789 c->c_errors++;
1790 else {
1791 int i = com_addconst(c, v);
1792 com_addoparg(c, LOAD_CONST, i);
1793 com_addbyte(c, BUILD_FUNCTION);
1794 com_addbyte(c, UNARY_CALL);
1795 com_addbyte(c, BUILD_CLASS);
1796 com_addopname(c, STORE_NAME, CHILD(n, 1));
1797 DECREF(v);
1798 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001799}
1800
1801static void
1802com_node(c, n)
1803 struct compiling *c;
1804 node *n;
1805{
1806 switch (TYPE(n)) {
1807
1808 /* Definition nodes */
1809
1810 case funcdef:
1811 com_funcdef(c, n);
1812 break;
1813 case classdef:
1814 com_classdef(c, n);
1815 break;
1816
1817 /* Trivial parse tree nodes */
1818
1819 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001820 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001821 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001822 com_node(c, CHILD(n, 0));
1823 break;
1824
1825 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001826 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
1827 com_addoparg(c, SET_LINENO, n->n_lineno);
1828 {
1829 int i;
1830 for (i = 0; i < NCH(n)-1; i += 2)
1831 com_node(c, CHILD(n, i));
1832 }
1833 break;
1834
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001835 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001836 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001837 com_node(c, CHILD(n, 0));
1838 break;
1839
1840 /* Statement nodes */
1841
1842 case expr_stmt:
1843 com_expr_stmt(c, n);
1844 break;
1845 case print_stmt:
1846 com_print_stmt(c, n);
1847 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001848 case del_stmt: /* 'del' exprlist */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001849 com_assign(c, CHILD(n, 1), 0/*delete*/);
1850 break;
1851 case pass_stmt:
1852 break;
1853 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001854 if (c->c_loops == 0) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001855 err_setstr(SyntaxError, "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001856 c->c_errors++;
1857 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001858 com_addbyte(c, BREAK_LOOP);
1859 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001860 case continue_stmt:
1861 com_continue_stmt(c, n);
1862 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001863 case return_stmt:
1864 com_return_stmt(c, n);
1865 break;
1866 case raise_stmt:
1867 com_raise_stmt(c, n);
1868 break;
1869 case import_stmt:
1870 com_import_stmt(c, n);
1871 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001872 case global_stmt:
1873 com_global_stmt(c, n);
1874 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001875 case if_stmt:
1876 com_if_stmt(c, n);
1877 break;
1878 case while_stmt:
1879 com_while_stmt(c, n);
1880 break;
1881 case for_stmt:
1882 com_for_stmt(c, n);
1883 break;
1884 case try_stmt:
1885 com_try_stmt(c, n);
1886 break;
1887 case suite:
1888 com_suite(c, n);
1889 break;
1890
1891 /* Expression nodes */
1892
1893 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00001894 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001895 break;
1896 case test:
1897 com_test(c, n);
1898 break;
1899 case and_test:
1900 com_and_test(c, n);
1901 break;
1902 case not_test:
1903 com_not_test(c, n);
1904 break;
1905 case comparison:
1906 com_comparison(c, n);
1907 break;
1908 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00001909 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001910 break;
1911 case expr:
1912 com_expr(c, n);
1913 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001914 case xor_expr:
1915 com_xor_expr(c, n);
1916 break;
1917 case and_expr:
1918 com_and_expr(c, n);
1919 break;
1920 case shift_expr:
1921 com_shift_expr(c, n);
1922 break;
1923 case arith_expr:
1924 com_arith_expr(c, n);
1925 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001926 case term:
1927 com_term(c, n);
1928 break;
1929 case factor:
1930 com_factor(c, n);
1931 break;
1932 case atom:
1933 com_atom(c, n);
1934 break;
1935
1936 default:
1937 fprintf(stderr, "node type %d\n", TYPE(n));
1938 err_setstr(SystemError, "com_node: unexpected node type");
1939 c->c_errors++;
1940 }
1941}
1942
1943static void com_fplist PROTO((struct compiling *, node *));
1944
1945static void
1946com_fpdef(c, n)
1947 struct compiling *c;
1948 node *n;
1949{
1950 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
1951 if (TYPE(CHILD(n, 0)) == LPAR)
1952 com_fplist(c, CHILD(n, 1));
1953 else
1954 com_addopname(c, STORE_NAME, CHILD(n, 0));
1955}
1956
1957static void
1958com_fplist(c, n)
1959 struct compiling *c;
1960 node *n;
1961{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001962 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001963 if (NCH(n) == 1) {
1964 com_fpdef(c, CHILD(n, 0));
1965 }
1966 else {
1967 int i;
1968 com_addoparg(c, UNPACK_TUPLE, (NCH(n)+1)/2);
1969 for (i = 0; i < NCH(n); i += 2)
1970 com_fpdef(c, CHILD(n, i));
1971 }
1972}
1973
1974static void
Guido van Rossum49d6dc41992-01-14 18:30:26 +00001975com_arglist(c, n)
1976 struct compiling *c;
1977 node *n;
1978{
1979 int i, nargs, op;
1980 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001981 /* varargslist:
Guido van Rossum94fb82e1992-04-05 14:24:50 +00001982 (fpdef ',')* '*' NAME | fpdef (',' fpdef)* [','] */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00001983 op = UNPACK_ARG;
1984 nargs = (NCH(n) + 1) / 2;
1985 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumacbefef1992-01-19 16:33:51 +00001986 int t = TYPE(CHILD(n, i));
Guido van Rossum94fb82e1992-04-05 14:24:50 +00001987 if (t == STAR) {
Guido van Rossum49d6dc41992-01-14 18:30:26 +00001988 op = UNPACK_VARARG;
1989 nargs = i/2;
1990 break;
1991 }
1992 }
1993 com_addoparg(c, op, nargs);
1994 for (i = 0; i < 2*nargs; i += 2)
1995 com_fpdef(c, CHILD(n, i));
1996 if (op == UNPACK_VARARG)
1997 com_addopname(c, STORE_NAME, CHILD(n, 2*nargs+1));
1998}
1999
2000static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002001com_file_input(c, n)
2002 struct compiling *c;
2003 node *n;
2004{
2005 int i;
2006 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
2007 for (i = 0; i < NCH(n); i++) {
2008 node *ch = CHILD(n, i);
2009 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
2010 com_node(c, ch);
2011 }
2012}
2013
2014/* Top-level compile-node interface */
2015
2016static void
2017compile_funcdef(c, n)
2018 struct compiling *c;
2019 node *n;
2020{
2021 node *ch;
2022 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002023 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
2024 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002025 if (TYPE(ch) == RPAR)
Guido van Rossum288a60f1991-12-16 13:05:10 +00002026 com_addoparg(c, UNPACK_ARG, 0);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002027 else
2028 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002029 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002030 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002031 c->c_infunction = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002032 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2033 com_addbyte(c, RETURN_VALUE);
2034}
2035
2036static void
2037compile_node(c, n)
2038 struct compiling *c;
2039 node *n;
2040{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002041 com_addoparg(c, SET_LINENO, n->n_lineno);
2042
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002043 switch (TYPE(n)) {
2044
Guido van Rossum4c417781991-01-21 16:09:22 +00002045 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002046 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
2047 n = CHILD(n, 0);
2048 if (TYPE(n) != NEWLINE)
2049 com_node(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002050 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2051 com_addbyte(c, RETURN_VALUE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002052 break;
2053
Guido van Rossum4c417781991-01-21 16:09:22 +00002054 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002055 com_file_input(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002056 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2057 com_addbyte(c, RETURN_VALUE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002058 break;
2059
Guido van Rossum4c417781991-01-21 16:09:22 +00002060 case expr_input: /* Built-in function eval() */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002061 com_node(c, CHILD(n, 0));
2062 com_addbyte(c, RETURN_VALUE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002063 break;
2064
Guido van Rossum4c417781991-01-21 16:09:22 +00002065 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00002066 com_node(c, CHILD(n, 0));
2067 com_addbyte(c, RETURN_VALUE);
2068 break;
2069
2070 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002071 compile_funcdef(c, n);
2072 break;
2073
Guido van Rossum4c417781991-01-21 16:09:22 +00002074 case classdef: /* A class definition */
Guido van Rossumc5e96291991-12-10 13:53:51 +00002075 /* classdef: 'class' NAME
2076 ['(' testlist ')' |'(' ')' ['=' baselist]]
2077 ':' suite */
Guido van Rossumc5e96291991-12-10 13:53:51 +00002078 com_node(c, CHILD(n, NCH(n)-1)); /* The suite */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002079 com_addbyte(c, LOAD_LOCALS);
2080 com_addbyte(c, RETURN_VALUE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002081 break;
2082
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002083 default:
2084 fprintf(stderr, "node type %d\n", TYPE(n));
2085 err_setstr(SystemError, "compile_node: unexpected node type");
2086 c->c_errors++;
2087 }
2088}
2089
Guido van Rossum282914b1991-04-04 10:42:56 +00002090/* Optimization for local and global variables.
2091
2092 Attempt to replace all LOAD_NAME instructions that refer to a local
2093 variable with LOAD_LOCAL instructions, and all that refer to a global
2094 variable with LOAD_GLOBAL instructions.
2095
2096 To find all local variables, we check all STORE_NAME and IMPORT_FROM
2097 instructions. This yields all local variables, including arguments,
2098 function definitions, class definitions and import statements.
2099
2100 There is one leak: 'from foo import *' introduces local variables
2101 that we can't know while compiling. If this is the case, LOAD_GLOBAL
2102 instructions are not generated -- LOAD_NAME is left in place for
2103 globals, since it first checks for globals (LOAD_LOCAL is still used
2104 for recognized locals, since it doesn't hurt).
2105
2106 This optimization means that using the same name as a global and
2107 as a local variable within the same scope is now illegal, which
2108 is a change to the language! Also using eval() to introduce new
2109 local variables won't work. But both were bad practice at best.
2110
2111 The optimization doesn't save much: basically, it saves one
2112 unsuccessful dictionary lookup per global (or built-in) variable
2113 reference. On the (slow!) Mac Plus, with 4 local variables,
2114 this saving was measured to be about 0.18 ms. We might save more
2115 by using a different data structure to hold local variables, like
2116 an array indexed by variable number.
2117
2118 NB: this modifies the string object co->co_code!
2119*/
2120
2121static void
2122optimizer(co)
2123 codeobject *co;
2124{
Guido van Rossum0a697f61991-04-16 08:39:12 +00002125 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00002126 object *locals;
2127 int opcode;
2128 int oparg;
2129 object *name;
2130 int star_used;
Guido van Rossum0a697f61991-04-16 08:39:12 +00002131
Guido van Rossum282914b1991-04-04 10:42:56 +00002132#define NEXTOP() (*next_instr++)
2133#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
2134#define GETITEM(v, i) (getlistitem((v), (i)))
2135#define GETNAMEOBJ(i) (GETITEM(co->co_names, (i)))
2136
2137 locals = newdictobject();
2138 if (locals == NULL) {
2139 err_clear();
2140 return; /* For now, this is OK */
2141 }
2142
Guido van Rossum0a697f61991-04-16 08:39:12 +00002143 next_instr = (unsigned char *) GETSTRINGVALUE(co->co_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00002144 for (;;) {
2145 opcode = NEXTOP();
2146 if (opcode == STOP_CODE)
2147 break;
2148 if (HAS_ARG(opcode))
2149 oparg = NEXTARG();
2150 if (opcode == STORE_NAME || opcode == IMPORT_FROM) {
2151 name = GETNAMEOBJ(oparg);
2152 if (dict2insert(locals, name, None) != 0) {
2153 DECREF(locals);
2154 return; /* Sorry */
2155 }
2156 }
2157 }
2158
2159 star_used = (dictlookup(locals, "*") != NULL);
Guido van Rossum0a697f61991-04-16 08:39:12 +00002160 next_instr = (unsigned char *) GETSTRINGVALUE(co->co_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00002161 for (;;) {
2162 cur_instr = next_instr;
2163 opcode = NEXTOP();
2164 if (opcode == STOP_CODE)
2165 break;
2166 if (HAS_ARG(opcode))
2167 oparg = NEXTARG();
2168 if (opcode == LOAD_NAME) {
2169 name = GETNAMEOBJ(oparg);
Guido van Rossum83163251991-08-16 08:58:43 +00002170 if (dict2lookup(locals, name) != NULL)
Guido van Rossum282914b1991-04-04 10:42:56 +00002171 *cur_instr = LOAD_LOCAL;
Guido van Rossum83163251991-08-16 08:58:43 +00002172 else {
2173 err_clear();
2174 if (!star_used)
2175 *cur_instr = LOAD_GLOBAL;
2176 }
Guido van Rossum282914b1991-04-04 10:42:56 +00002177 }
2178 }
2179
2180 DECREF(locals);
2181}
2182
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002183codeobject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002184compile(n, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002185 node *n;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002186 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002187{
2188 struct compiling sc;
2189 codeobject *co;
Guido van Rossuma082ce41991-06-04 19:41:56 +00002190 object *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002191 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002192 return NULL;
2193 compile_node(&sc, n);
2194 com_done(&sc);
Guido van Rossuma082ce41991-06-04 19:41:56 +00002195 if (sc.c_errors == 0 && (v = newstringobject(filename)) != NULL) {
2196 co = newcodeobject(sc.c_code, sc.c_consts, sc.c_names, v);
2197 DECREF(v);
2198 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002199 else
2200 co = NULL;
2201 com_free(&sc);
Guido van Rossumfb8edfc1991-05-14 11:56:03 +00002202 if (co != NULL && filename[0] != '<')
Guido van Rossum282914b1991-04-04 10:42:56 +00002203 optimizer(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002204 return co;
2205}