blob: 532e498fce13bc320e888543e2c539c1c6dfdc93 [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) {
159 err_setstr(TypeError, "too many statically nested blocks");
160 c->c_errors++;
161 }
162 else {
163 c->c_block[c->c_nblocks++] = type;
164 }
165}
166
167static void
168block_pop(c, type)
169 struct compiling *c;
170 int type;
171{
172 if (c->c_nblocks > 0)
173 c->c_nblocks--;
174 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
175 err_setstr(SystemError, "bad block pop");
176 c->c_errors++;
177 }
178}
179
180
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000181/* Prototypes */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000182
Guido van Rossum3f5da241990-12-20 15:06:42 +0000183static int com_init PROTO((struct compiling *, char *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000184static void com_free PROTO((struct compiling *));
185static void com_done PROTO((struct compiling *));
186static void com_node PROTO((struct compiling *, struct _node *));
187static void com_addbyte PROTO((struct compiling *, int));
188static void com_addint PROTO((struct compiling *, int));
189static void com_addoparg PROTO((struct compiling *, int, int));
190static void com_addfwref PROTO((struct compiling *, int, int *));
191static void com_backpatch PROTO((struct compiling *, int));
192static int com_add PROTO((struct compiling *, object *, object *));
193static int com_addconst PROTO((struct compiling *, object *));
194static int com_addname PROTO((struct compiling *, object *));
195static void com_addopname PROTO((struct compiling *, int, node *));
Guido van Rossum288a60f1991-12-16 13:05:10 +0000196static void com_list PROTO((struct compiling *, node *, int));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000197
198static int
Guido van Rossum3f5da241990-12-20 15:06:42 +0000199com_init(c, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000200 struct compiling *c;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000201 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000202{
Guido van Rossum62d46241991-04-03 19:00:23 +0000203 if ((c->c_code = newsizedstringobject((char *)NULL, 1000)) == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000204 goto fail_3;
205 if ((c->c_consts = newlistobject(0)) == NULL)
206 goto fail_2;
207 if ((c->c_names = newlistobject(0)) == NULL)
208 goto fail_1;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000209 if ((c->c_globals = newdictobject()) == NULL)
210 goto fail_0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000211 c->c_nexti = 0;
212 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000213 c->c_infunction = 0;
214 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000215 c->c_begin = 0;
216 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000217 c->c_filename = filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000218 return 1;
219
Guido van Rossumc5e96291991-12-10 13:53:51 +0000220 fail_0:
221 DECREF(c->c_names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000222 fail_1:
223 DECREF(c->c_consts);
224 fail_2:
225 DECREF(c->c_code);
226 fail_3:
227 return 0;
228}
229
230static void
231com_free(c)
232 struct compiling *c;
233{
234 XDECREF(c->c_code);
235 XDECREF(c->c_consts);
236 XDECREF(c->c_names);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000237 XDECREF(c->c_globals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000238}
239
240static void
241com_done(c)
242 struct compiling *c;
243{
244 if (c->c_code != NULL)
245 resizestring(&c->c_code, c->c_nexti);
246}
247
248static void
249com_addbyte(c, byte)
250 struct compiling *c;
251 int byte;
252{
253 int len;
254 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000255 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000256 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
257 abort();
Guido van Rossum01cfd441991-10-20 20:12:38 +0000258 */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000259 err_setstr(SystemError, "com_addbyte: byte out of range");
260 c->c_errors++;
261 }
262 if (c->c_code == NULL)
263 return;
264 len = getstringsize(c->c_code);
265 if (c->c_nexti >= len) {
266 if (resizestring(&c->c_code, len+1000) != 0) {
267 c->c_errors++;
268 return;
269 }
270 }
271 getstringvalue(c->c_code)[c->c_nexti++] = byte;
272}
273
274static void
275com_addint(c, x)
276 struct compiling *c;
277 int x;
278{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000279 com_addbyte(c, x & 0xff);
280 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000281}
282
283static void
284com_addoparg(c, op, arg)
285 struct compiling *c;
286 int op;
287 int arg;
288{
289 com_addbyte(c, op);
290 com_addint(c, arg);
291}
292
293static void
294com_addfwref(c, op, p_anchor)
295 struct compiling *c;
296 int op;
297 int *p_anchor;
298{
299 /* Compile a forward reference for backpatching */
300 int here;
301 int anchor;
302 com_addbyte(c, op);
303 here = c->c_nexti;
304 anchor = *p_anchor;
305 *p_anchor = here;
306 com_addint(c, anchor == 0 ? 0 : here - anchor);
307}
308
309static void
310com_backpatch(c, anchor)
311 struct compiling *c;
312 int anchor; /* Must be nonzero */
313{
314 unsigned char *code = (unsigned char *) getstringvalue(c->c_code);
315 int target = c->c_nexti;
316 int lastanchor = 0;
317 int dist;
318 int prev;
319 for (;;) {
320 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000321 prev = code[anchor] + (code[anchor+1] << 8);
322 dist = target - (anchor+2);
323 code[anchor] = dist & 0xff;
324 code[anchor+1] = dist >> 8;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000325 if (!prev)
326 break;
327 lastanchor = anchor;
328 anchor -= prev;
329 }
330}
331
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000332/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000333
334static int
335com_add(c, list, v)
336 struct compiling *c;
337 object *list;
338 object *v;
339{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000340 int n = getlistsize(list);
341 int i;
342 for (i = n; --i >= 0; ) {
343 object *w = getlistitem(list, i);
Guido van Rossumefc0bd01991-07-01 18:44:20 +0000344 if (v->ob_type == w->ob_type && cmpobject(v, w) == 0)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000345 return i;
346 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000347 if (addlistitem(list, v) != 0)
348 c->c_errors++;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000349 return n;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000350}
351
352static int
353com_addconst(c, v)
354 struct compiling *c;
355 object *v;
356{
357 return com_add(c, c->c_consts, v);
358}
359
360static int
361com_addname(c, v)
362 struct compiling *c;
363 object *v;
364{
365 return com_add(c, c->c_names, v);
366}
367
368static void
369com_addopname(c, op, n)
370 struct compiling *c;
371 int op;
372 node *n;
373{
374 object *v;
375 int i;
376 char *name;
377 if (TYPE(n) == STAR)
378 name = "*";
379 else {
380 REQ(n, NAME);
381 name = STR(n);
382 }
383 if ((v = newstringobject(name)) == NULL) {
384 c->c_errors++;
385 i = 255;
386 }
387 else {
388 i = com_addname(c, v);
389 DECREF(v);
390 }
Guido van Rossumc5e96291991-12-10 13:53:51 +0000391 /* Hack to replace *_NAME opcodes by *_GLOBAL if necessary */
392 switch (op) {
393 case LOAD_NAME:
394 case STORE_NAME:
395 case DELETE_NAME:
396 if (dictlookup(c->c_globals, name) != NULL) {
397 switch (op) {
398 case LOAD_NAME: op = LOAD_GLOBAL; break;
399 case STORE_NAME: op = STORE_GLOBAL; break;
400 case DELETE_NAME: op = DELETE_GLOBAL; break;
401 }
402 }
403 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000404 com_addoparg(c, op, i);
405}
406
407static object *
408parsenumber(s)
409 char *s;
410{
411 extern long strtol();
Guido van 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 Rossumacbefef1992-01-19 16:33:51 +0000492#if 0
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000493 case 'E': *p++ = '\033'; break; /* ESC, not C */
Guido van Rossumacbefef1992-01-19 16:33:51 +0000494#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000495 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
496 case '0': case '1': case '2': case '3':
497 case '4': case '5': case '6': case '7':
498 c = s[-1] - '0';
499 if ('0' <= *s && *s <= '7') {
500 c = (c<<3) + *s++ - '0';
501 if ('0' <= *s && *s <= '7')
502 c = (c<<3) + *s++ - '0';
503 }
504 *p++ = c;
505 break;
506 case 'x':
507 if (isxdigit(*s)) {
508 sscanf(s, "%x", &c);
509 *p++ = c;
510 do {
511 s++;
512 } while (isxdigit(*s));
513 break;
514 }
515 /* FALLTHROUGH */
516 default: *p++ = '\\'; *p++ = s[-1]; break;
517 }
518 }
519 resizestring(&v, (int)(p - buf));
520 return v;
521}
522
523static void
524com_list_constructor(c, n)
525 struct compiling *c;
526 node *n;
527{
528 int len;
529 int i;
530 object *v, *w;
531 if (TYPE(n) != testlist)
532 REQ(n, exprlist);
533 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
534 len = (NCH(n) + 1) / 2;
535 for (i = 0; i < NCH(n); i += 2)
536 com_node(c, CHILD(n, i));
537 com_addoparg(c, BUILD_LIST, len);
538}
539
540static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000541com_dictmaker(c, n)
542 struct compiling *c;
543 node *n;
544{
545 int i;
546 /* dictmaker: test ':' test (',' test ':' value)* [','] */
547 for (i = 0; i+2 < NCH(n); i += 4) {
548 /* We must arrange things just right for STORE_SUBSCR.
549 It wants the stack to look like (value) (dict) (key) */
550 com_addbyte(c, DUP_TOP);
551 com_node(c, CHILD(n, i+2)); /* value */
552 com_addbyte(c, ROT_TWO);
553 com_node(c, CHILD(n, i)); /* key */
554 com_addbyte(c, STORE_SUBSCR);
555 }
556}
557
558static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000559com_atom(c, n)
560 struct compiling *c;
561 node *n;
562{
563 node *ch;
564 object *v;
565 int i;
566 REQ(n, atom);
567 ch = CHILD(n, 0);
568 switch (TYPE(ch)) {
569 case LPAR:
570 if (TYPE(CHILD(n, 1)) == RPAR)
571 com_addoparg(c, BUILD_TUPLE, 0);
572 else
573 com_node(c, CHILD(n, 1));
574 break;
575 case LSQB:
576 if (TYPE(CHILD(n, 1)) == RSQB)
577 com_addoparg(c, BUILD_LIST, 0);
578 else
579 com_list_constructor(c, CHILD(n, 1));
580 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000581 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000582 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000583 if (TYPE(CHILD(n, 1)) != RBRACE)
584 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000585 break;
586 case BACKQUOTE:
587 com_node(c, CHILD(n, 1));
588 com_addbyte(c, UNARY_CONVERT);
589 break;
590 case NUMBER:
591 if ((v = parsenumber(STR(ch))) == NULL) {
592 c->c_errors++;
593 i = 255;
594 }
595 else {
596 i = com_addconst(c, v);
597 DECREF(v);
598 }
599 com_addoparg(c, LOAD_CONST, i);
600 break;
601 case STRING:
602 if ((v = parsestr(STR(ch))) == NULL) {
603 c->c_errors++;
604 i = 255;
605 }
606 else {
607 i = com_addconst(c, v);
608 DECREF(v);
609 }
610 com_addoparg(c, LOAD_CONST, i);
611 break;
612 case NAME:
613 com_addopname(c, LOAD_NAME, ch);
614 break;
615 default:
616 fprintf(stderr, "node type %d\n", TYPE(ch));
617 err_setstr(SystemError, "com_atom: unexpected node type");
618 c->c_errors++;
619 }
620}
621
622static void
623com_slice(c, n, op)
624 struct compiling *c;
625 node *n;
626 int op;
627{
628 if (NCH(n) == 1) {
629 com_addbyte(c, op);
630 }
631 else if (NCH(n) == 2) {
632 if (TYPE(CHILD(n, 0)) != COLON) {
633 com_node(c, CHILD(n, 0));
634 com_addbyte(c, op+1);
635 }
636 else {
637 com_node(c, CHILD(n, 1));
638 com_addbyte(c, op+2);
639 }
640 }
641 else {
642 com_node(c, CHILD(n, 0));
643 com_node(c, CHILD(n, 2));
644 com_addbyte(c, op+3);
645 }
646}
647
648static void
649com_apply_subscript(c, n)
650 struct compiling *c;
651 node *n;
652{
653 REQ(n, subscript);
654 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) != COLON) {
655 /* It's a single subscript */
656 com_node(c, CHILD(n, 0));
657 com_addbyte(c, BINARY_SUBSCR);
658 }
659 else {
660 /* It's a slice: [expr] ':' [expr] */
661 com_slice(c, n, SLICE);
662 }
663}
664
665static void
666com_call_function(c, n)
667 struct compiling *c;
668 node *n; /* EITHER testlist OR ')' */
669{
670 if (TYPE(n) == RPAR) {
Guido van Rossum288a60f1991-12-16 13:05:10 +0000671 com_addoparg(c, BUILD_TUPLE, 0);
672 com_addbyte(c, BINARY_CALL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000673 }
674 else {
Guido van Rossum288a60f1991-12-16 13:05:10 +0000675 int i;
676 REQ(n, testlist);
677 com_list(c, n, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000678 com_addbyte(c, BINARY_CALL);
679 }
680}
681
682static void
683com_select_member(c, n)
684 struct compiling *c;
685 node *n;
686{
687 com_addopname(c, LOAD_ATTR, n);
688}
689
690static void
691com_apply_trailer(c, n)
692 struct compiling *c;
693 node *n;
694{
695 REQ(n, trailer);
696 switch (TYPE(CHILD(n, 0))) {
697 case LPAR:
698 com_call_function(c, CHILD(n, 1));
699 break;
700 case DOT:
701 com_select_member(c, CHILD(n, 1));
702 break;
703 case LSQB:
704 com_apply_subscript(c, CHILD(n, 1));
705 break;
706 default:
707 err_setstr(SystemError,
708 "com_apply_trailer: unknown trailer type");
709 c->c_errors++;
710 }
711}
712
713static void
714com_factor(c, n)
715 struct compiling *c;
716 node *n;
717{
718 int i;
719 REQ(n, factor);
720 if (TYPE(CHILD(n, 0)) == PLUS) {
721 com_factor(c, CHILD(n, 1));
722 com_addbyte(c, UNARY_POSITIVE);
723 }
724 else if (TYPE(CHILD(n, 0)) == MINUS) {
725 com_factor(c, CHILD(n, 1));
726 com_addbyte(c, UNARY_NEGATIVE);
727 }
Guido van Rossum7928cd71991-10-24 14:59:31 +0000728 else if (TYPE(CHILD(n, 0)) == TILDE) {
729 com_factor(c, CHILD(n, 1));
730 com_addbyte(c, UNARY_INVERT);
731 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000732 else {
733 com_atom(c, CHILD(n, 0));
734 for (i = 1; i < NCH(n); i++)
735 com_apply_trailer(c, CHILD(n, i));
736 }
737}
738
739static void
740com_term(c, n)
741 struct compiling *c;
742 node *n;
743{
744 int i;
745 int op;
746 REQ(n, term);
747 com_factor(c, CHILD(n, 0));
748 for (i = 2; i < NCH(n); i += 2) {
749 com_factor(c, CHILD(n, i));
750 switch (TYPE(CHILD(n, i-1))) {
751 case STAR:
752 op = BINARY_MULTIPLY;
753 break;
754 case SLASH:
755 op = BINARY_DIVIDE;
756 break;
757 case PERCENT:
758 op = BINARY_MODULO;
759 break;
760 default:
761 err_setstr(SystemError,
Guido van Rossum7928cd71991-10-24 14:59:31 +0000762 "com_term: operator not *, / or %");
763 c->c_errors++;
764 op = 255;
765 }
766 com_addbyte(c, op);
767 }
768}
769
770static void
771com_arith_expr(c, n)
772 struct compiling *c;
773 node *n;
774{
775 int i;
776 int op;
777 REQ(n, arith_expr);
778 com_term(c, CHILD(n, 0));
779 for (i = 2; i < NCH(n); i += 2) {
780 com_term(c, CHILD(n, i));
781 switch (TYPE(CHILD(n, i-1))) {
782 case PLUS:
783 op = BINARY_ADD;
784 break;
785 case MINUS:
786 op = BINARY_SUBTRACT;
787 break;
788 default:
789 err_setstr(SystemError,
790 "com_arith_expr: operator not + or -");
791 c->c_errors++;
792 op = 255;
793 }
794 com_addbyte(c, op);
795 }
796}
797
798static void
799com_shift_expr(c, n)
800 struct compiling *c;
801 node *n;
802{
803 int i;
804 int op;
805 REQ(n, shift_expr);
806 com_arith_expr(c, CHILD(n, 0));
807 for (i = 2; i < NCH(n); i += 2) {
808 com_arith_expr(c, CHILD(n, i));
809 switch (TYPE(CHILD(n, i-1))) {
810 case LEFTSHIFT:
811 op = BINARY_LSHIFT;
812 break;
813 case RIGHTSHIFT:
814 op = BINARY_RSHIFT;
815 break;
816 default:
817 err_setstr(SystemError,
818 "com_shift_expr: operator not << or >>");
819 c->c_errors++;
820 op = 255;
821 }
822 com_addbyte(c, op);
823 }
824}
825
826static void
827com_and_expr(c, n)
828 struct compiling *c;
829 node *n;
830{
831 int i;
832 int op;
833 REQ(n, and_expr);
834 com_shift_expr(c, CHILD(n, 0));
835 for (i = 2; i < NCH(n); i += 2) {
836 com_shift_expr(c, CHILD(n, i));
837 if (TYPE(CHILD(n, i-1)) == AMPER) {
838 op = BINARY_AND;
839 }
840 else {
841 err_setstr(SystemError,
842 "com_and_expr: operator not &");
843 c->c_errors++;
844 op = 255;
845 }
846 com_addbyte(c, op);
847 }
848}
849
850static void
851com_xor_expr(c, n)
852 struct compiling *c;
853 node *n;
854{
855 int i;
856 int op;
857 REQ(n, xor_expr);
858 com_and_expr(c, CHILD(n, 0));
859 for (i = 2; i < NCH(n); i += 2) {
860 com_and_expr(c, CHILD(n, i));
861 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
862 op = BINARY_XOR;
863 }
864 else {
865 err_setstr(SystemError,
866 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000867 c->c_errors++;
868 op = 255;
869 }
870 com_addbyte(c, op);
871 }
872}
873
874static void
875com_expr(c, n)
876 struct compiling *c;
877 node *n;
878{
879 int i;
880 int op;
881 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000882 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000883 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +0000884 com_xor_expr(c, CHILD(n, i));
885 if (TYPE(CHILD(n, i-1)) == VBAR) {
886 op = BINARY_OR;
887 }
888 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000889 err_setstr(SystemError,
Guido van Rossum7928cd71991-10-24 14:59:31 +0000890 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000891 c->c_errors++;
892 op = 255;
893 }
894 com_addbyte(c, op);
895 }
896}
897
898static enum cmp_op
899cmp_type(n)
900 node *n;
901{
902 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +0000903 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000904 | 'in' | 'not' 'in' | 'is' | 'is' not' */
905 if (NCH(n) == 1) {
906 n = CHILD(n, 0);
907 switch (TYPE(n)) {
908 case LESS: return LT;
909 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +0000910 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000911 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +0000912 case LESSEQUAL: return LE;
913 case GREATEREQUAL: return GE;
914 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000915 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
916 if (strcmp(STR(n), "is") == 0) return IS;
917 }
918 }
919 else if (NCH(n) == 2) {
920 int t2 = TYPE(CHILD(n, 1));
921 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000922 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
923 return NOT_IN;
924 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
925 return IS_NOT;
926 }
927 }
928 return BAD;
929}
930
931static void
932com_comparison(c, n)
933 struct compiling *c;
934 node *n;
935{
936 int i;
937 enum cmp_op op;
938 int anchor;
939 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
940 com_expr(c, CHILD(n, 0));
941 if (NCH(n) == 1)
942 return;
943
944 /****************************************************************
945 The following code is generated for all but the last
946 comparison in a chain:
947
948 label: on stack: opcode: jump to:
949
950 a <code to load b>
951 a, b DUP_TOP
952 a, b, b ROT_THREE
953 b, a, b COMPARE_OP
954 b, 0-or-1 JUMP_IF_FALSE L1
955 b, 1 POP_TOP
956 b
957
958 We are now ready to repeat this sequence for the next
959 comparison in the chain.
960
961 For the last we generate:
962
963 b <code to load c>
964 b, c COMPARE_OP
965 0-or-1
966
967 If there were any jumps to L1 (i.e., there was more than one
968 comparison), we generate:
969
970 0-or-1 JUMP_FORWARD L2
971 L1: b, 0 ROT_TWO
972 0, b POP_TOP
973 0
974 L2:
975 ****************************************************************/
976
977 anchor = 0;
978
979 for (i = 2; i < NCH(n); i += 2) {
980 com_expr(c, CHILD(n, i));
981 if (i+2 < NCH(n)) {
982 com_addbyte(c, DUP_TOP);
983 com_addbyte(c, ROT_THREE);
984 }
985 op = cmp_type(CHILD(n, i-1));
986 if (op == BAD) {
987 err_setstr(SystemError,
988 "com_comparison: unknown comparison op");
989 c->c_errors++;
990 }
991 com_addoparg(c, COMPARE_OP, op);
992 if (i+2 < NCH(n)) {
993 com_addfwref(c, JUMP_IF_FALSE, &anchor);
994 com_addbyte(c, POP_TOP);
995 }
996 }
997
998 if (anchor) {
999 int anchor2 = 0;
1000 com_addfwref(c, JUMP_FORWARD, &anchor2);
1001 com_backpatch(c, anchor);
1002 com_addbyte(c, ROT_TWO);
1003 com_addbyte(c, POP_TOP);
1004 com_backpatch(c, anchor2);
1005 }
1006}
1007
1008static void
1009com_not_test(c, n)
1010 struct compiling *c;
1011 node *n;
1012{
1013 REQ(n, not_test); /* 'not' not_test | comparison */
1014 if (NCH(n) == 1) {
1015 com_comparison(c, CHILD(n, 0));
1016 }
1017 else {
1018 com_not_test(c, CHILD(n, 1));
1019 com_addbyte(c, UNARY_NOT);
1020 }
1021}
1022
1023static void
1024com_and_test(c, n)
1025 struct compiling *c;
1026 node *n;
1027{
1028 int i;
1029 int anchor;
1030 REQ(n, and_test); /* not_test ('and' not_test)* */
1031 anchor = 0;
1032 i = 0;
1033 for (;;) {
1034 com_not_test(c, CHILD(n, i));
1035 if ((i += 2) >= NCH(n))
1036 break;
1037 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1038 com_addbyte(c, POP_TOP);
1039 }
1040 if (anchor)
1041 com_backpatch(c, anchor);
1042}
1043
1044static void
1045com_test(c, n)
1046 struct compiling *c;
1047 node *n;
1048{
1049 int i;
1050 int anchor;
1051 REQ(n, test); /* and_test ('and' and_test)* */
1052 anchor = 0;
1053 i = 0;
1054 for (;;) {
1055 com_and_test(c, CHILD(n, i));
1056 if ((i += 2) >= NCH(n))
1057 break;
1058 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1059 com_addbyte(c, POP_TOP);
1060 }
1061 if (anchor)
1062 com_backpatch(c, anchor);
1063}
1064
1065static void
Guido van Rossum288a60f1991-12-16 13:05:10 +00001066com_list(c, n, toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001067 struct compiling *c;
1068 node *n;
Guido van Rossum288a60f1991-12-16 13:05:10 +00001069 int toplevel; /* If nonzero, *always* build a tuple */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001070{
1071 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001072 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001073 com_node(c, CHILD(n, 0));
1074 }
1075 else {
1076 int i;
1077 int len;
1078 len = (NCH(n) + 1) / 2;
1079 for (i = 0; i < NCH(n); i += 2)
1080 com_node(c, CHILD(n, i));
1081 com_addoparg(c, BUILD_TUPLE, len);
1082 }
1083}
1084
1085
1086/* Begin of assignment compilation */
1087
1088static void com_assign_name PROTO((struct compiling *, node *, int));
1089static void com_assign PROTO((struct compiling *, node *, int));
1090
1091static void
1092com_assign_attr(c, n, assigning)
1093 struct compiling *c;
1094 node *n;
1095 int assigning;
1096{
1097 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
1098}
1099
1100static void
1101com_assign_slice(c, n, assigning)
1102 struct compiling *c;
1103 node *n;
1104 int assigning;
1105{
1106 com_slice(c, n, assigning ? STORE_SLICE : DELETE_SLICE);
1107}
1108
1109static void
1110com_assign_subscript(c, n, assigning)
1111 struct compiling *c;
1112 node *n;
1113 int assigning;
1114{
1115 com_node(c, n);
1116 com_addbyte(c, assigning ? STORE_SUBSCR : DELETE_SUBSCR);
1117}
1118
1119static void
1120com_assign_trailer(c, n, assigning)
1121 struct compiling *c;
1122 node *n;
1123 int assigning;
1124{
1125 char *name;
1126 REQ(n, trailer);
1127 switch (TYPE(CHILD(n, 0))) {
1128 case LPAR: /* '(' [exprlist] ')' */
1129 err_setstr(TypeError, "can't assign to function call");
1130 c->c_errors++;
1131 break;
1132 case DOT: /* '.' NAME */
1133 com_assign_attr(c, CHILD(n, 1), assigning);
1134 break;
1135 case LSQB: /* '[' subscript ']' */
1136 n = CHILD(n, 1);
1137 REQ(n, subscript); /* subscript: expr | [expr] ':' [expr] */
1138 if (NCH(n) > 1 || TYPE(CHILD(n, 0)) == COLON)
1139 com_assign_slice(c, n, assigning);
1140 else
1141 com_assign_subscript(c, CHILD(n, 0), assigning);
1142 break;
1143 default:
1144 err_setstr(TypeError, "unknown trailer type");
1145 c->c_errors++;
1146 }
1147}
1148
1149static void
1150com_assign_tuple(c, n, assigning)
1151 struct compiling *c;
1152 node *n;
1153 int assigning;
1154{
1155 int i;
1156 if (TYPE(n) != testlist)
1157 REQ(n, exprlist);
1158 if (assigning)
1159 com_addoparg(c, UNPACK_TUPLE, (NCH(n)+1)/2);
1160 for (i = 0; i < NCH(n); i += 2)
1161 com_assign(c, CHILD(n, i), assigning);
1162}
1163
1164static void
1165com_assign_list(c, n, assigning)
1166 struct compiling *c;
1167 node *n;
1168 int assigning;
1169{
1170 int i;
1171 if (assigning)
1172 com_addoparg(c, UNPACK_LIST, (NCH(n)+1)/2);
1173 for (i = 0; i < NCH(n); i += 2)
1174 com_assign(c, CHILD(n, i), assigning);
1175}
1176
1177static void
1178com_assign_name(c, n, assigning)
1179 struct compiling *c;
1180 node *n;
1181 int assigning;
1182{
1183 REQ(n, NAME);
1184 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
1185}
1186
1187static void
1188com_assign(c, n, assigning)
1189 struct compiling *c;
1190 node *n;
1191 int assigning;
1192{
1193 /* Loop to avoid trivial recursion */
1194 for (;;) {
1195 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001196
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001197 case exprlist:
1198 case testlist:
1199 if (NCH(n) > 1) {
1200 com_assign_tuple(c, n, assigning);
1201 return;
1202 }
1203 n = CHILD(n, 0);
1204 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001205
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001206 case test:
1207 case and_test:
1208 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001209 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001210 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001211 case xor_expr:
1212 case and_expr:
1213 case shift_expr:
1214 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001215 case term:
1216 if (NCH(n) > 1) {
1217 err_setstr(TypeError,
1218 "can't assign to operator");
1219 c->c_errors++;
1220 return;
1221 }
1222 n = CHILD(n, 0);
1223 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001224
Guido van Rossum7928cd71991-10-24 14:59:31 +00001225 case factor: /* ('+'|'-'|'~') factor | atom trailer* */
1226 if (TYPE(CHILD(n, 0)) != atom) { /* '+'|'-'|'~' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001227 err_setstr(TypeError,
1228 "can't assign to operator");
1229 c->c_errors++;
1230 return;
1231 }
1232 if (NCH(n) > 1) { /* trailer present */
1233 int i;
1234 com_node(c, CHILD(n, 0));
1235 for (i = 1; i+1 < NCH(n); i++) {
1236 com_apply_trailer(c, CHILD(n, i));
1237 } /* NB i is still alive */
1238 com_assign_trailer(c,
1239 CHILD(n, i), assigning);
1240 return;
1241 }
1242 n = CHILD(n, 0);
1243 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001244
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001245 case atom:
1246 switch (TYPE(CHILD(n, 0))) {
1247 case LPAR:
1248 n = CHILD(n, 1);
1249 if (TYPE(n) == RPAR) {
1250 /* XXX Should allow () = () ??? */
1251 err_setstr(TypeError,
1252 "can't assign to ()");
1253 c->c_errors++;
1254 return;
1255 }
1256 break;
1257 case LSQB:
1258 n = CHILD(n, 1);
1259 if (TYPE(n) == RSQB) {
1260 err_setstr(TypeError,
1261 "can't assign to []");
1262 c->c_errors++;
1263 return;
1264 }
1265 com_assign_list(c, n, assigning);
1266 return;
1267 case NAME:
1268 com_assign_name(c, CHILD(n, 0), assigning);
1269 return;
1270 default:
1271 err_setstr(TypeError,
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001272 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001273 c->c_errors++;
1274 return;
1275 }
1276 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001277
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001278 default:
1279 fprintf(stderr, "node type %d\n", TYPE(n));
1280 err_setstr(SystemError, "com_assign: bad node");
1281 c->c_errors++;
1282 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001283
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001284 }
1285 }
1286}
1287
1288static void
1289com_expr_stmt(c, n)
1290 struct compiling *c;
1291 node *n;
1292{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001293 REQ(n, expr_stmt); /* exprlist ('=' exprlist)* */
1294 com_node(c, CHILD(n, NCH(n)-1));
1295 if (NCH(n) == 1) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001296 com_addbyte(c, PRINT_EXPR);
1297 }
1298 else {
1299 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001300 for (i = 0; i < NCH(n)-2; i+=2) {
1301 if (i+2 < NCH(n)-2)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001302 com_addbyte(c, DUP_TOP);
1303 com_assign(c, CHILD(n, i), 1/*assign*/);
1304 }
1305 }
1306}
1307
1308static void
1309com_print_stmt(c, n)
1310 struct compiling *c;
1311 node *n;
1312{
1313 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001314 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
1315 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001316 com_node(c, CHILD(n, i));
1317 com_addbyte(c, PRINT_ITEM);
1318 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001319 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001320 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001321 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001322}
1323
1324static void
1325com_return_stmt(c, n)
1326 struct compiling *c;
1327 node *n;
1328{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001329 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001330 if (!c->c_infunction) {
1331 err_setstr(TypeError, "'return' outside function");
1332 c->c_errors++;
1333 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001334 if (NCH(n) < 2)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001335 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1336 else
1337 com_node(c, CHILD(n, 1));
1338 com_addbyte(c, RETURN_VALUE);
1339}
1340
1341static void
1342com_raise_stmt(c, n)
1343 struct compiling *c;
1344 node *n;
1345{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001346 REQ(n, raise_stmt); /* 'raise' test [',' test] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001347 com_node(c, CHILD(n, 1));
1348 if (NCH(n) > 3)
1349 com_node(c, CHILD(n, 3));
1350 else
1351 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1352 com_addbyte(c, RAISE_EXCEPTION);
1353}
1354
1355static void
1356com_import_stmt(c, n)
1357 struct compiling *c;
1358 node *n;
1359{
1360 int i;
1361 REQ(n, import_stmt);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001362 /* 'import' NAME (',' NAME)* |
1363 'from' NAME 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001364 if (STR(CHILD(n, 0))[0] == 'f') {
1365 /* 'from' NAME 'import' ... */
1366 REQ(CHILD(n, 1), NAME);
1367 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
1368 for (i = 3; i < NCH(n); i += 2)
1369 com_addopname(c, IMPORT_FROM, CHILD(n, i));
1370 com_addbyte(c, POP_TOP);
1371 }
1372 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001373 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001374 for (i = 1; i < NCH(n); i += 2) {
1375 com_addopname(c, IMPORT_NAME, CHILD(n, i));
1376 com_addopname(c, STORE_NAME, CHILD(n, i));
1377 }
1378 }
1379}
1380
1381static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00001382com_global_stmt(c, n)
1383 struct compiling *c;
1384 node *n;
1385{
1386 int i;
1387 object *v;
1388 REQ(n, global_stmt);
1389 /* 'global' NAME (',' NAME)* */
1390 for (i = 1; i < NCH(n); i += 2) {
1391 if (dictinsert(c->c_globals, STR(CHILD(n, i)), None) != 0)
1392 c->c_errors++;
1393 }
1394}
1395
1396static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001397com_if_stmt(c, n)
1398 struct compiling *c;
1399 node *n;
1400{
1401 int i;
1402 int anchor = 0;
1403 REQ(n, if_stmt);
1404 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
1405 for (i = 0; i+3 < NCH(n); i+=4) {
1406 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001407 node *ch = CHILD(n, i+1);
1408 if (i > 0)
1409 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001410 com_node(c, CHILD(n, i+1));
1411 com_addfwref(c, JUMP_IF_FALSE, &a);
1412 com_addbyte(c, POP_TOP);
1413 com_node(c, CHILD(n, i+3));
1414 com_addfwref(c, JUMP_FORWARD, &anchor);
1415 com_backpatch(c, a);
1416 com_addbyte(c, POP_TOP);
1417 }
1418 if (i+2 < NCH(n))
1419 com_node(c, CHILD(n, i+2));
1420 com_backpatch(c, anchor);
1421}
1422
1423static void
1424com_while_stmt(c, n)
1425 struct compiling *c;
1426 node *n;
1427{
1428 int break_anchor = 0;
1429 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001430 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001431 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
1432 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001433 block_push(c, SETUP_LOOP);
1434 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001435 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001436 com_node(c, CHILD(n, 1));
1437 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1438 com_addbyte(c, POP_TOP);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001439 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001440 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001441 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001442 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1443 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001444 com_backpatch(c, anchor);
1445 com_addbyte(c, POP_TOP);
1446 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001447 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001448 if (NCH(n) > 4)
1449 com_node(c, CHILD(n, 6));
1450 com_backpatch(c, break_anchor);
1451}
1452
1453static void
1454com_for_stmt(c, n)
1455 struct compiling *c;
1456 node *n;
1457{
1458 object *v;
1459 int break_anchor = 0;
1460 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001461 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001462 REQ(n, for_stmt);
1463 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
1464 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001465 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001466 com_node(c, CHILD(n, 3));
1467 v = newintobject(0L);
1468 if (v == NULL)
1469 c->c_errors++;
1470 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
1471 XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001472 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001473 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001474 com_addfwref(c, FOR_LOOP, &anchor);
1475 com_assign(c, CHILD(n, 1), 1/*assigning*/);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001476 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001477 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001478 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001479 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1480 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001481 com_backpatch(c, anchor);
1482 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001483 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001484 if (NCH(n) > 8)
1485 com_node(c, CHILD(n, 8));
1486 com_backpatch(c, break_anchor);
1487}
1488
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001489/* Although 'execpt' and 'finally' clauses can be combined
1490 syntactically, they are compiled separately. In fact,
1491 try: S
1492 except E1: S1
1493 except E2: S2
1494 ...
1495 finally: Sf
1496 is equivalent to
1497 try:
1498 try: S
1499 except E1: S1
1500 except E2: S2
1501 ...
1502 finally: Sf
1503 meaning that the 'finally' clause is entered even if things
1504 go wrong again in an exception handler. Note that this is
1505 not the case for exception handlers: at most one is entered.
1506
1507 Code generated for "try: S finally: Sf" is as follows:
1508
1509 SETUP_FINALLY L
1510 <code for S>
1511 POP_BLOCK
1512 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001513 L: <code for Sf>
1514 END_FINALLY
1515
1516 The special instructions use the block stack. Each block
1517 stack entry contains the instruction that created it (here
1518 SETUP_FINALLY), the level of the value stack at the time the
1519 block stack entry was created, and a label (here L).
1520
1521 SETUP_FINALLY:
1522 Pushes the current value stack level and the label
1523 onto the block stack.
1524 POP_BLOCK:
1525 Pops en entry from the block stack, and pops the value
1526 stack until its level is the same as indicated on the
1527 block stack. (The label is ignored.)
1528 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001529 Pops a variable number of entries from the *value* stack
1530 and re-raises the exception they specify. The number of
1531 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001532
1533 The block stack is unwound when an exception is raised:
1534 when a SETUP_FINALLY entry is found, the exception is pushed
1535 onto the value stack (and the exception condition is cleared),
1536 and the interpreter jumps to the label gotten from the block
1537 stack.
1538
1539 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00001540 (The contents of the value stack is shown in [], with the top
1541 at the right; 'tb' is trace-back info, 'val' the exception's
1542 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001543
1544 Value stack Label Instruction Argument
1545 [] SETUP_EXCEPT L1
1546 [] <code for S>
1547 [] POP_BLOCK
1548 [] JUMP_FORWARD L0
1549
Guido van Rossum3f5da241990-12-20 15:06:42 +00001550 [tb, val, exc] L1: DUP )
1551 [tb, val, exc, exc] <evaluate E1> )
1552 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
1553 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
1554 [tb, val, exc, 1] POP )
1555 [tb, val, exc] POP
1556 [tb, val] <assign to V1> (or POP if no V1)
1557 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001558 [] <code for S1>
1559 JUMP_FORWARD L0
1560
Guido van Rossum3f5da241990-12-20 15:06:42 +00001561 [tb, val, exc, 0] L2: POP
1562 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001563 .............................etc.......................
1564
Guido van Rossum3f5da241990-12-20 15:06:42 +00001565 [tb, val, exc, 0] Ln+1: POP
1566 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001567
1568 [] L0: <next statement>
1569
1570 Of course, parts are not generated if Vi or Ei is not present.
1571*/
1572
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001573static void
1574com_try_stmt(c, n)
1575 struct compiling *c;
1576 node *n;
1577{
1578 int finally_anchor = 0;
1579 int except_anchor = 0;
1580 REQ(n, try_stmt);
1581 /* 'try' ':' suite (except_clause ':' suite)* ['finally' ':' suite] */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001582
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001583 if (NCH(n) > 3 && TYPE(CHILD(n, NCH(n)-3)) != except_clause) {
1584 /* Have a 'finally' clause */
1585 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001586 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001587 }
1588 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == except_clause) {
1589 /* Have an 'except' clause */
1590 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001591 block_push(c, SETUP_EXCEPT);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001592 }
1593 com_node(c, CHILD(n, 2));
1594 if (except_anchor) {
1595 int end_anchor = 0;
1596 int i;
1597 node *ch;
1598 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001599 block_pop(c, SETUP_EXCEPT);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001600 com_addfwref(c, JUMP_FORWARD, &end_anchor);
1601 com_backpatch(c, except_anchor);
1602 for (i = 3;
1603 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
1604 i += 3) {
1605 /* except_clause: 'except' [expr [',' expr]] */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001606 if (except_anchor == 0) {
1607 err_setstr(TypeError,
1608 "default 'except:' must be last");
1609 c->c_errors++;
1610 break;
1611 }
1612 except_anchor = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001613 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001614 if (NCH(ch) > 1) {
1615 com_addbyte(c, DUP_TOP);
1616 com_node(c, CHILD(ch, 1));
1617 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001618 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001619 com_addbyte(c, POP_TOP);
1620 }
1621 com_addbyte(c, POP_TOP);
1622 if (NCH(ch) > 3)
1623 com_assign(c, CHILD(ch, 3), 1/*assigning*/);
1624 else
1625 com_addbyte(c, POP_TOP);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001626 com_addbyte(c, POP_TOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001627 com_node(c, CHILD(n, i+2));
1628 com_addfwref(c, JUMP_FORWARD, &end_anchor);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001629 if (except_anchor) {
1630 com_backpatch(c, except_anchor);
1631 com_addbyte(c, POP_TOP);
1632 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001633 }
1634 com_addbyte(c, END_FINALLY);
1635 com_backpatch(c, end_anchor);
1636 }
1637 if (finally_anchor) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001638 node *ch;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001639 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001640 block_pop(c, SETUP_FINALLY);
1641 block_push(c, END_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001642 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001643 com_backpatch(c, finally_anchor);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001644 ch = CHILD(n, NCH(n)-1);
1645 com_addoparg(c, SET_LINENO, ch->n_lineno);
1646 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001647 com_addbyte(c, END_FINALLY);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001648 block_pop(c, END_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001649 }
1650}
1651
1652static void
1653com_suite(c, n)
1654 struct compiling *c;
1655 node *n;
1656{
1657 REQ(n, suite);
1658 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
1659 if (NCH(n) == 1) {
1660 com_node(c, CHILD(n, 0));
1661 }
1662 else {
1663 int i;
1664 for (i = 0; i < NCH(n); i++) {
1665 node *ch = CHILD(n, i);
1666 if (TYPE(ch) == stmt)
1667 com_node(c, ch);
1668 }
1669 }
1670}
1671
1672static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001673com_continue_stmt(c, n)
1674 struct compiling *c;
1675 node *n;
1676{
1677 int i = c->c_nblocks;
1678 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
1679 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1680 }
1681 else {
1682 err_setstr(TypeError, "'continue' not properly in loop");
1683 c->c_errors++;
1684 }
1685 /* XXX Could allow it inside a 'finally' clause
1686 XXX if we could pop the exception still on the stack */
1687}
1688
1689static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001690com_funcdef(c, n)
1691 struct compiling *c;
1692 node *n;
1693{
1694 object *v;
1695 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001696 v = (object *)compile(n, c->c_filename);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001697 if (v == NULL)
1698 c->c_errors++;
1699 else {
1700 int i = com_addconst(c, v);
1701 com_addoparg(c, LOAD_CONST, i);
1702 com_addbyte(c, BUILD_FUNCTION);
1703 com_addopname(c, STORE_NAME, CHILD(n, 1));
1704 DECREF(v);
1705 }
1706}
1707
1708static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00001709com_oldbases(c, n)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001710 struct compiling *c;
1711 node *n;
1712{
1713 int i, nbases;
1714 REQ(n, baselist);
1715 /*
1716 baselist: atom arguments (',' atom arguments)*
Guido van Rossumc5e96291991-12-10 13:53:51 +00001717 arguments: '(' ')'
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001718 */
1719 for (i = 0; i < NCH(n); i += 3)
1720 com_node(c, CHILD(n, i));
1721 com_addoparg(c, BUILD_TUPLE, (NCH(n)+1) / 3);
1722}
1723
1724static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00001725com_newbases(c, n)
1726 struct compiling *c;
1727 node *n;
1728{
1729 int i, nbases;
1730 REQ(n, testlist);
1731 /* testlist: test (',' test)* [','] */
1732 for (i = 0; i < NCH(n); i += 2)
1733 com_node(c, CHILD(n, i));
1734 com_addoparg(c, BUILD_TUPLE, (NCH(n)+1) / 2);
1735}
1736
1737static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001738com_classdef(c, n)
1739 struct compiling *c;
1740 node *n;
1741{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001742 object *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001743 REQ(n, classdef);
1744 /*
Guido van Rossumc5e96291991-12-10 13:53:51 +00001745 classdef: 'class' NAME
1746 ['(' testlist ')' |'(' ')' ['=' baselist]] ':' suite
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001747 baselist: atom arguments (',' atom arguments)*
Guido van Rossumc5e96291991-12-10 13:53:51 +00001748 arguments: '(' ')'
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001749 */
Guido van Rossumc5e96291991-12-10 13:53:51 +00001750 /* This piece of code must push a tuple on the stack (the bases) */
1751 if (TYPE(CHILD(n, 2)) != LPAR) {
1752 /* New syntax without base classes:
1753 class NAME ':' suite
1754 ___________^
1755 */
1756 com_addoparg(c, BUILD_TUPLE, 0);
1757 }
1758 else {
1759 if (TYPE(CHILD(n, 3)) == RPAR) {
1760 /* Old syntax with or without base classes:
1761 class NAME '(' ')' ['=' baselist] ':' suite
1762 _______________^....^...^
1763 */
1764 if (TYPE(CHILD(n, 4)) == EQUAL)
1765 com_oldbases(c, CHILD(n, 5));
1766 else
1767 com_addoparg(c, BUILD_TUPLE, 0);
1768 }
1769 else {
1770 /* New syntax with base classes:
1771 class NAME '(' testlist ')' ':' suite
1772 _______________^
1773 */
1774 com_newbases(c, CHILD(n, 3));
1775 }
1776 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001777 v = (object *)compile(n, c->c_filename);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001778 if (v == NULL)
1779 c->c_errors++;
1780 else {
1781 int i = com_addconst(c, v);
1782 com_addoparg(c, LOAD_CONST, i);
1783 com_addbyte(c, BUILD_FUNCTION);
1784 com_addbyte(c, UNARY_CALL);
1785 com_addbyte(c, BUILD_CLASS);
1786 com_addopname(c, STORE_NAME, CHILD(n, 1));
1787 DECREF(v);
1788 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001789}
1790
1791static void
1792com_node(c, n)
1793 struct compiling *c;
1794 node *n;
1795{
1796 switch (TYPE(n)) {
1797
1798 /* Definition nodes */
1799
1800 case funcdef:
1801 com_funcdef(c, n);
1802 break;
1803 case classdef:
1804 com_classdef(c, n);
1805 break;
1806
1807 /* Trivial parse tree nodes */
1808
1809 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001810 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001811 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001812 com_node(c, CHILD(n, 0));
1813 break;
1814
1815 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001816 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
1817 com_addoparg(c, SET_LINENO, n->n_lineno);
1818 {
1819 int i;
1820 for (i = 0; i < NCH(n)-1; i += 2)
1821 com_node(c, CHILD(n, i));
1822 }
1823 break;
1824
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001825 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001826 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001827 com_node(c, CHILD(n, 0));
1828 break;
1829
1830 /* Statement nodes */
1831
1832 case expr_stmt:
1833 com_expr_stmt(c, n);
1834 break;
1835 case print_stmt:
1836 com_print_stmt(c, n);
1837 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001838 case del_stmt: /* 'del' exprlist */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001839 com_assign(c, CHILD(n, 1), 0/*delete*/);
1840 break;
1841 case pass_stmt:
1842 break;
1843 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001844 if (c->c_loops == 0) {
1845 err_setstr(TypeError, "'break' outside loop");
1846 c->c_errors++;
1847 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001848 com_addbyte(c, BREAK_LOOP);
1849 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001850 case continue_stmt:
1851 com_continue_stmt(c, n);
1852 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001853 case return_stmt:
1854 com_return_stmt(c, n);
1855 break;
1856 case raise_stmt:
1857 com_raise_stmt(c, n);
1858 break;
1859 case import_stmt:
1860 com_import_stmt(c, n);
1861 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001862 case global_stmt:
1863 com_global_stmt(c, n);
1864 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001865 case if_stmt:
1866 com_if_stmt(c, n);
1867 break;
1868 case while_stmt:
1869 com_while_stmt(c, n);
1870 break;
1871 case for_stmt:
1872 com_for_stmt(c, n);
1873 break;
1874 case try_stmt:
1875 com_try_stmt(c, n);
1876 break;
1877 case suite:
1878 com_suite(c, n);
1879 break;
1880
1881 /* Expression nodes */
1882
1883 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00001884 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001885 break;
1886 case test:
1887 com_test(c, n);
1888 break;
1889 case and_test:
1890 com_and_test(c, n);
1891 break;
1892 case not_test:
1893 com_not_test(c, n);
1894 break;
1895 case comparison:
1896 com_comparison(c, n);
1897 break;
1898 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00001899 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001900 break;
1901 case expr:
1902 com_expr(c, n);
1903 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001904 case xor_expr:
1905 com_xor_expr(c, n);
1906 break;
1907 case and_expr:
1908 com_and_expr(c, n);
1909 break;
1910 case shift_expr:
1911 com_shift_expr(c, n);
1912 break;
1913 case arith_expr:
1914 com_arith_expr(c, n);
1915 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001916 case term:
1917 com_term(c, n);
1918 break;
1919 case factor:
1920 com_factor(c, n);
1921 break;
1922 case atom:
1923 com_atom(c, n);
1924 break;
1925
1926 default:
1927 fprintf(stderr, "node type %d\n", TYPE(n));
1928 err_setstr(SystemError, "com_node: unexpected node type");
1929 c->c_errors++;
1930 }
1931}
1932
1933static void com_fplist PROTO((struct compiling *, node *));
1934
1935static void
1936com_fpdef(c, n)
1937 struct compiling *c;
1938 node *n;
1939{
1940 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
1941 if (TYPE(CHILD(n, 0)) == LPAR)
1942 com_fplist(c, CHILD(n, 1));
1943 else
1944 com_addopname(c, STORE_NAME, CHILD(n, 0));
1945}
1946
1947static void
1948com_fplist(c, n)
1949 struct compiling *c;
1950 node *n;
1951{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001952 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001953 if (NCH(n) == 1) {
1954 com_fpdef(c, CHILD(n, 0));
1955 }
1956 else {
1957 int i;
1958 com_addoparg(c, UNPACK_TUPLE, (NCH(n)+1)/2);
1959 for (i = 0; i < NCH(n); i += 2)
1960 com_fpdef(c, CHILD(n, i));
1961 }
1962}
1963
1964static void
Guido van Rossum49d6dc41992-01-14 18:30:26 +00001965com_arglist(c, n)
1966 struct compiling *c;
1967 node *n;
1968{
1969 int i, nargs, op;
1970 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001971 /* varargslist:
1972 (fpdef ',')* ('+'|'*') NAME | fpdef (',' fpdef)* [','] */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00001973 op = UNPACK_ARG;
1974 nargs = (NCH(n) + 1) / 2;
1975 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumacbefef1992-01-19 16:33:51 +00001976 int t = TYPE(CHILD(n, i));
1977 if (t == PLUS || t == STAR) {
Guido van Rossum49d6dc41992-01-14 18:30:26 +00001978 op = UNPACK_VARARG;
1979 nargs = i/2;
1980 break;
1981 }
1982 }
1983 com_addoparg(c, op, nargs);
1984 for (i = 0; i < 2*nargs; i += 2)
1985 com_fpdef(c, CHILD(n, i));
1986 if (op == UNPACK_VARARG)
1987 com_addopname(c, STORE_NAME, CHILD(n, 2*nargs+1));
1988}
1989
1990static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001991com_file_input(c, n)
1992 struct compiling *c;
1993 node *n;
1994{
1995 int i;
1996 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
1997 for (i = 0; i < NCH(n); i++) {
1998 node *ch = CHILD(n, i);
1999 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
2000 com_node(c, ch);
2001 }
2002}
2003
2004/* Top-level compile-node interface */
2005
2006static void
2007compile_funcdef(c, n)
2008 struct compiling *c;
2009 node *n;
2010{
2011 node *ch;
2012 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002013 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
2014 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002015 if (TYPE(ch) == RPAR)
Guido van Rossum288a60f1991-12-16 13:05:10 +00002016 com_addoparg(c, UNPACK_ARG, 0);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002017 else
2018 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002019 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002020 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002021 c->c_infunction = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002022 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2023 com_addbyte(c, RETURN_VALUE);
2024}
2025
2026static void
2027compile_node(c, n)
2028 struct compiling *c;
2029 node *n;
2030{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002031 com_addoparg(c, SET_LINENO, n->n_lineno);
2032
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002033 switch (TYPE(n)) {
2034
Guido van Rossum4c417781991-01-21 16:09:22 +00002035 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002036 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
2037 n = CHILD(n, 0);
2038 if (TYPE(n) != NEWLINE)
2039 com_node(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002040 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2041 com_addbyte(c, RETURN_VALUE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002042 break;
2043
Guido van Rossum4c417781991-01-21 16:09:22 +00002044 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002045 com_file_input(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002046 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2047 com_addbyte(c, RETURN_VALUE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002048 break;
2049
Guido van Rossum4c417781991-01-21 16:09:22 +00002050 case expr_input: /* Built-in function eval() */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002051 com_node(c, CHILD(n, 0));
2052 com_addbyte(c, RETURN_VALUE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002053 break;
2054
Guido van Rossum4c417781991-01-21 16:09:22 +00002055 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00002056 com_node(c, CHILD(n, 0));
2057 com_addbyte(c, RETURN_VALUE);
2058 break;
2059
2060 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002061 compile_funcdef(c, n);
2062 break;
2063
Guido van Rossum4c417781991-01-21 16:09:22 +00002064 case classdef: /* A class definition */
Guido van Rossumc5e96291991-12-10 13:53:51 +00002065 /* classdef: 'class' NAME
2066 ['(' testlist ')' |'(' ')' ['=' baselist]]
2067 ':' suite */
Guido van Rossumc5e96291991-12-10 13:53:51 +00002068 com_node(c, CHILD(n, NCH(n)-1)); /* The suite */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002069 com_addbyte(c, LOAD_LOCALS);
2070 com_addbyte(c, RETURN_VALUE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002071 break;
2072
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002073 default:
2074 fprintf(stderr, "node type %d\n", TYPE(n));
2075 err_setstr(SystemError, "compile_node: unexpected node type");
2076 c->c_errors++;
2077 }
2078}
2079
Guido van Rossum282914b1991-04-04 10:42:56 +00002080/* Optimization for local and global variables.
2081
2082 Attempt to replace all LOAD_NAME instructions that refer to a local
2083 variable with LOAD_LOCAL instructions, and all that refer to a global
2084 variable with LOAD_GLOBAL instructions.
2085
2086 To find all local variables, we check all STORE_NAME and IMPORT_FROM
2087 instructions. This yields all local variables, including arguments,
2088 function definitions, class definitions and import statements.
2089
2090 There is one leak: 'from foo import *' introduces local variables
2091 that we can't know while compiling. If this is the case, LOAD_GLOBAL
2092 instructions are not generated -- LOAD_NAME is left in place for
2093 globals, since it first checks for globals (LOAD_LOCAL is still used
2094 for recognized locals, since it doesn't hurt).
2095
2096 This optimization means that using the same name as a global and
2097 as a local variable within the same scope is now illegal, which
2098 is a change to the language! Also using eval() to introduce new
2099 local variables won't work. But both were bad practice at best.
2100
2101 The optimization doesn't save much: basically, it saves one
2102 unsuccessful dictionary lookup per global (or built-in) variable
2103 reference. On the (slow!) Mac Plus, with 4 local variables,
2104 this saving was measured to be about 0.18 ms. We might save more
2105 by using a different data structure to hold local variables, like
2106 an array indexed by variable number.
2107
2108 NB: this modifies the string object co->co_code!
2109*/
2110
2111static void
2112optimizer(co)
2113 codeobject *co;
2114{
Guido van Rossum0a697f61991-04-16 08:39:12 +00002115 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00002116 object *locals;
2117 int opcode;
2118 int oparg;
2119 object *name;
2120 int star_used;
Guido van Rossum0a697f61991-04-16 08:39:12 +00002121
Guido van Rossum282914b1991-04-04 10:42:56 +00002122#define NEXTOP() (*next_instr++)
2123#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
2124#define GETITEM(v, i) (getlistitem((v), (i)))
2125#define GETNAMEOBJ(i) (GETITEM(co->co_names, (i)))
2126
2127 locals = newdictobject();
2128 if (locals == NULL) {
2129 err_clear();
2130 return; /* For now, this is OK */
2131 }
2132
Guido van Rossum0a697f61991-04-16 08:39:12 +00002133 next_instr = (unsigned char *) GETSTRINGVALUE(co->co_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00002134 for (;;) {
2135 opcode = NEXTOP();
2136 if (opcode == STOP_CODE)
2137 break;
2138 if (HAS_ARG(opcode))
2139 oparg = NEXTARG();
2140 if (opcode == STORE_NAME || opcode == IMPORT_FROM) {
2141 name = GETNAMEOBJ(oparg);
2142 if (dict2insert(locals, name, None) != 0) {
2143 DECREF(locals);
2144 return; /* Sorry */
2145 }
2146 }
2147 }
2148
2149 star_used = (dictlookup(locals, "*") != NULL);
Guido van Rossum0a697f61991-04-16 08:39:12 +00002150 next_instr = (unsigned char *) GETSTRINGVALUE(co->co_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00002151 for (;;) {
2152 cur_instr = next_instr;
2153 opcode = NEXTOP();
2154 if (opcode == STOP_CODE)
2155 break;
2156 if (HAS_ARG(opcode))
2157 oparg = NEXTARG();
2158 if (opcode == LOAD_NAME) {
2159 name = GETNAMEOBJ(oparg);
Guido van Rossum83163251991-08-16 08:58:43 +00002160 if (dict2lookup(locals, name) != NULL)
Guido van Rossum282914b1991-04-04 10:42:56 +00002161 *cur_instr = LOAD_LOCAL;
Guido van Rossum83163251991-08-16 08:58:43 +00002162 else {
2163 err_clear();
2164 if (!star_used)
2165 *cur_instr = LOAD_GLOBAL;
2166 }
Guido van Rossum282914b1991-04-04 10:42:56 +00002167 }
2168 }
2169
2170 DECREF(locals);
2171}
2172
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002173codeobject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002174compile(n, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002175 node *n;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002176 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002177{
2178 struct compiling sc;
2179 codeobject *co;
Guido van Rossuma082ce41991-06-04 19:41:56 +00002180 object *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002181 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002182 return NULL;
2183 compile_node(&sc, n);
2184 com_done(&sc);
Guido van Rossuma082ce41991-06-04 19:41:56 +00002185 if (sc.c_errors == 0 && (v = newstringobject(filename)) != NULL) {
2186 co = newcodeobject(sc.c_code, sc.c_consts, sc.c_names, v);
2187 DECREF(v);
2188 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002189 else
2190 co = NULL;
2191 com_free(&sc);
Guido van Rossumfb8edfc1991-05-14 11:56:03 +00002192 if (co != NULL && filename[0] != '<')
Guido van Rossum282914b1991-04-04 10:42:56 +00002193 optimizer(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002194 return co;
2195}