blob: ccb1de25ac373fc4fa726c76e28f445849ca902c [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[] = {
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
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) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +0000159 err_setstr(SystemError, "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000160 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 Rossumacbefef1992-01-19 16:33:51 +0000412 extern unsigned long strtoul();
Guido van Rossum282914b1991-04-04 10:42:56 +0000413 extern double strtod();
Guido van Rossumc5e96291991-12-10 13:53:51 +0000414 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000415 long x;
Guido van Rossum282914b1991-04-04 10:42:56 +0000416 double xx;
417 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000418 end = s + strlen(s) - 1;
419 if (*end == 'l' || *end == 'L') {
420 extern object *long_scan();
421 return long_scan(s, 0);
422 }
Guido van Rossumacbefef1992-01-19 16:33:51 +0000423 if (s[0] == '0')
424 x = (long) strtoul(s, &end, 0);
425 else
426 x = strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +0000427 if (*end == '\0') {
428 if (errno != 0) {
Guido van Rossumefb087b1991-12-16 15:41:41 +0000429 err_setstr(OverflowError,
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000430 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000431 return NULL;
432 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000433 return newintobject(x);
Guido van Rossum282914b1991-04-04 10:42:56 +0000434 }
435 errno = 0;
436 xx = strtod(s, &end);
437 if (*end == '\0') {
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000438#ifndef BROKEN_STRTOD
439 /* Some strtod() versions (e.g., in older SunOS systems)
440 set errno incorrectly; better to ignore overflows
441 than not to be able to use float literals at all! */
Guido van Rossum282914b1991-04-04 10:42:56 +0000442 if (errno != 0) {
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000443 err_setstr(OverflowError, "float literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000444 return NULL;
445 }
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000446#endif
Guido van Rossum282914b1991-04-04 10:42:56 +0000447 return newfloatobject(xx);
448 }
Guido van Rossumefb087b1991-12-16 15:41:41 +0000449 err_setstr(SystemError, "bad number syntax?!?!");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000450 return NULL;
451}
452
453static object *
454parsestr(s)
455 char *s;
456{
457 object *v;
458 int len;
459 char *buf;
460 char *p;
461 int c;
462 if (*s != '\'') {
463 err_badcall();
464 return NULL;
465 }
466 s++;
467 len = strlen(s);
468 if (s[--len] != '\'') {
469 err_badcall();
470 return NULL;
471 }
472 if (strchr(s, '\\') == NULL)
473 return newsizedstringobject(s, len);
474 v = newsizedstringobject((char *)NULL, len);
475 p = buf = getstringvalue(v);
476 while (*s != '\0' && *s != '\'') {
477 if (*s != '\\') {
478 *p++ = *s++;
479 continue;
480 }
481 s++;
482 switch (*s++) {
483 /* XXX This assumes ASCII! */
484 case '\\': *p++ = '\\'; break;
485 case '\'': *p++ = '\''; break;
486 case 'b': *p++ = '\b'; break;
487 case 'f': *p++ = '\014'; break; /* FF */
488 case 't': *p++ = '\t'; break;
489 case 'n': *p++ = '\n'; break;
490 case 'r': *p++ = '\r'; break;
491 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000492 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
493 case '0': case '1': case '2': case '3':
494 case '4': case '5': case '6': case '7':
495 c = s[-1] - '0';
496 if ('0' <= *s && *s <= '7') {
497 c = (c<<3) + *s++ - '0';
498 if ('0' <= *s && *s <= '7')
499 c = (c<<3) + *s++ - '0';
500 }
501 *p++ = c;
502 break;
503 case 'x':
504 if (isxdigit(*s)) {
505 sscanf(s, "%x", &c);
506 *p++ = c;
507 do {
508 s++;
509 } while (isxdigit(*s));
510 break;
511 }
512 /* FALLTHROUGH */
513 default: *p++ = '\\'; *p++ = s[-1]; break;
514 }
515 }
516 resizestring(&v, (int)(p - buf));
517 return v;
518}
519
520static void
521com_list_constructor(c, n)
522 struct compiling *c;
523 node *n;
524{
525 int len;
526 int i;
527 object *v, *w;
528 if (TYPE(n) != testlist)
529 REQ(n, exprlist);
530 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
531 len = (NCH(n) + 1) / 2;
532 for (i = 0; i < NCH(n); i += 2)
533 com_node(c, CHILD(n, i));
534 com_addoparg(c, BUILD_LIST, len);
535}
536
537static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000538com_dictmaker(c, n)
539 struct compiling *c;
540 node *n;
541{
542 int i;
543 /* dictmaker: test ':' test (',' test ':' value)* [','] */
544 for (i = 0; i+2 < NCH(n); i += 4) {
545 /* We must arrange things just right for STORE_SUBSCR.
546 It wants the stack to look like (value) (dict) (key) */
547 com_addbyte(c, DUP_TOP);
548 com_node(c, CHILD(n, i+2)); /* value */
549 com_addbyte(c, ROT_TWO);
550 com_node(c, CHILD(n, i)); /* key */
551 com_addbyte(c, STORE_SUBSCR);
552 }
553}
554
555static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000556com_atom(c, n)
557 struct compiling *c;
558 node *n;
559{
560 node *ch;
561 object *v;
562 int i;
563 REQ(n, atom);
564 ch = CHILD(n, 0);
565 switch (TYPE(ch)) {
566 case LPAR:
567 if (TYPE(CHILD(n, 1)) == RPAR)
568 com_addoparg(c, BUILD_TUPLE, 0);
569 else
570 com_node(c, CHILD(n, 1));
571 break;
572 case LSQB:
573 if (TYPE(CHILD(n, 1)) == RSQB)
574 com_addoparg(c, BUILD_LIST, 0);
575 else
576 com_list_constructor(c, CHILD(n, 1));
577 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000578 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000579 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000580 if (TYPE(CHILD(n, 1)) != RBRACE)
581 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000582 break;
583 case BACKQUOTE:
584 com_node(c, CHILD(n, 1));
585 com_addbyte(c, UNARY_CONVERT);
586 break;
587 case NUMBER:
588 if ((v = parsenumber(STR(ch))) == NULL) {
589 c->c_errors++;
590 i = 255;
591 }
592 else {
593 i = com_addconst(c, v);
594 DECREF(v);
595 }
596 com_addoparg(c, LOAD_CONST, i);
597 break;
598 case STRING:
599 if ((v = parsestr(STR(ch))) == NULL) {
600 c->c_errors++;
601 i = 255;
602 }
603 else {
604 i = com_addconst(c, v);
605 DECREF(v);
606 }
607 com_addoparg(c, LOAD_CONST, i);
608 break;
609 case NAME:
610 com_addopname(c, LOAD_NAME, ch);
611 break;
612 default:
613 fprintf(stderr, "node type %d\n", TYPE(ch));
614 err_setstr(SystemError, "com_atom: unexpected node type");
615 c->c_errors++;
616 }
617}
618
619static void
620com_slice(c, n, op)
621 struct compiling *c;
622 node *n;
623 int op;
624{
625 if (NCH(n) == 1) {
626 com_addbyte(c, op);
627 }
628 else if (NCH(n) == 2) {
629 if (TYPE(CHILD(n, 0)) != COLON) {
630 com_node(c, CHILD(n, 0));
631 com_addbyte(c, op+1);
632 }
633 else {
634 com_node(c, CHILD(n, 1));
635 com_addbyte(c, op+2);
636 }
637 }
638 else {
639 com_node(c, CHILD(n, 0));
640 com_node(c, CHILD(n, 2));
641 com_addbyte(c, op+3);
642 }
643}
644
645static void
646com_apply_subscript(c, n)
647 struct compiling *c;
648 node *n;
649{
650 REQ(n, subscript);
651 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) != COLON) {
652 /* It's a single subscript */
653 com_node(c, CHILD(n, 0));
654 com_addbyte(c, BINARY_SUBSCR);
655 }
656 else {
657 /* It's a slice: [expr] ':' [expr] */
658 com_slice(c, n, SLICE);
659 }
660}
661
662static void
663com_call_function(c, n)
664 struct compiling *c;
665 node *n; /* EITHER testlist OR ')' */
666{
667 if (TYPE(n) == RPAR) {
Guido van Rossum288a60f1991-12-16 13:05:10 +0000668 com_addoparg(c, BUILD_TUPLE, 0);
669 com_addbyte(c, BINARY_CALL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000670 }
671 else {
Guido van Rossum288a60f1991-12-16 13:05:10 +0000672 int i;
673 REQ(n, testlist);
674 com_list(c, n, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000675 com_addbyte(c, BINARY_CALL);
676 }
677}
678
679static void
680com_select_member(c, n)
681 struct compiling *c;
682 node *n;
683{
684 com_addopname(c, LOAD_ATTR, n);
685}
686
687static void
688com_apply_trailer(c, n)
689 struct compiling *c;
690 node *n;
691{
692 REQ(n, trailer);
693 switch (TYPE(CHILD(n, 0))) {
694 case LPAR:
695 com_call_function(c, CHILD(n, 1));
696 break;
697 case DOT:
698 com_select_member(c, CHILD(n, 1));
699 break;
700 case LSQB:
701 com_apply_subscript(c, CHILD(n, 1));
702 break;
703 default:
704 err_setstr(SystemError,
705 "com_apply_trailer: unknown trailer type");
706 c->c_errors++;
707 }
708}
709
710static void
711com_factor(c, n)
712 struct compiling *c;
713 node *n;
714{
715 int i;
716 REQ(n, factor);
717 if (TYPE(CHILD(n, 0)) == PLUS) {
718 com_factor(c, CHILD(n, 1));
719 com_addbyte(c, UNARY_POSITIVE);
720 }
721 else if (TYPE(CHILD(n, 0)) == MINUS) {
722 com_factor(c, CHILD(n, 1));
723 com_addbyte(c, UNARY_NEGATIVE);
724 }
Guido van Rossum7928cd71991-10-24 14:59:31 +0000725 else if (TYPE(CHILD(n, 0)) == TILDE) {
726 com_factor(c, CHILD(n, 1));
727 com_addbyte(c, UNARY_INVERT);
728 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000729 else {
730 com_atom(c, CHILD(n, 0));
731 for (i = 1; i < NCH(n); i++)
732 com_apply_trailer(c, CHILD(n, i));
733 }
734}
735
736static void
737com_term(c, n)
738 struct compiling *c;
739 node *n;
740{
741 int i;
742 int op;
743 REQ(n, term);
744 com_factor(c, CHILD(n, 0));
745 for (i = 2; i < NCH(n); i += 2) {
746 com_factor(c, CHILD(n, i));
747 switch (TYPE(CHILD(n, i-1))) {
748 case STAR:
749 op = BINARY_MULTIPLY;
750 break;
751 case SLASH:
752 op = BINARY_DIVIDE;
753 break;
754 case PERCENT:
755 op = BINARY_MODULO;
756 break;
757 default:
758 err_setstr(SystemError,
Guido van Rossum7928cd71991-10-24 14:59:31 +0000759 "com_term: operator not *, / or %");
760 c->c_errors++;
761 op = 255;
762 }
763 com_addbyte(c, op);
764 }
765}
766
767static void
768com_arith_expr(c, n)
769 struct compiling *c;
770 node *n;
771{
772 int i;
773 int op;
774 REQ(n, arith_expr);
775 com_term(c, CHILD(n, 0));
776 for (i = 2; i < NCH(n); i += 2) {
777 com_term(c, CHILD(n, i));
778 switch (TYPE(CHILD(n, i-1))) {
779 case PLUS:
780 op = BINARY_ADD;
781 break;
782 case MINUS:
783 op = BINARY_SUBTRACT;
784 break;
785 default:
786 err_setstr(SystemError,
787 "com_arith_expr: operator not + or -");
788 c->c_errors++;
789 op = 255;
790 }
791 com_addbyte(c, op);
792 }
793}
794
795static void
796com_shift_expr(c, n)
797 struct compiling *c;
798 node *n;
799{
800 int i;
801 int op;
802 REQ(n, shift_expr);
803 com_arith_expr(c, CHILD(n, 0));
804 for (i = 2; i < NCH(n); i += 2) {
805 com_arith_expr(c, CHILD(n, i));
806 switch (TYPE(CHILD(n, i-1))) {
807 case LEFTSHIFT:
808 op = BINARY_LSHIFT;
809 break;
810 case RIGHTSHIFT:
811 op = BINARY_RSHIFT;
812 break;
813 default:
814 err_setstr(SystemError,
815 "com_shift_expr: operator not << or >>");
816 c->c_errors++;
817 op = 255;
818 }
819 com_addbyte(c, op);
820 }
821}
822
823static void
824com_and_expr(c, n)
825 struct compiling *c;
826 node *n;
827{
828 int i;
829 int op;
830 REQ(n, and_expr);
831 com_shift_expr(c, CHILD(n, 0));
832 for (i = 2; i < NCH(n); i += 2) {
833 com_shift_expr(c, CHILD(n, i));
834 if (TYPE(CHILD(n, i-1)) == AMPER) {
835 op = BINARY_AND;
836 }
837 else {
838 err_setstr(SystemError,
839 "com_and_expr: operator not &");
840 c->c_errors++;
841 op = 255;
842 }
843 com_addbyte(c, op);
844 }
845}
846
847static void
848com_xor_expr(c, n)
849 struct compiling *c;
850 node *n;
851{
852 int i;
853 int op;
854 REQ(n, xor_expr);
855 com_and_expr(c, CHILD(n, 0));
856 for (i = 2; i < NCH(n); i += 2) {
857 com_and_expr(c, CHILD(n, i));
858 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
859 op = BINARY_XOR;
860 }
861 else {
862 err_setstr(SystemError,
863 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000864 c->c_errors++;
865 op = 255;
866 }
867 com_addbyte(c, op);
868 }
869}
870
871static void
872com_expr(c, n)
873 struct compiling *c;
874 node *n;
875{
876 int i;
877 int op;
878 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000879 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000880 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +0000881 com_xor_expr(c, CHILD(n, i));
882 if (TYPE(CHILD(n, i-1)) == VBAR) {
883 op = BINARY_OR;
884 }
885 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000886 err_setstr(SystemError,
Guido van Rossum7928cd71991-10-24 14:59:31 +0000887 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000888 c->c_errors++;
889 op = 255;
890 }
891 com_addbyte(c, op);
892 }
893}
894
895static enum cmp_op
896cmp_type(n)
897 node *n;
898{
899 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +0000900 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000901 | 'in' | 'not' 'in' | 'is' | 'is' not' */
902 if (NCH(n) == 1) {
903 n = CHILD(n, 0);
904 switch (TYPE(n)) {
905 case LESS: return LT;
906 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +0000907 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000908 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +0000909 case LESSEQUAL: return LE;
910 case GREATEREQUAL: return GE;
911 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000912 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
913 if (strcmp(STR(n), "is") == 0) return IS;
914 }
915 }
916 else if (NCH(n) == 2) {
917 int t2 = TYPE(CHILD(n, 1));
918 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000919 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
920 return NOT_IN;
921 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
922 return IS_NOT;
923 }
924 }
925 return BAD;
926}
927
928static void
929com_comparison(c, n)
930 struct compiling *c;
931 node *n;
932{
933 int i;
934 enum cmp_op op;
935 int anchor;
936 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
937 com_expr(c, CHILD(n, 0));
938 if (NCH(n) == 1)
939 return;
940
941 /****************************************************************
942 The following code is generated for all but the last
943 comparison in a chain:
944
945 label: on stack: opcode: jump to:
946
947 a <code to load b>
948 a, b DUP_TOP
949 a, b, b ROT_THREE
950 b, a, b COMPARE_OP
951 b, 0-or-1 JUMP_IF_FALSE L1
952 b, 1 POP_TOP
953 b
954
955 We are now ready to repeat this sequence for the next
956 comparison in the chain.
957
958 For the last we generate:
959
960 b <code to load c>
961 b, c COMPARE_OP
962 0-or-1
963
964 If there were any jumps to L1 (i.e., there was more than one
965 comparison), we generate:
966
967 0-or-1 JUMP_FORWARD L2
968 L1: b, 0 ROT_TWO
969 0, b POP_TOP
970 0
971 L2:
972 ****************************************************************/
973
974 anchor = 0;
975
976 for (i = 2; i < NCH(n); i += 2) {
977 com_expr(c, CHILD(n, i));
978 if (i+2 < NCH(n)) {
979 com_addbyte(c, DUP_TOP);
980 com_addbyte(c, ROT_THREE);
981 }
982 op = cmp_type(CHILD(n, i-1));
983 if (op == BAD) {
984 err_setstr(SystemError,
985 "com_comparison: unknown comparison op");
986 c->c_errors++;
987 }
988 com_addoparg(c, COMPARE_OP, op);
989 if (i+2 < NCH(n)) {
990 com_addfwref(c, JUMP_IF_FALSE, &anchor);
991 com_addbyte(c, POP_TOP);
992 }
993 }
994
995 if (anchor) {
996 int anchor2 = 0;
997 com_addfwref(c, JUMP_FORWARD, &anchor2);
998 com_backpatch(c, anchor);
999 com_addbyte(c, ROT_TWO);
1000 com_addbyte(c, POP_TOP);
1001 com_backpatch(c, anchor2);
1002 }
1003}
1004
1005static void
1006com_not_test(c, n)
1007 struct compiling *c;
1008 node *n;
1009{
1010 REQ(n, not_test); /* 'not' not_test | comparison */
1011 if (NCH(n) == 1) {
1012 com_comparison(c, CHILD(n, 0));
1013 }
1014 else {
1015 com_not_test(c, CHILD(n, 1));
1016 com_addbyte(c, UNARY_NOT);
1017 }
1018}
1019
1020static void
1021com_and_test(c, n)
1022 struct compiling *c;
1023 node *n;
1024{
1025 int i;
1026 int anchor;
1027 REQ(n, and_test); /* not_test ('and' not_test)* */
1028 anchor = 0;
1029 i = 0;
1030 for (;;) {
1031 com_not_test(c, CHILD(n, i));
1032 if ((i += 2) >= NCH(n))
1033 break;
1034 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1035 com_addbyte(c, POP_TOP);
1036 }
1037 if (anchor)
1038 com_backpatch(c, anchor);
1039}
1040
1041static void
1042com_test(c, n)
1043 struct compiling *c;
1044 node *n;
1045{
1046 int i;
1047 int anchor;
1048 REQ(n, test); /* and_test ('and' and_test)* */
1049 anchor = 0;
1050 i = 0;
1051 for (;;) {
1052 com_and_test(c, CHILD(n, i));
1053 if ((i += 2) >= NCH(n))
1054 break;
1055 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1056 com_addbyte(c, POP_TOP);
1057 }
1058 if (anchor)
1059 com_backpatch(c, anchor);
1060}
1061
1062static void
Guido van Rossum288a60f1991-12-16 13:05:10 +00001063com_list(c, n, toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001064 struct compiling *c;
1065 node *n;
Guido van Rossum288a60f1991-12-16 13:05:10 +00001066 int toplevel; /* If nonzero, *always* build a tuple */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001067{
1068 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001069 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001070 com_node(c, CHILD(n, 0));
1071 }
1072 else {
1073 int i;
1074 int len;
1075 len = (NCH(n) + 1) / 2;
1076 for (i = 0; i < NCH(n); i += 2)
1077 com_node(c, CHILD(n, i));
1078 com_addoparg(c, BUILD_TUPLE, len);
1079 }
1080}
1081
1082
1083/* Begin of assignment compilation */
1084
1085static void com_assign_name PROTO((struct compiling *, node *, int));
1086static void com_assign PROTO((struct compiling *, node *, int));
1087
1088static void
1089com_assign_attr(c, n, assigning)
1090 struct compiling *c;
1091 node *n;
1092 int assigning;
1093{
1094 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
1095}
1096
1097static void
1098com_assign_slice(c, n, assigning)
1099 struct compiling *c;
1100 node *n;
1101 int assigning;
1102{
1103 com_slice(c, n, assigning ? STORE_SLICE : DELETE_SLICE);
1104}
1105
1106static void
1107com_assign_subscript(c, n, assigning)
1108 struct compiling *c;
1109 node *n;
1110 int assigning;
1111{
1112 com_node(c, n);
1113 com_addbyte(c, assigning ? STORE_SUBSCR : DELETE_SUBSCR);
1114}
1115
1116static void
1117com_assign_trailer(c, n, assigning)
1118 struct compiling *c;
1119 node *n;
1120 int assigning;
1121{
1122 char *name;
1123 REQ(n, trailer);
1124 switch (TYPE(CHILD(n, 0))) {
1125 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001126 err_setstr(SyntaxError, "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001127 c->c_errors++;
1128 break;
1129 case DOT: /* '.' NAME */
1130 com_assign_attr(c, CHILD(n, 1), assigning);
1131 break;
1132 case LSQB: /* '[' subscript ']' */
1133 n = CHILD(n, 1);
1134 REQ(n, subscript); /* subscript: expr | [expr] ':' [expr] */
1135 if (NCH(n) > 1 || TYPE(CHILD(n, 0)) == COLON)
1136 com_assign_slice(c, n, assigning);
1137 else
1138 com_assign_subscript(c, CHILD(n, 0), assigning);
1139 break;
1140 default:
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001141 err_setstr(SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001142 c->c_errors++;
1143 }
1144}
1145
1146static void
1147com_assign_tuple(c, n, assigning)
1148 struct compiling *c;
1149 node *n;
1150 int assigning;
1151{
1152 int i;
1153 if (TYPE(n) != testlist)
1154 REQ(n, exprlist);
1155 if (assigning)
1156 com_addoparg(c, UNPACK_TUPLE, (NCH(n)+1)/2);
1157 for (i = 0; i < NCH(n); i += 2)
1158 com_assign(c, CHILD(n, i), assigning);
1159}
1160
1161static void
1162com_assign_list(c, n, assigning)
1163 struct compiling *c;
1164 node *n;
1165 int assigning;
1166{
1167 int i;
1168 if (assigning)
1169 com_addoparg(c, UNPACK_LIST, (NCH(n)+1)/2);
1170 for (i = 0; i < NCH(n); i += 2)
1171 com_assign(c, CHILD(n, i), assigning);
1172}
1173
1174static void
1175com_assign_name(c, n, assigning)
1176 struct compiling *c;
1177 node *n;
1178 int assigning;
1179{
1180 REQ(n, NAME);
1181 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
1182}
1183
1184static void
1185com_assign(c, n, assigning)
1186 struct compiling *c;
1187 node *n;
1188 int assigning;
1189{
1190 /* Loop to avoid trivial recursion */
1191 for (;;) {
1192 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001193
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001194 case exprlist:
1195 case testlist:
1196 if (NCH(n) > 1) {
1197 com_assign_tuple(c, n, assigning);
1198 return;
1199 }
1200 n = CHILD(n, 0);
1201 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001202
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001203 case test:
1204 case and_test:
1205 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001206 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001207 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001208 case xor_expr:
1209 case and_expr:
1210 case shift_expr:
1211 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001212 case term:
1213 if (NCH(n) > 1) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001214 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001215 "can't assign to operator");
1216 c->c_errors++;
1217 return;
1218 }
1219 n = CHILD(n, 0);
1220 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001221
Guido van Rossum7928cd71991-10-24 14:59:31 +00001222 case factor: /* ('+'|'-'|'~') factor | atom trailer* */
1223 if (TYPE(CHILD(n, 0)) != atom) { /* '+'|'-'|'~' */
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001224 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001225 "can't assign to operator");
1226 c->c_errors++;
1227 return;
1228 }
1229 if (NCH(n) > 1) { /* trailer present */
1230 int i;
1231 com_node(c, CHILD(n, 0));
1232 for (i = 1; i+1 < NCH(n); i++) {
1233 com_apply_trailer(c, CHILD(n, i));
1234 } /* NB i is still alive */
1235 com_assign_trailer(c,
1236 CHILD(n, i), assigning);
1237 return;
1238 }
1239 n = CHILD(n, 0);
1240 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001241
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001242 case atom:
1243 switch (TYPE(CHILD(n, 0))) {
1244 case LPAR:
1245 n = CHILD(n, 1);
1246 if (TYPE(n) == RPAR) {
1247 /* XXX Should allow () = () ??? */
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001248 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001249 "can't assign to ()");
1250 c->c_errors++;
1251 return;
1252 }
1253 break;
1254 case LSQB:
1255 n = CHILD(n, 1);
1256 if (TYPE(n) == RSQB) {
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 com_assign_list(c, n, assigning);
1263 return;
1264 case NAME:
1265 com_assign_name(c, CHILD(n, 0), assigning);
1266 return;
1267 default:
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001268 err_setstr(SyntaxError,
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001269 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001270 c->c_errors++;
1271 return;
1272 }
1273 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001274
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001275 default:
1276 fprintf(stderr, "node type %d\n", TYPE(n));
1277 err_setstr(SystemError, "com_assign: bad node");
1278 c->c_errors++;
1279 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001280
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001281 }
1282 }
1283}
1284
1285static void
1286com_expr_stmt(c, n)
1287 struct compiling *c;
1288 node *n;
1289{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001290 REQ(n, expr_stmt); /* exprlist ('=' exprlist)* */
1291 com_node(c, CHILD(n, NCH(n)-1));
1292 if (NCH(n) == 1) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001293 com_addbyte(c, PRINT_EXPR);
1294 }
1295 else {
1296 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001297 for (i = 0; i < NCH(n)-2; i+=2) {
1298 if (i+2 < NCH(n)-2)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001299 com_addbyte(c, DUP_TOP);
1300 com_assign(c, CHILD(n, i), 1/*assign*/);
1301 }
1302 }
1303}
1304
1305static void
1306com_print_stmt(c, n)
1307 struct compiling *c;
1308 node *n;
1309{
1310 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001311 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
1312 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001313 com_node(c, CHILD(n, i));
1314 com_addbyte(c, PRINT_ITEM);
1315 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001316 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001317 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001318 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001319}
1320
1321static void
1322com_return_stmt(c, n)
1323 struct compiling *c;
1324 node *n;
1325{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001326 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001327 if (!c->c_infunction) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001328 err_setstr(SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001329 c->c_errors++;
1330 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001331 if (NCH(n) < 2)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001332 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1333 else
1334 com_node(c, CHILD(n, 1));
1335 com_addbyte(c, RETURN_VALUE);
1336}
1337
1338static void
1339com_raise_stmt(c, n)
1340 struct compiling *c;
1341 node *n;
1342{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001343 REQ(n, raise_stmt); /* 'raise' test [',' test] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001344 com_node(c, CHILD(n, 1));
1345 if (NCH(n) > 3)
1346 com_node(c, CHILD(n, 3));
1347 else
1348 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1349 com_addbyte(c, RAISE_EXCEPTION);
1350}
1351
1352static void
1353com_import_stmt(c, n)
1354 struct compiling *c;
1355 node *n;
1356{
1357 int i;
1358 REQ(n, import_stmt);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001359 /* 'import' NAME (',' NAME)* |
1360 'from' NAME 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001361 if (STR(CHILD(n, 0))[0] == 'f') {
1362 /* 'from' NAME 'import' ... */
1363 REQ(CHILD(n, 1), NAME);
1364 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
1365 for (i = 3; i < NCH(n); i += 2)
1366 com_addopname(c, IMPORT_FROM, CHILD(n, i));
1367 com_addbyte(c, POP_TOP);
1368 }
1369 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001370 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001371 for (i = 1; i < NCH(n); i += 2) {
1372 com_addopname(c, IMPORT_NAME, CHILD(n, i));
1373 com_addopname(c, STORE_NAME, CHILD(n, i));
1374 }
1375 }
1376}
1377
1378static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00001379com_global_stmt(c, n)
1380 struct compiling *c;
1381 node *n;
1382{
1383 int i;
1384 object *v;
1385 REQ(n, global_stmt);
1386 /* 'global' NAME (',' NAME)* */
1387 for (i = 1; i < NCH(n); i += 2) {
1388 if (dictinsert(c->c_globals, STR(CHILD(n, i)), None) != 0)
1389 c->c_errors++;
1390 }
1391}
1392
1393static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001394com_if_stmt(c, n)
1395 struct compiling *c;
1396 node *n;
1397{
1398 int i;
1399 int anchor = 0;
1400 REQ(n, if_stmt);
1401 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
1402 for (i = 0; i+3 < NCH(n); i+=4) {
1403 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001404 node *ch = CHILD(n, i+1);
1405 if (i > 0)
1406 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001407 com_node(c, CHILD(n, i+1));
1408 com_addfwref(c, JUMP_IF_FALSE, &a);
1409 com_addbyte(c, POP_TOP);
1410 com_node(c, CHILD(n, i+3));
1411 com_addfwref(c, JUMP_FORWARD, &anchor);
1412 com_backpatch(c, a);
1413 com_addbyte(c, POP_TOP);
1414 }
1415 if (i+2 < NCH(n))
1416 com_node(c, CHILD(n, i+2));
1417 com_backpatch(c, anchor);
1418}
1419
1420static void
1421com_while_stmt(c, n)
1422 struct compiling *c;
1423 node *n;
1424{
1425 int break_anchor = 0;
1426 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001427 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001428 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
1429 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001430 block_push(c, SETUP_LOOP);
1431 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001432 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001433 com_node(c, CHILD(n, 1));
1434 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1435 com_addbyte(c, POP_TOP);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001436 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001437 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001438 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001439 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1440 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001441 com_backpatch(c, anchor);
1442 com_addbyte(c, POP_TOP);
1443 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001444 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001445 if (NCH(n) > 4)
1446 com_node(c, CHILD(n, 6));
1447 com_backpatch(c, break_anchor);
1448}
1449
1450static void
1451com_for_stmt(c, n)
1452 struct compiling *c;
1453 node *n;
1454{
1455 object *v;
1456 int break_anchor = 0;
1457 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001458 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001459 REQ(n, for_stmt);
1460 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
1461 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001462 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001463 com_node(c, CHILD(n, 3));
1464 v = newintobject(0L);
1465 if (v == NULL)
1466 c->c_errors++;
1467 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
1468 XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001469 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001470 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001471 com_addfwref(c, FOR_LOOP, &anchor);
1472 com_assign(c, CHILD(n, 1), 1/*assigning*/);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001473 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001474 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001475 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001476 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1477 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001478 com_backpatch(c, anchor);
1479 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001480 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001481 if (NCH(n) > 8)
1482 com_node(c, CHILD(n, 8));
1483 com_backpatch(c, break_anchor);
1484}
1485
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001486/* Although 'execpt' and 'finally' clauses can be combined
1487 syntactically, they are compiled separately. In fact,
1488 try: S
1489 except E1: S1
1490 except E2: S2
1491 ...
1492 finally: Sf
1493 is equivalent to
1494 try:
1495 try: S
1496 except E1: S1
1497 except E2: S2
1498 ...
1499 finally: Sf
1500 meaning that the 'finally' clause is entered even if things
1501 go wrong again in an exception handler. Note that this is
1502 not the case for exception handlers: at most one is entered.
1503
1504 Code generated for "try: S finally: Sf" is as follows:
1505
1506 SETUP_FINALLY L
1507 <code for S>
1508 POP_BLOCK
1509 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001510 L: <code for Sf>
1511 END_FINALLY
1512
1513 The special instructions use the block stack. Each block
1514 stack entry contains the instruction that created it (here
1515 SETUP_FINALLY), the level of the value stack at the time the
1516 block stack entry was created, and a label (here L).
1517
1518 SETUP_FINALLY:
1519 Pushes the current value stack level and the label
1520 onto the block stack.
1521 POP_BLOCK:
1522 Pops en entry from the block stack, and pops the value
1523 stack until its level is the same as indicated on the
1524 block stack. (The label is ignored.)
1525 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001526 Pops a variable number of entries from the *value* stack
1527 and re-raises the exception they specify. The number of
1528 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001529
1530 The block stack is unwound when an exception is raised:
1531 when a SETUP_FINALLY entry is found, the exception is pushed
1532 onto the value stack (and the exception condition is cleared),
1533 and the interpreter jumps to the label gotten from the block
1534 stack.
1535
1536 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00001537 (The contents of the value stack is shown in [], with the top
1538 at the right; 'tb' is trace-back info, 'val' the exception's
1539 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001540
1541 Value stack Label Instruction Argument
1542 [] SETUP_EXCEPT L1
1543 [] <code for S>
1544 [] POP_BLOCK
1545 [] JUMP_FORWARD L0
1546
Guido van Rossum3f5da241990-12-20 15:06:42 +00001547 [tb, val, exc] L1: DUP )
1548 [tb, val, exc, exc] <evaluate E1> )
1549 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
1550 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
1551 [tb, val, exc, 1] POP )
1552 [tb, val, exc] POP
1553 [tb, val] <assign to V1> (or POP if no V1)
1554 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001555 [] <code for S1>
1556 JUMP_FORWARD L0
1557
Guido van Rossum3f5da241990-12-20 15:06:42 +00001558 [tb, val, exc, 0] L2: POP
1559 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001560 .............................etc.......................
1561
Guido van Rossum3f5da241990-12-20 15:06:42 +00001562 [tb, val, exc, 0] Ln+1: POP
1563 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001564
1565 [] L0: <next statement>
1566
1567 Of course, parts are not generated if Vi or Ei is not present.
1568*/
1569
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001570static void
1571com_try_stmt(c, n)
1572 struct compiling *c;
1573 node *n;
1574{
1575 int finally_anchor = 0;
1576 int except_anchor = 0;
1577 REQ(n, try_stmt);
1578 /* 'try' ':' suite (except_clause ':' suite)* ['finally' ':' suite] */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001579
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001580 if (NCH(n) > 3 && TYPE(CHILD(n, NCH(n)-3)) != except_clause) {
1581 /* Have a 'finally' clause */
1582 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001583 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001584 }
1585 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == except_clause) {
1586 /* Have an 'except' clause */
1587 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001588 block_push(c, SETUP_EXCEPT);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001589 }
1590 com_node(c, CHILD(n, 2));
1591 if (except_anchor) {
1592 int end_anchor = 0;
1593 int i;
1594 node *ch;
1595 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001596 block_pop(c, SETUP_EXCEPT);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001597 com_addfwref(c, JUMP_FORWARD, &end_anchor);
1598 com_backpatch(c, except_anchor);
1599 for (i = 3;
1600 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
1601 i += 3) {
1602 /* except_clause: 'except' [expr [',' expr]] */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001603 if (except_anchor == 0) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001604 err_setstr(SyntaxError,
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001605 "default 'except:' must be last");
1606 c->c_errors++;
1607 break;
1608 }
1609 except_anchor = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001610 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001611 if (NCH(ch) > 1) {
1612 com_addbyte(c, DUP_TOP);
1613 com_node(c, CHILD(ch, 1));
1614 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001615 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001616 com_addbyte(c, POP_TOP);
1617 }
1618 com_addbyte(c, POP_TOP);
1619 if (NCH(ch) > 3)
1620 com_assign(c, CHILD(ch, 3), 1/*assigning*/);
1621 else
1622 com_addbyte(c, POP_TOP);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001623 com_addbyte(c, POP_TOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001624 com_node(c, CHILD(n, i+2));
1625 com_addfwref(c, JUMP_FORWARD, &end_anchor);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001626 if (except_anchor) {
1627 com_backpatch(c, except_anchor);
1628 com_addbyte(c, POP_TOP);
1629 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001630 }
1631 com_addbyte(c, END_FINALLY);
1632 com_backpatch(c, end_anchor);
1633 }
1634 if (finally_anchor) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001635 node *ch;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001636 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001637 block_pop(c, SETUP_FINALLY);
1638 block_push(c, END_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001639 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001640 com_backpatch(c, finally_anchor);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001641 ch = CHILD(n, NCH(n)-1);
1642 com_addoparg(c, SET_LINENO, ch->n_lineno);
1643 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001644 com_addbyte(c, END_FINALLY);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001645 block_pop(c, END_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001646 }
1647}
1648
1649static void
1650com_suite(c, n)
1651 struct compiling *c;
1652 node *n;
1653{
1654 REQ(n, suite);
1655 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
1656 if (NCH(n) == 1) {
1657 com_node(c, CHILD(n, 0));
1658 }
1659 else {
1660 int i;
1661 for (i = 0; i < NCH(n); i++) {
1662 node *ch = CHILD(n, i);
1663 if (TYPE(ch) == stmt)
1664 com_node(c, ch);
1665 }
1666 }
1667}
1668
1669static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001670com_continue_stmt(c, n)
1671 struct compiling *c;
1672 node *n;
1673{
1674 int i = c->c_nblocks;
1675 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
1676 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1677 }
1678 else {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001679 err_setstr(SyntaxError, "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001680 c->c_errors++;
1681 }
1682 /* XXX Could allow it inside a 'finally' clause
1683 XXX if we could pop the exception still on the stack */
1684}
1685
1686static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001687com_funcdef(c, n)
1688 struct compiling *c;
1689 node *n;
1690{
1691 object *v;
1692 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001693 v = (object *)compile(n, c->c_filename);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001694 if (v == NULL)
1695 c->c_errors++;
1696 else {
1697 int i = com_addconst(c, v);
1698 com_addoparg(c, LOAD_CONST, i);
1699 com_addbyte(c, BUILD_FUNCTION);
1700 com_addopname(c, STORE_NAME, CHILD(n, 1));
1701 DECREF(v);
1702 }
1703}
1704
1705static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00001706com_oldbases(c, n)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001707 struct compiling *c;
1708 node *n;
1709{
1710 int i, nbases;
1711 REQ(n, baselist);
1712 /*
1713 baselist: atom arguments (',' atom arguments)*
Guido van Rossumc5e96291991-12-10 13:53:51 +00001714 arguments: '(' ')'
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001715 */
1716 for (i = 0; i < NCH(n); i += 3)
1717 com_node(c, CHILD(n, i));
1718 com_addoparg(c, BUILD_TUPLE, (NCH(n)+1) / 3);
1719}
1720
1721static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00001722com_newbases(c, n)
1723 struct compiling *c;
1724 node *n;
1725{
1726 int i, nbases;
1727 REQ(n, testlist);
1728 /* testlist: test (',' test)* [','] */
1729 for (i = 0; i < NCH(n); i += 2)
1730 com_node(c, CHILD(n, i));
1731 com_addoparg(c, BUILD_TUPLE, (NCH(n)+1) / 2);
1732}
1733
1734static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001735com_classdef(c, n)
1736 struct compiling *c;
1737 node *n;
1738{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001739 object *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001740 REQ(n, classdef);
1741 /*
Guido van Rossumc5e96291991-12-10 13:53:51 +00001742 classdef: 'class' NAME
1743 ['(' testlist ')' |'(' ')' ['=' baselist]] ':' suite
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001744 baselist: atom arguments (',' atom arguments)*
Guido van Rossumc5e96291991-12-10 13:53:51 +00001745 arguments: '(' ')'
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001746 */
Guido van Rossumc5e96291991-12-10 13:53:51 +00001747 /* This piece of code must push a tuple on the stack (the bases) */
1748 if (TYPE(CHILD(n, 2)) != LPAR) {
1749 /* New syntax without base classes:
1750 class NAME ':' suite
1751 ___________^
1752 */
1753 com_addoparg(c, BUILD_TUPLE, 0);
1754 }
1755 else {
1756 if (TYPE(CHILD(n, 3)) == RPAR) {
1757 /* Old syntax with or without base classes:
1758 class NAME '(' ')' ['=' baselist] ':' suite
1759 _______________^....^...^
1760 */
1761 if (TYPE(CHILD(n, 4)) == EQUAL)
1762 com_oldbases(c, CHILD(n, 5));
1763 else
1764 com_addoparg(c, BUILD_TUPLE, 0);
1765 }
1766 else {
1767 /* New syntax with base classes:
1768 class NAME '(' testlist ')' ':' suite
1769 _______________^
1770 */
1771 com_newbases(c, CHILD(n, 3));
1772 }
1773 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001774 v = (object *)compile(n, c->c_filename);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001775 if (v == NULL)
1776 c->c_errors++;
1777 else {
1778 int i = com_addconst(c, v);
1779 com_addoparg(c, LOAD_CONST, i);
1780 com_addbyte(c, BUILD_FUNCTION);
1781 com_addbyte(c, UNARY_CALL);
1782 com_addbyte(c, BUILD_CLASS);
1783 com_addopname(c, STORE_NAME, CHILD(n, 1));
1784 DECREF(v);
1785 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001786}
1787
1788static void
1789com_node(c, n)
1790 struct compiling *c;
1791 node *n;
1792{
1793 switch (TYPE(n)) {
1794
1795 /* Definition nodes */
1796
1797 case funcdef:
1798 com_funcdef(c, n);
1799 break;
1800 case classdef:
1801 com_classdef(c, n);
1802 break;
1803
1804 /* Trivial parse tree nodes */
1805
1806 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001807 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001808 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001809 com_node(c, CHILD(n, 0));
1810 break;
1811
1812 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001813 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
1814 com_addoparg(c, SET_LINENO, n->n_lineno);
1815 {
1816 int i;
1817 for (i = 0; i < NCH(n)-1; i += 2)
1818 com_node(c, CHILD(n, i));
1819 }
1820 break;
1821
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001822 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001823 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001824 com_node(c, CHILD(n, 0));
1825 break;
1826
1827 /* Statement nodes */
1828
1829 case expr_stmt:
1830 com_expr_stmt(c, n);
1831 break;
1832 case print_stmt:
1833 com_print_stmt(c, n);
1834 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001835 case del_stmt: /* 'del' exprlist */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001836 com_assign(c, CHILD(n, 1), 0/*delete*/);
1837 break;
1838 case pass_stmt:
1839 break;
1840 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001841 if (c->c_loops == 0) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001842 err_setstr(SyntaxError, "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001843 c->c_errors++;
1844 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001845 com_addbyte(c, BREAK_LOOP);
1846 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001847 case continue_stmt:
1848 com_continue_stmt(c, n);
1849 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001850 case return_stmt:
1851 com_return_stmt(c, n);
1852 break;
1853 case raise_stmt:
1854 com_raise_stmt(c, n);
1855 break;
1856 case import_stmt:
1857 com_import_stmt(c, n);
1858 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001859 case global_stmt:
1860 com_global_stmt(c, n);
1861 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001862 case if_stmt:
1863 com_if_stmt(c, n);
1864 break;
1865 case while_stmt:
1866 com_while_stmt(c, n);
1867 break;
1868 case for_stmt:
1869 com_for_stmt(c, n);
1870 break;
1871 case try_stmt:
1872 com_try_stmt(c, n);
1873 break;
1874 case suite:
1875 com_suite(c, n);
1876 break;
1877
1878 /* Expression nodes */
1879
1880 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00001881 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001882 break;
1883 case test:
1884 com_test(c, n);
1885 break;
1886 case and_test:
1887 com_and_test(c, n);
1888 break;
1889 case not_test:
1890 com_not_test(c, n);
1891 break;
1892 case comparison:
1893 com_comparison(c, n);
1894 break;
1895 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00001896 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001897 break;
1898 case expr:
1899 com_expr(c, n);
1900 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001901 case xor_expr:
1902 com_xor_expr(c, n);
1903 break;
1904 case and_expr:
1905 com_and_expr(c, n);
1906 break;
1907 case shift_expr:
1908 com_shift_expr(c, n);
1909 break;
1910 case arith_expr:
1911 com_arith_expr(c, n);
1912 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001913 case term:
1914 com_term(c, n);
1915 break;
1916 case factor:
1917 com_factor(c, n);
1918 break;
1919 case atom:
1920 com_atom(c, n);
1921 break;
1922
1923 default:
1924 fprintf(stderr, "node type %d\n", TYPE(n));
1925 err_setstr(SystemError, "com_node: unexpected node type");
1926 c->c_errors++;
1927 }
1928}
1929
1930static void com_fplist PROTO((struct compiling *, node *));
1931
1932static void
1933com_fpdef(c, n)
1934 struct compiling *c;
1935 node *n;
1936{
1937 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
1938 if (TYPE(CHILD(n, 0)) == LPAR)
1939 com_fplist(c, CHILD(n, 1));
1940 else
1941 com_addopname(c, STORE_NAME, CHILD(n, 0));
1942}
1943
1944static void
1945com_fplist(c, n)
1946 struct compiling *c;
1947 node *n;
1948{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001949 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001950 if (NCH(n) == 1) {
1951 com_fpdef(c, CHILD(n, 0));
1952 }
1953 else {
1954 int i;
1955 com_addoparg(c, UNPACK_TUPLE, (NCH(n)+1)/2);
1956 for (i = 0; i < NCH(n); i += 2)
1957 com_fpdef(c, CHILD(n, i));
1958 }
1959}
1960
1961static void
Guido van Rossum49d6dc41992-01-14 18:30:26 +00001962com_arglist(c, n)
1963 struct compiling *c;
1964 node *n;
1965{
1966 int i, nargs, op;
1967 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001968 /* varargslist:
1969 (fpdef ',')* ('+'|'*') NAME | fpdef (',' fpdef)* [','] */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00001970 op = UNPACK_ARG;
1971 nargs = (NCH(n) + 1) / 2;
1972 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumacbefef1992-01-19 16:33:51 +00001973 int t = TYPE(CHILD(n, i));
1974 if (t == PLUS || t == STAR) {
Guido van Rossum49d6dc41992-01-14 18:30:26 +00001975 op = UNPACK_VARARG;
1976 nargs = i/2;
1977 break;
1978 }
1979 }
1980 com_addoparg(c, op, nargs);
1981 for (i = 0; i < 2*nargs; i += 2)
1982 com_fpdef(c, CHILD(n, i));
1983 if (op == UNPACK_VARARG)
1984 com_addopname(c, STORE_NAME, CHILD(n, 2*nargs+1));
1985}
1986
1987static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001988com_file_input(c, n)
1989 struct compiling *c;
1990 node *n;
1991{
1992 int i;
1993 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
1994 for (i = 0; i < NCH(n); i++) {
1995 node *ch = CHILD(n, i);
1996 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
1997 com_node(c, ch);
1998 }
1999}
2000
2001/* Top-level compile-node interface */
2002
2003static void
2004compile_funcdef(c, n)
2005 struct compiling *c;
2006 node *n;
2007{
2008 node *ch;
2009 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002010 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
2011 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002012 if (TYPE(ch) == RPAR)
Guido van Rossum288a60f1991-12-16 13:05:10 +00002013 com_addoparg(c, UNPACK_ARG, 0);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002014 else
2015 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002016 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002017 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002018 c->c_infunction = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002019 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2020 com_addbyte(c, RETURN_VALUE);
2021}
2022
2023static void
2024compile_node(c, n)
2025 struct compiling *c;
2026 node *n;
2027{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002028 com_addoparg(c, SET_LINENO, n->n_lineno);
2029
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002030 switch (TYPE(n)) {
2031
Guido van Rossum4c417781991-01-21 16:09:22 +00002032 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002033 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
2034 n = CHILD(n, 0);
2035 if (TYPE(n) != NEWLINE)
2036 com_node(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002037 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2038 com_addbyte(c, RETURN_VALUE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002039 break;
2040
Guido van Rossum4c417781991-01-21 16:09:22 +00002041 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002042 com_file_input(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002043 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2044 com_addbyte(c, RETURN_VALUE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002045 break;
2046
Guido van Rossum4c417781991-01-21 16:09:22 +00002047 case expr_input: /* Built-in function eval() */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002048 com_node(c, CHILD(n, 0));
2049 com_addbyte(c, RETURN_VALUE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002050 break;
2051
Guido van Rossum4c417781991-01-21 16:09:22 +00002052 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00002053 com_node(c, CHILD(n, 0));
2054 com_addbyte(c, RETURN_VALUE);
2055 break;
2056
2057 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002058 compile_funcdef(c, n);
2059 break;
2060
Guido van Rossum4c417781991-01-21 16:09:22 +00002061 case classdef: /* A class definition */
Guido van Rossumc5e96291991-12-10 13:53:51 +00002062 /* classdef: 'class' NAME
2063 ['(' testlist ')' |'(' ')' ['=' baselist]]
2064 ':' suite */
Guido van Rossumc5e96291991-12-10 13:53:51 +00002065 com_node(c, CHILD(n, NCH(n)-1)); /* The suite */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002066 com_addbyte(c, LOAD_LOCALS);
2067 com_addbyte(c, RETURN_VALUE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002068 break;
2069
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002070 default:
2071 fprintf(stderr, "node type %d\n", TYPE(n));
2072 err_setstr(SystemError, "compile_node: unexpected node type");
2073 c->c_errors++;
2074 }
2075}
2076
Guido van Rossum282914b1991-04-04 10:42:56 +00002077/* Optimization for local and global variables.
2078
2079 Attempt to replace all LOAD_NAME instructions that refer to a local
2080 variable with LOAD_LOCAL instructions, and all that refer to a global
2081 variable with LOAD_GLOBAL instructions.
2082
2083 To find all local variables, we check all STORE_NAME and IMPORT_FROM
2084 instructions. This yields all local variables, including arguments,
2085 function definitions, class definitions and import statements.
2086
2087 There is one leak: 'from foo import *' introduces local variables
2088 that we can't know while compiling. If this is the case, LOAD_GLOBAL
2089 instructions are not generated -- LOAD_NAME is left in place for
2090 globals, since it first checks for globals (LOAD_LOCAL is still used
2091 for recognized locals, since it doesn't hurt).
2092
2093 This optimization means that using the same name as a global and
2094 as a local variable within the same scope is now illegal, which
2095 is a change to the language! Also using eval() to introduce new
2096 local variables won't work. But both were bad practice at best.
2097
2098 The optimization doesn't save much: basically, it saves one
2099 unsuccessful dictionary lookup per global (or built-in) variable
2100 reference. On the (slow!) Mac Plus, with 4 local variables,
2101 this saving was measured to be about 0.18 ms. We might save more
2102 by using a different data structure to hold local variables, like
2103 an array indexed by variable number.
2104
2105 NB: this modifies the string object co->co_code!
2106*/
2107
2108static void
2109optimizer(co)
2110 codeobject *co;
2111{
Guido van Rossum0a697f61991-04-16 08:39:12 +00002112 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00002113 object *locals;
2114 int opcode;
2115 int oparg;
2116 object *name;
2117 int star_used;
Guido van Rossum0a697f61991-04-16 08:39:12 +00002118
Guido van Rossum282914b1991-04-04 10:42:56 +00002119#define NEXTOP() (*next_instr++)
2120#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
2121#define GETITEM(v, i) (getlistitem((v), (i)))
2122#define GETNAMEOBJ(i) (GETITEM(co->co_names, (i)))
2123
2124 locals = newdictobject();
2125 if (locals == NULL) {
2126 err_clear();
2127 return; /* For now, this is OK */
2128 }
2129
Guido van Rossum0a697f61991-04-16 08:39:12 +00002130 next_instr = (unsigned char *) GETSTRINGVALUE(co->co_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00002131 for (;;) {
2132 opcode = NEXTOP();
2133 if (opcode == STOP_CODE)
2134 break;
2135 if (HAS_ARG(opcode))
2136 oparg = NEXTARG();
2137 if (opcode == STORE_NAME || opcode == IMPORT_FROM) {
2138 name = GETNAMEOBJ(oparg);
2139 if (dict2insert(locals, name, None) != 0) {
2140 DECREF(locals);
2141 return; /* Sorry */
2142 }
2143 }
2144 }
2145
2146 star_used = (dictlookup(locals, "*") != NULL);
Guido van Rossum0a697f61991-04-16 08:39:12 +00002147 next_instr = (unsigned char *) GETSTRINGVALUE(co->co_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00002148 for (;;) {
2149 cur_instr = next_instr;
2150 opcode = NEXTOP();
2151 if (opcode == STOP_CODE)
2152 break;
2153 if (HAS_ARG(opcode))
2154 oparg = NEXTARG();
2155 if (opcode == LOAD_NAME) {
2156 name = GETNAMEOBJ(oparg);
Guido van Rossum83163251991-08-16 08:58:43 +00002157 if (dict2lookup(locals, name) != NULL)
Guido van Rossum282914b1991-04-04 10:42:56 +00002158 *cur_instr = LOAD_LOCAL;
Guido van Rossum83163251991-08-16 08:58:43 +00002159 else {
2160 err_clear();
2161 if (!star_used)
2162 *cur_instr = LOAD_GLOBAL;
2163 }
Guido van Rossum282914b1991-04-04 10:42:56 +00002164 }
2165 }
2166
2167 DECREF(locals);
2168}
2169
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002170codeobject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002171compile(n, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002172 node *n;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002173 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002174{
2175 struct compiling sc;
2176 codeobject *co;
Guido van Rossuma082ce41991-06-04 19:41:56 +00002177 object *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002178 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002179 return NULL;
2180 compile_node(&sc, n);
2181 com_done(&sc);
Guido van Rossuma082ce41991-06-04 19:41:56 +00002182 if (sc.c_errors == 0 && (v = newstringobject(filename)) != NULL) {
2183 co = newcodeobject(sc.c_code, sc.c_consts, sc.c_names, v);
2184 DECREF(v);
2185 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002186 else
2187 co = NULL;
2188 com_free(&sc);
Guido van Rossumfb8edfc1991-05-14 11:56:03 +00002189 if (co != NULL && filename[0] != '<')
Guido van Rossum282914b1991-04-04 10:42:56 +00002190 optimizer(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002191 return co;
2192}