blob: a8cd4e9418c5a8fabbda2a28ad144cbdaacc47b8 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum9bfef441993-03-29 10:43:31 +00002Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
3Amsterdam, The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
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'
Guido van Rossum3f5da241990-12-20 15:06:42 +000030*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +000031
Guido van Rossum3f5da241990-12-20 15:06:42 +000032#include "allobjects.h"
33
Guido van Rossum10dc2e81990-11-18 17:27:39 +000034#include "node.h"
35#include "token.h"
36#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000037#include "compile.h"
38#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000039#include "structmember.h"
40
41#include <ctype.h>
42
Guido van Rossum282914b1991-04-04 10:42:56 +000043extern int errno;
44
Guido van Rossum3f5da241990-12-20 15:06:42 +000045#define OFF(x) offsetof(codeobject, x)
46
47static struct memberlist code_memberlist[] = {
Guido van Rossum39d942d1992-01-12 02:30:05 +000048 {"co_code", T_OBJECT, OFF(co_code), READONLY},
49 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
50 {"co_names", T_OBJECT, OFF(co_names), READONLY},
51 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000052 {"co_name", T_OBJECT, OFF(co_name), 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);
Guido van Rossum9bfef441993-03-29 10:43:31 +000072 XDECREF(co->co_name);
Guido van Rossum3f5da241990-12-20 15:06:42 +000073 DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +000074}
75
Guido van Rossum2dff9911992-09-03 20:50:59 +000076static object *
77code_repr(co)
78 codeobject *co;
79{
80 char buf[500];
81 int lineno = -1;
82 char *p = GETSTRINGVALUE(co->co_code);
83 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +000084 char *name = "???";
Guido van Rossum2dff9911992-09-03 20:50:59 +000085 if (*p == SET_LINENO)
86 lineno = (p[1] & 0xff) | ((p[2] & 0xff) << 8);
87 if (co->co_filename && is_stringobject(co->co_filename))
88 filename = getstringvalue(co->co_filename);
Guido van Rossum9bfef441993-03-29 10:43:31 +000089 if (co->co_name && is_stringobject(co->co_name))
90 name = getstringvalue(co->co_name);
91 sprintf(buf, "<code object %.100s at %lx, file \"%.300s\", line %d>",
92 name, (long)co, filename, lineno);
Guido van Rossum2dff9911992-09-03 20:50:59 +000093 return newstringobject(buf);
94}
95
Guido van Rossum10dc2e81990-11-18 17:27:39 +000096typeobject Codetype = {
97 OB_HEAD_INIT(&Typetype)
98 0,
99 "code",
100 sizeof(codeobject),
101 0,
102 code_dealloc, /*tp_dealloc*/
103 0, /*tp_print*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000104 code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000105 0, /*tp_setattr*/
106 0, /*tp_compare*/
Guido van Rossum2dff9911992-09-03 20:50:59 +0000107 code_repr, /*tp_repr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000108 0, /*tp_as_number*/
109 0, /*tp_as_sequence*/
110 0, /*tp_as_mapping*/
111};
112
Guido van Rossuma082ce41991-06-04 19:41:56 +0000113codeobject *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000114newcodeobject(code, consts, names, filename, name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000115 object *code;
116 object *consts;
117 object *names;
Guido van Rossuma082ce41991-06-04 19:41:56 +0000118 object *filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000119 object *name;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000120{
121 codeobject *co;
122 int i;
123 /* Check argument types */
124 if (code == NULL || !is_stringobject(code) ||
125 consts == NULL || !is_listobject(consts) ||
Guido van Rossum9bfef441993-03-29 10:43:31 +0000126 names == NULL || !is_listobject(names) ||
127 name == NULL || !is_stringobject(name)) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000128 err_badcall();
129 return NULL;
130 }
131 /* Make sure the list of names contains only strings */
132 for (i = getlistsize(names); --i >= 0; ) {
133 object *v = getlistitem(names, i);
134 if (v == NULL || !is_stringobject(v)) {
135 err_badcall();
136 return NULL;
137 }
138 }
139 co = NEWOBJ(codeobject, &Codetype);
140 if (co != NULL) {
141 INCREF(code);
142 co->co_code = (stringobject *)code;
143 INCREF(consts);
144 co->co_consts = consts;
145 INCREF(names);
146 co->co_names = names;
Guido van Rossuma082ce41991-06-04 19:41:56 +0000147 INCREF(filename);
148 co->co_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000149 INCREF(name);
150 co->co_name = name;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000151 }
152 return co;
153}
154
155
156/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000157
158#define MAXBLOCKS 20 /* Max static block nesting within a function */
159
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000160struct compiling {
161 object *c_code; /* string */
162 object *c_consts; /* list of objects */
163 object *c_names; /* list of strings (names) */
Guido van Rossumc5e96291991-12-10 13:53:51 +0000164 object *c_globals; /* dictionary */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000165 int c_nexti; /* index into c_code */
166 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000167 int c_infunction; /* set when compiling a function */
168 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000169 int c_begin; /* begin of current loop, for 'continue' */
170 int c_block[MAXBLOCKS]; /* stack of block types */
171 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000172 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000173 char *c_name; /* name of object (e.g. function) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000174};
175
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000176
177/* Interface to the block stack */
178
179static void
180block_push(c, type)
181 struct compiling *c;
182 int type;
183{
184 if (c->c_nblocks >= MAXBLOCKS) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +0000185 err_setstr(SystemError, "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000186 c->c_errors++;
187 }
188 else {
189 c->c_block[c->c_nblocks++] = type;
190 }
191}
192
193static void
194block_pop(c, type)
195 struct compiling *c;
196 int type;
197{
198 if (c->c_nblocks > 0)
199 c->c_nblocks--;
200 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
201 err_setstr(SystemError, "bad block pop");
202 c->c_errors++;
203 }
204}
205
206
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000207/* Prototypes */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000208
Guido van Rossum3f5da241990-12-20 15:06:42 +0000209static int com_init PROTO((struct compiling *, char *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000210static void com_free PROTO((struct compiling *));
211static void com_done PROTO((struct compiling *));
212static void com_node PROTO((struct compiling *, struct _node *));
213static void com_addbyte PROTO((struct compiling *, int));
214static void com_addint PROTO((struct compiling *, int));
215static void com_addoparg PROTO((struct compiling *, int, int));
216static void com_addfwref PROTO((struct compiling *, int, int *));
217static void com_backpatch PROTO((struct compiling *, int));
218static int com_add PROTO((struct compiling *, object *, object *));
219static int com_addconst PROTO((struct compiling *, object *));
220static int com_addname PROTO((struct compiling *, object *));
221static void com_addopname PROTO((struct compiling *, int, node *));
Guido van Rossum288a60f1991-12-16 13:05:10 +0000222static void com_list PROTO((struct compiling *, node *, int));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000223
224static int
Guido van Rossum3f5da241990-12-20 15:06:42 +0000225com_init(c, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000226 struct compiling *c;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000227 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000228{
Guido van Rossum62d46241991-04-03 19:00:23 +0000229 if ((c->c_code = newsizedstringobject((char *)NULL, 1000)) == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000230 goto fail_3;
231 if ((c->c_consts = newlistobject(0)) == NULL)
232 goto fail_2;
233 if ((c->c_names = newlistobject(0)) == NULL)
234 goto fail_1;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000235 if ((c->c_globals = newdictobject()) == NULL)
236 goto fail_0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000237 c->c_nexti = 0;
238 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000239 c->c_infunction = 0;
240 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000241 c->c_begin = 0;
242 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000243 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000244 c->c_name = "?";
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000245 return 1;
246
Guido van Rossumc5e96291991-12-10 13:53:51 +0000247 fail_0:
248 DECREF(c->c_names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000249 fail_1:
250 DECREF(c->c_consts);
251 fail_2:
252 DECREF(c->c_code);
253 fail_3:
254 return 0;
255}
256
257static void
258com_free(c)
259 struct compiling *c;
260{
261 XDECREF(c->c_code);
262 XDECREF(c->c_consts);
263 XDECREF(c->c_names);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000264 XDECREF(c->c_globals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000265}
266
267static void
268com_done(c)
269 struct compiling *c;
270{
271 if (c->c_code != NULL)
272 resizestring(&c->c_code, c->c_nexti);
273}
274
275static void
276com_addbyte(c, byte)
277 struct compiling *c;
278 int byte;
279{
280 int len;
281 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000282 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000283 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
284 abort();
Guido van Rossum01cfd441991-10-20 20:12:38 +0000285 */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000286 err_setstr(SystemError, "com_addbyte: byte out of range");
287 c->c_errors++;
288 }
289 if (c->c_code == NULL)
290 return;
291 len = getstringsize(c->c_code);
292 if (c->c_nexti >= len) {
293 if (resizestring(&c->c_code, len+1000) != 0) {
294 c->c_errors++;
295 return;
296 }
297 }
298 getstringvalue(c->c_code)[c->c_nexti++] = byte;
299}
300
301static void
302com_addint(c, x)
303 struct compiling *c;
304 int x;
305{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000306 com_addbyte(c, x & 0xff);
307 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000308}
309
310static void
311com_addoparg(c, op, arg)
312 struct compiling *c;
313 int op;
314 int arg;
315{
316 com_addbyte(c, op);
317 com_addint(c, arg);
318}
319
320static void
321com_addfwref(c, op, p_anchor)
322 struct compiling *c;
323 int op;
324 int *p_anchor;
325{
326 /* Compile a forward reference for backpatching */
327 int here;
328 int anchor;
329 com_addbyte(c, op);
330 here = c->c_nexti;
331 anchor = *p_anchor;
332 *p_anchor = here;
333 com_addint(c, anchor == 0 ? 0 : here - anchor);
334}
335
336static void
337com_backpatch(c, anchor)
338 struct compiling *c;
339 int anchor; /* Must be nonzero */
340{
341 unsigned char *code = (unsigned char *) getstringvalue(c->c_code);
342 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000343 int dist;
344 int prev;
345 for (;;) {
346 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000347 prev = code[anchor] + (code[anchor+1] << 8);
348 dist = target - (anchor+2);
349 code[anchor] = dist & 0xff;
350 code[anchor+1] = dist >> 8;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000351 if (!prev)
352 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000353 anchor -= prev;
354 }
355}
356
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000357/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000358
359static int
360com_add(c, list, v)
361 struct compiling *c;
362 object *list;
363 object *v;
364{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000365 int n = getlistsize(list);
366 int i;
367 for (i = n; --i >= 0; ) {
368 object *w = getlistitem(list, i);
Guido van Rossumefc0bd01991-07-01 18:44:20 +0000369 if (v->ob_type == w->ob_type && cmpobject(v, w) == 0)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000370 return i;
371 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000372 if (addlistitem(list, v) != 0)
373 c->c_errors++;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000374 return n;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000375}
376
377static int
378com_addconst(c, v)
379 struct compiling *c;
380 object *v;
381{
382 return com_add(c, c->c_consts, v);
383}
384
385static int
386com_addname(c, v)
387 struct compiling *c;
388 object *v;
389{
390 return com_add(c, c->c_names, v);
391}
392
393static void
394com_addopname(c, op, n)
395 struct compiling *c;
396 int op;
397 node *n;
398{
399 object *v;
400 int i;
401 char *name;
402 if (TYPE(n) == STAR)
403 name = "*";
404 else {
405 REQ(n, NAME);
406 name = STR(n);
407 }
408 if ((v = newstringobject(name)) == NULL) {
409 c->c_errors++;
410 i = 255;
411 }
412 else {
413 i = com_addname(c, v);
414 DECREF(v);
415 }
Guido van Rossumc5e96291991-12-10 13:53:51 +0000416 /* Hack to replace *_NAME opcodes by *_GLOBAL if necessary */
417 switch (op) {
418 case LOAD_NAME:
419 case STORE_NAME:
420 case DELETE_NAME:
421 if (dictlookup(c->c_globals, name) != NULL) {
422 switch (op) {
423 case LOAD_NAME: op = LOAD_GLOBAL; break;
424 case STORE_NAME: op = STORE_GLOBAL; break;
425 case DELETE_NAME: op = DELETE_GLOBAL; break;
426 }
427 }
428 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000429 com_addoparg(c, op, i);
430}
431
432static object *
433parsenumber(s)
434 char *s;
435{
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000436 extern long strtol PROTO((const char *, char **, int));
437 extern unsigned long strtoul PROTO((const char *, char **, int));
438 extern double strtod PROTO((const char *, char **));
Guido van Rossumc5e96291991-12-10 13:53:51 +0000439 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000440 long x;
Guido van Rossum282914b1991-04-04 10:42:56 +0000441 double xx;
442 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000443 end = s + strlen(s) - 1;
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000444 if (*end == 'l' || *end == 'L')
Guido van Rossumc5e96291991-12-10 13:53:51 +0000445 return long_scan(s, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000446 if (s[0] == '0')
447 x = (long) strtoul(s, &end, 0);
448 else
449 x = strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +0000450 if (*end == '\0') {
451 if (errno != 0) {
Guido van Rossumefb087b1991-12-16 15:41:41 +0000452 err_setstr(OverflowError,
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000453 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000454 return NULL;
455 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000456 return newintobject(x);
Guido van Rossum282914b1991-04-04 10:42:56 +0000457 }
458 errno = 0;
459 xx = strtod(s, &end);
460 if (*end == '\0') {
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000461#ifndef BROKEN_STRTOD
462 /* Some strtod() versions (e.g., in older SunOS systems)
463 set errno incorrectly; better to ignore overflows
464 than not to be able to use float literals at all! */
Guido van Rossum282914b1991-04-04 10:42:56 +0000465 if (errno != 0) {
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000466 err_setstr(OverflowError, "float literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000467 return NULL;
468 }
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000469#endif
Guido van Rossum282914b1991-04-04 10:42:56 +0000470 return newfloatobject(xx);
471 }
Guido van Rossumefb087b1991-12-16 15:41:41 +0000472 err_setstr(SystemError, "bad number syntax?!?!");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000473 return NULL;
474}
475
476static object *
477parsestr(s)
478 char *s;
479{
480 object *v;
481 int len;
482 char *buf;
483 char *p;
484 int c;
485 if (*s != '\'') {
486 err_badcall();
487 return NULL;
488 }
489 s++;
490 len = strlen(s);
491 if (s[--len] != '\'') {
492 err_badcall();
493 return NULL;
494 }
495 if (strchr(s, '\\') == NULL)
496 return newsizedstringobject(s, len);
497 v = newsizedstringobject((char *)NULL, len);
498 p = buf = getstringvalue(v);
499 while (*s != '\0' && *s != '\'') {
500 if (*s != '\\') {
501 *p++ = *s++;
502 continue;
503 }
504 s++;
505 switch (*s++) {
506 /* XXX This assumes ASCII! */
507 case '\\': *p++ = '\\'; break;
508 case '\'': *p++ = '\''; break;
509 case 'b': *p++ = '\b'; break;
510 case 'f': *p++ = '\014'; break; /* FF */
511 case 't': *p++ = '\t'; break;
512 case 'n': *p++ = '\n'; break;
513 case 'r': *p++ = '\r'; break;
514 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000515 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
516 case '0': case '1': case '2': case '3':
517 case '4': case '5': case '6': case '7':
518 c = s[-1] - '0';
519 if ('0' <= *s && *s <= '7') {
520 c = (c<<3) + *s++ - '0';
521 if ('0' <= *s && *s <= '7')
522 c = (c<<3) + *s++ - '0';
523 }
524 *p++ = c;
525 break;
526 case 'x':
527 if (isxdigit(*s)) {
528 sscanf(s, "%x", &c);
529 *p++ = c;
530 do {
531 s++;
532 } while (isxdigit(*s));
533 break;
534 }
535 /* FALLTHROUGH */
536 default: *p++ = '\\'; *p++ = s[-1]; break;
537 }
538 }
539 resizestring(&v, (int)(p - buf));
540 return v;
541}
542
543static void
544com_list_constructor(c, n)
545 struct compiling *c;
546 node *n;
547{
548 int len;
549 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000550 if (TYPE(n) != testlist)
551 REQ(n, exprlist);
552 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
553 len = (NCH(n) + 1) / 2;
554 for (i = 0; i < NCH(n); i += 2)
555 com_node(c, CHILD(n, i));
556 com_addoparg(c, BUILD_LIST, len);
557}
558
559static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000560com_dictmaker(c, n)
561 struct compiling *c;
562 node *n;
563{
564 int i;
565 /* dictmaker: test ':' test (',' test ':' value)* [','] */
566 for (i = 0; i+2 < NCH(n); i += 4) {
567 /* We must arrange things just right for STORE_SUBSCR.
568 It wants the stack to look like (value) (dict) (key) */
569 com_addbyte(c, DUP_TOP);
570 com_node(c, CHILD(n, i+2)); /* value */
571 com_addbyte(c, ROT_TWO);
572 com_node(c, CHILD(n, i)); /* key */
573 com_addbyte(c, STORE_SUBSCR);
574 }
575}
576
577static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000578com_atom(c, n)
579 struct compiling *c;
580 node *n;
581{
582 node *ch;
583 object *v;
584 int i;
585 REQ(n, atom);
586 ch = CHILD(n, 0);
587 switch (TYPE(ch)) {
588 case LPAR:
589 if (TYPE(CHILD(n, 1)) == RPAR)
590 com_addoparg(c, BUILD_TUPLE, 0);
591 else
592 com_node(c, CHILD(n, 1));
593 break;
594 case LSQB:
595 if (TYPE(CHILD(n, 1)) == RSQB)
596 com_addoparg(c, BUILD_LIST, 0);
597 else
598 com_list_constructor(c, CHILD(n, 1));
599 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000600 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000601 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000602 if (TYPE(CHILD(n, 1)) != RBRACE)
603 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000604 break;
605 case BACKQUOTE:
606 com_node(c, CHILD(n, 1));
607 com_addbyte(c, UNARY_CONVERT);
608 break;
609 case NUMBER:
610 if ((v = parsenumber(STR(ch))) == NULL) {
611 c->c_errors++;
612 i = 255;
613 }
614 else {
615 i = com_addconst(c, v);
616 DECREF(v);
617 }
618 com_addoparg(c, LOAD_CONST, i);
619 break;
620 case STRING:
621 if ((v = parsestr(STR(ch))) == NULL) {
622 c->c_errors++;
623 i = 255;
624 }
625 else {
626 i = com_addconst(c, v);
627 DECREF(v);
628 }
629 com_addoparg(c, LOAD_CONST, i);
630 break;
631 case NAME:
632 com_addopname(c, LOAD_NAME, ch);
633 break;
634 default:
635 fprintf(stderr, "node type %d\n", TYPE(ch));
636 err_setstr(SystemError, "com_atom: unexpected node type");
637 c->c_errors++;
638 }
639}
640
641static void
642com_slice(c, n, op)
643 struct compiling *c;
644 node *n;
645 int op;
646{
647 if (NCH(n) == 1) {
648 com_addbyte(c, op);
649 }
650 else if (NCH(n) == 2) {
651 if (TYPE(CHILD(n, 0)) != COLON) {
652 com_node(c, CHILD(n, 0));
653 com_addbyte(c, op+1);
654 }
655 else {
656 com_node(c, CHILD(n, 1));
657 com_addbyte(c, op+2);
658 }
659 }
660 else {
661 com_node(c, CHILD(n, 0));
662 com_node(c, CHILD(n, 2));
663 com_addbyte(c, op+3);
664 }
665}
666
667static void
668com_apply_subscript(c, n)
669 struct compiling *c;
670 node *n;
671{
672 REQ(n, subscript);
673 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) != COLON) {
674 /* It's a single subscript */
675 com_node(c, CHILD(n, 0));
676 com_addbyte(c, BINARY_SUBSCR);
677 }
678 else {
679 /* It's a slice: [expr] ':' [expr] */
680 com_slice(c, n, SLICE);
681 }
682}
683
684static void
685com_call_function(c, n)
686 struct compiling *c;
687 node *n; /* EITHER testlist OR ')' */
688{
689 if (TYPE(n) == RPAR) {
Guido van Rossum288a60f1991-12-16 13:05:10 +0000690 com_addoparg(c, BUILD_TUPLE, 0);
691 com_addbyte(c, BINARY_CALL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000692 }
693 else {
Guido van Rossum288a60f1991-12-16 13:05:10 +0000694 REQ(n, testlist);
695 com_list(c, n, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000696 com_addbyte(c, BINARY_CALL);
697 }
698}
699
700static void
701com_select_member(c, n)
702 struct compiling *c;
703 node *n;
704{
705 com_addopname(c, LOAD_ATTR, n);
706}
707
708static void
709com_apply_trailer(c, n)
710 struct compiling *c;
711 node *n;
712{
713 REQ(n, trailer);
714 switch (TYPE(CHILD(n, 0))) {
715 case LPAR:
716 com_call_function(c, CHILD(n, 1));
717 break;
718 case DOT:
719 com_select_member(c, CHILD(n, 1));
720 break;
721 case LSQB:
722 com_apply_subscript(c, CHILD(n, 1));
723 break;
724 default:
725 err_setstr(SystemError,
726 "com_apply_trailer: unknown trailer type");
727 c->c_errors++;
728 }
729}
730
731static void
732com_factor(c, n)
733 struct compiling *c;
734 node *n;
735{
736 int i;
737 REQ(n, factor);
738 if (TYPE(CHILD(n, 0)) == PLUS) {
739 com_factor(c, CHILD(n, 1));
740 com_addbyte(c, UNARY_POSITIVE);
741 }
742 else if (TYPE(CHILD(n, 0)) == MINUS) {
743 com_factor(c, CHILD(n, 1));
744 com_addbyte(c, UNARY_NEGATIVE);
745 }
Guido van Rossum7928cd71991-10-24 14:59:31 +0000746 else if (TYPE(CHILD(n, 0)) == TILDE) {
747 com_factor(c, CHILD(n, 1));
748 com_addbyte(c, UNARY_INVERT);
749 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000750 else {
751 com_atom(c, CHILD(n, 0));
752 for (i = 1; i < NCH(n); i++)
753 com_apply_trailer(c, CHILD(n, i));
754 }
755}
756
757static void
758com_term(c, n)
759 struct compiling *c;
760 node *n;
761{
762 int i;
763 int op;
764 REQ(n, term);
765 com_factor(c, CHILD(n, 0));
766 for (i = 2; i < NCH(n); i += 2) {
767 com_factor(c, CHILD(n, i));
768 switch (TYPE(CHILD(n, i-1))) {
769 case STAR:
770 op = BINARY_MULTIPLY;
771 break;
772 case SLASH:
773 op = BINARY_DIVIDE;
774 break;
775 case PERCENT:
776 op = BINARY_MODULO;
777 break;
778 default:
779 err_setstr(SystemError,
Guido van Rossum7928cd71991-10-24 14:59:31 +0000780 "com_term: operator not *, / or %");
781 c->c_errors++;
782 op = 255;
783 }
784 com_addbyte(c, op);
785 }
786}
787
788static void
789com_arith_expr(c, n)
790 struct compiling *c;
791 node *n;
792{
793 int i;
794 int op;
795 REQ(n, arith_expr);
796 com_term(c, CHILD(n, 0));
797 for (i = 2; i < NCH(n); i += 2) {
798 com_term(c, CHILD(n, i));
799 switch (TYPE(CHILD(n, i-1))) {
800 case PLUS:
801 op = BINARY_ADD;
802 break;
803 case MINUS:
804 op = BINARY_SUBTRACT;
805 break;
806 default:
807 err_setstr(SystemError,
808 "com_arith_expr: operator not + or -");
809 c->c_errors++;
810 op = 255;
811 }
812 com_addbyte(c, op);
813 }
814}
815
816static void
817com_shift_expr(c, n)
818 struct compiling *c;
819 node *n;
820{
821 int i;
822 int op;
823 REQ(n, shift_expr);
824 com_arith_expr(c, CHILD(n, 0));
825 for (i = 2; i < NCH(n); i += 2) {
826 com_arith_expr(c, CHILD(n, i));
827 switch (TYPE(CHILD(n, i-1))) {
828 case LEFTSHIFT:
829 op = BINARY_LSHIFT;
830 break;
831 case RIGHTSHIFT:
832 op = BINARY_RSHIFT;
833 break;
834 default:
835 err_setstr(SystemError,
836 "com_shift_expr: operator not << or >>");
837 c->c_errors++;
838 op = 255;
839 }
840 com_addbyte(c, op);
841 }
842}
843
844static void
845com_and_expr(c, n)
846 struct compiling *c;
847 node *n;
848{
849 int i;
850 int op;
851 REQ(n, and_expr);
852 com_shift_expr(c, CHILD(n, 0));
853 for (i = 2; i < NCH(n); i += 2) {
854 com_shift_expr(c, CHILD(n, i));
855 if (TYPE(CHILD(n, i-1)) == AMPER) {
856 op = BINARY_AND;
857 }
858 else {
859 err_setstr(SystemError,
860 "com_and_expr: operator not &");
861 c->c_errors++;
862 op = 255;
863 }
864 com_addbyte(c, op);
865 }
866}
867
868static void
869com_xor_expr(c, n)
870 struct compiling *c;
871 node *n;
872{
873 int i;
874 int op;
875 REQ(n, xor_expr);
876 com_and_expr(c, CHILD(n, 0));
877 for (i = 2; i < NCH(n); i += 2) {
878 com_and_expr(c, CHILD(n, i));
879 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
880 op = BINARY_XOR;
881 }
882 else {
883 err_setstr(SystemError,
884 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000885 c->c_errors++;
886 op = 255;
887 }
888 com_addbyte(c, op);
889 }
890}
891
892static void
893com_expr(c, n)
894 struct compiling *c;
895 node *n;
896{
897 int i;
898 int op;
899 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000900 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000901 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +0000902 com_xor_expr(c, CHILD(n, i));
903 if (TYPE(CHILD(n, i-1)) == VBAR) {
904 op = BINARY_OR;
905 }
906 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000907 err_setstr(SystemError,
Guido van Rossum7928cd71991-10-24 14:59:31 +0000908 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000909 c->c_errors++;
910 op = 255;
911 }
912 com_addbyte(c, op);
913 }
914}
915
916static enum cmp_op
917cmp_type(n)
918 node *n;
919{
920 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +0000921 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000922 | 'in' | 'not' 'in' | 'is' | 'is' not' */
923 if (NCH(n) == 1) {
924 n = CHILD(n, 0);
925 switch (TYPE(n)) {
926 case LESS: return LT;
927 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +0000928 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000929 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +0000930 case LESSEQUAL: return LE;
931 case GREATEREQUAL: return GE;
932 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000933 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
934 if (strcmp(STR(n), "is") == 0) return IS;
935 }
936 }
937 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000938 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000939 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
940 return NOT_IN;
941 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
942 return IS_NOT;
943 }
944 }
945 return BAD;
946}
947
948static void
949com_comparison(c, n)
950 struct compiling *c;
951 node *n;
952{
953 int i;
954 enum cmp_op op;
955 int anchor;
956 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
957 com_expr(c, CHILD(n, 0));
958 if (NCH(n) == 1)
959 return;
960
961 /****************************************************************
962 The following code is generated for all but the last
963 comparison in a chain:
964
965 label: on stack: opcode: jump to:
966
967 a <code to load b>
968 a, b DUP_TOP
969 a, b, b ROT_THREE
970 b, a, b COMPARE_OP
971 b, 0-or-1 JUMP_IF_FALSE L1
972 b, 1 POP_TOP
973 b
974
975 We are now ready to repeat this sequence for the next
976 comparison in the chain.
977
978 For the last we generate:
979
980 b <code to load c>
981 b, c COMPARE_OP
982 0-or-1
983
984 If there were any jumps to L1 (i.e., there was more than one
985 comparison), we generate:
986
987 0-or-1 JUMP_FORWARD L2
988 L1: b, 0 ROT_TWO
989 0, b POP_TOP
990 0
991 L2:
992 ****************************************************************/
993
994 anchor = 0;
995
996 for (i = 2; i < NCH(n); i += 2) {
997 com_expr(c, CHILD(n, i));
998 if (i+2 < NCH(n)) {
999 com_addbyte(c, DUP_TOP);
1000 com_addbyte(c, ROT_THREE);
1001 }
1002 op = cmp_type(CHILD(n, i-1));
1003 if (op == BAD) {
1004 err_setstr(SystemError,
1005 "com_comparison: unknown comparison op");
1006 c->c_errors++;
1007 }
1008 com_addoparg(c, COMPARE_OP, op);
1009 if (i+2 < NCH(n)) {
1010 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1011 com_addbyte(c, POP_TOP);
1012 }
1013 }
1014
1015 if (anchor) {
1016 int anchor2 = 0;
1017 com_addfwref(c, JUMP_FORWARD, &anchor2);
1018 com_backpatch(c, anchor);
1019 com_addbyte(c, ROT_TWO);
1020 com_addbyte(c, POP_TOP);
1021 com_backpatch(c, anchor2);
1022 }
1023}
1024
1025static void
1026com_not_test(c, n)
1027 struct compiling *c;
1028 node *n;
1029{
1030 REQ(n, not_test); /* 'not' not_test | comparison */
1031 if (NCH(n) == 1) {
1032 com_comparison(c, CHILD(n, 0));
1033 }
1034 else {
1035 com_not_test(c, CHILD(n, 1));
1036 com_addbyte(c, UNARY_NOT);
1037 }
1038}
1039
1040static void
1041com_and_test(c, n)
1042 struct compiling *c;
1043 node *n;
1044{
1045 int i;
1046 int anchor;
1047 REQ(n, and_test); /* not_test ('and' not_test)* */
1048 anchor = 0;
1049 i = 0;
1050 for (;;) {
1051 com_not_test(c, CHILD(n, i));
1052 if ((i += 2) >= NCH(n))
1053 break;
1054 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1055 com_addbyte(c, POP_TOP);
1056 }
1057 if (anchor)
1058 com_backpatch(c, anchor);
1059}
1060
1061static void
1062com_test(c, n)
1063 struct compiling *c;
1064 node *n;
1065{
1066 int i;
1067 int anchor;
1068 REQ(n, test); /* and_test ('and' and_test)* */
1069 anchor = 0;
1070 i = 0;
1071 for (;;) {
1072 com_and_test(c, CHILD(n, i));
1073 if ((i += 2) >= NCH(n))
1074 break;
1075 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1076 com_addbyte(c, POP_TOP);
1077 }
1078 if (anchor)
1079 com_backpatch(c, anchor);
1080}
1081
1082static void
Guido van Rossum288a60f1991-12-16 13:05:10 +00001083com_list(c, n, toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001084 struct compiling *c;
1085 node *n;
Guido van Rossum288a60f1991-12-16 13:05:10 +00001086 int toplevel; /* If nonzero, *always* build a tuple */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001087{
1088 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001089 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001090 com_node(c, CHILD(n, 0));
1091 }
1092 else {
1093 int i;
1094 int len;
1095 len = (NCH(n) + 1) / 2;
1096 for (i = 0; i < NCH(n); i += 2)
1097 com_node(c, CHILD(n, i));
1098 com_addoparg(c, BUILD_TUPLE, len);
1099 }
1100}
1101
1102
1103/* Begin of assignment compilation */
1104
1105static void com_assign_name PROTO((struct compiling *, node *, int));
1106static void com_assign PROTO((struct compiling *, node *, int));
1107
1108static void
1109com_assign_attr(c, n, assigning)
1110 struct compiling *c;
1111 node *n;
1112 int assigning;
1113{
1114 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
1115}
1116
1117static void
1118com_assign_slice(c, n, assigning)
1119 struct compiling *c;
1120 node *n;
1121 int assigning;
1122{
1123 com_slice(c, n, assigning ? STORE_SLICE : DELETE_SLICE);
1124}
1125
1126static void
1127com_assign_subscript(c, n, assigning)
1128 struct compiling *c;
1129 node *n;
1130 int assigning;
1131{
1132 com_node(c, n);
1133 com_addbyte(c, assigning ? STORE_SUBSCR : DELETE_SUBSCR);
1134}
1135
1136static void
1137com_assign_trailer(c, n, assigning)
1138 struct compiling *c;
1139 node *n;
1140 int assigning;
1141{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001142 REQ(n, trailer);
1143 switch (TYPE(CHILD(n, 0))) {
1144 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001145 err_setstr(SyntaxError, "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001146 c->c_errors++;
1147 break;
1148 case DOT: /* '.' NAME */
1149 com_assign_attr(c, CHILD(n, 1), assigning);
1150 break;
1151 case LSQB: /* '[' subscript ']' */
1152 n = CHILD(n, 1);
1153 REQ(n, subscript); /* subscript: expr | [expr] ':' [expr] */
1154 if (NCH(n) > 1 || TYPE(CHILD(n, 0)) == COLON)
1155 com_assign_slice(c, n, assigning);
1156 else
1157 com_assign_subscript(c, CHILD(n, 0), assigning);
1158 break;
1159 default:
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001160 err_setstr(SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001161 c->c_errors++;
1162 }
1163}
1164
1165static void
1166com_assign_tuple(c, n, assigning)
1167 struct compiling *c;
1168 node *n;
1169 int assigning;
1170{
1171 int i;
1172 if (TYPE(n) != testlist)
1173 REQ(n, exprlist);
1174 if (assigning)
1175 com_addoparg(c, UNPACK_TUPLE, (NCH(n)+1)/2);
1176 for (i = 0; i < NCH(n); i += 2)
1177 com_assign(c, CHILD(n, i), assigning);
1178}
1179
1180static void
1181com_assign_list(c, n, assigning)
1182 struct compiling *c;
1183 node *n;
1184 int assigning;
1185{
1186 int i;
1187 if (assigning)
1188 com_addoparg(c, UNPACK_LIST, (NCH(n)+1)/2);
1189 for (i = 0; i < NCH(n); i += 2)
1190 com_assign(c, CHILD(n, i), assigning);
1191}
1192
1193static void
1194com_assign_name(c, n, assigning)
1195 struct compiling *c;
1196 node *n;
1197 int assigning;
1198{
1199 REQ(n, NAME);
1200 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
1201}
1202
1203static void
1204com_assign(c, n, assigning)
1205 struct compiling *c;
1206 node *n;
1207 int assigning;
1208{
1209 /* Loop to avoid trivial recursion */
1210 for (;;) {
1211 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001212
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001213 case exprlist:
1214 case testlist:
1215 if (NCH(n) > 1) {
1216 com_assign_tuple(c, n, assigning);
1217 return;
1218 }
1219 n = CHILD(n, 0);
1220 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001221
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001222 case test:
1223 case and_test:
1224 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001225 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001226 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001227 case xor_expr:
1228 case and_expr:
1229 case shift_expr:
1230 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001231 case term:
1232 if (NCH(n) > 1) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001233 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001234 "can't assign to operator");
1235 c->c_errors++;
1236 return;
1237 }
1238 n = CHILD(n, 0);
1239 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001240
Guido van Rossum7928cd71991-10-24 14:59:31 +00001241 case factor: /* ('+'|'-'|'~') factor | atom trailer* */
1242 if (TYPE(CHILD(n, 0)) != atom) { /* '+'|'-'|'~' */
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001243 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001244 "can't assign to operator");
1245 c->c_errors++;
1246 return;
1247 }
1248 if (NCH(n) > 1) { /* trailer present */
1249 int i;
1250 com_node(c, CHILD(n, 0));
1251 for (i = 1; i+1 < NCH(n); i++) {
1252 com_apply_trailer(c, CHILD(n, i));
1253 } /* NB i is still alive */
1254 com_assign_trailer(c,
1255 CHILD(n, i), assigning);
1256 return;
1257 }
1258 n = CHILD(n, 0);
1259 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001260
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001261 case atom:
1262 switch (TYPE(CHILD(n, 0))) {
1263 case LPAR:
1264 n = CHILD(n, 1);
1265 if (TYPE(n) == RPAR) {
1266 /* XXX Should allow () = () ??? */
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001267 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001268 "can't assign to ()");
1269 c->c_errors++;
1270 return;
1271 }
1272 break;
1273 case LSQB:
1274 n = CHILD(n, 1);
1275 if (TYPE(n) == RSQB) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001276 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001277 "can't assign to []");
1278 c->c_errors++;
1279 return;
1280 }
1281 com_assign_list(c, n, assigning);
1282 return;
1283 case NAME:
1284 com_assign_name(c, CHILD(n, 0), assigning);
1285 return;
1286 default:
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001287 err_setstr(SyntaxError,
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001288 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001289 c->c_errors++;
1290 return;
1291 }
1292 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001293
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001294 default:
1295 fprintf(stderr, "node type %d\n", TYPE(n));
1296 err_setstr(SystemError, "com_assign: bad node");
1297 c->c_errors++;
1298 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001299
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001300 }
1301 }
1302}
1303
1304static void
1305com_expr_stmt(c, n)
1306 struct compiling *c;
1307 node *n;
1308{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001309 REQ(n, expr_stmt); /* exprlist ('=' exprlist)* */
1310 com_node(c, CHILD(n, NCH(n)-1));
1311 if (NCH(n) == 1) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001312 com_addbyte(c, PRINT_EXPR);
1313 }
1314 else {
1315 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001316 for (i = 0; i < NCH(n)-2; i+=2) {
1317 if (i+2 < NCH(n)-2)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001318 com_addbyte(c, DUP_TOP);
1319 com_assign(c, CHILD(n, i), 1/*assign*/);
1320 }
1321 }
1322}
1323
1324static void
1325com_print_stmt(c, n)
1326 struct compiling *c;
1327 node *n;
1328{
1329 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001330 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
1331 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001332 com_node(c, CHILD(n, i));
1333 com_addbyte(c, PRINT_ITEM);
1334 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001335 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001336 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001337 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001338}
1339
1340static void
1341com_return_stmt(c, n)
1342 struct compiling *c;
1343 node *n;
1344{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001345 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001346 if (!c->c_infunction) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001347 err_setstr(SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001348 c->c_errors++;
1349 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001350 if (NCH(n) < 2)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001351 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1352 else
1353 com_node(c, CHILD(n, 1));
1354 com_addbyte(c, RETURN_VALUE);
1355}
1356
1357static void
1358com_raise_stmt(c, n)
1359 struct compiling *c;
1360 node *n;
1361{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001362 REQ(n, raise_stmt); /* 'raise' test [',' test] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001363 com_node(c, CHILD(n, 1));
1364 if (NCH(n) > 3)
1365 com_node(c, CHILD(n, 3));
1366 else
1367 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1368 com_addbyte(c, RAISE_EXCEPTION);
1369}
1370
1371static void
1372com_import_stmt(c, n)
1373 struct compiling *c;
1374 node *n;
1375{
1376 int i;
1377 REQ(n, import_stmt);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001378 /* 'import' NAME (',' NAME)* |
1379 'from' NAME 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001380 if (STR(CHILD(n, 0))[0] == 'f') {
1381 /* 'from' NAME 'import' ... */
1382 REQ(CHILD(n, 1), NAME);
1383 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
1384 for (i = 3; i < NCH(n); i += 2)
1385 com_addopname(c, IMPORT_FROM, CHILD(n, i));
1386 com_addbyte(c, POP_TOP);
1387 }
1388 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001389 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001390 for (i = 1; i < NCH(n); i += 2) {
1391 com_addopname(c, IMPORT_NAME, CHILD(n, i));
1392 com_addopname(c, STORE_NAME, CHILD(n, i));
1393 }
1394 }
1395}
1396
1397static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00001398com_global_stmt(c, n)
1399 struct compiling *c;
1400 node *n;
1401{
1402 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001403 REQ(n, global_stmt);
1404 /* 'global' NAME (',' NAME)* */
1405 for (i = 1; i < NCH(n); i += 2) {
1406 if (dictinsert(c->c_globals, STR(CHILD(n, i)), None) != 0)
1407 c->c_errors++;
1408 }
1409}
1410
Guido van Rossum25831651993-05-19 14:50:45 +00001411#define strequ(a, b) (strcmp((a), (b)) == 0)
1412
1413static void
1414com_access_stmt(c, n)
1415 struct compiling *c;
1416 node *n;
1417{
1418 int i, j, k, mode, imode;
1419 object *vmode;
1420 REQ(n, access_stmt);
1421 /* 'access' NAME (',' NAME)* ':' accesstype (',' accesstype)*
1422 accesstype: NAME+ */
1423
1424 /* Find where the colon is */
1425 i = 1;
1426 while (TYPE(CHILD(n,i-1)) != COLON)
1427 i += 1;
1428
1429 /* Calculate the mode mask */
1430 mode = 0;
1431 for (j = i; j < NCH(n); j += 2) {
Guido van Rossum81daa321993-05-20 14:24:46 +00001432 int r = 0, w = 0, p = 0;
1433 for (k = 0; k < NCH(CHILD(n,j)); k++) {
Guido van Rossum25831651993-05-19 14:50:45 +00001434 if (strequ(STR(CHILD(CHILD(n,j),k)), "public"))
1435 p = 0;
1436 else if (strequ(STR(CHILD(CHILD(n,j),k)), "protected"))
1437 p = 1;
1438 else if (strequ(STR(CHILD(CHILD(n,j),k)), "private"))
1439 p = 2;
1440 else if (strequ(STR(CHILD(CHILD(n,j),k)), "read"))
1441 r = 1;
1442 else if (strequ(STR(CHILD(CHILD(n,j),k)), "write"))
1443 w = 1;
1444 else /* XXX should make this an exception */
1445 fprintf(stderr, "bad access type %s\n",
1446 STR(CHILD(CHILD(n,j),k)));
1447 }
1448 if (r == 0 && w == 0)
Guido van Rossum81daa321993-05-20 14:24:46 +00001449 r = w = 1;
Guido van Rossum25831651993-05-19 14:50:45 +00001450 if (p == 0) {
1451 if (r == 1) mode |= AC_R_PUBLIC;
1452 if (w == 1) mode |= AC_W_PUBLIC;
1453 } else if (p == 1) {
1454 if (r == 1) mode |= AC_R_PROTECTED;
1455 if (w == 1) mode |= AC_W_PROTECTED;
1456 } else {
1457 if (r == 1) mode |= AC_R_PRIVATE;
1458 if (w == 1) mode |= AC_W_PRIVATE;
1459 }
1460 }
1461 vmode = newintobject((long)mode);
1462 imode = com_addconst(c, vmode);
1463 XDECREF(vmode);
1464 for (i = 1; TYPE(CHILD(n,i-1)) != COLON; i+=2) {
1465 com_addoparg(c, LOAD_CONST, imode);
1466 com_addopname(c, ACCESS_MODE, CHILD(n, i));
1467 }
1468}
1469
Guido van Rossumc5e96291991-12-10 13:53:51 +00001470static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001471com_if_stmt(c, n)
1472 struct compiling *c;
1473 node *n;
1474{
1475 int i;
1476 int anchor = 0;
1477 REQ(n, if_stmt);
1478 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
1479 for (i = 0; i+3 < NCH(n); i+=4) {
1480 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001481 node *ch = CHILD(n, i+1);
1482 if (i > 0)
1483 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001484 com_node(c, CHILD(n, i+1));
1485 com_addfwref(c, JUMP_IF_FALSE, &a);
1486 com_addbyte(c, POP_TOP);
1487 com_node(c, CHILD(n, i+3));
1488 com_addfwref(c, JUMP_FORWARD, &anchor);
1489 com_backpatch(c, a);
1490 com_addbyte(c, POP_TOP);
1491 }
1492 if (i+2 < NCH(n))
1493 com_node(c, CHILD(n, i+2));
1494 com_backpatch(c, anchor);
1495}
1496
1497static void
1498com_while_stmt(c, n)
1499 struct compiling *c;
1500 node *n;
1501{
1502 int break_anchor = 0;
1503 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001504 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001505 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
1506 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001507 block_push(c, SETUP_LOOP);
1508 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001509 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001510 com_node(c, CHILD(n, 1));
1511 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1512 com_addbyte(c, POP_TOP);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001513 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001514 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001515 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001516 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1517 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001518 com_backpatch(c, anchor);
1519 com_addbyte(c, POP_TOP);
1520 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001521 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001522 if (NCH(n) > 4)
1523 com_node(c, CHILD(n, 6));
1524 com_backpatch(c, break_anchor);
1525}
1526
1527static void
1528com_for_stmt(c, n)
1529 struct compiling *c;
1530 node *n;
1531{
1532 object *v;
1533 int break_anchor = 0;
1534 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001535 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001536 REQ(n, for_stmt);
1537 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
1538 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001539 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001540 com_node(c, CHILD(n, 3));
1541 v = newintobject(0L);
1542 if (v == NULL)
1543 c->c_errors++;
1544 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
1545 XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001546 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001547 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001548 com_addfwref(c, FOR_LOOP, &anchor);
1549 com_assign(c, CHILD(n, 1), 1/*assigning*/);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001550 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001551 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001552 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001553 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1554 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001555 com_backpatch(c, anchor);
1556 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001557 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001558 if (NCH(n) > 8)
1559 com_node(c, CHILD(n, 8));
1560 com_backpatch(c, break_anchor);
1561}
1562
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001563/* Although 'execpt' and 'finally' clauses can be combined
1564 syntactically, they are compiled separately. In fact,
1565 try: S
1566 except E1: S1
1567 except E2: S2
1568 ...
1569 finally: Sf
1570 is equivalent to
1571 try:
1572 try: S
1573 except E1: S1
1574 except E2: S2
1575 ...
1576 finally: Sf
1577 meaning that the 'finally' clause is entered even if things
1578 go wrong again in an exception handler. Note that this is
1579 not the case for exception handlers: at most one is entered.
1580
1581 Code generated for "try: S finally: Sf" is as follows:
1582
1583 SETUP_FINALLY L
1584 <code for S>
1585 POP_BLOCK
1586 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001587 L: <code for Sf>
1588 END_FINALLY
1589
1590 The special instructions use the block stack. Each block
1591 stack entry contains the instruction that created it (here
1592 SETUP_FINALLY), the level of the value stack at the time the
1593 block stack entry was created, and a label (here L).
1594
1595 SETUP_FINALLY:
1596 Pushes the current value stack level and the label
1597 onto the block stack.
1598 POP_BLOCK:
1599 Pops en entry from the block stack, and pops the value
1600 stack until its level is the same as indicated on the
1601 block stack. (The label is ignored.)
1602 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001603 Pops a variable number of entries from the *value* stack
1604 and re-raises the exception they specify. The number of
1605 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001606
1607 The block stack is unwound when an exception is raised:
1608 when a SETUP_FINALLY entry is found, the exception is pushed
1609 onto the value stack (and the exception condition is cleared),
1610 and the interpreter jumps to the label gotten from the block
1611 stack.
1612
1613 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00001614 (The contents of the value stack is shown in [], with the top
1615 at the right; 'tb' is trace-back info, 'val' the exception's
1616 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001617
1618 Value stack Label Instruction Argument
1619 [] SETUP_EXCEPT L1
1620 [] <code for S>
1621 [] POP_BLOCK
1622 [] JUMP_FORWARD L0
1623
Guido van Rossum3f5da241990-12-20 15:06:42 +00001624 [tb, val, exc] L1: DUP )
1625 [tb, val, exc, exc] <evaluate E1> )
1626 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
1627 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
1628 [tb, val, exc, 1] POP )
1629 [tb, val, exc] POP
1630 [tb, val] <assign to V1> (or POP if no V1)
1631 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001632 [] <code for S1>
1633 JUMP_FORWARD L0
1634
Guido van Rossum3f5da241990-12-20 15:06:42 +00001635 [tb, val, exc, 0] L2: POP
1636 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001637 .............................etc.......................
1638
Guido van Rossum3f5da241990-12-20 15:06:42 +00001639 [tb, val, exc, 0] Ln+1: POP
1640 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001641
1642 [] L0: <next statement>
1643
1644 Of course, parts are not generated if Vi or Ei is not present.
1645*/
1646
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001647static void
1648com_try_stmt(c, n)
1649 struct compiling *c;
1650 node *n;
1651{
1652 int finally_anchor = 0;
1653 int except_anchor = 0;
1654 REQ(n, try_stmt);
Guido van Rossum94fb82e1992-04-05 14:24:50 +00001655 /* 'try' ':' suite (except_clause ':' suite)*
1656 | 'try' ':' 'finally' ':' suite */
1657
1658 /* XXX This can be simplified because except and finally can
1659 no longer be mixed in a single try statement */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001660
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001661 if (NCH(n) > 3 && TYPE(CHILD(n, NCH(n)-3)) != except_clause) {
1662 /* Have a 'finally' clause */
1663 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001664 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001665 }
1666 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == except_clause) {
1667 /* Have an 'except' clause */
1668 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001669 block_push(c, SETUP_EXCEPT);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001670 }
1671 com_node(c, CHILD(n, 2));
1672 if (except_anchor) {
1673 int end_anchor = 0;
1674 int i;
1675 node *ch;
1676 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001677 block_pop(c, SETUP_EXCEPT);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001678 com_addfwref(c, JUMP_FORWARD, &end_anchor);
1679 com_backpatch(c, except_anchor);
1680 for (i = 3;
1681 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
1682 i += 3) {
1683 /* except_clause: 'except' [expr [',' expr]] */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001684 if (except_anchor == 0) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001685 err_setstr(SyntaxError,
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001686 "default 'except:' must be last");
1687 c->c_errors++;
1688 break;
1689 }
1690 except_anchor = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001691 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001692 if (NCH(ch) > 1) {
1693 com_addbyte(c, DUP_TOP);
1694 com_node(c, CHILD(ch, 1));
1695 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001696 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001697 com_addbyte(c, POP_TOP);
1698 }
1699 com_addbyte(c, POP_TOP);
1700 if (NCH(ch) > 3)
1701 com_assign(c, CHILD(ch, 3), 1/*assigning*/);
1702 else
1703 com_addbyte(c, POP_TOP);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001704 com_addbyte(c, POP_TOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001705 com_node(c, CHILD(n, i+2));
1706 com_addfwref(c, JUMP_FORWARD, &end_anchor);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001707 if (except_anchor) {
1708 com_backpatch(c, except_anchor);
1709 com_addbyte(c, POP_TOP);
1710 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001711 }
1712 com_addbyte(c, END_FINALLY);
1713 com_backpatch(c, end_anchor);
1714 }
1715 if (finally_anchor) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001716 node *ch;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001717 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001718 block_pop(c, SETUP_FINALLY);
1719 block_push(c, END_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001720 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001721 com_backpatch(c, finally_anchor);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001722 ch = CHILD(n, NCH(n)-1);
1723 com_addoparg(c, SET_LINENO, ch->n_lineno);
1724 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001725 com_addbyte(c, END_FINALLY);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001726 block_pop(c, END_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001727 }
1728}
1729
1730static void
1731com_suite(c, n)
1732 struct compiling *c;
1733 node *n;
1734{
1735 REQ(n, suite);
1736 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
1737 if (NCH(n) == 1) {
1738 com_node(c, CHILD(n, 0));
1739 }
1740 else {
1741 int i;
1742 for (i = 0; i < NCH(n); i++) {
1743 node *ch = CHILD(n, i);
1744 if (TYPE(ch) == stmt)
1745 com_node(c, ch);
1746 }
1747 }
1748}
1749
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001750/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001751static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001752com_continue_stmt(c, n)
1753 struct compiling *c;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001754 node *n; /* Not used, but passed for consistency */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001755{
1756 int i = c->c_nblocks;
1757 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
1758 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1759 }
1760 else {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001761 err_setstr(SyntaxError, "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001762 c->c_errors++;
1763 }
1764 /* XXX Could allow it inside a 'finally' clause
1765 XXX if we could pop the exception still on the stack */
1766}
1767
1768static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001769com_funcdef(c, n)
1770 struct compiling *c;
1771 node *n;
1772{
1773 object *v;
1774 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001775 v = (object *)compile(n, c->c_filename);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001776 if (v == NULL)
1777 c->c_errors++;
1778 else {
1779 int i = com_addconst(c, v);
1780 com_addoparg(c, LOAD_CONST, i);
1781 com_addbyte(c, BUILD_FUNCTION);
1782 com_addopname(c, STORE_NAME, CHILD(n, 1));
1783 DECREF(v);
1784 }
1785}
1786
1787static void
Guido van Rossum25831651993-05-19 14:50:45 +00001788com_bases(c, n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00001789 struct compiling *c;
1790 node *n;
1791{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001792 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001793 REQ(n, testlist);
1794 /* testlist: test (',' test)* [','] */
1795 for (i = 0; i < NCH(n); i += 2)
1796 com_node(c, CHILD(n, i));
1797 com_addoparg(c, BUILD_TUPLE, (NCH(n)+1) / 2);
1798}
1799
1800static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001801com_classdef(c, n)
1802 struct compiling *c;
1803 node *n;
1804{
Guido van Rossum25831651993-05-19 14:50:45 +00001805 int i;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001806 object *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001807 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00001808 /* classdef: class NAME ['(' testlist ')'] ':' suite */
1809 if ((v = newstringobject(STR(CHILD(n, 1)))) == NULL) {
1810 c->c_errors++;
1811 return;
1812 }
1813 /* Push the class name on the stack */
1814 i = com_addconst(c, v);
1815 com_addoparg(c, LOAD_CONST, i);
1816 DECREF(v);
1817 /* Push the tuple of base classes on the stack */
1818 if (TYPE(CHILD(n, 2)) != LPAR)
Guido van Rossumc5e96291991-12-10 13:53:51 +00001819 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum25831651993-05-19 14:50:45 +00001820 else
1821 com_bases(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001822 v = (object *)compile(n, c->c_filename);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001823 if (v == NULL)
1824 c->c_errors++;
1825 else {
Guido van Rossum25831651993-05-19 14:50:45 +00001826 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001827 com_addoparg(c, LOAD_CONST, i);
1828 com_addbyte(c, BUILD_FUNCTION);
1829 com_addbyte(c, UNARY_CALL);
1830 com_addbyte(c, BUILD_CLASS);
1831 com_addopname(c, STORE_NAME, CHILD(n, 1));
1832 DECREF(v);
1833 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001834}
1835
1836static void
1837com_node(c, n)
1838 struct compiling *c;
1839 node *n;
1840{
1841 switch (TYPE(n)) {
1842
1843 /* Definition nodes */
1844
1845 case funcdef:
1846 com_funcdef(c, n);
1847 break;
1848 case classdef:
1849 com_classdef(c, n);
1850 break;
1851
1852 /* Trivial parse tree nodes */
1853
1854 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001855 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001856 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001857 com_node(c, CHILD(n, 0));
1858 break;
1859
1860 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001861 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
1862 com_addoparg(c, SET_LINENO, n->n_lineno);
1863 {
1864 int i;
1865 for (i = 0; i < NCH(n)-1; i += 2)
1866 com_node(c, CHILD(n, i));
1867 }
1868 break;
1869
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001870 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001871 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001872 com_node(c, CHILD(n, 0));
1873 break;
1874
1875 /* Statement nodes */
1876
1877 case expr_stmt:
1878 com_expr_stmt(c, n);
1879 break;
1880 case print_stmt:
1881 com_print_stmt(c, n);
1882 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001883 case del_stmt: /* 'del' exprlist */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001884 com_assign(c, CHILD(n, 1), 0/*delete*/);
1885 break;
1886 case pass_stmt:
1887 break;
1888 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001889 if (c->c_loops == 0) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001890 err_setstr(SyntaxError, "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001891 c->c_errors++;
1892 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001893 com_addbyte(c, BREAK_LOOP);
1894 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001895 case continue_stmt:
1896 com_continue_stmt(c, n);
1897 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001898 case return_stmt:
1899 com_return_stmt(c, n);
1900 break;
1901 case raise_stmt:
1902 com_raise_stmt(c, n);
1903 break;
1904 case import_stmt:
1905 com_import_stmt(c, n);
1906 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001907 case global_stmt:
1908 com_global_stmt(c, n);
1909 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001910 case access_stmt:
1911 com_access_stmt(c, n);
1912 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001913 case if_stmt:
1914 com_if_stmt(c, n);
1915 break;
1916 case while_stmt:
1917 com_while_stmt(c, n);
1918 break;
1919 case for_stmt:
1920 com_for_stmt(c, n);
1921 break;
1922 case try_stmt:
1923 com_try_stmt(c, n);
1924 break;
1925 case suite:
1926 com_suite(c, n);
1927 break;
1928
1929 /* Expression nodes */
1930
1931 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00001932 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001933 break;
1934 case test:
1935 com_test(c, n);
1936 break;
1937 case and_test:
1938 com_and_test(c, n);
1939 break;
1940 case not_test:
1941 com_not_test(c, n);
1942 break;
1943 case comparison:
1944 com_comparison(c, n);
1945 break;
1946 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00001947 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001948 break;
1949 case expr:
1950 com_expr(c, n);
1951 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001952 case xor_expr:
1953 com_xor_expr(c, n);
1954 break;
1955 case and_expr:
1956 com_and_expr(c, n);
1957 break;
1958 case shift_expr:
1959 com_shift_expr(c, n);
1960 break;
1961 case arith_expr:
1962 com_arith_expr(c, n);
1963 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001964 case term:
1965 com_term(c, n);
1966 break;
1967 case factor:
1968 com_factor(c, n);
1969 break;
1970 case atom:
1971 com_atom(c, n);
1972 break;
1973
1974 default:
1975 fprintf(stderr, "node type %d\n", TYPE(n));
1976 err_setstr(SystemError, "com_node: unexpected node type");
1977 c->c_errors++;
1978 }
1979}
1980
1981static void com_fplist PROTO((struct compiling *, node *));
1982
1983static void
1984com_fpdef(c, n)
1985 struct compiling *c;
1986 node *n;
1987{
1988 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
1989 if (TYPE(CHILD(n, 0)) == LPAR)
1990 com_fplist(c, CHILD(n, 1));
1991 else
1992 com_addopname(c, STORE_NAME, CHILD(n, 0));
1993}
1994
1995static void
1996com_fplist(c, n)
1997 struct compiling *c;
1998 node *n;
1999{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00002000 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002001 if (NCH(n) == 1) {
2002 com_fpdef(c, CHILD(n, 0));
2003 }
2004 else {
2005 int i;
2006 com_addoparg(c, UNPACK_TUPLE, (NCH(n)+1)/2);
2007 for (i = 0; i < NCH(n); i += 2)
2008 com_fpdef(c, CHILD(n, i));
2009 }
2010}
2011
2012static void
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002013com_arglist(c, n)
2014 struct compiling *c;
2015 node *n;
2016{
2017 int i, nargs, op;
2018 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00002019 /* varargslist:
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002020 (fpdef ',')* '*' NAME | fpdef (',' fpdef)* [','] */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002021 op = UNPACK_ARG;
2022 nargs = (NCH(n) + 1) / 2;
2023 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumacbefef1992-01-19 16:33:51 +00002024 int t = TYPE(CHILD(n, i));
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002025 if (t == STAR) {
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002026 op = UNPACK_VARARG;
2027 nargs = i/2;
2028 break;
2029 }
2030 }
2031 com_addoparg(c, op, nargs);
2032 for (i = 0; i < 2*nargs; i += 2)
2033 com_fpdef(c, CHILD(n, i));
2034 if (op == UNPACK_VARARG)
2035 com_addopname(c, STORE_NAME, CHILD(n, 2*nargs+1));
2036}
2037
2038static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002039com_file_input(c, n)
2040 struct compiling *c;
2041 node *n;
2042{
2043 int i;
2044 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
2045 for (i = 0; i < NCH(n); i++) {
2046 node *ch = CHILD(n, i);
2047 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
2048 com_node(c, ch);
2049 }
2050}
2051
2052/* Top-level compile-node interface */
2053
2054static void
2055compile_funcdef(c, n)
2056 struct compiling *c;
2057 node *n;
2058{
2059 node *ch;
2060 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00002061 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002062 com_addoparg(c, RESERVE_FAST, com_addconst(c, None)); /* Patched! */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002063 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
2064 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002065 if (TYPE(ch) == RPAR)
Guido van Rossum288a60f1991-12-16 13:05:10 +00002066 com_addoparg(c, UNPACK_ARG, 0);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002067 else
2068 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002069 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002070 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002071 c->c_infunction = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002072 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2073 com_addbyte(c, RETURN_VALUE);
2074}
2075
2076static void
2077compile_node(c, n)
2078 struct compiling *c;
2079 node *n;
2080{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002081 com_addoparg(c, SET_LINENO, n->n_lineno);
2082
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002083 switch (TYPE(n)) {
2084
Guido van Rossum4c417781991-01-21 16:09:22 +00002085 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002086 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
2087 n = CHILD(n, 0);
2088 if (TYPE(n) != NEWLINE)
2089 com_node(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002090 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2091 com_addbyte(c, RETURN_VALUE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002092 break;
2093
Guido van Rossum4c417781991-01-21 16:09:22 +00002094 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002095 com_file_input(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002096 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2097 com_addbyte(c, RETURN_VALUE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002098 break;
2099
Guido van Rossum4c417781991-01-21 16:09:22 +00002100 case expr_input: /* Built-in function eval() */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002101 com_node(c, CHILD(n, 0));
2102 com_addbyte(c, RETURN_VALUE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002103 break;
2104
Guido van Rossum4c417781991-01-21 16:09:22 +00002105 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00002106 com_node(c, CHILD(n, 0));
2107 com_addbyte(c, RETURN_VALUE);
2108 break;
2109
2110 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002111 compile_funcdef(c, n);
2112 break;
2113
Guido van Rossum4c417781991-01-21 16:09:22 +00002114 case classdef: /* A class definition */
Guido van Rossum25831651993-05-19 14:50:45 +00002115 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
2116 c->c_name = STR(CHILD(n, 1));
Guido van Rossumc5e96291991-12-10 13:53:51 +00002117 com_node(c, CHILD(n, NCH(n)-1)); /* The suite */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002118 com_addbyte(c, LOAD_LOCALS);
2119 com_addbyte(c, RETURN_VALUE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002120 break;
2121
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002122 default:
2123 fprintf(stderr, "node type %d\n", TYPE(n));
2124 err_setstr(SystemError, "compile_node: unexpected node type");
2125 c->c_errors++;
2126 }
2127}
2128
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002129/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00002130
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002131 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
2132 instructions that refer to local variables with LOAD_FAST etc.
2133 The latter instructions are much faster because they don't need to
2134 look up the variable name in a dictionary.
Guido van Rossum282914b1991-04-04 10:42:56 +00002135
2136 To find all local variables, we check all STORE_NAME and IMPORT_FROM
2137 instructions. This yields all local variables, including arguments,
2138 function definitions, class definitions and import statements.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002139 (We don't check DELETE_NAME instructions, since if there's no
2140 STORE_NAME the DELETE_NAME will surely fail.)
Guido van Rossum282914b1991-04-04 10:42:56 +00002141
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002142 There is one problem: 'from foo import *' introduces local variables
2143 that we can't know while compiling. If this is the case, wo don't
Guido van Rossum25831651993-05-19 14:50:45 +00002144 optimize at all (this rarely happens, since this form of import
2145 statement is mostly used at the module level).
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002146
2147 Note that, because of this optimization, code like the following
2148 won't work:
2149 eval('x = 1')
2150 print x
Guido van Rossum282914b1991-04-04 10:42:56 +00002151
2152 NB: this modifies the string object co->co_code!
2153*/
2154
2155static void
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002156optimize(c)
2157 struct compiling *c;
Guido van Rossum282914b1991-04-04 10:42:56 +00002158{
Guido van Rossum0a697f61991-04-16 08:39:12 +00002159 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00002160 object *locals;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002161 int nlocals;
Guido van Rossum282914b1991-04-04 10:42:56 +00002162 int opcode;
2163 int oparg;
2164 object *name;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002165 int fast_reserved;
2166 object *error_type, *error_value;
2167
Guido van Rossum282914b1991-04-04 10:42:56 +00002168#define NEXTOP() (*next_instr++)
2169#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
2170#define GETITEM(v, i) (getlistitem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002171#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
2172
Guido van Rossum282914b1991-04-04 10:42:56 +00002173 locals = newdictobject();
2174 if (locals == NULL) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002175 c->c_errors++;
2176 return;
Guido van Rossum282914b1991-04-04 10:42:56 +00002177 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002178 nlocals = 0;
2179
2180 err_get(&error_type, &error_value);
Guido van Rossum282914b1991-04-04 10:42:56 +00002181
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002182 next_instr = (unsigned char *) getstringvalue(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00002183 for (;;) {
2184 opcode = NEXTOP();
2185 if (opcode == STOP_CODE)
2186 break;
2187 if (HAS_ARG(opcode))
2188 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002189 if (opcode == STORE_NAME || opcode == DELETE_NAME ||
2190 opcode == IMPORT_FROM) {
2191 object *v;
Guido van Rossum282914b1991-04-04 10:42:56 +00002192 name = GETNAMEOBJ(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002193 if (dict2lookup(locals, name) != NULL)
2194 continue;
2195 err_clear();
2196 v = newintobject(nlocals);
2197 if (v == NULL) {
2198 c->c_errors++;
2199 goto err;
Guido van Rossum282914b1991-04-04 10:42:56 +00002200 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002201 nlocals++;
2202 if (dict2insert(locals, name, v) != 0) {
2203 DECREF(v);
2204 c->c_errors++;
2205 goto err;
2206 }
2207 DECREF(v);
Guido van Rossum282914b1991-04-04 10:42:56 +00002208 }
2209 }
2210
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002211 if (nlocals == 0 || dictlookup(locals, "*") != NULL) {
2212 /* Don't optimize anything */
2213 goto end;
2214 }
2215
2216 next_instr = (unsigned char *) getstringvalue(c->c_code);
2217 fast_reserved = 0;
Guido van Rossum282914b1991-04-04 10:42:56 +00002218 for (;;) {
2219 cur_instr = next_instr;
2220 opcode = NEXTOP();
2221 if (opcode == STOP_CODE)
2222 break;
2223 if (HAS_ARG(opcode))
2224 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002225 if (opcode == RESERVE_FAST) {
2226 int i = com_addconst(c, locals);
2227 cur_instr[1] = i & 0xff;
2228 cur_instr[2] = (i>>8) & 0xff;
2229 fast_reserved = 1;
2230 continue;
2231 }
2232 if (!fast_reserved)
2233 continue;
2234 if (opcode == LOAD_NAME ||
2235 opcode == STORE_NAME ||
2236 opcode == DELETE_NAME) {
2237 object *v;
2238 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00002239 name = GETNAMEOBJ(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002240 v = dict2lookup(locals, name);
2241 if (v == NULL) {
Guido van Rossum83163251991-08-16 08:58:43 +00002242 err_clear();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002243 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00002244 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002245 i = getintvalue(v);
2246 switch (opcode) {
2247 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
2248 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
2249 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
2250 }
2251 cur_instr[1] = i & 0xff;
2252 cur_instr[2] = (i>>8) & 0xff;
Guido van Rossum282914b1991-04-04 10:42:56 +00002253 }
2254 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002255
2256 end:
2257 err_setval(error_type, error_value);
2258 err:
Guido van Rossum282914b1991-04-04 10:42:56 +00002259 DECREF(locals);
2260}
2261
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002262codeobject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002263compile(n, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002264 node *n;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002265 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002266{
2267 struct compiling sc;
2268 codeobject *co;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002269 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002270 return NULL;
2271 compile_node(&sc, n);
2272 com_done(&sc);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002273 if (TYPE(n) == funcdef && sc.c_errors == 0)
2274 optimize(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00002275 co = NULL;
2276 if (sc.c_errors == 0) {
2277 object *v, *w;
2278 v = newstringobject(sc.c_filename);
2279 w = newstringobject(sc.c_name);
2280 if (v != NULL && w != NULL)
2281 co = newcodeobject(sc.c_code, sc.c_consts,
2282 sc.c_names, v, w);
2283 XDECREF(v);
2284 XDECREF(w);
Guido van Rossuma082ce41991-06-04 19:41:56 +00002285 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002286 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002287 return co;
2288}