blob: 0eb06cb5d50401e03430a2ca57f58e797b093b58 [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 Rossum4bad92c1991-07-27 21:34:52 +00001308 REQ(n, expr_stmt); /* exprlist ('=' exprlist)* */
1309 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 Rossum10dc2e81990-11-18 17:27:39 +00001470com_if_stmt(c, n)
1471 struct compiling *c;
1472 node *n;
1473{
1474 int i;
1475 int anchor = 0;
1476 REQ(n, if_stmt);
1477 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
1478 for (i = 0; i+3 < NCH(n); i+=4) {
1479 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001480 node *ch = CHILD(n, i+1);
1481 if (i > 0)
1482 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001483 com_node(c, CHILD(n, i+1));
1484 com_addfwref(c, JUMP_IF_FALSE, &a);
1485 com_addbyte(c, POP_TOP);
1486 com_node(c, CHILD(n, i+3));
1487 com_addfwref(c, JUMP_FORWARD, &anchor);
1488 com_backpatch(c, a);
1489 com_addbyte(c, POP_TOP);
1490 }
1491 if (i+2 < NCH(n))
1492 com_node(c, CHILD(n, i+2));
1493 com_backpatch(c, anchor);
1494}
1495
1496static void
1497com_while_stmt(c, n)
1498 struct compiling *c;
1499 node *n;
1500{
1501 int break_anchor = 0;
1502 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001503 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001504 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
1505 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001506 block_push(c, SETUP_LOOP);
1507 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001508 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001509 com_node(c, CHILD(n, 1));
1510 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1511 com_addbyte(c, POP_TOP);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001512 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001513 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001514 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001515 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1516 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001517 com_backpatch(c, anchor);
1518 com_addbyte(c, POP_TOP);
1519 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001520 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001521 if (NCH(n) > 4)
1522 com_node(c, CHILD(n, 6));
1523 com_backpatch(c, break_anchor);
1524}
1525
1526static void
1527com_for_stmt(c, n)
1528 struct compiling *c;
1529 node *n;
1530{
1531 object *v;
1532 int break_anchor = 0;
1533 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001534 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001535 REQ(n, for_stmt);
1536 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
1537 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001538 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001539 com_node(c, CHILD(n, 3));
1540 v = newintobject(0L);
1541 if (v == NULL)
1542 c->c_errors++;
1543 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
1544 XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001545 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001546 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001547 com_addfwref(c, FOR_LOOP, &anchor);
1548 com_assign(c, CHILD(n, 1), 1/*assigning*/);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001549 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001550 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001551 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001552 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1553 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001554 com_backpatch(c, anchor);
1555 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001556 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001557 if (NCH(n) > 8)
1558 com_node(c, CHILD(n, 8));
1559 com_backpatch(c, break_anchor);
1560}
1561
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001562/* Although 'execpt' and 'finally' clauses can be combined
1563 syntactically, they are compiled separately. In fact,
1564 try: S
1565 except E1: S1
1566 except E2: S2
1567 ...
1568 finally: Sf
1569 is equivalent to
1570 try:
1571 try: S
1572 except E1: S1
1573 except E2: S2
1574 ...
1575 finally: Sf
1576 meaning that the 'finally' clause is entered even if things
1577 go wrong again in an exception handler. Note that this is
1578 not the case for exception handlers: at most one is entered.
1579
1580 Code generated for "try: S finally: Sf" is as follows:
1581
1582 SETUP_FINALLY L
1583 <code for S>
1584 POP_BLOCK
1585 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001586 L: <code for Sf>
1587 END_FINALLY
1588
1589 The special instructions use the block stack. Each block
1590 stack entry contains the instruction that created it (here
1591 SETUP_FINALLY), the level of the value stack at the time the
1592 block stack entry was created, and a label (here L).
1593
1594 SETUP_FINALLY:
1595 Pushes the current value stack level and the label
1596 onto the block stack.
1597 POP_BLOCK:
1598 Pops en entry from the block stack, and pops the value
1599 stack until its level is the same as indicated on the
1600 block stack. (The label is ignored.)
1601 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001602 Pops a variable number of entries from the *value* stack
1603 and re-raises the exception they specify. The number of
1604 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001605
1606 The block stack is unwound when an exception is raised:
1607 when a SETUP_FINALLY entry is found, the exception is pushed
1608 onto the value stack (and the exception condition is cleared),
1609 and the interpreter jumps to the label gotten from the block
1610 stack.
1611
1612 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00001613 (The contents of the value stack is shown in [], with the top
1614 at the right; 'tb' is trace-back info, 'val' the exception's
1615 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001616
1617 Value stack Label Instruction Argument
1618 [] SETUP_EXCEPT L1
1619 [] <code for S>
1620 [] POP_BLOCK
1621 [] JUMP_FORWARD L0
1622
Guido van Rossum3f5da241990-12-20 15:06:42 +00001623 [tb, val, exc] L1: DUP )
1624 [tb, val, exc, exc] <evaluate E1> )
1625 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
1626 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
1627 [tb, val, exc, 1] POP )
1628 [tb, val, exc] POP
1629 [tb, val] <assign to V1> (or POP if no V1)
1630 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001631 [] <code for S1>
1632 JUMP_FORWARD L0
1633
Guido van Rossum3f5da241990-12-20 15:06:42 +00001634 [tb, val, exc, 0] L2: POP
1635 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001636 .............................etc.......................
1637
Guido van Rossum3f5da241990-12-20 15:06:42 +00001638 [tb, val, exc, 0] Ln+1: POP
1639 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001640
1641 [] L0: <next statement>
1642
1643 Of course, parts are not generated if Vi or Ei is not present.
1644*/
1645
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001646static void
1647com_try_stmt(c, n)
1648 struct compiling *c;
1649 node *n;
1650{
1651 int finally_anchor = 0;
1652 int except_anchor = 0;
1653 REQ(n, try_stmt);
Guido van Rossum94fb82e1992-04-05 14:24:50 +00001654 /* 'try' ':' suite (except_clause ':' suite)*
1655 | 'try' ':' 'finally' ':' suite */
1656
1657 /* XXX This can be simplified because except and finally can
1658 no longer be mixed in a single try statement */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001659
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001660 if (NCH(n) > 3 && TYPE(CHILD(n, NCH(n)-3)) != except_clause) {
1661 /* Have a 'finally' clause */
1662 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001663 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001664 }
1665 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == except_clause) {
1666 /* Have an 'except' clause */
1667 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001668 block_push(c, SETUP_EXCEPT);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001669 }
1670 com_node(c, CHILD(n, 2));
1671 if (except_anchor) {
1672 int end_anchor = 0;
1673 int i;
1674 node *ch;
1675 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001676 block_pop(c, SETUP_EXCEPT);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001677 com_addfwref(c, JUMP_FORWARD, &end_anchor);
1678 com_backpatch(c, except_anchor);
1679 for (i = 3;
1680 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
1681 i += 3) {
1682 /* except_clause: 'except' [expr [',' expr]] */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001683 if (except_anchor == 0) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001684 err_setstr(SyntaxError,
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001685 "default 'except:' must be last");
1686 c->c_errors++;
1687 break;
1688 }
1689 except_anchor = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001690 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001691 if (NCH(ch) > 1) {
1692 com_addbyte(c, DUP_TOP);
1693 com_node(c, CHILD(ch, 1));
1694 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001695 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001696 com_addbyte(c, POP_TOP);
1697 }
1698 com_addbyte(c, POP_TOP);
1699 if (NCH(ch) > 3)
1700 com_assign(c, CHILD(ch, 3), 1/*assigning*/);
1701 else
1702 com_addbyte(c, POP_TOP);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001703 com_addbyte(c, POP_TOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001704 com_node(c, CHILD(n, i+2));
1705 com_addfwref(c, JUMP_FORWARD, &end_anchor);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001706 if (except_anchor) {
1707 com_backpatch(c, except_anchor);
1708 com_addbyte(c, POP_TOP);
1709 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001710 }
1711 com_addbyte(c, END_FINALLY);
1712 com_backpatch(c, end_anchor);
1713 }
1714 if (finally_anchor) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001715 node *ch;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001716 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001717 block_pop(c, SETUP_FINALLY);
1718 block_push(c, END_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001719 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001720 com_backpatch(c, finally_anchor);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001721 ch = CHILD(n, NCH(n)-1);
1722 com_addoparg(c, SET_LINENO, ch->n_lineno);
1723 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001724 com_addbyte(c, END_FINALLY);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001725 block_pop(c, END_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001726 }
1727}
1728
1729static void
1730com_suite(c, n)
1731 struct compiling *c;
1732 node *n;
1733{
1734 REQ(n, suite);
1735 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
1736 if (NCH(n) == 1) {
1737 com_node(c, CHILD(n, 0));
1738 }
1739 else {
1740 int i;
1741 for (i = 0; i < NCH(n); i++) {
1742 node *ch = CHILD(n, i);
1743 if (TYPE(ch) == stmt)
1744 com_node(c, ch);
1745 }
1746 }
1747}
1748
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001749/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001750static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001751com_continue_stmt(c, n)
1752 struct compiling *c;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001753 node *n; /* Not used, but passed for consistency */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001754{
1755 int i = c->c_nblocks;
1756 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
1757 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1758 }
1759 else {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001760 err_setstr(SyntaxError, "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001761 c->c_errors++;
1762 }
1763 /* XXX Could allow it inside a 'finally' clause
1764 XXX if we could pop the exception still on the stack */
1765}
1766
1767static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001768com_funcdef(c, n)
1769 struct compiling *c;
1770 node *n;
1771{
1772 object *v;
1773 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001774 v = (object *)compile(n, c->c_filename);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001775 if (v == NULL)
1776 c->c_errors++;
1777 else {
1778 int i = com_addconst(c, v);
1779 com_addoparg(c, LOAD_CONST, i);
1780 com_addbyte(c, BUILD_FUNCTION);
1781 com_addopname(c, STORE_NAME, CHILD(n, 1));
1782 DECREF(v);
1783 }
1784}
1785
1786static void
Guido van Rossum25831651993-05-19 14:50:45 +00001787com_bases(c, n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00001788 struct compiling *c;
1789 node *n;
1790{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001791 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001792 REQ(n, testlist);
1793 /* testlist: test (',' test)* [','] */
1794 for (i = 0; i < NCH(n); i += 2)
1795 com_node(c, CHILD(n, i));
1796 com_addoparg(c, BUILD_TUPLE, (NCH(n)+1) / 2);
1797}
1798
1799static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001800com_classdef(c, n)
1801 struct compiling *c;
1802 node *n;
1803{
Guido van Rossum25831651993-05-19 14:50:45 +00001804 int i;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001805 object *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001806 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00001807 /* classdef: class NAME ['(' testlist ')'] ':' suite */
1808 if ((v = newstringobject(STR(CHILD(n, 1)))) == NULL) {
1809 c->c_errors++;
1810 return;
1811 }
1812 /* Push the class name on the stack */
1813 i = com_addconst(c, v);
1814 com_addoparg(c, LOAD_CONST, i);
1815 DECREF(v);
1816 /* Push the tuple of base classes on the stack */
1817 if (TYPE(CHILD(n, 2)) != LPAR)
Guido van Rossumc5e96291991-12-10 13:53:51 +00001818 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum25831651993-05-19 14:50:45 +00001819 else
1820 com_bases(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001821 v = (object *)compile(n, c->c_filename);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001822 if (v == NULL)
1823 c->c_errors++;
1824 else {
Guido van Rossum25831651993-05-19 14:50:45 +00001825 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001826 com_addoparg(c, LOAD_CONST, i);
1827 com_addbyte(c, BUILD_FUNCTION);
1828 com_addbyte(c, UNARY_CALL);
1829 com_addbyte(c, BUILD_CLASS);
1830 com_addopname(c, STORE_NAME, CHILD(n, 1));
1831 DECREF(v);
1832 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001833}
1834
1835static void
1836com_node(c, n)
1837 struct compiling *c;
1838 node *n;
1839{
1840 switch (TYPE(n)) {
1841
1842 /* Definition nodes */
1843
1844 case funcdef:
1845 com_funcdef(c, n);
1846 break;
1847 case classdef:
1848 com_classdef(c, n);
1849 break;
1850
1851 /* Trivial parse tree nodes */
1852
1853 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001854 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001855 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001856 com_node(c, CHILD(n, 0));
1857 break;
1858
1859 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001860 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
1861 com_addoparg(c, SET_LINENO, n->n_lineno);
1862 {
1863 int i;
1864 for (i = 0; i < NCH(n)-1; i += 2)
1865 com_node(c, CHILD(n, i));
1866 }
1867 break;
1868
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001869 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001870 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001871 com_node(c, CHILD(n, 0));
1872 break;
1873
1874 /* Statement nodes */
1875
1876 case expr_stmt:
1877 com_expr_stmt(c, n);
1878 break;
1879 case print_stmt:
1880 com_print_stmt(c, n);
1881 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001882 case del_stmt: /* 'del' exprlist */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001883 com_assign(c, CHILD(n, 1), 0/*delete*/);
1884 break;
1885 case pass_stmt:
1886 break;
1887 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001888 if (c->c_loops == 0) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001889 err_setstr(SyntaxError, "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001890 c->c_errors++;
1891 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001892 com_addbyte(c, BREAK_LOOP);
1893 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001894 case continue_stmt:
1895 com_continue_stmt(c, n);
1896 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001897 case return_stmt:
1898 com_return_stmt(c, n);
1899 break;
1900 case raise_stmt:
1901 com_raise_stmt(c, n);
1902 break;
1903 case import_stmt:
1904 com_import_stmt(c, n);
1905 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001906 case global_stmt:
1907 com_global_stmt(c, n);
1908 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001909 case access_stmt:
1910 com_access_stmt(c, n);
1911 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001912 case if_stmt:
1913 com_if_stmt(c, n);
1914 break;
1915 case while_stmt:
1916 com_while_stmt(c, n);
1917 break;
1918 case for_stmt:
1919 com_for_stmt(c, n);
1920 break;
1921 case try_stmt:
1922 com_try_stmt(c, n);
1923 break;
1924 case suite:
1925 com_suite(c, n);
1926 break;
1927
1928 /* Expression nodes */
1929
1930 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00001931 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001932 break;
1933 case test:
1934 com_test(c, n);
1935 break;
1936 case and_test:
1937 com_and_test(c, n);
1938 break;
1939 case not_test:
1940 com_not_test(c, n);
1941 break;
1942 case comparison:
1943 com_comparison(c, n);
1944 break;
1945 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00001946 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001947 break;
1948 case expr:
1949 com_expr(c, n);
1950 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001951 case xor_expr:
1952 com_xor_expr(c, n);
1953 break;
1954 case and_expr:
1955 com_and_expr(c, n);
1956 break;
1957 case shift_expr:
1958 com_shift_expr(c, n);
1959 break;
1960 case arith_expr:
1961 com_arith_expr(c, n);
1962 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001963 case term:
1964 com_term(c, n);
1965 break;
1966 case factor:
1967 com_factor(c, n);
1968 break;
1969 case atom:
1970 com_atom(c, n);
1971 break;
1972
1973 default:
1974 fprintf(stderr, "node type %d\n", TYPE(n));
1975 err_setstr(SystemError, "com_node: unexpected node type");
1976 c->c_errors++;
1977 }
1978}
1979
1980static void com_fplist PROTO((struct compiling *, node *));
1981
1982static void
1983com_fpdef(c, n)
1984 struct compiling *c;
1985 node *n;
1986{
1987 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
1988 if (TYPE(CHILD(n, 0)) == LPAR)
1989 com_fplist(c, CHILD(n, 1));
1990 else
1991 com_addopname(c, STORE_NAME, CHILD(n, 0));
1992}
1993
1994static void
1995com_fplist(c, n)
1996 struct compiling *c;
1997 node *n;
1998{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001999 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002000 if (NCH(n) == 1) {
2001 com_fpdef(c, CHILD(n, 0));
2002 }
2003 else {
2004 int i;
2005 com_addoparg(c, UNPACK_TUPLE, (NCH(n)+1)/2);
2006 for (i = 0; i < NCH(n); i += 2)
2007 com_fpdef(c, CHILD(n, i));
2008 }
2009}
2010
2011static void
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002012com_arglist(c, n)
2013 struct compiling *c;
2014 node *n;
2015{
2016 int i, nargs, op;
2017 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00002018 /* varargslist:
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002019 (fpdef ',')* '*' NAME | fpdef (',' fpdef)* [','] */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002020 op = UNPACK_ARG;
2021 nargs = (NCH(n) + 1) / 2;
2022 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumacbefef1992-01-19 16:33:51 +00002023 int t = TYPE(CHILD(n, i));
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002024 if (t == STAR) {
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002025 op = UNPACK_VARARG;
2026 nargs = i/2;
2027 break;
2028 }
2029 }
2030 com_addoparg(c, op, nargs);
2031 for (i = 0; i < 2*nargs; i += 2)
2032 com_fpdef(c, CHILD(n, i));
2033 if (op == UNPACK_VARARG)
2034 com_addopname(c, STORE_NAME, CHILD(n, 2*nargs+1));
2035}
2036
2037static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002038com_file_input(c, n)
2039 struct compiling *c;
2040 node *n;
2041{
2042 int i;
2043 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
2044 for (i = 0; i < NCH(n); i++) {
2045 node *ch = CHILD(n, i);
2046 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
2047 com_node(c, ch);
2048 }
2049}
2050
2051/* Top-level compile-node interface */
2052
2053static void
2054compile_funcdef(c, n)
2055 struct compiling *c;
2056 node *n;
2057{
2058 node *ch;
2059 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00002060 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002061 com_addoparg(c, RESERVE_FAST, com_addconst(c, None)); /* Patched! */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002062 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
2063 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002064 if (TYPE(ch) == RPAR)
Guido van Rossum288a60f1991-12-16 13:05:10 +00002065 com_addoparg(c, UNPACK_ARG, 0);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002066 else
2067 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002068 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002069 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002070 c->c_infunction = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002071 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2072 com_addbyte(c, RETURN_VALUE);
2073}
2074
2075static void
2076compile_node(c, n)
2077 struct compiling *c;
2078 node *n;
2079{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002080 com_addoparg(c, SET_LINENO, n->n_lineno);
2081
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002082 switch (TYPE(n)) {
2083
Guido van Rossum4c417781991-01-21 16:09:22 +00002084 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002085 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
2086 n = CHILD(n, 0);
2087 if (TYPE(n) != NEWLINE)
2088 com_node(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002089 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2090 com_addbyte(c, RETURN_VALUE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002091 break;
2092
Guido van Rossum4c417781991-01-21 16:09:22 +00002093 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002094 com_file_input(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002095 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2096 com_addbyte(c, RETURN_VALUE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002097 break;
2098
Guido van Rossum4c417781991-01-21 16:09:22 +00002099 case expr_input: /* Built-in function eval() */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002100 com_node(c, CHILD(n, 0));
2101 com_addbyte(c, RETURN_VALUE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002102 break;
2103
Guido van Rossum4c417781991-01-21 16:09:22 +00002104 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00002105 com_node(c, CHILD(n, 0));
2106 com_addbyte(c, RETURN_VALUE);
2107 break;
2108
2109 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002110 compile_funcdef(c, n);
2111 break;
2112
Guido van Rossum4c417781991-01-21 16:09:22 +00002113 case classdef: /* A class definition */
Guido van Rossum25831651993-05-19 14:50:45 +00002114 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
2115 c->c_name = STR(CHILD(n, 1));
Guido van Rossumc5e96291991-12-10 13:53:51 +00002116 com_node(c, CHILD(n, NCH(n)-1)); /* The suite */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002117 com_addbyte(c, LOAD_LOCALS);
2118 com_addbyte(c, RETURN_VALUE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002119 break;
2120
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002121 default:
2122 fprintf(stderr, "node type %d\n", TYPE(n));
2123 err_setstr(SystemError, "compile_node: unexpected node type");
2124 c->c_errors++;
2125 }
2126}
2127
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002128/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00002129
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002130 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
2131 instructions that refer to local variables with LOAD_FAST etc.
2132 The latter instructions are much faster because they don't need to
2133 look up the variable name in a dictionary.
Guido van Rossum282914b1991-04-04 10:42:56 +00002134
2135 To find all local variables, we check all STORE_NAME and IMPORT_FROM
2136 instructions. This yields all local variables, including arguments,
2137 function definitions, class definitions and import statements.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002138 (We don't check DELETE_NAME instructions, since if there's no
2139 STORE_NAME the DELETE_NAME will surely fail.)
Guido van Rossum282914b1991-04-04 10:42:56 +00002140
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002141 There is one problem: 'from foo import *' introduces local variables
2142 that we can't know while compiling. If this is the case, wo don't
Guido van Rossum25831651993-05-19 14:50:45 +00002143 optimize at all (this rarely happens, since this form of import
2144 statement is mostly used at the module level).
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002145
2146 Note that, because of this optimization, code like the following
2147 won't work:
2148 eval('x = 1')
2149 print x
Guido van Rossum282914b1991-04-04 10:42:56 +00002150
2151 NB: this modifies the string object co->co_code!
2152*/
2153
2154static void
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002155optimize(c)
2156 struct compiling *c;
Guido van Rossum282914b1991-04-04 10:42:56 +00002157{
Guido van Rossum0a697f61991-04-16 08:39:12 +00002158 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00002159 object *locals;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002160 int nlocals;
Guido van Rossum282914b1991-04-04 10:42:56 +00002161 int opcode;
2162 int oparg;
2163 object *name;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002164 int fast_reserved;
2165 object *error_type, *error_value;
2166
Guido van Rossum282914b1991-04-04 10:42:56 +00002167#define NEXTOP() (*next_instr++)
2168#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
2169#define GETITEM(v, i) (getlistitem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002170#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
2171
Guido van Rossum282914b1991-04-04 10:42:56 +00002172 locals = newdictobject();
2173 if (locals == NULL) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002174 c->c_errors++;
2175 return;
Guido van Rossum282914b1991-04-04 10:42:56 +00002176 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002177 nlocals = 0;
2178
2179 err_get(&error_type, &error_value);
Guido van Rossum282914b1991-04-04 10:42:56 +00002180
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002181 next_instr = (unsigned char *) getstringvalue(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00002182 for (;;) {
2183 opcode = NEXTOP();
2184 if (opcode == STOP_CODE)
2185 break;
2186 if (HAS_ARG(opcode))
2187 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002188 if (opcode == STORE_NAME || opcode == DELETE_NAME ||
2189 opcode == IMPORT_FROM) {
2190 object *v;
Guido van Rossum282914b1991-04-04 10:42:56 +00002191 name = GETNAMEOBJ(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002192 if (dict2lookup(locals, name) != NULL)
2193 continue;
2194 err_clear();
2195 v = newintobject(nlocals);
2196 if (v == NULL) {
2197 c->c_errors++;
2198 goto err;
Guido van Rossum282914b1991-04-04 10:42:56 +00002199 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002200 nlocals++;
2201 if (dict2insert(locals, name, v) != 0) {
2202 DECREF(v);
2203 c->c_errors++;
2204 goto err;
2205 }
2206 DECREF(v);
Guido van Rossum282914b1991-04-04 10:42:56 +00002207 }
2208 }
2209
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002210 if (nlocals == 0 || dictlookup(locals, "*") != NULL) {
2211 /* Don't optimize anything */
2212 goto end;
2213 }
2214
2215 next_instr = (unsigned char *) getstringvalue(c->c_code);
2216 fast_reserved = 0;
Guido van Rossum282914b1991-04-04 10:42:56 +00002217 for (;;) {
2218 cur_instr = next_instr;
2219 opcode = NEXTOP();
2220 if (opcode == STOP_CODE)
2221 break;
2222 if (HAS_ARG(opcode))
2223 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002224 if (opcode == RESERVE_FAST) {
2225 int i = com_addconst(c, locals);
2226 cur_instr[1] = i & 0xff;
2227 cur_instr[2] = (i>>8) & 0xff;
2228 fast_reserved = 1;
2229 continue;
2230 }
2231 if (!fast_reserved)
2232 continue;
2233 if (opcode == LOAD_NAME ||
2234 opcode == STORE_NAME ||
2235 opcode == DELETE_NAME) {
2236 object *v;
2237 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00002238 name = GETNAMEOBJ(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002239 v = dict2lookup(locals, name);
2240 if (v == NULL) {
Guido van Rossum83163251991-08-16 08:58:43 +00002241 err_clear();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002242 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00002243 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002244 i = getintvalue(v);
2245 switch (opcode) {
2246 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
2247 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
2248 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
2249 }
2250 cur_instr[1] = i & 0xff;
2251 cur_instr[2] = (i>>8) & 0xff;
Guido van Rossum282914b1991-04-04 10:42:56 +00002252 }
2253 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002254
2255 end:
2256 err_setval(error_type, error_value);
2257 err:
Guido van Rossum282914b1991-04-04 10:42:56 +00002258 DECREF(locals);
2259}
2260
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002261codeobject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002262compile(n, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002263 node *n;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002264 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002265{
2266 struct compiling sc;
2267 codeobject *co;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002268 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002269 return NULL;
2270 compile_node(&sc, n);
2271 com_done(&sc);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002272 if (TYPE(n) == funcdef && sc.c_errors == 0)
2273 optimize(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00002274 co = NULL;
2275 if (sc.c_errors == 0) {
2276 object *v, *w;
2277 v = newstringobject(sc.c_filename);
2278 w = newstringobject(sc.c_name);
2279 if (v != NULL && w != NULL)
2280 co = newcodeobject(sc.c_code, sc.c_consts,
2281 sc.c_names, v, w);
2282 XDECREF(v);
2283 XDECREF(w);
Guido van Rossuma082ce41991-06-04 19:41:56 +00002284 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002285 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002286 return co;
2287}