blob: 2a1a2b4451b12b293752d84eee40106fb1dde2ac [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>
Guido van Rossumf1dc5661993-07-05 10:31:29 +000042#include <errno.h>
Guido van Rossum282914b1991-04-04 10:42:56 +000043
Guido van Rossum3f5da241990-12-20 15:06:42 +000044#define OFF(x) offsetof(codeobject, x)
45
46static struct memberlist code_memberlist[] = {
Guido van Rossum39d942d1992-01-12 02:30:05 +000047 {"co_code", T_OBJECT, OFF(co_code), READONLY},
48 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
49 {"co_names", T_OBJECT, OFF(co_names), READONLY},
50 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000051 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000052 {NULL} /* Sentinel */
53};
54
55static object *
56code_getattr(co, name)
57 codeobject *co;
58 char *name;
59{
60 return getmember((char *)co, code_memberlist, name);
61}
Guido van Rossum10dc2e81990-11-18 17:27:39 +000062
63static void
Guido van Rossum3f5da241990-12-20 15:06:42 +000064code_dealloc(co)
65 codeobject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +000066{
Guido van Rossum3f5da241990-12-20 15:06:42 +000067 XDECREF(co->co_code);
68 XDECREF(co->co_consts);
69 XDECREF(co->co_names);
70 XDECREF(co->co_filename);
Guido van Rossum9bfef441993-03-29 10:43:31 +000071 XDECREF(co->co_name);
Guido van Rossum3f5da241990-12-20 15:06:42 +000072 DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +000073}
74
Guido van Rossum2dff9911992-09-03 20:50:59 +000075static object *
76code_repr(co)
77 codeobject *co;
78{
79 char buf[500];
80 int lineno = -1;
81 char *p = GETSTRINGVALUE(co->co_code);
82 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +000083 char *name = "???";
Guido van Rossum2dff9911992-09-03 20:50:59 +000084 if (*p == SET_LINENO)
85 lineno = (p[1] & 0xff) | ((p[2] & 0xff) << 8);
86 if (co->co_filename && is_stringobject(co->co_filename))
87 filename = getstringvalue(co->co_filename);
Guido van Rossum9bfef441993-03-29 10:43:31 +000088 if (co->co_name && is_stringobject(co->co_name))
89 name = getstringvalue(co->co_name);
90 sprintf(buf, "<code object %.100s at %lx, file \"%.300s\", line %d>",
91 name, (long)co, filename, lineno);
Guido van Rossum2dff9911992-09-03 20:50:59 +000092 return newstringobject(buf);
93}
94
Guido van Rossum10dc2e81990-11-18 17:27:39 +000095typeobject Codetype = {
96 OB_HEAD_INIT(&Typetype)
97 0,
98 "code",
99 sizeof(codeobject),
100 0,
101 code_dealloc, /*tp_dealloc*/
102 0, /*tp_print*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000103 code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000104 0, /*tp_setattr*/
105 0, /*tp_compare*/
Guido van Rossum2dff9911992-09-03 20:50:59 +0000106 code_repr, /*tp_repr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000107 0, /*tp_as_number*/
108 0, /*tp_as_sequence*/
109 0, /*tp_as_mapping*/
110};
111
Guido van Rossuma082ce41991-06-04 19:41:56 +0000112codeobject *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000113newcodeobject(code, consts, names, filename, name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000114 object *code;
115 object *consts;
116 object *names;
Guido van Rossuma082ce41991-06-04 19:41:56 +0000117 object *filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000118 object *name;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000119{
120 codeobject *co;
121 int i;
122 /* Check argument types */
123 if (code == NULL || !is_stringobject(code) ||
124 consts == NULL || !is_listobject(consts) ||
Guido van Rossum9bfef441993-03-29 10:43:31 +0000125 names == NULL || !is_listobject(names) ||
126 name == NULL || !is_stringobject(name)) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000127 err_badcall();
128 return NULL;
129 }
130 /* Make sure the list of names contains only strings */
131 for (i = getlistsize(names); --i >= 0; ) {
132 object *v = getlistitem(names, i);
133 if (v == NULL || !is_stringobject(v)) {
134 err_badcall();
135 return NULL;
136 }
137 }
138 co = NEWOBJ(codeobject, &Codetype);
139 if (co != NULL) {
140 INCREF(code);
141 co->co_code = (stringobject *)code;
142 INCREF(consts);
143 co->co_consts = consts;
144 INCREF(names);
145 co->co_names = names;
Guido van Rossuma082ce41991-06-04 19:41:56 +0000146 INCREF(filename);
147 co->co_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000148 INCREF(name);
149 co->co_name = name;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000150 }
151 return co;
152}
153
154
155/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000156
157#define MAXBLOCKS 20 /* Max static block nesting within a function */
158
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000159struct compiling {
160 object *c_code; /* string */
161 object *c_consts; /* list of objects */
162 object *c_names; /* list of strings (names) */
Guido van Rossumc5e96291991-12-10 13:53:51 +0000163 object *c_globals; /* dictionary */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000164 int c_nexti; /* index into c_code */
165 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000166 int c_infunction; /* set when compiling a function */
167 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000168 int c_begin; /* begin of current loop, for 'continue' */
169 int c_block[MAXBLOCKS]; /* stack of block types */
170 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000171 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000172 char *c_name; /* name of object (e.g. function) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000173};
174
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000175
176/* Interface to the block stack */
177
178static void
179block_push(c, type)
180 struct compiling *c;
181 int type;
182{
183 if (c->c_nblocks >= MAXBLOCKS) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +0000184 err_setstr(SystemError, "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000185 c->c_errors++;
186 }
187 else {
188 c->c_block[c->c_nblocks++] = type;
189 }
190}
191
192static void
193block_pop(c, type)
194 struct compiling *c;
195 int type;
196{
197 if (c->c_nblocks > 0)
198 c->c_nblocks--;
199 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
200 err_setstr(SystemError, "bad block pop");
201 c->c_errors++;
202 }
203}
204
205
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000206/* Prototypes */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000207
Guido van Rossum3f5da241990-12-20 15:06:42 +0000208static int com_init PROTO((struct compiling *, char *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000209static void com_free PROTO((struct compiling *));
210static void com_done PROTO((struct compiling *));
211static void com_node PROTO((struct compiling *, struct _node *));
212static void com_addbyte PROTO((struct compiling *, int));
213static void com_addint PROTO((struct compiling *, int));
214static void com_addoparg PROTO((struct compiling *, int, int));
215static void com_addfwref PROTO((struct compiling *, int, int *));
216static void com_backpatch PROTO((struct compiling *, int));
217static int com_add PROTO((struct compiling *, object *, object *));
218static int com_addconst PROTO((struct compiling *, object *));
219static int com_addname PROTO((struct compiling *, object *));
220static void com_addopname PROTO((struct compiling *, int, node *));
Guido van Rossum288a60f1991-12-16 13:05:10 +0000221static void com_list PROTO((struct compiling *, node *, int));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000222
223static int
Guido van Rossum3f5da241990-12-20 15:06:42 +0000224com_init(c, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000225 struct compiling *c;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000226 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000227{
Guido van Rossum62d46241991-04-03 19:00:23 +0000228 if ((c->c_code = newsizedstringobject((char *)NULL, 1000)) == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000229 goto fail_3;
230 if ((c->c_consts = newlistobject(0)) == NULL)
231 goto fail_2;
232 if ((c->c_names = newlistobject(0)) == NULL)
233 goto fail_1;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000234 if ((c->c_globals = newdictobject()) == NULL)
235 goto fail_0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000236 c->c_nexti = 0;
237 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000238 c->c_infunction = 0;
239 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000240 c->c_begin = 0;
241 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000242 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000243 c->c_name = "?";
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000244 return 1;
245
Guido van Rossumc5e96291991-12-10 13:53:51 +0000246 fail_0:
247 DECREF(c->c_names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000248 fail_1:
249 DECREF(c->c_consts);
250 fail_2:
251 DECREF(c->c_code);
252 fail_3:
253 return 0;
254}
255
256static void
257com_free(c)
258 struct compiling *c;
259{
260 XDECREF(c->c_code);
261 XDECREF(c->c_consts);
262 XDECREF(c->c_names);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000263 XDECREF(c->c_globals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000264}
265
266static void
267com_done(c)
268 struct compiling *c;
269{
270 if (c->c_code != NULL)
271 resizestring(&c->c_code, c->c_nexti);
272}
273
274static void
275com_addbyte(c, byte)
276 struct compiling *c;
277 int byte;
278{
279 int len;
280 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000281 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000282 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
283 abort();
Guido van Rossum01cfd441991-10-20 20:12:38 +0000284 */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000285 err_setstr(SystemError, "com_addbyte: byte out of range");
286 c->c_errors++;
287 }
288 if (c->c_code == NULL)
289 return;
290 len = getstringsize(c->c_code);
291 if (c->c_nexti >= len) {
292 if (resizestring(&c->c_code, len+1000) != 0) {
293 c->c_errors++;
294 return;
295 }
296 }
297 getstringvalue(c->c_code)[c->c_nexti++] = byte;
298}
299
300static void
301com_addint(c, x)
302 struct compiling *c;
303 int x;
304{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000305 com_addbyte(c, x & 0xff);
306 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000307}
308
309static void
310com_addoparg(c, op, arg)
311 struct compiling *c;
312 int op;
313 int arg;
314{
315 com_addbyte(c, op);
316 com_addint(c, arg);
317}
318
319static void
320com_addfwref(c, op, p_anchor)
321 struct compiling *c;
322 int op;
323 int *p_anchor;
324{
325 /* Compile a forward reference for backpatching */
326 int here;
327 int anchor;
328 com_addbyte(c, op);
329 here = c->c_nexti;
330 anchor = *p_anchor;
331 *p_anchor = here;
332 com_addint(c, anchor == 0 ? 0 : here - anchor);
333}
334
335static void
336com_backpatch(c, anchor)
337 struct compiling *c;
338 int anchor; /* Must be nonzero */
339{
340 unsigned char *code = (unsigned char *) getstringvalue(c->c_code);
341 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000342 int dist;
343 int prev;
344 for (;;) {
345 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000346 prev = code[anchor] + (code[anchor+1] << 8);
347 dist = target - (anchor+2);
348 code[anchor] = dist & 0xff;
349 code[anchor+1] = dist >> 8;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000350 if (!prev)
351 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000352 anchor -= prev;
353 }
354}
355
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000356/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000357
358static int
359com_add(c, list, v)
360 struct compiling *c;
361 object *list;
362 object *v;
363{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000364 int n = getlistsize(list);
365 int i;
366 for (i = n; --i >= 0; ) {
367 object *w = getlistitem(list, i);
Guido van Rossumefc0bd01991-07-01 18:44:20 +0000368 if (v->ob_type == w->ob_type && cmpobject(v, w) == 0)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000369 return i;
370 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000371 if (addlistitem(list, v) != 0)
372 c->c_errors++;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000373 return n;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000374}
375
376static int
377com_addconst(c, v)
378 struct compiling *c;
379 object *v;
380{
381 return com_add(c, c->c_consts, v);
382}
383
384static int
385com_addname(c, v)
386 struct compiling *c;
387 object *v;
388{
389 return com_add(c, c->c_names, v);
390}
391
392static void
393com_addopname(c, op, n)
394 struct compiling *c;
395 int op;
396 node *n;
397{
398 object *v;
399 int i;
400 char *name;
401 if (TYPE(n) == STAR)
402 name = "*";
403 else {
404 REQ(n, NAME);
405 name = STR(n);
406 }
407 if ((v = newstringobject(name)) == NULL) {
408 c->c_errors++;
409 i = 255;
410 }
411 else {
412 i = com_addname(c, v);
413 DECREF(v);
414 }
Guido van Rossumc5e96291991-12-10 13:53:51 +0000415 /* Hack to replace *_NAME opcodes by *_GLOBAL if necessary */
416 switch (op) {
417 case LOAD_NAME:
418 case STORE_NAME:
419 case DELETE_NAME:
420 if (dictlookup(c->c_globals, name) != NULL) {
421 switch (op) {
422 case LOAD_NAME: op = LOAD_GLOBAL; break;
423 case STORE_NAME: op = STORE_GLOBAL; break;
424 case DELETE_NAME: op = DELETE_GLOBAL; break;
425 }
426 }
427 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000428 com_addoparg(c, op, i);
429}
430
431static object *
432parsenumber(s)
433 char *s;
434{
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000435 extern long strtol PROTO((const char *, char **, int));
436 extern unsigned long strtoul PROTO((const char *, char **, int));
437 extern double strtod PROTO((const char *, char **));
Guido van Rossumc5e96291991-12-10 13:53:51 +0000438 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000439 long x;
Guido van Rossum282914b1991-04-04 10:42:56 +0000440 double xx;
441 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000442 end = s + strlen(s) - 1;
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000443 if (*end == 'l' || *end == 'L')
Guido van Rossumc5e96291991-12-10 13:53:51 +0000444 return long_scan(s, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000445 if (s[0] == '0')
446 x = (long) strtoul(s, &end, 0);
447 else
448 x = strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +0000449 if (*end == '\0') {
450 if (errno != 0) {
Guido van Rossumefb087b1991-12-16 15:41:41 +0000451 err_setstr(OverflowError,
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000452 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000453 return NULL;
454 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000455 return newintobject(x);
Guido van Rossum282914b1991-04-04 10:42:56 +0000456 }
457 errno = 0;
458 xx = strtod(s, &end);
459 if (*end == '\0') {
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000460#ifndef BROKEN_STRTOD
461 /* Some strtod() versions (e.g., in older SunOS systems)
462 set errno incorrectly; better to ignore overflows
463 than not to be able to use float literals at all! */
Guido van Rossum282914b1991-04-04 10:42:56 +0000464 if (errno != 0) {
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000465 err_setstr(OverflowError, "float literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000466 return NULL;
467 }
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000468#endif
Guido van Rossum282914b1991-04-04 10:42:56 +0000469 return newfloatobject(xx);
470 }
Guido van Rossumefb087b1991-12-16 15:41:41 +0000471 err_setstr(SystemError, "bad number syntax?!?!");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000472 return NULL;
473}
474
475static object *
476parsestr(s)
477 char *s;
478{
479 object *v;
480 int len;
481 char *buf;
482 char *p;
483 int c;
484 if (*s != '\'') {
485 err_badcall();
486 return NULL;
487 }
488 s++;
489 len = strlen(s);
490 if (s[--len] != '\'') {
491 err_badcall();
492 return NULL;
493 }
494 if (strchr(s, '\\') == NULL)
495 return newsizedstringobject(s, len);
496 v = newsizedstringobject((char *)NULL, len);
497 p = buf = getstringvalue(v);
498 while (*s != '\0' && *s != '\'') {
499 if (*s != '\\') {
500 *p++ = *s++;
501 continue;
502 }
503 s++;
504 switch (*s++) {
505 /* XXX This assumes ASCII! */
506 case '\\': *p++ = '\\'; break;
507 case '\'': *p++ = '\''; break;
508 case 'b': *p++ = '\b'; break;
509 case 'f': *p++ = '\014'; break; /* FF */
510 case 't': *p++ = '\t'; break;
511 case 'n': *p++ = '\n'; break;
512 case 'r': *p++ = '\r'; break;
513 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000514 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
515 case '0': case '1': case '2': case '3':
516 case '4': case '5': case '6': case '7':
517 c = s[-1] - '0';
518 if ('0' <= *s && *s <= '7') {
519 c = (c<<3) + *s++ - '0';
520 if ('0' <= *s && *s <= '7')
521 c = (c<<3) + *s++ - '0';
522 }
523 *p++ = c;
524 break;
525 case 'x':
526 if (isxdigit(*s)) {
527 sscanf(s, "%x", &c);
528 *p++ = c;
529 do {
530 s++;
531 } while (isxdigit(*s));
532 break;
533 }
534 /* FALLTHROUGH */
535 default: *p++ = '\\'; *p++ = s[-1]; break;
536 }
537 }
538 resizestring(&v, (int)(p - buf));
539 return v;
540}
541
542static void
543com_list_constructor(c, n)
544 struct compiling *c;
545 node *n;
546{
547 int len;
548 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000549 if (TYPE(n) != testlist)
550 REQ(n, exprlist);
551 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
552 len = (NCH(n) + 1) / 2;
553 for (i = 0; i < NCH(n); i += 2)
554 com_node(c, CHILD(n, i));
555 com_addoparg(c, BUILD_LIST, len);
556}
557
558static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000559com_dictmaker(c, n)
560 struct compiling *c;
561 node *n;
562{
563 int i;
564 /* dictmaker: test ':' test (',' test ':' value)* [','] */
565 for (i = 0; i+2 < NCH(n); i += 4) {
566 /* We must arrange things just right for STORE_SUBSCR.
567 It wants the stack to look like (value) (dict) (key) */
568 com_addbyte(c, DUP_TOP);
569 com_node(c, CHILD(n, i+2)); /* value */
570 com_addbyte(c, ROT_TWO);
571 com_node(c, CHILD(n, i)); /* key */
572 com_addbyte(c, STORE_SUBSCR);
573 }
574}
575
576static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000577com_atom(c, n)
578 struct compiling *c;
579 node *n;
580{
581 node *ch;
582 object *v;
583 int i;
584 REQ(n, atom);
585 ch = CHILD(n, 0);
586 switch (TYPE(ch)) {
587 case LPAR:
588 if (TYPE(CHILD(n, 1)) == RPAR)
589 com_addoparg(c, BUILD_TUPLE, 0);
590 else
591 com_node(c, CHILD(n, 1));
592 break;
593 case LSQB:
594 if (TYPE(CHILD(n, 1)) == RSQB)
595 com_addoparg(c, BUILD_LIST, 0);
596 else
597 com_list_constructor(c, CHILD(n, 1));
598 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000599 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000600 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000601 if (TYPE(CHILD(n, 1)) != RBRACE)
602 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000603 break;
604 case BACKQUOTE:
605 com_node(c, CHILD(n, 1));
606 com_addbyte(c, UNARY_CONVERT);
607 break;
608 case NUMBER:
609 if ((v = parsenumber(STR(ch))) == NULL) {
610 c->c_errors++;
611 i = 255;
612 }
613 else {
614 i = com_addconst(c, v);
615 DECREF(v);
616 }
617 com_addoparg(c, LOAD_CONST, i);
618 break;
619 case STRING:
620 if ((v = parsestr(STR(ch))) == NULL) {
621 c->c_errors++;
622 i = 255;
623 }
624 else {
625 i = com_addconst(c, v);
626 DECREF(v);
627 }
628 com_addoparg(c, LOAD_CONST, i);
629 break;
630 case NAME:
631 com_addopname(c, LOAD_NAME, ch);
632 break;
633 default:
634 fprintf(stderr, "node type %d\n", TYPE(ch));
635 err_setstr(SystemError, "com_atom: unexpected node type");
636 c->c_errors++;
637 }
638}
639
640static void
641com_slice(c, n, op)
642 struct compiling *c;
643 node *n;
644 int op;
645{
646 if (NCH(n) == 1) {
647 com_addbyte(c, op);
648 }
649 else if (NCH(n) == 2) {
650 if (TYPE(CHILD(n, 0)) != COLON) {
651 com_node(c, CHILD(n, 0));
652 com_addbyte(c, op+1);
653 }
654 else {
655 com_node(c, CHILD(n, 1));
656 com_addbyte(c, op+2);
657 }
658 }
659 else {
660 com_node(c, CHILD(n, 0));
661 com_node(c, CHILD(n, 2));
662 com_addbyte(c, op+3);
663 }
664}
665
666static void
667com_apply_subscript(c, n)
668 struct compiling *c;
669 node *n;
670{
671 REQ(n, subscript);
672 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) != COLON) {
673 /* It's a single subscript */
674 com_node(c, CHILD(n, 0));
675 com_addbyte(c, BINARY_SUBSCR);
676 }
677 else {
678 /* It's a slice: [expr] ':' [expr] */
679 com_slice(c, n, SLICE);
680 }
681}
682
683static void
684com_call_function(c, n)
685 struct compiling *c;
686 node *n; /* EITHER testlist OR ')' */
687{
688 if (TYPE(n) == RPAR) {
Guido van Rossum288a60f1991-12-16 13:05:10 +0000689 com_addoparg(c, BUILD_TUPLE, 0);
690 com_addbyte(c, BINARY_CALL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000691 }
692 else {
Guido van Rossum288a60f1991-12-16 13:05:10 +0000693 REQ(n, testlist);
694 com_list(c, n, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000695 com_addbyte(c, BINARY_CALL);
696 }
697}
698
699static void
700com_select_member(c, n)
701 struct compiling *c;
702 node *n;
703{
704 com_addopname(c, LOAD_ATTR, n);
705}
706
707static void
708com_apply_trailer(c, n)
709 struct compiling *c;
710 node *n;
711{
712 REQ(n, trailer);
713 switch (TYPE(CHILD(n, 0))) {
714 case LPAR:
715 com_call_function(c, CHILD(n, 1));
716 break;
717 case DOT:
718 com_select_member(c, CHILD(n, 1));
719 break;
720 case LSQB:
721 com_apply_subscript(c, CHILD(n, 1));
722 break;
723 default:
724 err_setstr(SystemError,
725 "com_apply_trailer: unknown trailer type");
726 c->c_errors++;
727 }
728}
729
730static void
731com_factor(c, n)
732 struct compiling *c;
733 node *n;
734{
735 int i;
736 REQ(n, factor);
737 if (TYPE(CHILD(n, 0)) == PLUS) {
738 com_factor(c, CHILD(n, 1));
739 com_addbyte(c, UNARY_POSITIVE);
740 }
741 else if (TYPE(CHILD(n, 0)) == MINUS) {
742 com_factor(c, CHILD(n, 1));
743 com_addbyte(c, UNARY_NEGATIVE);
744 }
Guido van Rossum7928cd71991-10-24 14:59:31 +0000745 else if (TYPE(CHILD(n, 0)) == TILDE) {
746 com_factor(c, CHILD(n, 1));
747 com_addbyte(c, UNARY_INVERT);
748 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000749 else {
750 com_atom(c, CHILD(n, 0));
751 for (i = 1; i < NCH(n); i++)
752 com_apply_trailer(c, CHILD(n, i));
753 }
754}
755
756static void
757com_term(c, n)
758 struct compiling *c;
759 node *n;
760{
761 int i;
762 int op;
763 REQ(n, term);
764 com_factor(c, CHILD(n, 0));
765 for (i = 2; i < NCH(n); i += 2) {
766 com_factor(c, CHILD(n, i));
767 switch (TYPE(CHILD(n, i-1))) {
768 case STAR:
769 op = BINARY_MULTIPLY;
770 break;
771 case SLASH:
772 op = BINARY_DIVIDE;
773 break;
774 case PERCENT:
775 op = BINARY_MODULO;
776 break;
777 default:
778 err_setstr(SystemError,
Guido van Rossum7928cd71991-10-24 14:59:31 +0000779 "com_term: operator not *, / or %");
780 c->c_errors++;
781 op = 255;
782 }
783 com_addbyte(c, op);
784 }
785}
786
787static void
788com_arith_expr(c, n)
789 struct compiling *c;
790 node *n;
791{
792 int i;
793 int op;
794 REQ(n, arith_expr);
795 com_term(c, CHILD(n, 0));
796 for (i = 2; i < NCH(n); i += 2) {
797 com_term(c, CHILD(n, i));
798 switch (TYPE(CHILD(n, i-1))) {
799 case PLUS:
800 op = BINARY_ADD;
801 break;
802 case MINUS:
803 op = BINARY_SUBTRACT;
804 break;
805 default:
806 err_setstr(SystemError,
807 "com_arith_expr: operator not + or -");
808 c->c_errors++;
809 op = 255;
810 }
811 com_addbyte(c, op);
812 }
813}
814
815static void
816com_shift_expr(c, n)
817 struct compiling *c;
818 node *n;
819{
820 int i;
821 int op;
822 REQ(n, shift_expr);
823 com_arith_expr(c, CHILD(n, 0));
824 for (i = 2; i < NCH(n); i += 2) {
825 com_arith_expr(c, CHILD(n, i));
826 switch (TYPE(CHILD(n, i-1))) {
827 case LEFTSHIFT:
828 op = BINARY_LSHIFT;
829 break;
830 case RIGHTSHIFT:
831 op = BINARY_RSHIFT;
832 break;
833 default:
834 err_setstr(SystemError,
835 "com_shift_expr: operator not << or >>");
836 c->c_errors++;
837 op = 255;
838 }
839 com_addbyte(c, op);
840 }
841}
842
843static void
844com_and_expr(c, n)
845 struct compiling *c;
846 node *n;
847{
848 int i;
849 int op;
850 REQ(n, and_expr);
851 com_shift_expr(c, CHILD(n, 0));
852 for (i = 2; i < NCH(n); i += 2) {
853 com_shift_expr(c, CHILD(n, i));
854 if (TYPE(CHILD(n, i-1)) == AMPER) {
855 op = BINARY_AND;
856 }
857 else {
858 err_setstr(SystemError,
859 "com_and_expr: operator not &");
860 c->c_errors++;
861 op = 255;
862 }
863 com_addbyte(c, op);
864 }
865}
866
867static void
868com_xor_expr(c, n)
869 struct compiling *c;
870 node *n;
871{
872 int i;
873 int op;
874 REQ(n, xor_expr);
875 com_and_expr(c, CHILD(n, 0));
876 for (i = 2; i < NCH(n); i += 2) {
877 com_and_expr(c, CHILD(n, i));
878 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
879 op = BINARY_XOR;
880 }
881 else {
882 err_setstr(SystemError,
883 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000884 c->c_errors++;
885 op = 255;
886 }
887 com_addbyte(c, op);
888 }
889}
890
891static void
892com_expr(c, n)
893 struct compiling *c;
894 node *n;
895{
896 int i;
897 int op;
898 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000899 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000900 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +0000901 com_xor_expr(c, CHILD(n, i));
902 if (TYPE(CHILD(n, i-1)) == VBAR) {
903 op = BINARY_OR;
904 }
905 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000906 err_setstr(SystemError,
Guido van Rossum7928cd71991-10-24 14:59:31 +0000907 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000908 c->c_errors++;
909 op = 255;
910 }
911 com_addbyte(c, op);
912 }
913}
914
915static enum cmp_op
916cmp_type(n)
917 node *n;
918{
919 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +0000920 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000921 | 'in' | 'not' 'in' | 'is' | 'is' not' */
922 if (NCH(n) == 1) {
923 n = CHILD(n, 0);
924 switch (TYPE(n)) {
925 case LESS: return LT;
926 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +0000927 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000928 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +0000929 case LESSEQUAL: return LE;
930 case GREATEREQUAL: return GE;
931 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000932 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
933 if (strcmp(STR(n), "is") == 0) return IS;
934 }
935 }
936 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000937 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000938 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
939 return NOT_IN;
940 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
941 return IS_NOT;
942 }
943 }
944 return BAD;
945}
946
947static void
948com_comparison(c, n)
949 struct compiling *c;
950 node *n;
951{
952 int i;
953 enum cmp_op op;
954 int anchor;
955 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
956 com_expr(c, CHILD(n, 0));
957 if (NCH(n) == 1)
958 return;
959
960 /****************************************************************
961 The following code is generated for all but the last
962 comparison in a chain:
963
964 label: on stack: opcode: jump to:
965
966 a <code to load b>
967 a, b DUP_TOP
968 a, b, b ROT_THREE
969 b, a, b COMPARE_OP
970 b, 0-or-1 JUMP_IF_FALSE L1
971 b, 1 POP_TOP
972 b
973
974 We are now ready to repeat this sequence for the next
975 comparison in the chain.
976
977 For the last we generate:
978
979 b <code to load c>
980 b, c COMPARE_OP
981 0-or-1
982
983 If there were any jumps to L1 (i.e., there was more than one
984 comparison), we generate:
985
986 0-or-1 JUMP_FORWARD L2
987 L1: b, 0 ROT_TWO
988 0, b POP_TOP
989 0
990 L2:
991 ****************************************************************/
992
993 anchor = 0;
994
995 for (i = 2; i < NCH(n); i += 2) {
996 com_expr(c, CHILD(n, i));
997 if (i+2 < NCH(n)) {
998 com_addbyte(c, DUP_TOP);
999 com_addbyte(c, ROT_THREE);
1000 }
1001 op = cmp_type(CHILD(n, i-1));
1002 if (op == BAD) {
1003 err_setstr(SystemError,
1004 "com_comparison: unknown comparison op");
1005 c->c_errors++;
1006 }
1007 com_addoparg(c, COMPARE_OP, op);
1008 if (i+2 < NCH(n)) {
1009 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1010 com_addbyte(c, POP_TOP);
1011 }
1012 }
1013
1014 if (anchor) {
1015 int anchor2 = 0;
1016 com_addfwref(c, JUMP_FORWARD, &anchor2);
1017 com_backpatch(c, anchor);
1018 com_addbyte(c, ROT_TWO);
1019 com_addbyte(c, POP_TOP);
1020 com_backpatch(c, anchor2);
1021 }
1022}
1023
1024static void
1025com_not_test(c, n)
1026 struct compiling *c;
1027 node *n;
1028{
1029 REQ(n, not_test); /* 'not' not_test | comparison */
1030 if (NCH(n) == 1) {
1031 com_comparison(c, CHILD(n, 0));
1032 }
1033 else {
1034 com_not_test(c, CHILD(n, 1));
1035 com_addbyte(c, UNARY_NOT);
1036 }
1037}
1038
1039static void
1040com_and_test(c, n)
1041 struct compiling *c;
1042 node *n;
1043{
1044 int i;
1045 int anchor;
1046 REQ(n, and_test); /* not_test ('and' not_test)* */
1047 anchor = 0;
1048 i = 0;
1049 for (;;) {
1050 com_not_test(c, CHILD(n, i));
1051 if ((i += 2) >= NCH(n))
1052 break;
1053 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1054 com_addbyte(c, POP_TOP);
1055 }
1056 if (anchor)
1057 com_backpatch(c, anchor);
1058}
1059
1060static void
1061com_test(c, n)
1062 struct compiling *c;
1063 node *n;
1064{
1065 int i;
1066 int anchor;
1067 REQ(n, test); /* and_test ('and' and_test)* */
1068 anchor = 0;
1069 i = 0;
1070 for (;;) {
1071 com_and_test(c, CHILD(n, i));
1072 if ((i += 2) >= NCH(n))
1073 break;
1074 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1075 com_addbyte(c, POP_TOP);
1076 }
1077 if (anchor)
1078 com_backpatch(c, anchor);
1079}
1080
1081static void
Guido van Rossum288a60f1991-12-16 13:05:10 +00001082com_list(c, n, toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001083 struct compiling *c;
1084 node *n;
Guido van Rossum288a60f1991-12-16 13:05:10 +00001085 int toplevel; /* If nonzero, *always* build a tuple */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001086{
1087 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001088 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001089 com_node(c, CHILD(n, 0));
1090 }
1091 else {
1092 int i;
1093 int len;
1094 len = (NCH(n) + 1) / 2;
1095 for (i = 0; i < NCH(n); i += 2)
1096 com_node(c, CHILD(n, i));
1097 com_addoparg(c, BUILD_TUPLE, len);
1098 }
1099}
1100
1101
1102/* Begin of assignment compilation */
1103
1104static void com_assign_name PROTO((struct compiling *, node *, int));
1105static void com_assign PROTO((struct compiling *, node *, int));
1106
1107static void
1108com_assign_attr(c, n, assigning)
1109 struct compiling *c;
1110 node *n;
1111 int assigning;
1112{
1113 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
1114}
1115
1116static void
1117com_assign_slice(c, n, assigning)
1118 struct compiling *c;
1119 node *n;
1120 int assigning;
1121{
1122 com_slice(c, n, assigning ? STORE_SLICE : DELETE_SLICE);
1123}
1124
1125static void
1126com_assign_subscript(c, n, assigning)
1127 struct compiling *c;
1128 node *n;
1129 int assigning;
1130{
1131 com_node(c, n);
1132 com_addbyte(c, assigning ? STORE_SUBSCR : DELETE_SUBSCR);
1133}
1134
1135static void
1136com_assign_trailer(c, n, assigning)
1137 struct compiling *c;
1138 node *n;
1139 int assigning;
1140{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001141 REQ(n, trailer);
1142 switch (TYPE(CHILD(n, 0))) {
1143 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001144 err_setstr(SyntaxError, "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001145 c->c_errors++;
1146 break;
1147 case DOT: /* '.' NAME */
1148 com_assign_attr(c, CHILD(n, 1), assigning);
1149 break;
1150 case LSQB: /* '[' subscript ']' */
1151 n = CHILD(n, 1);
1152 REQ(n, subscript); /* subscript: expr | [expr] ':' [expr] */
1153 if (NCH(n) > 1 || TYPE(CHILD(n, 0)) == COLON)
1154 com_assign_slice(c, n, assigning);
1155 else
1156 com_assign_subscript(c, CHILD(n, 0), assigning);
1157 break;
1158 default:
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001159 err_setstr(SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001160 c->c_errors++;
1161 }
1162}
1163
1164static void
1165com_assign_tuple(c, n, assigning)
1166 struct compiling *c;
1167 node *n;
1168 int assigning;
1169{
1170 int i;
1171 if (TYPE(n) != testlist)
1172 REQ(n, exprlist);
1173 if (assigning)
1174 com_addoparg(c, UNPACK_TUPLE, (NCH(n)+1)/2);
1175 for (i = 0; i < NCH(n); i += 2)
1176 com_assign(c, CHILD(n, i), assigning);
1177}
1178
1179static void
1180com_assign_list(c, n, assigning)
1181 struct compiling *c;
1182 node *n;
1183 int assigning;
1184{
1185 int i;
1186 if (assigning)
1187 com_addoparg(c, UNPACK_LIST, (NCH(n)+1)/2);
1188 for (i = 0; i < NCH(n); i += 2)
1189 com_assign(c, CHILD(n, i), assigning);
1190}
1191
1192static void
1193com_assign_name(c, n, assigning)
1194 struct compiling *c;
1195 node *n;
1196 int assigning;
1197{
1198 REQ(n, NAME);
1199 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
1200}
1201
1202static void
1203com_assign(c, n, assigning)
1204 struct compiling *c;
1205 node *n;
1206 int assigning;
1207{
1208 /* Loop to avoid trivial recursion */
1209 for (;;) {
1210 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001211
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001212 case exprlist:
1213 case testlist:
1214 if (NCH(n) > 1) {
1215 com_assign_tuple(c, n, assigning);
1216 return;
1217 }
1218 n = CHILD(n, 0);
1219 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001220
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001221 case test:
1222 case and_test:
1223 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001224 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001225 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001226 case xor_expr:
1227 case and_expr:
1228 case shift_expr:
1229 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001230 case term:
1231 if (NCH(n) > 1) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001232 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001233 "can't assign to operator");
1234 c->c_errors++;
1235 return;
1236 }
1237 n = CHILD(n, 0);
1238 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001239
Guido van Rossum7928cd71991-10-24 14:59:31 +00001240 case factor: /* ('+'|'-'|'~') factor | atom trailer* */
1241 if (TYPE(CHILD(n, 0)) != atom) { /* '+'|'-'|'~' */
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001242 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001243 "can't assign to operator");
1244 c->c_errors++;
1245 return;
1246 }
1247 if (NCH(n) > 1) { /* trailer present */
1248 int i;
1249 com_node(c, CHILD(n, 0));
1250 for (i = 1; i+1 < NCH(n); i++) {
1251 com_apply_trailer(c, CHILD(n, i));
1252 } /* NB i is still alive */
1253 com_assign_trailer(c,
1254 CHILD(n, i), assigning);
1255 return;
1256 }
1257 n = CHILD(n, 0);
1258 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001259
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001260 case atom:
1261 switch (TYPE(CHILD(n, 0))) {
1262 case LPAR:
1263 n = CHILD(n, 1);
1264 if (TYPE(n) == RPAR) {
1265 /* XXX Should allow () = () ??? */
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001266 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001267 "can't assign to ()");
1268 c->c_errors++;
1269 return;
1270 }
1271 break;
1272 case LSQB:
1273 n = CHILD(n, 1);
1274 if (TYPE(n) == RSQB) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001275 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001276 "can't assign to []");
1277 c->c_errors++;
1278 return;
1279 }
1280 com_assign_list(c, n, assigning);
1281 return;
1282 case NAME:
1283 com_assign_name(c, CHILD(n, 0), assigning);
1284 return;
1285 default:
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001286 err_setstr(SyntaxError,
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001287 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001288 c->c_errors++;
1289 return;
1290 }
1291 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001292
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001293 default:
1294 fprintf(stderr, "node type %d\n", TYPE(n));
1295 err_setstr(SystemError, "com_assign: bad node");
1296 c->c_errors++;
1297 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001298
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001299 }
1300 }
1301}
1302
1303static void
1304com_expr_stmt(c, n)
1305 struct compiling *c;
1306 node *n;
1307{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001308 REQ(n, expr_stmt); /* testlist ('=' testlist)* */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001309 com_node(c, CHILD(n, NCH(n)-1));
1310 if (NCH(n) == 1) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001311 com_addbyte(c, PRINT_EXPR);
1312 }
1313 else {
1314 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001315 for (i = 0; i < NCH(n)-2; i+=2) {
1316 if (i+2 < NCH(n)-2)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001317 com_addbyte(c, DUP_TOP);
1318 com_assign(c, CHILD(n, i), 1/*assign*/);
1319 }
1320 }
1321}
1322
1323static void
1324com_print_stmt(c, n)
1325 struct compiling *c;
1326 node *n;
1327{
1328 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001329 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
1330 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001331 com_node(c, CHILD(n, i));
1332 com_addbyte(c, PRINT_ITEM);
1333 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001334 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001335 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001336 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001337}
1338
1339static void
1340com_return_stmt(c, n)
1341 struct compiling *c;
1342 node *n;
1343{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001344 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001345 if (!c->c_infunction) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001346 err_setstr(SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001347 c->c_errors++;
1348 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001349 if (NCH(n) < 2)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001350 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1351 else
1352 com_node(c, CHILD(n, 1));
1353 com_addbyte(c, RETURN_VALUE);
1354}
1355
1356static void
1357com_raise_stmt(c, n)
1358 struct compiling *c;
1359 node *n;
1360{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001361 REQ(n, raise_stmt); /* 'raise' test [',' test] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001362 com_node(c, CHILD(n, 1));
1363 if (NCH(n) > 3)
1364 com_node(c, CHILD(n, 3));
1365 else
1366 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1367 com_addbyte(c, RAISE_EXCEPTION);
1368}
1369
1370static void
1371com_import_stmt(c, n)
1372 struct compiling *c;
1373 node *n;
1374{
1375 int i;
1376 REQ(n, import_stmt);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001377 /* 'import' NAME (',' NAME)* |
1378 'from' NAME 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001379 if (STR(CHILD(n, 0))[0] == 'f') {
1380 /* 'from' NAME 'import' ... */
1381 REQ(CHILD(n, 1), NAME);
1382 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
1383 for (i = 3; i < NCH(n); i += 2)
1384 com_addopname(c, IMPORT_FROM, CHILD(n, i));
1385 com_addbyte(c, POP_TOP);
1386 }
1387 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001388 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001389 for (i = 1; i < NCH(n); i += 2) {
1390 com_addopname(c, IMPORT_NAME, CHILD(n, i));
1391 com_addopname(c, STORE_NAME, CHILD(n, i));
1392 }
1393 }
1394}
1395
1396static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00001397com_global_stmt(c, n)
1398 struct compiling *c;
1399 node *n;
1400{
1401 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001402 REQ(n, global_stmt);
1403 /* 'global' NAME (',' NAME)* */
1404 for (i = 1; i < NCH(n); i += 2) {
1405 if (dictinsert(c->c_globals, STR(CHILD(n, i)), None) != 0)
1406 c->c_errors++;
1407 }
1408}
1409
Guido van Rossum25831651993-05-19 14:50:45 +00001410#define strequ(a, b) (strcmp((a), (b)) == 0)
1411
1412static void
1413com_access_stmt(c, n)
1414 struct compiling *c;
1415 node *n;
1416{
1417 int i, j, k, mode, imode;
1418 object *vmode;
1419 REQ(n, access_stmt);
1420 /* 'access' NAME (',' NAME)* ':' accesstype (',' accesstype)*
1421 accesstype: NAME+ */
1422
1423 /* Find where the colon is */
1424 i = 1;
1425 while (TYPE(CHILD(n,i-1)) != COLON)
1426 i += 1;
1427
1428 /* Calculate the mode mask */
1429 mode = 0;
1430 for (j = i; j < NCH(n); j += 2) {
Guido van Rossum81daa321993-05-20 14:24:46 +00001431 int r = 0, w = 0, p = 0;
1432 for (k = 0; k < NCH(CHILD(n,j)); k++) {
Guido van Rossum25831651993-05-19 14:50:45 +00001433 if (strequ(STR(CHILD(CHILD(n,j),k)), "public"))
1434 p = 0;
1435 else if (strequ(STR(CHILD(CHILD(n,j),k)), "protected"))
1436 p = 1;
1437 else if (strequ(STR(CHILD(CHILD(n,j),k)), "private"))
1438 p = 2;
1439 else if (strequ(STR(CHILD(CHILD(n,j),k)), "read"))
1440 r = 1;
1441 else if (strequ(STR(CHILD(CHILD(n,j),k)), "write"))
1442 w = 1;
1443 else /* XXX should make this an exception */
1444 fprintf(stderr, "bad access type %s\n",
1445 STR(CHILD(CHILD(n,j),k)));
1446 }
1447 if (r == 0 && w == 0)
Guido van Rossum81daa321993-05-20 14:24:46 +00001448 r = w = 1;
Guido van Rossum25831651993-05-19 14:50:45 +00001449 if (p == 0) {
1450 if (r == 1) mode |= AC_R_PUBLIC;
1451 if (w == 1) mode |= AC_W_PUBLIC;
1452 } else if (p == 1) {
1453 if (r == 1) mode |= AC_R_PROTECTED;
1454 if (w == 1) mode |= AC_W_PROTECTED;
1455 } else {
1456 if (r == 1) mode |= AC_R_PRIVATE;
1457 if (w == 1) mode |= AC_W_PRIVATE;
1458 }
1459 }
1460 vmode = newintobject((long)mode);
1461 imode = com_addconst(c, vmode);
1462 XDECREF(vmode);
1463 for (i = 1; TYPE(CHILD(n,i-1)) != COLON; i+=2) {
1464 com_addoparg(c, LOAD_CONST, imode);
1465 com_addopname(c, ACCESS_MODE, CHILD(n, i));
1466 }
1467}
1468
Guido van Rossumc5e96291991-12-10 13:53:51 +00001469static void
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001470com_exec_stmt(c, n)
1471 struct compiling *c;
1472 node *n;
1473{
1474 REQ(n, exec_stmt);
1475 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
1476 com_node(c, CHILD(n, 1));
1477 if (NCH(n) >= 4)
1478 com_node(c, CHILD(n, 3));
1479 else
1480 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1481 if (NCH(n) >= 6)
1482 com_node(c, CHILD(n, 5));
1483 else
1484 com_addbyte(c, DUP_TOP);
1485 com_addbyte(c, EXEC_STMT);
1486}
1487
1488static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001489com_if_stmt(c, n)
1490 struct compiling *c;
1491 node *n;
1492{
1493 int i;
1494 int anchor = 0;
1495 REQ(n, if_stmt);
1496 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
1497 for (i = 0; i+3 < NCH(n); i+=4) {
1498 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001499 node *ch = CHILD(n, i+1);
1500 if (i > 0)
1501 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001502 com_node(c, CHILD(n, i+1));
1503 com_addfwref(c, JUMP_IF_FALSE, &a);
1504 com_addbyte(c, POP_TOP);
1505 com_node(c, CHILD(n, i+3));
1506 com_addfwref(c, JUMP_FORWARD, &anchor);
1507 com_backpatch(c, a);
1508 com_addbyte(c, POP_TOP);
1509 }
1510 if (i+2 < NCH(n))
1511 com_node(c, CHILD(n, i+2));
1512 com_backpatch(c, anchor);
1513}
1514
1515static void
1516com_while_stmt(c, n)
1517 struct compiling *c;
1518 node *n;
1519{
1520 int break_anchor = 0;
1521 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001522 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001523 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
1524 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001525 block_push(c, SETUP_LOOP);
1526 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001527 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001528 com_node(c, CHILD(n, 1));
1529 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1530 com_addbyte(c, POP_TOP);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001531 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001532 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001533 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001534 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1535 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001536 com_backpatch(c, anchor);
1537 com_addbyte(c, POP_TOP);
1538 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001539 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001540 if (NCH(n) > 4)
1541 com_node(c, CHILD(n, 6));
1542 com_backpatch(c, break_anchor);
1543}
1544
1545static void
1546com_for_stmt(c, n)
1547 struct compiling *c;
1548 node *n;
1549{
1550 object *v;
1551 int break_anchor = 0;
1552 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001553 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001554 REQ(n, for_stmt);
1555 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
1556 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001557 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001558 com_node(c, CHILD(n, 3));
1559 v = newintobject(0L);
1560 if (v == NULL)
1561 c->c_errors++;
1562 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
1563 XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001564 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001565 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001566 com_addfwref(c, FOR_LOOP, &anchor);
1567 com_assign(c, CHILD(n, 1), 1/*assigning*/);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001568 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001569 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001570 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001571 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1572 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001573 com_backpatch(c, anchor);
1574 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001575 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001576 if (NCH(n) > 8)
1577 com_node(c, CHILD(n, 8));
1578 com_backpatch(c, break_anchor);
1579}
1580
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001581/* Although 'execpt' and 'finally' clauses can be combined
1582 syntactically, they are compiled separately. In fact,
1583 try: S
1584 except E1: S1
1585 except E2: S2
1586 ...
1587 finally: Sf
1588 is equivalent to
1589 try:
1590 try: S
1591 except E1: S1
1592 except E2: S2
1593 ...
1594 finally: Sf
1595 meaning that the 'finally' clause is entered even if things
1596 go wrong again in an exception handler. Note that this is
1597 not the case for exception handlers: at most one is entered.
1598
1599 Code generated for "try: S finally: Sf" is as follows:
1600
1601 SETUP_FINALLY L
1602 <code for S>
1603 POP_BLOCK
1604 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001605 L: <code for Sf>
1606 END_FINALLY
1607
1608 The special instructions use the block stack. Each block
1609 stack entry contains the instruction that created it (here
1610 SETUP_FINALLY), the level of the value stack at the time the
1611 block stack entry was created, and a label (here L).
1612
1613 SETUP_FINALLY:
1614 Pushes the current value stack level and the label
1615 onto the block stack.
1616 POP_BLOCK:
1617 Pops en entry from the block stack, and pops the value
1618 stack until its level is the same as indicated on the
1619 block stack. (The label is ignored.)
1620 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001621 Pops a variable number of entries from the *value* stack
1622 and re-raises the exception they specify. The number of
1623 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001624
1625 The block stack is unwound when an exception is raised:
1626 when a SETUP_FINALLY entry is found, the exception is pushed
1627 onto the value stack (and the exception condition is cleared),
1628 and the interpreter jumps to the label gotten from the block
1629 stack.
1630
1631 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00001632 (The contents of the value stack is shown in [], with the top
1633 at the right; 'tb' is trace-back info, 'val' the exception's
1634 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001635
1636 Value stack Label Instruction Argument
1637 [] SETUP_EXCEPT L1
1638 [] <code for S>
1639 [] POP_BLOCK
1640 [] JUMP_FORWARD L0
1641
Guido van Rossum3f5da241990-12-20 15:06:42 +00001642 [tb, val, exc] L1: DUP )
1643 [tb, val, exc, exc] <evaluate E1> )
1644 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
1645 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
1646 [tb, val, exc, 1] POP )
1647 [tb, val, exc] POP
1648 [tb, val] <assign to V1> (or POP if no V1)
1649 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001650 [] <code for S1>
1651 JUMP_FORWARD L0
1652
Guido van Rossum3f5da241990-12-20 15:06:42 +00001653 [tb, val, exc, 0] L2: POP
1654 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001655 .............................etc.......................
1656
Guido van Rossum3f5da241990-12-20 15:06:42 +00001657 [tb, val, exc, 0] Ln+1: POP
1658 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001659
1660 [] L0: <next statement>
1661
1662 Of course, parts are not generated if Vi or Ei is not present.
1663*/
1664
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001665static void
1666com_try_stmt(c, n)
1667 struct compiling *c;
1668 node *n;
1669{
1670 int finally_anchor = 0;
1671 int except_anchor = 0;
1672 REQ(n, try_stmt);
Guido van Rossum94fb82e1992-04-05 14:24:50 +00001673 /* 'try' ':' suite (except_clause ':' suite)*
1674 | 'try' ':' 'finally' ':' suite */
1675
1676 /* XXX This can be simplified because except and finally can
1677 no longer be mixed in a single try statement */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001678
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001679 if (NCH(n) > 3 && TYPE(CHILD(n, NCH(n)-3)) != except_clause) {
1680 /* Have a 'finally' clause */
1681 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001682 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001683 }
1684 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == except_clause) {
1685 /* Have an 'except' clause */
1686 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001687 block_push(c, SETUP_EXCEPT);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001688 }
1689 com_node(c, CHILD(n, 2));
1690 if (except_anchor) {
1691 int end_anchor = 0;
1692 int i;
1693 node *ch;
1694 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001695 block_pop(c, SETUP_EXCEPT);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001696 com_addfwref(c, JUMP_FORWARD, &end_anchor);
1697 com_backpatch(c, except_anchor);
1698 for (i = 3;
1699 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
1700 i += 3) {
1701 /* except_clause: 'except' [expr [',' expr]] */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001702 if (except_anchor == 0) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001703 err_setstr(SyntaxError,
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001704 "default 'except:' must be last");
1705 c->c_errors++;
1706 break;
1707 }
1708 except_anchor = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001709 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001710 if (NCH(ch) > 1) {
1711 com_addbyte(c, DUP_TOP);
1712 com_node(c, CHILD(ch, 1));
1713 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001714 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001715 com_addbyte(c, POP_TOP);
1716 }
1717 com_addbyte(c, POP_TOP);
1718 if (NCH(ch) > 3)
1719 com_assign(c, CHILD(ch, 3), 1/*assigning*/);
1720 else
1721 com_addbyte(c, POP_TOP);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001722 com_addbyte(c, POP_TOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001723 com_node(c, CHILD(n, i+2));
1724 com_addfwref(c, JUMP_FORWARD, &end_anchor);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001725 if (except_anchor) {
1726 com_backpatch(c, except_anchor);
1727 com_addbyte(c, POP_TOP);
1728 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001729 }
1730 com_addbyte(c, END_FINALLY);
1731 com_backpatch(c, end_anchor);
1732 }
1733 if (finally_anchor) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001734 node *ch;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001735 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001736 block_pop(c, SETUP_FINALLY);
1737 block_push(c, END_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001738 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001739 com_backpatch(c, finally_anchor);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001740 ch = CHILD(n, NCH(n)-1);
1741 com_addoparg(c, SET_LINENO, ch->n_lineno);
1742 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001743 com_addbyte(c, END_FINALLY);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001744 block_pop(c, END_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001745 }
1746}
1747
1748static void
1749com_suite(c, n)
1750 struct compiling *c;
1751 node *n;
1752{
1753 REQ(n, suite);
1754 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
1755 if (NCH(n) == 1) {
1756 com_node(c, CHILD(n, 0));
1757 }
1758 else {
1759 int i;
1760 for (i = 0; i < NCH(n); i++) {
1761 node *ch = CHILD(n, i);
1762 if (TYPE(ch) == stmt)
1763 com_node(c, ch);
1764 }
1765 }
1766}
1767
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001768/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001769static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001770com_continue_stmt(c, n)
1771 struct compiling *c;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001772 node *n; /* Not used, but passed for consistency */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001773{
1774 int i = c->c_nblocks;
1775 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
1776 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1777 }
1778 else {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001779 err_setstr(SyntaxError, "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001780 c->c_errors++;
1781 }
1782 /* XXX Could allow it inside a 'finally' clause
1783 XXX if we could pop the exception still on the stack */
1784}
1785
1786static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001787com_funcdef(c, n)
1788 struct compiling *c;
1789 node *n;
1790{
1791 object *v;
1792 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001793 v = (object *)compile(n, c->c_filename);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001794 if (v == NULL)
1795 c->c_errors++;
1796 else {
1797 int i = com_addconst(c, v);
1798 com_addoparg(c, LOAD_CONST, i);
1799 com_addbyte(c, BUILD_FUNCTION);
1800 com_addopname(c, STORE_NAME, CHILD(n, 1));
1801 DECREF(v);
1802 }
1803}
1804
1805static void
Guido van Rossum25831651993-05-19 14:50:45 +00001806com_bases(c, n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00001807 struct compiling *c;
1808 node *n;
1809{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001810 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001811 REQ(n, testlist);
1812 /* testlist: test (',' test)* [','] */
1813 for (i = 0; i < NCH(n); i += 2)
1814 com_node(c, CHILD(n, i));
1815 com_addoparg(c, BUILD_TUPLE, (NCH(n)+1) / 2);
1816}
1817
1818static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001819com_classdef(c, n)
1820 struct compiling *c;
1821 node *n;
1822{
Guido van Rossum25831651993-05-19 14:50:45 +00001823 int i;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001824 object *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001825 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00001826 /* classdef: class NAME ['(' testlist ')'] ':' suite */
1827 if ((v = newstringobject(STR(CHILD(n, 1)))) == NULL) {
1828 c->c_errors++;
1829 return;
1830 }
1831 /* Push the class name on the stack */
1832 i = com_addconst(c, v);
1833 com_addoparg(c, LOAD_CONST, i);
1834 DECREF(v);
1835 /* Push the tuple of base classes on the stack */
1836 if (TYPE(CHILD(n, 2)) != LPAR)
Guido van Rossumc5e96291991-12-10 13:53:51 +00001837 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum25831651993-05-19 14:50:45 +00001838 else
1839 com_bases(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001840 v = (object *)compile(n, c->c_filename);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001841 if (v == NULL)
1842 c->c_errors++;
1843 else {
Guido van Rossum25831651993-05-19 14:50:45 +00001844 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001845 com_addoparg(c, LOAD_CONST, i);
1846 com_addbyte(c, BUILD_FUNCTION);
1847 com_addbyte(c, UNARY_CALL);
1848 com_addbyte(c, BUILD_CLASS);
1849 com_addopname(c, STORE_NAME, CHILD(n, 1));
1850 DECREF(v);
1851 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001852}
1853
1854static void
1855com_node(c, n)
1856 struct compiling *c;
1857 node *n;
1858{
1859 switch (TYPE(n)) {
1860
1861 /* Definition nodes */
1862
1863 case funcdef:
1864 com_funcdef(c, n);
1865 break;
1866 case classdef:
1867 com_classdef(c, n);
1868 break;
1869
1870 /* Trivial parse tree nodes */
1871
1872 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001873 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001874 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001875 com_node(c, CHILD(n, 0));
1876 break;
1877
1878 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001879 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
1880 com_addoparg(c, SET_LINENO, n->n_lineno);
1881 {
1882 int i;
1883 for (i = 0; i < NCH(n)-1; i += 2)
1884 com_node(c, CHILD(n, i));
1885 }
1886 break;
1887
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001888 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001889 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001890 com_node(c, CHILD(n, 0));
1891 break;
1892
1893 /* Statement nodes */
1894
1895 case expr_stmt:
1896 com_expr_stmt(c, n);
1897 break;
1898 case print_stmt:
1899 com_print_stmt(c, n);
1900 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001901 case del_stmt: /* 'del' exprlist */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001902 com_assign(c, CHILD(n, 1), 0/*delete*/);
1903 break;
1904 case pass_stmt:
1905 break;
1906 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001907 if (c->c_loops == 0) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001908 err_setstr(SyntaxError, "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001909 c->c_errors++;
1910 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001911 com_addbyte(c, BREAK_LOOP);
1912 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001913 case continue_stmt:
1914 com_continue_stmt(c, n);
1915 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001916 case return_stmt:
1917 com_return_stmt(c, n);
1918 break;
1919 case raise_stmt:
1920 com_raise_stmt(c, n);
1921 break;
1922 case import_stmt:
1923 com_import_stmt(c, n);
1924 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001925 case global_stmt:
1926 com_global_stmt(c, n);
1927 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001928 case access_stmt:
1929 com_access_stmt(c, n);
1930 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001931 case exec_stmt:
1932 com_exec_stmt(c, n);
1933 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001934 case if_stmt:
1935 com_if_stmt(c, n);
1936 break;
1937 case while_stmt:
1938 com_while_stmt(c, n);
1939 break;
1940 case for_stmt:
1941 com_for_stmt(c, n);
1942 break;
1943 case try_stmt:
1944 com_try_stmt(c, n);
1945 break;
1946 case suite:
1947 com_suite(c, n);
1948 break;
1949
1950 /* Expression nodes */
1951
1952 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00001953 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001954 break;
1955 case test:
1956 com_test(c, n);
1957 break;
1958 case and_test:
1959 com_and_test(c, n);
1960 break;
1961 case not_test:
1962 com_not_test(c, n);
1963 break;
1964 case comparison:
1965 com_comparison(c, n);
1966 break;
1967 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00001968 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001969 break;
1970 case expr:
1971 com_expr(c, n);
1972 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001973 case xor_expr:
1974 com_xor_expr(c, n);
1975 break;
1976 case and_expr:
1977 com_and_expr(c, n);
1978 break;
1979 case shift_expr:
1980 com_shift_expr(c, n);
1981 break;
1982 case arith_expr:
1983 com_arith_expr(c, n);
1984 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001985 case term:
1986 com_term(c, n);
1987 break;
1988 case factor:
1989 com_factor(c, n);
1990 break;
1991 case atom:
1992 com_atom(c, n);
1993 break;
1994
1995 default:
1996 fprintf(stderr, "node type %d\n", TYPE(n));
1997 err_setstr(SystemError, "com_node: unexpected node type");
1998 c->c_errors++;
1999 }
2000}
2001
2002static void com_fplist PROTO((struct compiling *, node *));
2003
2004static void
2005com_fpdef(c, n)
2006 struct compiling *c;
2007 node *n;
2008{
2009 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
2010 if (TYPE(CHILD(n, 0)) == LPAR)
2011 com_fplist(c, CHILD(n, 1));
2012 else
2013 com_addopname(c, STORE_NAME, CHILD(n, 0));
2014}
2015
2016static void
2017com_fplist(c, n)
2018 struct compiling *c;
2019 node *n;
2020{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00002021 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002022 if (NCH(n) == 1) {
2023 com_fpdef(c, CHILD(n, 0));
2024 }
2025 else {
2026 int i;
2027 com_addoparg(c, UNPACK_TUPLE, (NCH(n)+1)/2);
2028 for (i = 0; i < NCH(n); i += 2)
2029 com_fpdef(c, CHILD(n, i));
2030 }
2031}
2032
2033static void
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002034com_arglist(c, n)
2035 struct compiling *c;
2036 node *n;
2037{
2038 int i, nargs, op;
2039 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00002040 /* varargslist:
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002041 (fpdef ',')* '*' NAME | fpdef (',' fpdef)* [','] */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002042 op = UNPACK_ARG;
2043 nargs = (NCH(n) + 1) / 2;
2044 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumacbefef1992-01-19 16:33:51 +00002045 int t = TYPE(CHILD(n, i));
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002046 if (t == STAR) {
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002047 op = UNPACK_VARARG;
2048 nargs = i/2;
2049 break;
2050 }
2051 }
2052 com_addoparg(c, op, nargs);
2053 for (i = 0; i < 2*nargs; i += 2)
2054 com_fpdef(c, CHILD(n, i));
2055 if (op == UNPACK_VARARG)
2056 com_addopname(c, STORE_NAME, CHILD(n, 2*nargs+1));
2057}
2058
2059static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002060com_file_input(c, n)
2061 struct compiling *c;
2062 node *n;
2063{
2064 int i;
2065 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
2066 for (i = 0; i < NCH(n); i++) {
2067 node *ch = CHILD(n, i);
2068 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
2069 com_node(c, ch);
2070 }
2071}
2072
2073/* Top-level compile-node interface */
2074
2075static void
2076compile_funcdef(c, n)
2077 struct compiling *c;
2078 node *n;
2079{
2080 node *ch;
2081 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00002082 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002083 com_addoparg(c, RESERVE_FAST, com_addconst(c, None)); /* Patched! */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002084 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
2085 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002086 if (TYPE(ch) == RPAR)
Guido van Rossum288a60f1991-12-16 13:05:10 +00002087 com_addoparg(c, UNPACK_ARG, 0);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002088 else
2089 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002090 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002091 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002092 c->c_infunction = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002093 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2094 com_addbyte(c, RETURN_VALUE);
2095}
2096
2097static void
2098compile_node(c, n)
2099 struct compiling *c;
2100 node *n;
2101{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002102 com_addoparg(c, SET_LINENO, n->n_lineno);
2103
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002104 switch (TYPE(n)) {
2105
Guido van Rossum4c417781991-01-21 16:09:22 +00002106 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002107 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
2108 n = CHILD(n, 0);
2109 if (TYPE(n) != NEWLINE)
2110 com_node(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002111 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2112 com_addbyte(c, RETURN_VALUE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002113 break;
2114
Guido van Rossum4c417781991-01-21 16:09:22 +00002115 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002116 com_file_input(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002117 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2118 com_addbyte(c, RETURN_VALUE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002119 break;
2120
Guido van Rossum4c417781991-01-21 16:09:22 +00002121 case expr_input: /* Built-in function eval() */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002122 com_node(c, CHILD(n, 0));
2123 com_addbyte(c, RETURN_VALUE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002124 break;
2125
Guido van Rossum4c417781991-01-21 16:09:22 +00002126 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00002127 com_node(c, CHILD(n, 0));
2128 com_addbyte(c, RETURN_VALUE);
2129 break;
2130
2131 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002132 compile_funcdef(c, n);
2133 break;
2134
Guido van Rossum4c417781991-01-21 16:09:22 +00002135 case classdef: /* A class definition */
Guido van Rossum25831651993-05-19 14:50:45 +00002136 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
2137 c->c_name = STR(CHILD(n, 1));
Guido van Rossumc5e96291991-12-10 13:53:51 +00002138 com_node(c, CHILD(n, NCH(n)-1)); /* The suite */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002139 com_addbyte(c, LOAD_LOCALS);
2140 com_addbyte(c, RETURN_VALUE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002141 break;
2142
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002143 default:
2144 fprintf(stderr, "node type %d\n", TYPE(n));
2145 err_setstr(SystemError, "compile_node: unexpected node type");
2146 c->c_errors++;
2147 }
2148}
2149
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002150/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00002151
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002152 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
2153 instructions that refer to local variables with LOAD_FAST etc.
2154 The latter instructions are much faster because they don't need to
2155 look up the variable name in a dictionary.
Guido van Rossum282914b1991-04-04 10:42:56 +00002156
2157 To find all local variables, we check all STORE_NAME and IMPORT_FROM
2158 instructions. This yields all local variables, including arguments,
2159 function definitions, class definitions and import statements.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002160 (We don't check DELETE_NAME instructions, since if there's no
2161 STORE_NAME the DELETE_NAME will surely fail.)
Guido van Rossum282914b1991-04-04 10:42:56 +00002162
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002163 There is one problem: 'from foo import *' introduces local variables
2164 that we can't know while compiling. If this is the case, wo don't
Guido van Rossum25831651993-05-19 14:50:45 +00002165 optimize at all (this rarely happens, since this form of import
2166 statement is mostly used at the module level).
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002167
2168 Note that, because of this optimization, code like the following
2169 won't work:
2170 eval('x = 1')
2171 print x
Guido van Rossum282914b1991-04-04 10:42:56 +00002172
2173 NB: this modifies the string object co->co_code!
2174*/
2175
2176static void
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002177optimize(c)
2178 struct compiling *c;
Guido van Rossum282914b1991-04-04 10:42:56 +00002179{
Guido van Rossum0a697f61991-04-16 08:39:12 +00002180 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00002181 object *locals;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002182 int nlocals;
Guido van Rossum282914b1991-04-04 10:42:56 +00002183 int opcode;
2184 int oparg;
2185 object *name;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002186 int fast_reserved;
2187 object *error_type, *error_value;
2188
Guido van Rossum282914b1991-04-04 10:42:56 +00002189#define NEXTOP() (*next_instr++)
2190#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
2191#define GETITEM(v, i) (getlistitem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002192#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
2193
Guido van Rossum282914b1991-04-04 10:42:56 +00002194 locals = newdictobject();
2195 if (locals == NULL) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002196 c->c_errors++;
2197 return;
Guido van Rossum282914b1991-04-04 10:42:56 +00002198 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002199 nlocals = 0;
2200
2201 err_get(&error_type, &error_value);
Guido van Rossum282914b1991-04-04 10:42:56 +00002202
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002203 next_instr = (unsigned char *) getstringvalue(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00002204 for (;;) {
2205 opcode = NEXTOP();
2206 if (opcode == STOP_CODE)
2207 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002208 if (opcode == EXEC_STMT)
2209 goto end; /* Don't optimize if exec present */
Guido van Rossum282914b1991-04-04 10:42:56 +00002210 if (HAS_ARG(opcode))
2211 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002212 if (opcode == STORE_NAME || opcode == DELETE_NAME ||
2213 opcode == IMPORT_FROM) {
2214 object *v;
Guido van Rossum282914b1991-04-04 10:42:56 +00002215 name = GETNAMEOBJ(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002216 if (dict2lookup(locals, name) != NULL)
2217 continue;
2218 err_clear();
2219 v = newintobject(nlocals);
2220 if (v == NULL) {
2221 c->c_errors++;
2222 goto err;
Guido van Rossum282914b1991-04-04 10:42:56 +00002223 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002224 nlocals++;
2225 if (dict2insert(locals, name, v) != 0) {
2226 DECREF(v);
2227 c->c_errors++;
2228 goto err;
2229 }
2230 DECREF(v);
Guido van Rossum282914b1991-04-04 10:42:56 +00002231 }
2232 }
2233
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002234 if (nlocals == 0 || dictlookup(locals, "*") != NULL) {
2235 /* Don't optimize anything */
2236 goto end;
2237 }
2238
2239 next_instr = (unsigned char *) getstringvalue(c->c_code);
2240 fast_reserved = 0;
Guido van Rossum282914b1991-04-04 10:42:56 +00002241 for (;;) {
2242 cur_instr = next_instr;
2243 opcode = NEXTOP();
2244 if (opcode == STOP_CODE)
2245 break;
2246 if (HAS_ARG(opcode))
2247 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002248 if (opcode == RESERVE_FAST) {
2249 int i = com_addconst(c, locals);
2250 cur_instr[1] = i & 0xff;
2251 cur_instr[2] = (i>>8) & 0xff;
2252 fast_reserved = 1;
2253 continue;
2254 }
2255 if (!fast_reserved)
2256 continue;
2257 if (opcode == LOAD_NAME ||
2258 opcode == STORE_NAME ||
2259 opcode == DELETE_NAME) {
2260 object *v;
2261 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00002262 name = GETNAMEOBJ(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002263 v = dict2lookup(locals, name);
2264 if (v == NULL) {
Guido van Rossum83163251991-08-16 08:58:43 +00002265 err_clear();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002266 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00002267 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002268 i = getintvalue(v);
2269 switch (opcode) {
2270 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
2271 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
2272 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
2273 }
2274 cur_instr[1] = i & 0xff;
2275 cur_instr[2] = (i>>8) & 0xff;
Guido van Rossum282914b1991-04-04 10:42:56 +00002276 }
2277 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002278
2279 end:
2280 err_setval(error_type, error_value);
2281 err:
Guido van Rossum282914b1991-04-04 10:42:56 +00002282 DECREF(locals);
2283}
2284
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002285codeobject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002286compile(n, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002287 node *n;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002288 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002289{
2290 struct compiling sc;
2291 codeobject *co;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002292 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002293 return NULL;
2294 compile_node(&sc, n);
2295 com_done(&sc);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002296 if (TYPE(n) == funcdef && sc.c_errors == 0)
2297 optimize(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00002298 co = NULL;
2299 if (sc.c_errors == 0) {
2300 object *v, *w;
2301 v = newstringobject(sc.c_filename);
2302 w = newstringobject(sc.c_name);
2303 if (v != NULL && w != NULL)
2304 co = newcodeobject(sc.c_code, sc.c_consts,
2305 sc.c_names, v, w);
2306 XDECREF(v);
2307 XDECREF(w);
Guido van Rossuma082ce41991-06-04 19:41:56 +00002308 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002309 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002310 return co;
2311}