blob: 685a806c74920aa70e744346bbe85ed444b78957 [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;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000484 int quote = *s;
485 if (quote != '\'' && quote != '\"') {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000486 err_badcall();
487 return NULL;
488 }
489 s++;
490 len = strlen(s);
Guido van Rossum8054fad1993-10-26 15:19:44 +0000491 if (s[--len] != quote) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000492 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;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000509 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000510 case 'b': *p++ = '\b'; break;
511 case 'f': *p++ = '\014'; break; /* FF */
512 case 't': *p++ = '\t'; break;
513 case 'n': *p++ = '\n'; break;
514 case 'r': *p++ = '\r'; break;
515 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000516 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
517 case '0': case '1': case '2': case '3':
518 case '4': case '5': case '6': case '7':
519 c = s[-1] - '0';
520 if ('0' <= *s && *s <= '7') {
521 c = (c<<3) + *s++ - '0';
522 if ('0' <= *s && *s <= '7')
523 c = (c<<3) + *s++ - '0';
524 }
525 *p++ = c;
526 break;
527 case 'x':
528 if (isxdigit(*s)) {
529 sscanf(s, "%x", &c);
530 *p++ = c;
531 do {
532 s++;
533 } while (isxdigit(*s));
534 break;
535 }
536 /* FALLTHROUGH */
537 default: *p++ = '\\'; *p++ = s[-1]; break;
538 }
539 }
540 resizestring(&v, (int)(p - buf));
541 return v;
542}
543
544static void
545com_list_constructor(c, n)
546 struct compiling *c;
547 node *n;
548{
549 int len;
550 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000551 if (TYPE(n) != testlist)
552 REQ(n, exprlist);
553 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
554 len = (NCH(n) + 1) / 2;
555 for (i = 0; i < NCH(n); i += 2)
556 com_node(c, CHILD(n, i));
557 com_addoparg(c, BUILD_LIST, len);
558}
559
560static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000561com_dictmaker(c, n)
562 struct compiling *c;
563 node *n;
564{
565 int i;
566 /* dictmaker: test ':' test (',' test ':' value)* [','] */
567 for (i = 0; i+2 < NCH(n); i += 4) {
568 /* We must arrange things just right for STORE_SUBSCR.
569 It wants the stack to look like (value) (dict) (key) */
570 com_addbyte(c, DUP_TOP);
571 com_node(c, CHILD(n, i+2)); /* value */
572 com_addbyte(c, ROT_TWO);
573 com_node(c, CHILD(n, i)); /* key */
574 com_addbyte(c, STORE_SUBSCR);
575 }
576}
577
578static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000579com_atom(c, n)
580 struct compiling *c;
581 node *n;
582{
583 node *ch;
584 object *v;
585 int i;
586 REQ(n, atom);
587 ch = CHILD(n, 0);
588 switch (TYPE(ch)) {
589 case LPAR:
590 if (TYPE(CHILD(n, 1)) == RPAR)
591 com_addoparg(c, BUILD_TUPLE, 0);
592 else
593 com_node(c, CHILD(n, 1));
594 break;
595 case LSQB:
596 if (TYPE(CHILD(n, 1)) == RSQB)
597 com_addoparg(c, BUILD_LIST, 0);
598 else
599 com_list_constructor(c, CHILD(n, 1));
600 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000601 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000602 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000603 if (TYPE(CHILD(n, 1)) != RBRACE)
604 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000605 break;
606 case BACKQUOTE:
607 com_node(c, CHILD(n, 1));
608 com_addbyte(c, UNARY_CONVERT);
609 break;
610 case NUMBER:
611 if ((v = parsenumber(STR(ch))) == NULL) {
612 c->c_errors++;
613 i = 255;
614 }
615 else {
616 i = com_addconst(c, v);
617 DECREF(v);
618 }
619 com_addoparg(c, LOAD_CONST, i);
620 break;
621 case STRING:
622 if ((v = parsestr(STR(ch))) == NULL) {
623 c->c_errors++;
624 i = 255;
625 }
626 else {
627 i = com_addconst(c, v);
628 DECREF(v);
629 }
630 com_addoparg(c, LOAD_CONST, i);
631 break;
632 case NAME:
633 com_addopname(c, LOAD_NAME, ch);
634 break;
635 default:
636 fprintf(stderr, "node type %d\n", TYPE(ch));
637 err_setstr(SystemError, "com_atom: unexpected node type");
638 c->c_errors++;
639 }
640}
641
642static void
643com_slice(c, n, op)
644 struct compiling *c;
645 node *n;
646 int op;
647{
648 if (NCH(n) == 1) {
649 com_addbyte(c, op);
650 }
651 else if (NCH(n) == 2) {
652 if (TYPE(CHILD(n, 0)) != COLON) {
653 com_node(c, CHILD(n, 0));
654 com_addbyte(c, op+1);
655 }
656 else {
657 com_node(c, CHILD(n, 1));
658 com_addbyte(c, op+2);
659 }
660 }
661 else {
662 com_node(c, CHILD(n, 0));
663 com_node(c, CHILD(n, 2));
664 com_addbyte(c, op+3);
665 }
666}
667
668static void
669com_apply_subscript(c, n)
670 struct compiling *c;
671 node *n;
672{
673 REQ(n, subscript);
674 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) != COLON) {
675 /* It's a single subscript */
676 com_node(c, CHILD(n, 0));
677 com_addbyte(c, BINARY_SUBSCR);
678 }
679 else {
680 /* It's a slice: [expr] ':' [expr] */
681 com_slice(c, n, SLICE);
682 }
683}
684
685static void
686com_call_function(c, n)
687 struct compiling *c;
688 node *n; /* EITHER testlist OR ')' */
689{
690 if (TYPE(n) == RPAR) {
Guido van Rossum288a60f1991-12-16 13:05:10 +0000691 com_addoparg(c, BUILD_TUPLE, 0);
692 com_addbyte(c, BINARY_CALL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000693 }
694 else {
Guido van Rossum288a60f1991-12-16 13:05:10 +0000695 REQ(n, testlist);
696 com_list(c, n, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000697 com_addbyte(c, BINARY_CALL);
698 }
699}
700
701static void
702com_select_member(c, n)
703 struct compiling *c;
704 node *n;
705{
706 com_addopname(c, LOAD_ATTR, n);
707}
708
709static void
710com_apply_trailer(c, n)
711 struct compiling *c;
712 node *n;
713{
714 REQ(n, trailer);
715 switch (TYPE(CHILD(n, 0))) {
716 case LPAR:
717 com_call_function(c, CHILD(n, 1));
718 break;
719 case DOT:
720 com_select_member(c, CHILD(n, 1));
721 break;
722 case LSQB:
723 com_apply_subscript(c, CHILD(n, 1));
724 break;
725 default:
726 err_setstr(SystemError,
727 "com_apply_trailer: unknown trailer type");
728 c->c_errors++;
729 }
730}
731
732static void
733com_factor(c, n)
734 struct compiling *c;
735 node *n;
736{
737 int i;
738 REQ(n, factor);
739 if (TYPE(CHILD(n, 0)) == PLUS) {
740 com_factor(c, CHILD(n, 1));
741 com_addbyte(c, UNARY_POSITIVE);
742 }
743 else if (TYPE(CHILD(n, 0)) == MINUS) {
744 com_factor(c, CHILD(n, 1));
745 com_addbyte(c, UNARY_NEGATIVE);
746 }
Guido van Rossum7928cd71991-10-24 14:59:31 +0000747 else if (TYPE(CHILD(n, 0)) == TILDE) {
748 com_factor(c, CHILD(n, 1));
749 com_addbyte(c, UNARY_INVERT);
750 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000751 else {
752 com_atom(c, CHILD(n, 0));
753 for (i = 1; i < NCH(n); i++)
754 com_apply_trailer(c, CHILD(n, i));
755 }
756}
757
758static void
759com_term(c, n)
760 struct compiling *c;
761 node *n;
762{
763 int i;
764 int op;
765 REQ(n, term);
766 com_factor(c, CHILD(n, 0));
767 for (i = 2; i < NCH(n); i += 2) {
768 com_factor(c, CHILD(n, i));
769 switch (TYPE(CHILD(n, i-1))) {
770 case STAR:
771 op = BINARY_MULTIPLY;
772 break;
773 case SLASH:
774 op = BINARY_DIVIDE;
775 break;
776 case PERCENT:
777 op = BINARY_MODULO;
778 break;
779 default:
780 err_setstr(SystemError,
Guido van Rossum7928cd71991-10-24 14:59:31 +0000781 "com_term: operator not *, / or %");
782 c->c_errors++;
783 op = 255;
784 }
785 com_addbyte(c, op);
786 }
787}
788
789static void
790com_arith_expr(c, n)
791 struct compiling *c;
792 node *n;
793{
794 int i;
795 int op;
796 REQ(n, arith_expr);
797 com_term(c, CHILD(n, 0));
798 for (i = 2; i < NCH(n); i += 2) {
799 com_term(c, CHILD(n, i));
800 switch (TYPE(CHILD(n, i-1))) {
801 case PLUS:
802 op = BINARY_ADD;
803 break;
804 case MINUS:
805 op = BINARY_SUBTRACT;
806 break;
807 default:
808 err_setstr(SystemError,
809 "com_arith_expr: operator not + or -");
810 c->c_errors++;
811 op = 255;
812 }
813 com_addbyte(c, op);
814 }
815}
816
817static void
818com_shift_expr(c, n)
819 struct compiling *c;
820 node *n;
821{
822 int i;
823 int op;
824 REQ(n, shift_expr);
825 com_arith_expr(c, CHILD(n, 0));
826 for (i = 2; i < NCH(n); i += 2) {
827 com_arith_expr(c, CHILD(n, i));
828 switch (TYPE(CHILD(n, i-1))) {
829 case LEFTSHIFT:
830 op = BINARY_LSHIFT;
831 break;
832 case RIGHTSHIFT:
833 op = BINARY_RSHIFT;
834 break;
835 default:
836 err_setstr(SystemError,
837 "com_shift_expr: operator not << or >>");
838 c->c_errors++;
839 op = 255;
840 }
841 com_addbyte(c, op);
842 }
843}
844
845static void
846com_and_expr(c, n)
847 struct compiling *c;
848 node *n;
849{
850 int i;
851 int op;
852 REQ(n, and_expr);
853 com_shift_expr(c, CHILD(n, 0));
854 for (i = 2; i < NCH(n); i += 2) {
855 com_shift_expr(c, CHILD(n, i));
856 if (TYPE(CHILD(n, i-1)) == AMPER) {
857 op = BINARY_AND;
858 }
859 else {
860 err_setstr(SystemError,
861 "com_and_expr: operator not &");
862 c->c_errors++;
863 op = 255;
864 }
865 com_addbyte(c, op);
866 }
867}
868
869static void
870com_xor_expr(c, n)
871 struct compiling *c;
872 node *n;
873{
874 int i;
875 int op;
876 REQ(n, xor_expr);
877 com_and_expr(c, CHILD(n, 0));
878 for (i = 2; i < NCH(n); i += 2) {
879 com_and_expr(c, CHILD(n, i));
880 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
881 op = BINARY_XOR;
882 }
883 else {
884 err_setstr(SystemError,
885 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000886 c->c_errors++;
887 op = 255;
888 }
889 com_addbyte(c, op);
890 }
891}
892
893static void
894com_expr(c, n)
895 struct compiling *c;
896 node *n;
897{
898 int i;
899 int op;
900 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000901 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000902 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +0000903 com_xor_expr(c, CHILD(n, i));
904 if (TYPE(CHILD(n, i-1)) == VBAR) {
905 op = BINARY_OR;
906 }
907 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000908 err_setstr(SystemError,
Guido van Rossum7928cd71991-10-24 14:59:31 +0000909 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000910 c->c_errors++;
911 op = 255;
912 }
913 com_addbyte(c, op);
914 }
915}
916
917static enum cmp_op
918cmp_type(n)
919 node *n;
920{
921 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +0000922 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000923 | 'in' | 'not' 'in' | 'is' | 'is' not' */
924 if (NCH(n) == 1) {
925 n = CHILD(n, 0);
926 switch (TYPE(n)) {
927 case LESS: return LT;
928 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +0000929 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000930 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +0000931 case LESSEQUAL: return LE;
932 case GREATEREQUAL: return GE;
933 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000934 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
935 if (strcmp(STR(n), "is") == 0) return IS;
936 }
937 }
938 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000939 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000940 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
941 return NOT_IN;
942 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
943 return IS_NOT;
944 }
945 }
946 return BAD;
947}
948
949static void
950com_comparison(c, n)
951 struct compiling *c;
952 node *n;
953{
954 int i;
955 enum cmp_op op;
956 int anchor;
957 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
958 com_expr(c, CHILD(n, 0));
959 if (NCH(n) == 1)
960 return;
961
962 /****************************************************************
963 The following code is generated for all but the last
964 comparison in a chain:
965
966 label: on stack: opcode: jump to:
967
968 a <code to load b>
969 a, b DUP_TOP
970 a, b, b ROT_THREE
971 b, a, b COMPARE_OP
972 b, 0-or-1 JUMP_IF_FALSE L1
973 b, 1 POP_TOP
974 b
975
976 We are now ready to repeat this sequence for the next
977 comparison in the chain.
978
979 For the last we generate:
980
981 b <code to load c>
982 b, c COMPARE_OP
983 0-or-1
984
985 If there were any jumps to L1 (i.e., there was more than one
986 comparison), we generate:
987
988 0-or-1 JUMP_FORWARD L2
989 L1: b, 0 ROT_TWO
990 0, b POP_TOP
991 0
992 L2:
993 ****************************************************************/
994
995 anchor = 0;
996
997 for (i = 2; i < NCH(n); i += 2) {
998 com_expr(c, CHILD(n, i));
999 if (i+2 < NCH(n)) {
1000 com_addbyte(c, DUP_TOP);
1001 com_addbyte(c, ROT_THREE);
1002 }
1003 op = cmp_type(CHILD(n, i-1));
1004 if (op == BAD) {
1005 err_setstr(SystemError,
1006 "com_comparison: unknown comparison op");
1007 c->c_errors++;
1008 }
1009 com_addoparg(c, COMPARE_OP, op);
1010 if (i+2 < NCH(n)) {
1011 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1012 com_addbyte(c, POP_TOP);
1013 }
1014 }
1015
1016 if (anchor) {
1017 int anchor2 = 0;
1018 com_addfwref(c, JUMP_FORWARD, &anchor2);
1019 com_backpatch(c, anchor);
1020 com_addbyte(c, ROT_TWO);
1021 com_addbyte(c, POP_TOP);
1022 com_backpatch(c, anchor2);
1023 }
1024}
1025
1026static void
1027com_not_test(c, n)
1028 struct compiling *c;
1029 node *n;
1030{
1031 REQ(n, not_test); /* 'not' not_test | comparison */
1032 if (NCH(n) == 1) {
1033 com_comparison(c, CHILD(n, 0));
1034 }
1035 else {
1036 com_not_test(c, CHILD(n, 1));
1037 com_addbyte(c, UNARY_NOT);
1038 }
1039}
1040
1041static void
1042com_and_test(c, n)
1043 struct compiling *c;
1044 node *n;
1045{
1046 int i;
1047 int anchor;
1048 REQ(n, and_test); /* not_test ('and' not_test)* */
1049 anchor = 0;
1050 i = 0;
1051 for (;;) {
1052 com_not_test(c, CHILD(n, i));
1053 if ((i += 2) >= NCH(n))
1054 break;
1055 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1056 com_addbyte(c, POP_TOP);
1057 }
1058 if (anchor)
1059 com_backpatch(c, anchor);
1060}
1061
1062static void
1063com_test(c, n)
1064 struct compiling *c;
1065 node *n;
1066{
1067 int i;
1068 int anchor;
1069 REQ(n, test); /* and_test ('and' and_test)* */
1070 anchor = 0;
1071 i = 0;
1072 for (;;) {
1073 com_and_test(c, CHILD(n, i));
1074 if ((i += 2) >= NCH(n))
1075 break;
1076 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1077 com_addbyte(c, POP_TOP);
1078 }
1079 if (anchor)
1080 com_backpatch(c, anchor);
1081}
1082
1083static void
Guido van Rossum288a60f1991-12-16 13:05:10 +00001084com_list(c, n, toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001085 struct compiling *c;
1086 node *n;
Guido van Rossum288a60f1991-12-16 13:05:10 +00001087 int toplevel; /* If nonzero, *always* build a tuple */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001088{
1089 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001090 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001091 com_node(c, CHILD(n, 0));
1092 }
1093 else {
1094 int i;
1095 int len;
1096 len = (NCH(n) + 1) / 2;
1097 for (i = 0; i < NCH(n); i += 2)
1098 com_node(c, CHILD(n, i));
1099 com_addoparg(c, BUILD_TUPLE, len);
1100 }
1101}
1102
1103
1104/* Begin of assignment compilation */
1105
1106static void com_assign_name PROTO((struct compiling *, node *, int));
1107static void com_assign PROTO((struct compiling *, node *, int));
1108
1109static void
1110com_assign_attr(c, n, assigning)
1111 struct compiling *c;
1112 node *n;
1113 int assigning;
1114{
1115 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
1116}
1117
1118static void
1119com_assign_slice(c, n, assigning)
1120 struct compiling *c;
1121 node *n;
1122 int assigning;
1123{
1124 com_slice(c, n, assigning ? STORE_SLICE : DELETE_SLICE);
1125}
1126
1127static void
1128com_assign_subscript(c, n, assigning)
1129 struct compiling *c;
1130 node *n;
1131 int assigning;
1132{
1133 com_node(c, n);
1134 com_addbyte(c, assigning ? STORE_SUBSCR : DELETE_SUBSCR);
1135}
1136
1137static void
1138com_assign_trailer(c, n, assigning)
1139 struct compiling *c;
1140 node *n;
1141 int assigning;
1142{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001143 REQ(n, trailer);
1144 switch (TYPE(CHILD(n, 0))) {
1145 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001146 err_setstr(SyntaxError, "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001147 c->c_errors++;
1148 break;
1149 case DOT: /* '.' NAME */
1150 com_assign_attr(c, CHILD(n, 1), assigning);
1151 break;
1152 case LSQB: /* '[' subscript ']' */
1153 n = CHILD(n, 1);
1154 REQ(n, subscript); /* subscript: expr | [expr] ':' [expr] */
1155 if (NCH(n) > 1 || TYPE(CHILD(n, 0)) == COLON)
1156 com_assign_slice(c, n, assigning);
1157 else
1158 com_assign_subscript(c, CHILD(n, 0), assigning);
1159 break;
1160 default:
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001161 err_setstr(SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001162 c->c_errors++;
1163 }
1164}
1165
1166static void
1167com_assign_tuple(c, n, assigning)
1168 struct compiling *c;
1169 node *n;
1170 int assigning;
1171{
1172 int i;
1173 if (TYPE(n) != testlist)
1174 REQ(n, exprlist);
1175 if (assigning)
1176 com_addoparg(c, UNPACK_TUPLE, (NCH(n)+1)/2);
1177 for (i = 0; i < NCH(n); i += 2)
1178 com_assign(c, CHILD(n, i), assigning);
1179}
1180
1181static void
1182com_assign_list(c, n, assigning)
1183 struct compiling *c;
1184 node *n;
1185 int assigning;
1186{
1187 int i;
1188 if (assigning)
1189 com_addoparg(c, UNPACK_LIST, (NCH(n)+1)/2);
1190 for (i = 0; i < NCH(n); i += 2)
1191 com_assign(c, CHILD(n, i), assigning);
1192}
1193
1194static void
1195com_assign_name(c, n, assigning)
1196 struct compiling *c;
1197 node *n;
1198 int assigning;
1199{
1200 REQ(n, NAME);
1201 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
1202}
1203
1204static void
1205com_assign(c, n, assigning)
1206 struct compiling *c;
1207 node *n;
1208 int assigning;
1209{
1210 /* Loop to avoid trivial recursion */
1211 for (;;) {
1212 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001213
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001214 case exprlist:
1215 case testlist:
1216 if (NCH(n) > 1) {
1217 com_assign_tuple(c, n, assigning);
1218 return;
1219 }
1220 n = CHILD(n, 0);
1221 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001222
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001223 case test:
1224 case and_test:
1225 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001226 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001227 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001228 case xor_expr:
1229 case and_expr:
1230 case shift_expr:
1231 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001232 case term:
1233 if (NCH(n) > 1) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001234 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001235 "can't assign to operator");
1236 c->c_errors++;
1237 return;
1238 }
1239 n = CHILD(n, 0);
1240 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001241
Guido van Rossum7928cd71991-10-24 14:59:31 +00001242 case factor: /* ('+'|'-'|'~') factor | atom trailer* */
1243 if (TYPE(CHILD(n, 0)) != atom) { /* '+'|'-'|'~' */
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001244 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001245 "can't assign to operator");
1246 c->c_errors++;
1247 return;
1248 }
1249 if (NCH(n) > 1) { /* trailer present */
1250 int i;
1251 com_node(c, CHILD(n, 0));
1252 for (i = 1; i+1 < NCH(n); i++) {
1253 com_apply_trailer(c, CHILD(n, i));
1254 } /* NB i is still alive */
1255 com_assign_trailer(c,
1256 CHILD(n, i), assigning);
1257 return;
1258 }
1259 n = CHILD(n, 0);
1260 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001261
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001262 case atom:
1263 switch (TYPE(CHILD(n, 0))) {
1264 case LPAR:
1265 n = CHILD(n, 1);
1266 if (TYPE(n) == RPAR) {
1267 /* XXX Should allow () = () ??? */
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001268 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001269 "can't assign to ()");
1270 c->c_errors++;
1271 return;
1272 }
1273 break;
1274 case LSQB:
1275 n = CHILD(n, 1);
1276 if (TYPE(n) == RSQB) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001277 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001278 "can't assign to []");
1279 c->c_errors++;
1280 return;
1281 }
1282 com_assign_list(c, n, assigning);
1283 return;
1284 case NAME:
1285 com_assign_name(c, CHILD(n, 0), assigning);
1286 return;
1287 default:
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001288 err_setstr(SyntaxError,
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001289 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001290 c->c_errors++;
1291 return;
1292 }
1293 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001294
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001295 default:
1296 fprintf(stderr, "node type %d\n", TYPE(n));
1297 err_setstr(SystemError, "com_assign: bad node");
1298 c->c_errors++;
1299 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001300
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001301 }
1302 }
1303}
1304
1305static void
1306com_expr_stmt(c, n)
1307 struct compiling *c;
1308 node *n;
1309{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001310 REQ(n, expr_stmt); /* testlist ('=' testlist)* */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001311 com_node(c, CHILD(n, NCH(n)-1));
1312 if (NCH(n) == 1) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001313 com_addbyte(c, PRINT_EXPR);
1314 }
1315 else {
1316 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001317 for (i = 0; i < NCH(n)-2; i+=2) {
1318 if (i+2 < NCH(n)-2)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001319 com_addbyte(c, DUP_TOP);
1320 com_assign(c, CHILD(n, i), 1/*assign*/);
1321 }
1322 }
1323}
1324
1325static void
1326com_print_stmt(c, n)
1327 struct compiling *c;
1328 node *n;
1329{
1330 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001331 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
1332 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001333 com_node(c, CHILD(n, i));
1334 com_addbyte(c, PRINT_ITEM);
1335 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001336 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001337 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001338 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001339}
1340
1341static void
1342com_return_stmt(c, n)
1343 struct compiling *c;
1344 node *n;
1345{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001346 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001347 if (!c->c_infunction) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001348 err_setstr(SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001349 c->c_errors++;
1350 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001351 if (NCH(n) < 2)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001352 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1353 else
1354 com_node(c, CHILD(n, 1));
1355 com_addbyte(c, RETURN_VALUE);
1356}
1357
1358static void
1359com_raise_stmt(c, n)
1360 struct compiling *c;
1361 node *n;
1362{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001363 REQ(n, raise_stmt); /* 'raise' test [',' test] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001364 com_node(c, CHILD(n, 1));
1365 if (NCH(n) > 3)
1366 com_node(c, CHILD(n, 3));
1367 else
1368 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1369 com_addbyte(c, RAISE_EXCEPTION);
1370}
1371
1372static void
1373com_import_stmt(c, n)
1374 struct compiling *c;
1375 node *n;
1376{
1377 int i;
1378 REQ(n, import_stmt);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001379 /* 'import' NAME (',' NAME)* |
1380 'from' NAME 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001381 if (STR(CHILD(n, 0))[0] == 'f') {
1382 /* 'from' NAME 'import' ... */
1383 REQ(CHILD(n, 1), NAME);
1384 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
1385 for (i = 3; i < NCH(n); i += 2)
1386 com_addopname(c, IMPORT_FROM, CHILD(n, i));
1387 com_addbyte(c, POP_TOP);
1388 }
1389 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001390 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001391 for (i = 1; i < NCH(n); i += 2) {
1392 com_addopname(c, IMPORT_NAME, CHILD(n, i));
1393 com_addopname(c, STORE_NAME, CHILD(n, i));
1394 }
1395 }
1396}
1397
1398static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00001399com_global_stmt(c, n)
1400 struct compiling *c;
1401 node *n;
1402{
1403 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001404 REQ(n, global_stmt);
1405 /* 'global' NAME (',' NAME)* */
1406 for (i = 1; i < NCH(n); i += 2) {
1407 if (dictinsert(c->c_globals, STR(CHILD(n, i)), None) != 0)
1408 c->c_errors++;
1409 }
1410}
1411
Guido van Rossum25831651993-05-19 14:50:45 +00001412#define strequ(a, b) (strcmp((a), (b)) == 0)
1413
1414static void
1415com_access_stmt(c, n)
1416 struct compiling *c;
1417 node *n;
1418{
1419 int i, j, k, mode, imode;
1420 object *vmode;
1421 REQ(n, access_stmt);
1422 /* 'access' NAME (',' NAME)* ':' accesstype (',' accesstype)*
1423 accesstype: NAME+ */
1424
1425 /* Find where the colon is */
1426 i = 1;
1427 while (TYPE(CHILD(n,i-1)) != COLON)
1428 i += 1;
1429
1430 /* Calculate the mode mask */
1431 mode = 0;
1432 for (j = i; j < NCH(n); j += 2) {
Guido van Rossum81daa321993-05-20 14:24:46 +00001433 int r = 0, w = 0, p = 0;
1434 for (k = 0; k < NCH(CHILD(n,j)); k++) {
Guido van Rossum25831651993-05-19 14:50:45 +00001435 if (strequ(STR(CHILD(CHILD(n,j),k)), "public"))
1436 p = 0;
1437 else if (strequ(STR(CHILD(CHILD(n,j),k)), "protected"))
1438 p = 1;
1439 else if (strequ(STR(CHILD(CHILD(n,j),k)), "private"))
1440 p = 2;
1441 else if (strequ(STR(CHILD(CHILD(n,j),k)), "read"))
1442 r = 1;
1443 else if (strequ(STR(CHILD(CHILD(n,j),k)), "write"))
1444 w = 1;
1445 else /* XXX should make this an exception */
1446 fprintf(stderr, "bad access type %s\n",
1447 STR(CHILD(CHILD(n,j),k)));
1448 }
1449 if (r == 0 && w == 0)
Guido van Rossum81daa321993-05-20 14:24:46 +00001450 r = w = 1;
Guido van Rossum25831651993-05-19 14:50:45 +00001451 if (p == 0) {
1452 if (r == 1) mode |= AC_R_PUBLIC;
1453 if (w == 1) mode |= AC_W_PUBLIC;
1454 } else if (p == 1) {
1455 if (r == 1) mode |= AC_R_PROTECTED;
1456 if (w == 1) mode |= AC_W_PROTECTED;
1457 } else {
1458 if (r == 1) mode |= AC_R_PRIVATE;
1459 if (w == 1) mode |= AC_W_PRIVATE;
1460 }
1461 }
1462 vmode = newintobject((long)mode);
1463 imode = com_addconst(c, vmode);
1464 XDECREF(vmode);
1465 for (i = 1; TYPE(CHILD(n,i-1)) != COLON; i+=2) {
1466 com_addoparg(c, LOAD_CONST, imode);
1467 com_addopname(c, ACCESS_MODE, CHILD(n, i));
1468 }
1469}
1470
Guido van Rossumc5e96291991-12-10 13:53:51 +00001471static void
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001472com_exec_stmt(c, n)
1473 struct compiling *c;
1474 node *n;
1475{
1476 REQ(n, exec_stmt);
1477 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
1478 com_node(c, CHILD(n, 1));
1479 if (NCH(n) >= 4)
1480 com_node(c, CHILD(n, 3));
1481 else
1482 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1483 if (NCH(n) >= 6)
1484 com_node(c, CHILD(n, 5));
1485 else
1486 com_addbyte(c, DUP_TOP);
1487 com_addbyte(c, EXEC_STMT);
1488}
1489
1490static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001491com_if_stmt(c, n)
1492 struct compiling *c;
1493 node *n;
1494{
1495 int i;
1496 int anchor = 0;
1497 REQ(n, if_stmt);
1498 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
1499 for (i = 0; i+3 < NCH(n); i+=4) {
1500 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001501 node *ch = CHILD(n, i+1);
1502 if (i > 0)
1503 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001504 com_node(c, CHILD(n, i+1));
1505 com_addfwref(c, JUMP_IF_FALSE, &a);
1506 com_addbyte(c, POP_TOP);
1507 com_node(c, CHILD(n, i+3));
1508 com_addfwref(c, JUMP_FORWARD, &anchor);
1509 com_backpatch(c, a);
1510 com_addbyte(c, POP_TOP);
1511 }
1512 if (i+2 < NCH(n))
1513 com_node(c, CHILD(n, i+2));
1514 com_backpatch(c, anchor);
1515}
1516
1517static void
1518com_while_stmt(c, n)
1519 struct compiling *c;
1520 node *n;
1521{
1522 int break_anchor = 0;
1523 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001524 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001525 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
1526 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001527 block_push(c, SETUP_LOOP);
1528 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001529 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001530 com_node(c, CHILD(n, 1));
1531 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1532 com_addbyte(c, POP_TOP);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001533 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001534 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001535 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001536 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1537 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001538 com_backpatch(c, anchor);
1539 com_addbyte(c, POP_TOP);
1540 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001541 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001542 if (NCH(n) > 4)
1543 com_node(c, CHILD(n, 6));
1544 com_backpatch(c, break_anchor);
1545}
1546
1547static void
1548com_for_stmt(c, n)
1549 struct compiling *c;
1550 node *n;
1551{
1552 object *v;
1553 int break_anchor = 0;
1554 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001555 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001556 REQ(n, for_stmt);
1557 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
1558 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001559 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001560 com_node(c, CHILD(n, 3));
1561 v = newintobject(0L);
1562 if (v == NULL)
1563 c->c_errors++;
1564 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
1565 XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001566 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001567 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001568 com_addfwref(c, FOR_LOOP, &anchor);
1569 com_assign(c, CHILD(n, 1), 1/*assigning*/);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001570 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001571 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001572 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001573 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1574 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001575 com_backpatch(c, anchor);
1576 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001577 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001578 if (NCH(n) > 8)
1579 com_node(c, CHILD(n, 8));
1580 com_backpatch(c, break_anchor);
1581}
1582
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001583/* Although 'execpt' and 'finally' clauses can be combined
1584 syntactically, they are compiled separately. In fact,
1585 try: S
1586 except E1: S1
1587 except E2: S2
1588 ...
1589 finally: Sf
1590 is equivalent to
1591 try:
1592 try: S
1593 except E1: S1
1594 except E2: S2
1595 ...
1596 finally: Sf
1597 meaning that the 'finally' clause is entered even if things
1598 go wrong again in an exception handler. Note that this is
1599 not the case for exception handlers: at most one is entered.
1600
1601 Code generated for "try: S finally: Sf" is as follows:
1602
1603 SETUP_FINALLY L
1604 <code for S>
1605 POP_BLOCK
1606 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001607 L: <code for Sf>
1608 END_FINALLY
1609
1610 The special instructions use the block stack. Each block
1611 stack entry contains the instruction that created it (here
1612 SETUP_FINALLY), the level of the value stack at the time the
1613 block stack entry was created, and a label (here L).
1614
1615 SETUP_FINALLY:
1616 Pushes the current value stack level and the label
1617 onto the block stack.
1618 POP_BLOCK:
1619 Pops en entry from the block stack, and pops the value
1620 stack until its level is the same as indicated on the
1621 block stack. (The label is ignored.)
1622 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001623 Pops a variable number of entries from the *value* stack
1624 and re-raises the exception they specify. The number of
1625 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001626
1627 The block stack is unwound when an exception is raised:
1628 when a SETUP_FINALLY entry is found, the exception is pushed
1629 onto the value stack (and the exception condition is cleared),
1630 and the interpreter jumps to the label gotten from the block
1631 stack.
1632
1633 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00001634 (The contents of the value stack is shown in [], with the top
1635 at the right; 'tb' is trace-back info, 'val' the exception's
1636 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001637
1638 Value stack Label Instruction Argument
1639 [] SETUP_EXCEPT L1
1640 [] <code for S>
1641 [] POP_BLOCK
1642 [] JUMP_FORWARD L0
1643
Guido van Rossum3f5da241990-12-20 15:06:42 +00001644 [tb, val, exc] L1: DUP )
1645 [tb, val, exc, exc] <evaluate E1> )
1646 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
1647 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
1648 [tb, val, exc, 1] POP )
1649 [tb, val, exc] POP
1650 [tb, val] <assign to V1> (or POP if no V1)
1651 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001652 [] <code for S1>
1653 JUMP_FORWARD L0
1654
Guido van Rossum3f5da241990-12-20 15:06:42 +00001655 [tb, val, exc, 0] L2: POP
1656 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001657 .............................etc.......................
1658
Guido van Rossum3f5da241990-12-20 15:06:42 +00001659 [tb, val, exc, 0] Ln+1: POP
1660 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001661
1662 [] L0: <next statement>
1663
1664 Of course, parts are not generated if Vi or Ei is not present.
1665*/
1666
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001667static void
1668com_try_stmt(c, n)
1669 struct compiling *c;
1670 node *n;
1671{
1672 int finally_anchor = 0;
1673 int except_anchor = 0;
1674 REQ(n, try_stmt);
Guido van Rossum94fb82e1992-04-05 14:24:50 +00001675 /* 'try' ':' suite (except_clause ':' suite)*
1676 | 'try' ':' 'finally' ':' suite */
1677
1678 /* XXX This can be simplified because except and finally can
1679 no longer be mixed in a single try statement */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001680
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001681 if (NCH(n) > 3 && TYPE(CHILD(n, NCH(n)-3)) != except_clause) {
1682 /* Have a 'finally' clause */
1683 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001684 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001685 }
1686 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == except_clause) {
1687 /* Have an 'except' clause */
1688 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001689 block_push(c, SETUP_EXCEPT);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001690 }
1691 com_node(c, CHILD(n, 2));
1692 if (except_anchor) {
1693 int end_anchor = 0;
1694 int i;
1695 node *ch;
1696 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001697 block_pop(c, SETUP_EXCEPT);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001698 com_addfwref(c, JUMP_FORWARD, &end_anchor);
1699 com_backpatch(c, except_anchor);
1700 for (i = 3;
1701 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
1702 i += 3) {
1703 /* except_clause: 'except' [expr [',' expr]] */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001704 if (except_anchor == 0) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001705 err_setstr(SyntaxError,
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001706 "default 'except:' must be last");
1707 c->c_errors++;
1708 break;
1709 }
1710 except_anchor = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001711 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001712 if (NCH(ch) > 1) {
1713 com_addbyte(c, DUP_TOP);
1714 com_node(c, CHILD(ch, 1));
1715 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001716 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001717 com_addbyte(c, POP_TOP);
1718 }
1719 com_addbyte(c, POP_TOP);
1720 if (NCH(ch) > 3)
1721 com_assign(c, CHILD(ch, 3), 1/*assigning*/);
1722 else
1723 com_addbyte(c, POP_TOP);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001724 com_addbyte(c, POP_TOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001725 com_node(c, CHILD(n, i+2));
1726 com_addfwref(c, JUMP_FORWARD, &end_anchor);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001727 if (except_anchor) {
1728 com_backpatch(c, except_anchor);
1729 com_addbyte(c, POP_TOP);
1730 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001731 }
1732 com_addbyte(c, END_FINALLY);
1733 com_backpatch(c, end_anchor);
1734 }
1735 if (finally_anchor) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001736 node *ch;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001737 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001738 block_pop(c, SETUP_FINALLY);
1739 block_push(c, END_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001740 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001741 com_backpatch(c, finally_anchor);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001742 ch = CHILD(n, NCH(n)-1);
1743 com_addoparg(c, SET_LINENO, ch->n_lineno);
1744 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001745 com_addbyte(c, END_FINALLY);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001746 block_pop(c, END_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001747 }
1748}
1749
1750static void
1751com_suite(c, n)
1752 struct compiling *c;
1753 node *n;
1754{
1755 REQ(n, suite);
1756 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
1757 if (NCH(n) == 1) {
1758 com_node(c, CHILD(n, 0));
1759 }
1760 else {
1761 int i;
1762 for (i = 0; i < NCH(n); i++) {
1763 node *ch = CHILD(n, i);
1764 if (TYPE(ch) == stmt)
1765 com_node(c, ch);
1766 }
1767 }
1768}
1769
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001770/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001771static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001772com_continue_stmt(c, n)
1773 struct compiling *c;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001774 node *n; /* Not used, but passed for consistency */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001775{
1776 int i = c->c_nblocks;
1777 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
1778 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1779 }
1780 else {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001781 err_setstr(SyntaxError, "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001782 c->c_errors++;
1783 }
1784 /* XXX Could allow it inside a 'finally' clause
1785 XXX if we could pop the exception still on the stack */
1786}
1787
1788static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001789com_funcdef(c, n)
1790 struct compiling *c;
1791 node *n;
1792{
1793 object *v;
1794 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001795 v = (object *)compile(n, c->c_filename);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001796 if (v == NULL)
1797 c->c_errors++;
1798 else {
1799 int i = com_addconst(c, v);
1800 com_addoparg(c, LOAD_CONST, i);
1801 com_addbyte(c, BUILD_FUNCTION);
1802 com_addopname(c, STORE_NAME, CHILD(n, 1));
1803 DECREF(v);
1804 }
1805}
1806
1807static void
Guido van Rossum25831651993-05-19 14:50:45 +00001808com_bases(c, n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00001809 struct compiling *c;
1810 node *n;
1811{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001812 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001813 REQ(n, testlist);
1814 /* testlist: test (',' test)* [','] */
1815 for (i = 0; i < NCH(n); i += 2)
1816 com_node(c, CHILD(n, i));
1817 com_addoparg(c, BUILD_TUPLE, (NCH(n)+1) / 2);
1818}
1819
1820static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001821com_classdef(c, n)
1822 struct compiling *c;
1823 node *n;
1824{
Guido van Rossum25831651993-05-19 14:50:45 +00001825 int i;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001826 object *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001827 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00001828 /* classdef: class NAME ['(' testlist ')'] ':' suite */
1829 if ((v = newstringobject(STR(CHILD(n, 1)))) == NULL) {
1830 c->c_errors++;
1831 return;
1832 }
1833 /* Push the class name on the stack */
1834 i = com_addconst(c, v);
1835 com_addoparg(c, LOAD_CONST, i);
1836 DECREF(v);
1837 /* Push the tuple of base classes on the stack */
1838 if (TYPE(CHILD(n, 2)) != LPAR)
Guido van Rossumc5e96291991-12-10 13:53:51 +00001839 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum25831651993-05-19 14:50:45 +00001840 else
1841 com_bases(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001842 v = (object *)compile(n, c->c_filename);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001843 if (v == NULL)
1844 c->c_errors++;
1845 else {
Guido van Rossum25831651993-05-19 14:50:45 +00001846 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001847 com_addoparg(c, LOAD_CONST, i);
1848 com_addbyte(c, BUILD_FUNCTION);
1849 com_addbyte(c, UNARY_CALL);
1850 com_addbyte(c, BUILD_CLASS);
1851 com_addopname(c, STORE_NAME, CHILD(n, 1));
1852 DECREF(v);
1853 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001854}
1855
1856static void
1857com_node(c, n)
1858 struct compiling *c;
1859 node *n;
1860{
1861 switch (TYPE(n)) {
1862
1863 /* Definition nodes */
1864
1865 case funcdef:
1866 com_funcdef(c, n);
1867 break;
1868 case classdef:
1869 com_classdef(c, n);
1870 break;
1871
1872 /* Trivial parse tree nodes */
1873
1874 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001875 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001876 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001877 com_node(c, CHILD(n, 0));
1878 break;
1879
1880 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001881 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
1882 com_addoparg(c, SET_LINENO, n->n_lineno);
1883 {
1884 int i;
1885 for (i = 0; i < NCH(n)-1; i += 2)
1886 com_node(c, CHILD(n, i));
1887 }
1888 break;
1889
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001890 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001891 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001892 com_node(c, CHILD(n, 0));
1893 break;
1894
1895 /* Statement nodes */
1896
1897 case expr_stmt:
1898 com_expr_stmt(c, n);
1899 break;
1900 case print_stmt:
1901 com_print_stmt(c, n);
1902 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001903 case del_stmt: /* 'del' exprlist */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001904 com_assign(c, CHILD(n, 1), 0/*delete*/);
1905 break;
1906 case pass_stmt:
1907 break;
1908 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001909 if (c->c_loops == 0) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001910 err_setstr(SyntaxError, "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001911 c->c_errors++;
1912 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001913 com_addbyte(c, BREAK_LOOP);
1914 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001915 case continue_stmt:
1916 com_continue_stmt(c, n);
1917 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001918 case return_stmt:
1919 com_return_stmt(c, n);
1920 break;
1921 case raise_stmt:
1922 com_raise_stmt(c, n);
1923 break;
1924 case import_stmt:
1925 com_import_stmt(c, n);
1926 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001927 case global_stmt:
1928 com_global_stmt(c, n);
1929 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001930 case access_stmt:
1931 com_access_stmt(c, n);
1932 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001933 case exec_stmt:
1934 com_exec_stmt(c, n);
1935 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001936 case if_stmt:
1937 com_if_stmt(c, n);
1938 break;
1939 case while_stmt:
1940 com_while_stmt(c, n);
1941 break;
1942 case for_stmt:
1943 com_for_stmt(c, n);
1944 break;
1945 case try_stmt:
1946 com_try_stmt(c, n);
1947 break;
1948 case suite:
1949 com_suite(c, n);
1950 break;
1951
1952 /* Expression nodes */
1953
1954 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00001955 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001956 break;
1957 case test:
1958 com_test(c, n);
1959 break;
1960 case and_test:
1961 com_and_test(c, n);
1962 break;
1963 case not_test:
1964 com_not_test(c, n);
1965 break;
1966 case comparison:
1967 com_comparison(c, n);
1968 break;
1969 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00001970 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001971 break;
1972 case expr:
1973 com_expr(c, n);
1974 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001975 case xor_expr:
1976 com_xor_expr(c, n);
1977 break;
1978 case and_expr:
1979 com_and_expr(c, n);
1980 break;
1981 case shift_expr:
1982 com_shift_expr(c, n);
1983 break;
1984 case arith_expr:
1985 com_arith_expr(c, n);
1986 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001987 case term:
1988 com_term(c, n);
1989 break;
1990 case factor:
1991 com_factor(c, n);
1992 break;
1993 case atom:
1994 com_atom(c, n);
1995 break;
1996
1997 default:
1998 fprintf(stderr, "node type %d\n", TYPE(n));
1999 err_setstr(SystemError, "com_node: unexpected node type");
2000 c->c_errors++;
2001 }
2002}
2003
2004static void com_fplist PROTO((struct compiling *, node *));
2005
2006static void
2007com_fpdef(c, n)
2008 struct compiling *c;
2009 node *n;
2010{
2011 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
2012 if (TYPE(CHILD(n, 0)) == LPAR)
2013 com_fplist(c, CHILD(n, 1));
2014 else
2015 com_addopname(c, STORE_NAME, CHILD(n, 0));
2016}
2017
2018static void
2019com_fplist(c, n)
2020 struct compiling *c;
2021 node *n;
2022{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00002023 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002024 if (NCH(n) == 1) {
2025 com_fpdef(c, CHILD(n, 0));
2026 }
2027 else {
2028 int i;
2029 com_addoparg(c, UNPACK_TUPLE, (NCH(n)+1)/2);
2030 for (i = 0; i < NCH(n); i += 2)
2031 com_fpdef(c, CHILD(n, i));
2032 }
2033}
2034
2035static void
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002036com_arglist(c, n)
2037 struct compiling *c;
2038 node *n;
2039{
2040 int i, nargs, op;
2041 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00002042 /* varargslist:
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002043 (fpdef ',')* '*' NAME | fpdef (',' fpdef)* [','] */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002044 op = UNPACK_ARG;
2045 nargs = (NCH(n) + 1) / 2;
2046 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumacbefef1992-01-19 16:33:51 +00002047 int t = TYPE(CHILD(n, i));
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002048 if (t == STAR) {
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002049 op = UNPACK_VARARG;
2050 nargs = i/2;
2051 break;
2052 }
2053 }
2054 com_addoparg(c, op, nargs);
2055 for (i = 0; i < 2*nargs; i += 2)
2056 com_fpdef(c, CHILD(n, i));
2057 if (op == UNPACK_VARARG)
2058 com_addopname(c, STORE_NAME, CHILD(n, 2*nargs+1));
2059}
2060
2061static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002062com_file_input(c, n)
2063 struct compiling *c;
2064 node *n;
2065{
2066 int i;
2067 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
2068 for (i = 0; i < NCH(n); i++) {
2069 node *ch = CHILD(n, i);
2070 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
2071 com_node(c, ch);
2072 }
2073}
2074
2075/* Top-level compile-node interface */
2076
2077static void
2078compile_funcdef(c, n)
2079 struct compiling *c;
2080 node *n;
2081{
2082 node *ch;
2083 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00002084 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002085 com_addoparg(c, RESERVE_FAST, com_addconst(c, None)); /* Patched! */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002086 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
2087 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002088 if (TYPE(ch) == RPAR)
Guido van Rossum288a60f1991-12-16 13:05:10 +00002089 com_addoparg(c, UNPACK_ARG, 0);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002090 else
2091 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002092 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002093 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002094 c->c_infunction = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002095 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2096 com_addbyte(c, RETURN_VALUE);
2097}
2098
2099static void
2100compile_node(c, n)
2101 struct compiling *c;
2102 node *n;
2103{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002104 com_addoparg(c, SET_LINENO, n->n_lineno);
2105
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002106 switch (TYPE(n)) {
2107
Guido van Rossum4c417781991-01-21 16:09:22 +00002108 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002109 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
2110 n = CHILD(n, 0);
2111 if (TYPE(n) != NEWLINE)
2112 com_node(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002113 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2114 com_addbyte(c, RETURN_VALUE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002115 break;
2116
Guido van Rossum4c417781991-01-21 16:09:22 +00002117 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002118 com_file_input(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002119 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2120 com_addbyte(c, RETURN_VALUE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002121 break;
2122
Guido van Rossum4c417781991-01-21 16:09:22 +00002123 case expr_input: /* Built-in function eval() */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002124 com_node(c, CHILD(n, 0));
2125 com_addbyte(c, RETURN_VALUE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002126 break;
2127
Guido van Rossum4c417781991-01-21 16:09:22 +00002128 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00002129 com_node(c, CHILD(n, 0));
2130 com_addbyte(c, RETURN_VALUE);
2131 break;
2132
2133 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002134 compile_funcdef(c, n);
2135 break;
2136
Guido van Rossum4c417781991-01-21 16:09:22 +00002137 case classdef: /* A class definition */
Guido van Rossum25831651993-05-19 14:50:45 +00002138 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
2139 c->c_name = STR(CHILD(n, 1));
Guido van Rossumc5e96291991-12-10 13:53:51 +00002140 com_node(c, CHILD(n, NCH(n)-1)); /* The suite */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002141 com_addbyte(c, LOAD_LOCALS);
2142 com_addbyte(c, RETURN_VALUE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002143 break;
2144
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002145 default:
2146 fprintf(stderr, "node type %d\n", TYPE(n));
2147 err_setstr(SystemError, "compile_node: unexpected node type");
2148 c->c_errors++;
2149 }
2150}
2151
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002152/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00002153
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002154 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
2155 instructions that refer to local variables with LOAD_FAST etc.
2156 The latter instructions are much faster because they don't need to
2157 look up the variable name in a dictionary.
Guido van Rossum282914b1991-04-04 10:42:56 +00002158
2159 To find all local variables, we check all STORE_NAME and IMPORT_FROM
2160 instructions. This yields all local variables, including arguments,
2161 function definitions, class definitions and import statements.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002162 (We don't check DELETE_NAME instructions, since if there's no
2163 STORE_NAME the DELETE_NAME will surely fail.)
Guido van Rossum282914b1991-04-04 10:42:56 +00002164
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002165 There is one problem: 'from foo import *' introduces local variables
2166 that we can't know while compiling. If this is the case, wo don't
Guido van Rossum25831651993-05-19 14:50:45 +00002167 optimize at all (this rarely happens, since this form of import
2168 statement is mostly used at the module level).
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002169
2170 Note that, because of this optimization, code like the following
2171 won't work:
2172 eval('x = 1')
2173 print x
Guido van Rossum282914b1991-04-04 10:42:56 +00002174
2175 NB: this modifies the string object co->co_code!
2176*/
2177
2178static void
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002179optimize(c)
2180 struct compiling *c;
Guido van Rossum282914b1991-04-04 10:42:56 +00002181{
Guido van Rossum0a697f61991-04-16 08:39:12 +00002182 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00002183 object *locals;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002184 int nlocals;
Guido van Rossum282914b1991-04-04 10:42:56 +00002185 int opcode;
2186 int oparg;
2187 object *name;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002188 int fast_reserved;
2189 object *error_type, *error_value;
2190
Guido van Rossum282914b1991-04-04 10:42:56 +00002191#define NEXTOP() (*next_instr++)
2192#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
2193#define GETITEM(v, i) (getlistitem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002194#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
2195
Guido van Rossum282914b1991-04-04 10:42:56 +00002196 locals = newdictobject();
2197 if (locals == NULL) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002198 c->c_errors++;
2199 return;
Guido van Rossum282914b1991-04-04 10:42:56 +00002200 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002201 nlocals = 0;
2202
2203 err_get(&error_type, &error_value);
Guido van Rossum282914b1991-04-04 10:42:56 +00002204
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002205 next_instr = (unsigned char *) getstringvalue(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00002206 for (;;) {
2207 opcode = NEXTOP();
2208 if (opcode == STOP_CODE)
2209 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002210 if (opcode == EXEC_STMT)
2211 goto end; /* Don't optimize if exec present */
Guido van Rossum282914b1991-04-04 10:42:56 +00002212 if (HAS_ARG(opcode))
2213 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002214 if (opcode == STORE_NAME || opcode == DELETE_NAME ||
2215 opcode == IMPORT_FROM) {
2216 object *v;
Guido van Rossum282914b1991-04-04 10:42:56 +00002217 name = GETNAMEOBJ(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002218 if (dict2lookup(locals, name) != NULL)
2219 continue;
2220 err_clear();
2221 v = newintobject(nlocals);
2222 if (v == NULL) {
2223 c->c_errors++;
2224 goto err;
Guido van Rossum282914b1991-04-04 10:42:56 +00002225 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002226 nlocals++;
2227 if (dict2insert(locals, name, v) != 0) {
2228 DECREF(v);
2229 c->c_errors++;
2230 goto err;
2231 }
2232 DECREF(v);
Guido van Rossum282914b1991-04-04 10:42:56 +00002233 }
2234 }
2235
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002236 if (nlocals == 0 || dictlookup(locals, "*") != NULL) {
2237 /* Don't optimize anything */
2238 goto end;
2239 }
2240
2241 next_instr = (unsigned char *) getstringvalue(c->c_code);
2242 fast_reserved = 0;
Guido van Rossum282914b1991-04-04 10:42:56 +00002243 for (;;) {
2244 cur_instr = next_instr;
2245 opcode = NEXTOP();
2246 if (opcode == STOP_CODE)
2247 break;
2248 if (HAS_ARG(opcode))
2249 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002250 if (opcode == RESERVE_FAST) {
2251 int i = com_addconst(c, locals);
2252 cur_instr[1] = i & 0xff;
2253 cur_instr[2] = (i>>8) & 0xff;
2254 fast_reserved = 1;
2255 continue;
2256 }
2257 if (!fast_reserved)
2258 continue;
2259 if (opcode == LOAD_NAME ||
2260 opcode == STORE_NAME ||
2261 opcode == DELETE_NAME) {
2262 object *v;
2263 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00002264 name = GETNAMEOBJ(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002265 v = dict2lookup(locals, name);
2266 if (v == NULL) {
Guido van Rossum83163251991-08-16 08:58:43 +00002267 err_clear();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002268 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00002269 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002270 i = getintvalue(v);
2271 switch (opcode) {
2272 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
2273 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
2274 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
2275 }
2276 cur_instr[1] = i & 0xff;
2277 cur_instr[2] = (i>>8) & 0xff;
Guido van Rossum282914b1991-04-04 10:42:56 +00002278 }
2279 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002280
2281 end:
2282 err_setval(error_type, error_value);
2283 err:
Guido van Rossum282914b1991-04-04 10:42:56 +00002284 DECREF(locals);
2285}
2286
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002287codeobject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002288compile(n, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002289 node *n;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002290 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002291{
2292 struct compiling sc;
2293 codeobject *co;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002294 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002295 return NULL;
2296 compile_node(&sc, n);
2297 com_done(&sc);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002298 if (TYPE(n) == funcdef && sc.c_errors == 0)
2299 optimize(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00002300 co = NULL;
2301 if (sc.c_errors == 0) {
2302 object *v, *w;
2303 v = newstringobject(sc.c_filename);
2304 w = newstringobject(sc.c_name);
2305 if (v != NULL && w != NULL)
2306 co = newcodeobject(sc.c_code, sc.c_consts,
2307 sc.c_names, v, w);
2308 XDECREF(v);
2309 XDECREF(w);
Guido van Rossuma082ce41991-06-04 19:41:56 +00002310 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002311 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002312 return co;
2313}