blob: 3a6d1819c05f0e266c547fd9a53f90b149f7e55b [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 */
Guido van Rossum12d12c51993-10-26 17:58:25 +0000167 int c_inlambda; /* set when compiling an expression */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000168 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000169 int c_begin; /* begin of current loop, for 'continue' */
170 int c_block[MAXBLOCKS]; /* stack of block types */
171 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000172 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000173 char *c_name; /* name of object (e.g. function) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000174};
175
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000176
177/* Interface to the block stack */
178
179static void
180block_push(c, type)
181 struct compiling *c;
182 int type;
183{
184 if (c->c_nblocks >= MAXBLOCKS) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +0000185 err_setstr(SystemError, "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000186 c->c_errors++;
187 }
188 else {
189 c->c_block[c->c_nblocks++] = type;
190 }
191}
192
193static void
194block_pop(c, type)
195 struct compiling *c;
196 int type;
197{
198 if (c->c_nblocks > 0)
199 c->c_nblocks--;
200 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
201 err_setstr(SystemError, "bad block pop");
202 c->c_errors++;
203 }
204}
205
206
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000207/* Prototypes */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000208
Guido van Rossum12d12c51993-10-26 17:58:25 +0000209static int com_init PROTO((struct compiling *, char *, int));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000210static void com_free PROTO((struct compiling *));
211static void com_done PROTO((struct compiling *));
212static void com_node PROTO((struct compiling *, struct _node *));
213static void com_addbyte PROTO((struct compiling *, int));
214static void com_addint PROTO((struct compiling *, int));
215static void com_addoparg PROTO((struct compiling *, int, int));
216static void com_addfwref PROTO((struct compiling *, int, int *));
217static void com_backpatch PROTO((struct compiling *, int));
218static int com_add PROTO((struct compiling *, object *, object *));
219static int com_addconst PROTO((struct compiling *, object *));
220static int com_addname PROTO((struct compiling *, object *));
221static void com_addopname PROTO((struct compiling *, int, node *));
Guido van Rossum288a60f1991-12-16 13:05:10 +0000222static void com_list PROTO((struct compiling *, node *, int));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000223
224static int
Guido van Rossum12d12c51993-10-26 17:58:25 +0000225com_init(c, filename, inlambda)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000226 struct compiling *c;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000227 char *filename;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000228 int inlambda;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000229{
Guido van Rossum62d46241991-04-03 19:00:23 +0000230 if ((c->c_code = newsizedstringobject((char *)NULL, 1000)) == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000231 goto fail_3;
232 if ((c->c_consts = newlistobject(0)) == NULL)
233 goto fail_2;
234 if ((c->c_names = newlistobject(0)) == NULL)
235 goto fail_1;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000236 if ((c->c_globals = newdictobject()) == NULL)
237 goto fail_0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000238 c->c_nexti = 0;
239 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000240 c->c_infunction = 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000241 c->c_inlambda = inlambda;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000242 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000243 c->c_begin = 0;
244 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000245 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000246 c->c_name = "?";
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000247 return 1;
248
Guido van Rossumc5e96291991-12-10 13:53:51 +0000249 fail_0:
250 DECREF(c->c_names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000251 fail_1:
252 DECREF(c->c_consts);
253 fail_2:
254 DECREF(c->c_code);
255 fail_3:
256 return 0;
257}
258
259static void
260com_free(c)
261 struct compiling *c;
262{
263 XDECREF(c->c_code);
264 XDECREF(c->c_consts);
265 XDECREF(c->c_names);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000266 XDECREF(c->c_globals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000267}
268
269static void
270com_done(c)
271 struct compiling *c;
272{
273 if (c->c_code != NULL)
274 resizestring(&c->c_code, c->c_nexti);
275}
276
277static void
278com_addbyte(c, byte)
279 struct compiling *c;
280 int byte;
281{
282 int len;
283 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000284 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000285 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
286 abort();
Guido van Rossum01cfd441991-10-20 20:12:38 +0000287 */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000288 err_setstr(SystemError, "com_addbyte: byte out of range");
289 c->c_errors++;
290 }
291 if (c->c_code == NULL)
292 return;
293 len = getstringsize(c->c_code);
294 if (c->c_nexti >= len) {
295 if (resizestring(&c->c_code, len+1000) != 0) {
296 c->c_errors++;
297 return;
298 }
299 }
300 getstringvalue(c->c_code)[c->c_nexti++] = byte;
301}
302
303static void
304com_addint(c, x)
305 struct compiling *c;
306 int x;
307{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000308 com_addbyte(c, x & 0xff);
309 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000310}
311
312static void
313com_addoparg(c, op, arg)
314 struct compiling *c;
315 int op;
316 int arg;
317{
318 com_addbyte(c, op);
319 com_addint(c, arg);
320}
321
322static void
323com_addfwref(c, op, p_anchor)
324 struct compiling *c;
325 int op;
326 int *p_anchor;
327{
328 /* Compile a forward reference for backpatching */
329 int here;
330 int anchor;
331 com_addbyte(c, op);
332 here = c->c_nexti;
333 anchor = *p_anchor;
334 *p_anchor = here;
335 com_addint(c, anchor == 0 ? 0 : here - anchor);
336}
337
338static void
339com_backpatch(c, anchor)
340 struct compiling *c;
341 int anchor; /* Must be nonzero */
342{
343 unsigned char *code = (unsigned char *) getstringvalue(c->c_code);
344 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000345 int dist;
346 int prev;
347 for (;;) {
348 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000349 prev = code[anchor] + (code[anchor+1] << 8);
350 dist = target - (anchor+2);
351 code[anchor] = dist & 0xff;
352 code[anchor+1] = dist >> 8;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000353 if (!prev)
354 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000355 anchor -= prev;
356 }
357}
358
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000359/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000360
361static int
362com_add(c, list, v)
363 struct compiling *c;
364 object *list;
365 object *v;
366{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000367 int n = getlistsize(list);
368 int i;
369 for (i = n; --i >= 0; ) {
370 object *w = getlistitem(list, i);
Guido van Rossumefc0bd01991-07-01 18:44:20 +0000371 if (v->ob_type == w->ob_type && cmpobject(v, w) == 0)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000372 return i;
373 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000374 if (addlistitem(list, v) != 0)
375 c->c_errors++;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000376 return n;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000377}
378
379static int
380com_addconst(c, v)
381 struct compiling *c;
382 object *v;
383{
384 return com_add(c, c->c_consts, v);
385}
386
387static int
388com_addname(c, v)
389 struct compiling *c;
390 object *v;
391{
392 return com_add(c, c->c_names, v);
393}
394
395static void
396com_addopname(c, op, n)
397 struct compiling *c;
398 int op;
399 node *n;
400{
401 object *v;
402 int i;
403 char *name;
404 if (TYPE(n) == STAR)
405 name = "*";
406 else {
407 REQ(n, NAME);
408 name = STR(n);
409 }
410 if ((v = newstringobject(name)) == NULL) {
411 c->c_errors++;
412 i = 255;
413 }
414 else {
415 i = com_addname(c, v);
416 DECREF(v);
417 }
Guido van Rossumc5e96291991-12-10 13:53:51 +0000418 /* Hack to replace *_NAME opcodes by *_GLOBAL if necessary */
419 switch (op) {
420 case LOAD_NAME:
421 case STORE_NAME:
422 case DELETE_NAME:
423 if (dictlookup(c->c_globals, name) != NULL) {
424 switch (op) {
425 case LOAD_NAME: op = LOAD_GLOBAL; break;
426 case STORE_NAME: op = STORE_GLOBAL; break;
427 case DELETE_NAME: op = DELETE_GLOBAL; break;
428 }
429 }
430 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000431 com_addoparg(c, op, i);
432}
433
434static object *
435parsenumber(s)
436 char *s;
437{
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000438 extern long strtol PROTO((const char *, char **, int));
439 extern unsigned long strtoul PROTO((const char *, char **, int));
440 extern double strtod PROTO((const char *, char **));
Guido van Rossumc5e96291991-12-10 13:53:51 +0000441 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000442 long x;
Guido van Rossum282914b1991-04-04 10:42:56 +0000443 double xx;
444 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000445 end = s + strlen(s) - 1;
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000446 if (*end == 'l' || *end == 'L')
Guido van Rossumc5e96291991-12-10 13:53:51 +0000447 return long_scan(s, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000448 if (s[0] == '0')
449 x = (long) strtoul(s, &end, 0);
450 else
451 x = strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +0000452 if (*end == '\0') {
453 if (errno != 0) {
Guido van Rossumefb087b1991-12-16 15:41:41 +0000454 err_setstr(OverflowError,
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000455 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000456 return NULL;
457 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000458 return newintobject(x);
Guido van Rossum282914b1991-04-04 10:42:56 +0000459 }
460 errno = 0;
461 xx = strtod(s, &end);
462 if (*end == '\0') {
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000463#ifndef BROKEN_STRTOD
464 /* Some strtod() versions (e.g., in older SunOS systems)
465 set errno incorrectly; better to ignore overflows
466 than not to be able to use float literals at all! */
Guido van Rossum282914b1991-04-04 10:42:56 +0000467 if (errno != 0) {
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000468 err_setstr(OverflowError, "float literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000469 return NULL;
470 }
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000471#endif
Guido van Rossum282914b1991-04-04 10:42:56 +0000472 return newfloatobject(xx);
473 }
Guido van Rossumefb087b1991-12-16 15:41:41 +0000474 err_setstr(SystemError, "bad number syntax?!?!");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000475 return NULL;
476}
477
478static object *
479parsestr(s)
480 char *s;
481{
482 object *v;
483 int len;
484 char *buf;
485 char *p;
486 int c;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000487 int quote = *s;
488 if (quote != '\'' && quote != '\"') {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000489 err_badcall();
490 return NULL;
491 }
492 s++;
493 len = strlen(s);
Guido van Rossum8054fad1993-10-26 15:19:44 +0000494 if (s[--len] != quote) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000495 err_badcall();
496 return NULL;
497 }
498 if (strchr(s, '\\') == NULL)
499 return newsizedstringobject(s, len);
500 v = newsizedstringobject((char *)NULL, len);
501 p = buf = getstringvalue(v);
502 while (*s != '\0' && *s != '\'') {
503 if (*s != '\\') {
504 *p++ = *s++;
505 continue;
506 }
507 s++;
508 switch (*s++) {
509 /* XXX This assumes ASCII! */
510 case '\\': *p++ = '\\'; break;
511 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000512 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000513 case 'b': *p++ = '\b'; break;
514 case 'f': *p++ = '\014'; break; /* FF */
515 case 't': *p++ = '\t'; break;
516 case 'n': *p++ = '\n'; break;
517 case 'r': *p++ = '\r'; break;
518 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000519 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
520 case '0': case '1': case '2': case '3':
521 case '4': case '5': case '6': case '7':
522 c = s[-1] - '0';
523 if ('0' <= *s && *s <= '7') {
524 c = (c<<3) + *s++ - '0';
525 if ('0' <= *s && *s <= '7')
526 c = (c<<3) + *s++ - '0';
527 }
528 *p++ = c;
529 break;
530 case 'x':
531 if (isxdigit(*s)) {
532 sscanf(s, "%x", &c);
533 *p++ = c;
534 do {
535 s++;
536 } while (isxdigit(*s));
537 break;
538 }
539 /* FALLTHROUGH */
540 default: *p++ = '\\'; *p++ = s[-1]; break;
541 }
542 }
543 resizestring(&v, (int)(p - buf));
544 return v;
545}
546
547static void
548com_list_constructor(c, n)
549 struct compiling *c;
550 node *n;
551{
552 int len;
553 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000554 if (TYPE(n) != testlist)
555 REQ(n, exprlist);
556 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
557 len = (NCH(n) + 1) / 2;
558 for (i = 0; i < NCH(n); i += 2)
559 com_node(c, CHILD(n, i));
560 com_addoparg(c, BUILD_LIST, len);
561}
562
563static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000564com_dictmaker(c, n)
565 struct compiling *c;
566 node *n;
567{
568 int i;
569 /* dictmaker: test ':' test (',' test ':' value)* [','] */
570 for (i = 0; i+2 < NCH(n); i += 4) {
571 /* We must arrange things just right for STORE_SUBSCR.
572 It wants the stack to look like (value) (dict) (key) */
573 com_addbyte(c, DUP_TOP);
574 com_node(c, CHILD(n, i+2)); /* value */
575 com_addbyte(c, ROT_TWO);
576 com_node(c, CHILD(n, i)); /* key */
577 com_addbyte(c, STORE_SUBSCR);
578 }
579}
580
581static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000582com_atom(c, n)
583 struct compiling *c;
584 node *n;
585{
586 node *ch;
587 object *v;
588 int i;
589 REQ(n, atom);
590 ch = CHILD(n, 0);
591 switch (TYPE(ch)) {
592 case LPAR:
593 if (TYPE(CHILD(n, 1)) == RPAR)
594 com_addoparg(c, BUILD_TUPLE, 0);
595 else
596 com_node(c, CHILD(n, 1));
597 break;
598 case LSQB:
599 if (TYPE(CHILD(n, 1)) == RSQB)
600 com_addoparg(c, BUILD_LIST, 0);
601 else
602 com_list_constructor(c, CHILD(n, 1));
603 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000604 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000605 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000606 if (TYPE(CHILD(n, 1)) != RBRACE)
607 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000608 break;
609 case BACKQUOTE:
610 com_node(c, CHILD(n, 1));
611 com_addbyte(c, UNARY_CONVERT);
612 break;
613 case NUMBER:
614 if ((v = parsenumber(STR(ch))) == NULL) {
615 c->c_errors++;
616 i = 255;
617 }
618 else {
619 i = com_addconst(c, v);
620 DECREF(v);
621 }
622 com_addoparg(c, LOAD_CONST, i);
623 break;
624 case STRING:
625 if ((v = parsestr(STR(ch))) == NULL) {
626 c->c_errors++;
627 i = 255;
628 }
629 else {
630 i = com_addconst(c, v);
631 DECREF(v);
632 }
633 com_addoparg(c, LOAD_CONST, i);
634 break;
635 case NAME:
636 com_addopname(c, LOAD_NAME, ch);
637 break;
638 default:
639 fprintf(stderr, "node type %d\n", TYPE(ch));
640 err_setstr(SystemError, "com_atom: unexpected node type");
641 c->c_errors++;
642 }
643}
644
645static void
646com_slice(c, n, op)
647 struct compiling *c;
648 node *n;
649 int op;
650{
651 if (NCH(n) == 1) {
652 com_addbyte(c, op);
653 }
654 else if (NCH(n) == 2) {
655 if (TYPE(CHILD(n, 0)) != COLON) {
656 com_node(c, CHILD(n, 0));
657 com_addbyte(c, op+1);
658 }
659 else {
660 com_node(c, CHILD(n, 1));
661 com_addbyte(c, op+2);
662 }
663 }
664 else {
665 com_node(c, CHILD(n, 0));
666 com_node(c, CHILD(n, 2));
667 com_addbyte(c, op+3);
668 }
669}
670
671static void
672com_apply_subscript(c, n)
673 struct compiling *c;
674 node *n;
675{
676 REQ(n, subscript);
677 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) != COLON) {
678 /* It's a single subscript */
679 com_node(c, CHILD(n, 0));
680 com_addbyte(c, BINARY_SUBSCR);
681 }
682 else {
683 /* It's a slice: [expr] ':' [expr] */
684 com_slice(c, n, SLICE);
685 }
686}
687
688static void
689com_call_function(c, n)
690 struct compiling *c;
691 node *n; /* EITHER testlist OR ')' */
692{
693 if (TYPE(n) == RPAR) {
Guido van Rossum288a60f1991-12-16 13:05:10 +0000694 com_addoparg(c, BUILD_TUPLE, 0);
695 com_addbyte(c, BINARY_CALL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000696 }
697 else {
Guido van Rossum288a60f1991-12-16 13:05:10 +0000698 REQ(n, testlist);
699 com_list(c, n, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000700 com_addbyte(c, BINARY_CALL);
701 }
702}
703
704static void
705com_select_member(c, n)
706 struct compiling *c;
707 node *n;
708{
709 com_addopname(c, LOAD_ATTR, n);
710}
711
712static void
713com_apply_trailer(c, n)
714 struct compiling *c;
715 node *n;
716{
717 REQ(n, trailer);
718 switch (TYPE(CHILD(n, 0))) {
719 case LPAR:
720 com_call_function(c, CHILD(n, 1));
721 break;
722 case DOT:
723 com_select_member(c, CHILD(n, 1));
724 break;
725 case LSQB:
726 com_apply_subscript(c, CHILD(n, 1));
727 break;
728 default:
729 err_setstr(SystemError,
730 "com_apply_trailer: unknown trailer type");
731 c->c_errors++;
732 }
733}
734
735static void
736com_factor(c, n)
737 struct compiling *c;
738 node *n;
739{
740 int i;
741 REQ(n, factor);
742 if (TYPE(CHILD(n, 0)) == PLUS) {
743 com_factor(c, CHILD(n, 1));
744 com_addbyte(c, UNARY_POSITIVE);
745 }
746 else if (TYPE(CHILD(n, 0)) == MINUS) {
747 com_factor(c, CHILD(n, 1));
748 com_addbyte(c, UNARY_NEGATIVE);
749 }
Guido van Rossum7928cd71991-10-24 14:59:31 +0000750 else if (TYPE(CHILD(n, 0)) == TILDE) {
751 com_factor(c, CHILD(n, 1));
752 com_addbyte(c, UNARY_INVERT);
753 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000754 else {
755 com_atom(c, CHILD(n, 0));
756 for (i = 1; i < NCH(n); i++)
757 com_apply_trailer(c, CHILD(n, i));
758 }
759}
760
761static void
762com_term(c, n)
763 struct compiling *c;
764 node *n;
765{
766 int i;
767 int op;
768 REQ(n, term);
769 com_factor(c, CHILD(n, 0));
770 for (i = 2; i < NCH(n); i += 2) {
771 com_factor(c, CHILD(n, i));
772 switch (TYPE(CHILD(n, i-1))) {
773 case STAR:
774 op = BINARY_MULTIPLY;
775 break;
776 case SLASH:
777 op = BINARY_DIVIDE;
778 break;
779 case PERCENT:
780 op = BINARY_MODULO;
781 break;
782 default:
783 err_setstr(SystemError,
Guido van Rossum7928cd71991-10-24 14:59:31 +0000784 "com_term: operator not *, / or %");
785 c->c_errors++;
786 op = 255;
787 }
788 com_addbyte(c, op);
789 }
790}
791
792static void
793com_arith_expr(c, n)
794 struct compiling *c;
795 node *n;
796{
797 int i;
798 int op;
799 REQ(n, arith_expr);
800 com_term(c, CHILD(n, 0));
801 for (i = 2; i < NCH(n); i += 2) {
802 com_term(c, CHILD(n, i));
803 switch (TYPE(CHILD(n, i-1))) {
804 case PLUS:
805 op = BINARY_ADD;
806 break;
807 case MINUS:
808 op = BINARY_SUBTRACT;
809 break;
810 default:
811 err_setstr(SystemError,
812 "com_arith_expr: operator not + or -");
813 c->c_errors++;
814 op = 255;
815 }
816 com_addbyte(c, op);
817 }
818}
819
820static void
821com_shift_expr(c, n)
822 struct compiling *c;
823 node *n;
824{
825 int i;
826 int op;
827 REQ(n, shift_expr);
828 com_arith_expr(c, CHILD(n, 0));
829 for (i = 2; i < NCH(n); i += 2) {
830 com_arith_expr(c, CHILD(n, i));
831 switch (TYPE(CHILD(n, i-1))) {
832 case LEFTSHIFT:
833 op = BINARY_LSHIFT;
834 break;
835 case RIGHTSHIFT:
836 op = BINARY_RSHIFT;
837 break;
838 default:
839 err_setstr(SystemError,
840 "com_shift_expr: operator not << or >>");
841 c->c_errors++;
842 op = 255;
843 }
844 com_addbyte(c, op);
845 }
846}
847
848static void
849com_and_expr(c, n)
850 struct compiling *c;
851 node *n;
852{
853 int i;
854 int op;
855 REQ(n, and_expr);
856 com_shift_expr(c, CHILD(n, 0));
857 for (i = 2; i < NCH(n); i += 2) {
858 com_shift_expr(c, CHILD(n, i));
859 if (TYPE(CHILD(n, i-1)) == AMPER) {
860 op = BINARY_AND;
861 }
862 else {
863 err_setstr(SystemError,
864 "com_and_expr: operator not &");
865 c->c_errors++;
866 op = 255;
867 }
868 com_addbyte(c, op);
869 }
870}
871
872static void
873com_xor_expr(c, n)
874 struct compiling *c;
875 node *n;
876{
877 int i;
878 int op;
879 REQ(n, xor_expr);
880 com_and_expr(c, CHILD(n, 0));
881 for (i = 2; i < NCH(n); i += 2) {
882 com_and_expr(c, CHILD(n, i));
883 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
884 op = BINARY_XOR;
885 }
886 else {
887 err_setstr(SystemError,
888 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000889 c->c_errors++;
890 op = 255;
891 }
892 com_addbyte(c, op);
893 }
894}
895
896static void
897com_expr(c, n)
898 struct compiling *c;
899 node *n;
900{
901 int i;
902 int op;
903 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000904 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000905 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +0000906 com_xor_expr(c, CHILD(n, i));
907 if (TYPE(CHILD(n, i-1)) == VBAR) {
908 op = BINARY_OR;
909 }
910 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000911 err_setstr(SystemError,
Guido van Rossum7928cd71991-10-24 14:59:31 +0000912 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000913 c->c_errors++;
914 op = 255;
915 }
916 com_addbyte(c, op);
917 }
918}
919
920static enum cmp_op
921cmp_type(n)
922 node *n;
923{
924 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +0000925 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000926 | 'in' | 'not' 'in' | 'is' | 'is' not' */
927 if (NCH(n) == 1) {
928 n = CHILD(n, 0);
929 switch (TYPE(n)) {
930 case LESS: return LT;
931 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +0000932 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000933 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +0000934 case LESSEQUAL: return LE;
935 case GREATEREQUAL: return GE;
936 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000937 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
938 if (strcmp(STR(n), "is") == 0) return IS;
939 }
940 }
941 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000942 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000943 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
944 return NOT_IN;
945 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
946 return IS_NOT;
947 }
948 }
949 return BAD;
950}
951
952static void
953com_comparison(c, n)
954 struct compiling *c;
955 node *n;
956{
957 int i;
958 enum cmp_op op;
959 int anchor;
960 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
961 com_expr(c, CHILD(n, 0));
962 if (NCH(n) == 1)
963 return;
964
965 /****************************************************************
966 The following code is generated for all but the last
967 comparison in a chain:
968
969 label: on stack: opcode: jump to:
970
971 a <code to load b>
972 a, b DUP_TOP
973 a, b, b ROT_THREE
974 b, a, b COMPARE_OP
975 b, 0-or-1 JUMP_IF_FALSE L1
976 b, 1 POP_TOP
977 b
978
979 We are now ready to repeat this sequence for the next
980 comparison in the chain.
981
982 For the last we generate:
983
984 b <code to load c>
985 b, c COMPARE_OP
986 0-or-1
987
988 If there were any jumps to L1 (i.e., there was more than one
989 comparison), we generate:
990
991 0-or-1 JUMP_FORWARD L2
992 L1: b, 0 ROT_TWO
993 0, b POP_TOP
994 0
995 L2:
996 ****************************************************************/
997
998 anchor = 0;
999
1000 for (i = 2; i < NCH(n); i += 2) {
1001 com_expr(c, CHILD(n, i));
1002 if (i+2 < NCH(n)) {
1003 com_addbyte(c, DUP_TOP);
1004 com_addbyte(c, ROT_THREE);
1005 }
1006 op = cmp_type(CHILD(n, i-1));
1007 if (op == BAD) {
1008 err_setstr(SystemError,
1009 "com_comparison: unknown comparison op");
1010 c->c_errors++;
1011 }
1012 com_addoparg(c, COMPARE_OP, op);
1013 if (i+2 < NCH(n)) {
1014 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1015 com_addbyte(c, POP_TOP);
1016 }
1017 }
1018
1019 if (anchor) {
1020 int anchor2 = 0;
1021 com_addfwref(c, JUMP_FORWARD, &anchor2);
1022 com_backpatch(c, anchor);
1023 com_addbyte(c, ROT_TWO);
1024 com_addbyte(c, POP_TOP);
1025 com_backpatch(c, anchor2);
1026 }
1027}
1028
1029static void
1030com_not_test(c, n)
1031 struct compiling *c;
1032 node *n;
1033{
1034 REQ(n, not_test); /* 'not' not_test | comparison */
1035 if (NCH(n) == 1) {
1036 com_comparison(c, CHILD(n, 0));
1037 }
1038 else {
1039 com_not_test(c, CHILD(n, 1));
1040 com_addbyte(c, UNARY_NOT);
1041 }
1042}
1043
1044static void
1045com_and_test(c, n)
1046 struct compiling *c;
1047 node *n;
1048{
1049 int i;
1050 int anchor;
1051 REQ(n, and_test); /* not_test ('and' not_test)* */
1052 anchor = 0;
1053 i = 0;
1054 for (;;) {
1055 com_not_test(c, CHILD(n, i));
1056 if ((i += 2) >= NCH(n))
1057 break;
1058 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1059 com_addbyte(c, POP_TOP);
1060 }
1061 if (anchor)
1062 com_backpatch(c, anchor);
1063}
1064
1065static void
1066com_test(c, n)
1067 struct compiling *c;
1068 node *n;
1069{
1070 int i;
1071 int anchor;
1072 REQ(n, test); /* and_test ('and' and_test)* */
1073 anchor = 0;
1074 i = 0;
1075 for (;;) {
1076 com_and_test(c, CHILD(n, i));
1077 if ((i += 2) >= NCH(n))
1078 break;
1079 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1080 com_addbyte(c, POP_TOP);
1081 }
1082 if (anchor)
1083 com_backpatch(c, anchor);
1084}
1085
1086static void
Guido van Rossum288a60f1991-12-16 13:05:10 +00001087com_list(c, n, toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001088 struct compiling *c;
1089 node *n;
Guido van Rossum288a60f1991-12-16 13:05:10 +00001090 int toplevel; /* If nonzero, *always* build a tuple */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001091{
1092 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001093 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001094 com_node(c, CHILD(n, 0));
1095 }
1096 else {
1097 int i;
1098 int len;
1099 len = (NCH(n) + 1) / 2;
1100 for (i = 0; i < NCH(n); i += 2)
1101 com_node(c, CHILD(n, i));
1102 com_addoparg(c, BUILD_TUPLE, len);
1103 }
1104}
1105
1106
1107/* Begin of assignment compilation */
1108
1109static void com_assign_name PROTO((struct compiling *, node *, int));
1110static void com_assign PROTO((struct compiling *, node *, int));
1111
1112static void
1113com_assign_attr(c, n, assigning)
1114 struct compiling *c;
1115 node *n;
1116 int assigning;
1117{
1118 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
1119}
1120
1121static void
1122com_assign_slice(c, n, assigning)
1123 struct compiling *c;
1124 node *n;
1125 int assigning;
1126{
1127 com_slice(c, n, assigning ? STORE_SLICE : DELETE_SLICE);
1128}
1129
1130static void
1131com_assign_subscript(c, n, assigning)
1132 struct compiling *c;
1133 node *n;
1134 int assigning;
1135{
1136 com_node(c, n);
1137 com_addbyte(c, assigning ? STORE_SUBSCR : DELETE_SUBSCR);
1138}
1139
1140static void
1141com_assign_trailer(c, n, assigning)
1142 struct compiling *c;
1143 node *n;
1144 int assigning;
1145{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001146 REQ(n, trailer);
1147 switch (TYPE(CHILD(n, 0))) {
1148 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001149 err_setstr(SyntaxError, "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001150 c->c_errors++;
1151 break;
1152 case DOT: /* '.' NAME */
1153 com_assign_attr(c, CHILD(n, 1), assigning);
1154 break;
1155 case LSQB: /* '[' subscript ']' */
1156 n = CHILD(n, 1);
1157 REQ(n, subscript); /* subscript: expr | [expr] ':' [expr] */
1158 if (NCH(n) > 1 || TYPE(CHILD(n, 0)) == COLON)
1159 com_assign_slice(c, n, assigning);
1160 else
1161 com_assign_subscript(c, CHILD(n, 0), assigning);
1162 break;
1163 default:
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001164 err_setstr(SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001165 c->c_errors++;
1166 }
1167}
1168
1169static void
1170com_assign_tuple(c, n, assigning)
1171 struct compiling *c;
1172 node *n;
1173 int assigning;
1174{
1175 int i;
1176 if (TYPE(n) != testlist)
1177 REQ(n, exprlist);
1178 if (assigning)
1179 com_addoparg(c, UNPACK_TUPLE, (NCH(n)+1)/2);
1180 for (i = 0; i < NCH(n); i += 2)
1181 com_assign(c, CHILD(n, i), assigning);
1182}
1183
1184static void
1185com_assign_list(c, n, assigning)
1186 struct compiling *c;
1187 node *n;
1188 int assigning;
1189{
1190 int i;
1191 if (assigning)
1192 com_addoparg(c, UNPACK_LIST, (NCH(n)+1)/2);
1193 for (i = 0; i < NCH(n); i += 2)
1194 com_assign(c, CHILD(n, i), assigning);
1195}
1196
1197static void
1198com_assign_name(c, n, assigning)
1199 struct compiling *c;
1200 node *n;
1201 int assigning;
1202{
1203 REQ(n, NAME);
1204 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
1205}
1206
1207static void
1208com_assign(c, n, assigning)
1209 struct compiling *c;
1210 node *n;
1211 int assigning;
1212{
1213 /* Loop to avoid trivial recursion */
1214 for (;;) {
1215 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001216
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001217 case exprlist:
1218 case testlist:
1219 if (NCH(n) > 1) {
1220 com_assign_tuple(c, n, assigning);
1221 return;
1222 }
1223 n = CHILD(n, 0);
1224 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001225
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001226 case test:
1227 case and_test:
1228 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001229 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001230 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001231 case xor_expr:
1232 case and_expr:
1233 case shift_expr:
1234 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001235 case term:
1236 if (NCH(n) > 1) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001237 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001238 "can't assign to operator");
1239 c->c_errors++;
1240 return;
1241 }
1242 n = CHILD(n, 0);
1243 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001244
Guido van Rossum7928cd71991-10-24 14:59:31 +00001245 case factor: /* ('+'|'-'|'~') factor | atom trailer* */
1246 if (TYPE(CHILD(n, 0)) != atom) { /* '+'|'-'|'~' */
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001247 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001248 "can't assign to operator");
1249 c->c_errors++;
1250 return;
1251 }
1252 if (NCH(n) > 1) { /* trailer present */
1253 int i;
1254 com_node(c, CHILD(n, 0));
1255 for (i = 1; i+1 < NCH(n); i++) {
1256 com_apply_trailer(c, CHILD(n, i));
1257 } /* NB i is still alive */
1258 com_assign_trailer(c,
1259 CHILD(n, i), assigning);
1260 return;
1261 }
1262 n = CHILD(n, 0);
1263 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001264
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001265 case atom:
1266 switch (TYPE(CHILD(n, 0))) {
1267 case LPAR:
1268 n = CHILD(n, 1);
1269 if (TYPE(n) == RPAR) {
1270 /* XXX Should allow () = () ??? */
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001271 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001272 "can't assign to ()");
1273 c->c_errors++;
1274 return;
1275 }
1276 break;
1277 case LSQB:
1278 n = CHILD(n, 1);
1279 if (TYPE(n) == RSQB) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001280 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001281 "can't assign to []");
1282 c->c_errors++;
1283 return;
1284 }
1285 com_assign_list(c, n, assigning);
1286 return;
1287 case NAME:
1288 com_assign_name(c, CHILD(n, 0), assigning);
1289 return;
1290 default:
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001291 err_setstr(SyntaxError,
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001292 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001293 c->c_errors++;
1294 return;
1295 }
1296 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001297
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001298 default:
1299 fprintf(stderr, "node type %d\n", TYPE(n));
1300 err_setstr(SystemError, "com_assign: bad node");
1301 c->c_errors++;
1302 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001303
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001304 }
1305 }
1306}
1307
1308static void
1309com_expr_stmt(c, n)
1310 struct compiling *c;
1311 node *n;
1312{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001313 REQ(n, expr_stmt); /* testlist ('=' testlist)* */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001314 com_node(c, CHILD(n, NCH(n)-1));
1315 if (NCH(n) == 1) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001316 com_addbyte(c, PRINT_EXPR);
1317 }
1318 else {
1319 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001320 for (i = 0; i < NCH(n)-2; i+=2) {
1321 if (i+2 < NCH(n)-2)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001322 com_addbyte(c, DUP_TOP);
1323 com_assign(c, CHILD(n, i), 1/*assign*/);
1324 }
1325 }
1326}
1327
1328static void
1329com_print_stmt(c, n)
1330 struct compiling *c;
1331 node *n;
1332{
1333 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001334 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
1335 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001336 com_node(c, CHILD(n, i));
1337 com_addbyte(c, PRINT_ITEM);
1338 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001339 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001340 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001341 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001342}
1343
1344static void
1345com_return_stmt(c, n)
1346 struct compiling *c;
1347 node *n;
1348{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001349 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001350 if (!c->c_infunction) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001351 err_setstr(SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001352 c->c_errors++;
1353 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001354 if (NCH(n) < 2)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001355 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1356 else
1357 com_node(c, CHILD(n, 1));
1358 com_addbyte(c, RETURN_VALUE);
1359}
1360
1361static void
1362com_raise_stmt(c, n)
1363 struct compiling *c;
1364 node *n;
1365{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001366 REQ(n, raise_stmt); /* 'raise' test [',' test] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001367 com_node(c, CHILD(n, 1));
1368 if (NCH(n) > 3)
1369 com_node(c, CHILD(n, 3));
1370 else
1371 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1372 com_addbyte(c, RAISE_EXCEPTION);
1373}
1374
1375static void
1376com_import_stmt(c, n)
1377 struct compiling *c;
1378 node *n;
1379{
1380 int i;
1381 REQ(n, import_stmt);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001382 /* 'import' NAME (',' NAME)* |
1383 'from' NAME 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001384 if (STR(CHILD(n, 0))[0] == 'f') {
1385 /* 'from' NAME 'import' ... */
1386 REQ(CHILD(n, 1), NAME);
1387 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
1388 for (i = 3; i < NCH(n); i += 2)
1389 com_addopname(c, IMPORT_FROM, CHILD(n, i));
1390 com_addbyte(c, POP_TOP);
1391 }
1392 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001393 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001394 for (i = 1; i < NCH(n); i += 2) {
1395 com_addopname(c, IMPORT_NAME, CHILD(n, i));
1396 com_addopname(c, STORE_NAME, CHILD(n, i));
1397 }
1398 }
1399}
1400
1401static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00001402com_global_stmt(c, n)
1403 struct compiling *c;
1404 node *n;
1405{
1406 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001407 REQ(n, global_stmt);
1408 /* 'global' NAME (',' NAME)* */
1409 for (i = 1; i < NCH(n); i += 2) {
1410 if (dictinsert(c->c_globals, STR(CHILD(n, i)), None) != 0)
1411 c->c_errors++;
1412 }
1413}
1414
Guido van Rossum25831651993-05-19 14:50:45 +00001415#define strequ(a, b) (strcmp((a), (b)) == 0)
1416
1417static void
1418com_access_stmt(c, n)
1419 struct compiling *c;
1420 node *n;
1421{
1422 int i, j, k, mode, imode;
1423 object *vmode;
1424 REQ(n, access_stmt);
1425 /* 'access' NAME (',' NAME)* ':' accesstype (',' accesstype)*
1426 accesstype: NAME+ */
1427
1428 /* Find where the colon is */
1429 i = 1;
1430 while (TYPE(CHILD(n,i-1)) != COLON)
1431 i += 1;
1432
1433 /* Calculate the mode mask */
1434 mode = 0;
1435 for (j = i; j < NCH(n); j += 2) {
Guido van Rossum81daa321993-05-20 14:24:46 +00001436 int r = 0, w = 0, p = 0;
1437 for (k = 0; k < NCH(CHILD(n,j)); k++) {
Guido van Rossum25831651993-05-19 14:50:45 +00001438 if (strequ(STR(CHILD(CHILD(n,j),k)), "public"))
1439 p = 0;
1440 else if (strequ(STR(CHILD(CHILD(n,j),k)), "protected"))
1441 p = 1;
1442 else if (strequ(STR(CHILD(CHILD(n,j),k)), "private"))
1443 p = 2;
1444 else if (strequ(STR(CHILD(CHILD(n,j),k)), "read"))
1445 r = 1;
1446 else if (strequ(STR(CHILD(CHILD(n,j),k)), "write"))
1447 w = 1;
1448 else /* XXX should make this an exception */
1449 fprintf(stderr, "bad access type %s\n",
1450 STR(CHILD(CHILD(n,j),k)));
1451 }
1452 if (r == 0 && w == 0)
Guido van Rossum81daa321993-05-20 14:24:46 +00001453 r = w = 1;
Guido van Rossum25831651993-05-19 14:50:45 +00001454 if (p == 0) {
1455 if (r == 1) mode |= AC_R_PUBLIC;
1456 if (w == 1) mode |= AC_W_PUBLIC;
1457 } else if (p == 1) {
1458 if (r == 1) mode |= AC_R_PROTECTED;
1459 if (w == 1) mode |= AC_W_PROTECTED;
1460 } else {
1461 if (r == 1) mode |= AC_R_PRIVATE;
1462 if (w == 1) mode |= AC_W_PRIVATE;
1463 }
1464 }
1465 vmode = newintobject((long)mode);
1466 imode = com_addconst(c, vmode);
1467 XDECREF(vmode);
1468 for (i = 1; TYPE(CHILD(n,i-1)) != COLON; i+=2) {
1469 com_addoparg(c, LOAD_CONST, imode);
1470 com_addopname(c, ACCESS_MODE, CHILD(n, i));
1471 }
1472}
1473
Guido van Rossumc5e96291991-12-10 13:53:51 +00001474static void
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001475com_exec_stmt(c, n)
1476 struct compiling *c;
1477 node *n;
1478{
1479 REQ(n, exec_stmt);
1480 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
1481 com_node(c, CHILD(n, 1));
1482 if (NCH(n) >= 4)
1483 com_node(c, CHILD(n, 3));
1484 else
1485 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1486 if (NCH(n) >= 6)
1487 com_node(c, CHILD(n, 5));
1488 else
1489 com_addbyte(c, DUP_TOP);
1490 com_addbyte(c, EXEC_STMT);
1491}
1492
1493static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001494com_if_stmt(c, n)
1495 struct compiling *c;
1496 node *n;
1497{
1498 int i;
1499 int anchor = 0;
1500 REQ(n, if_stmt);
1501 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
1502 for (i = 0; i+3 < NCH(n); i+=4) {
1503 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001504 node *ch = CHILD(n, i+1);
1505 if (i > 0)
1506 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001507 com_node(c, CHILD(n, i+1));
1508 com_addfwref(c, JUMP_IF_FALSE, &a);
1509 com_addbyte(c, POP_TOP);
1510 com_node(c, CHILD(n, i+3));
1511 com_addfwref(c, JUMP_FORWARD, &anchor);
1512 com_backpatch(c, a);
1513 com_addbyte(c, POP_TOP);
1514 }
1515 if (i+2 < NCH(n))
1516 com_node(c, CHILD(n, i+2));
1517 com_backpatch(c, anchor);
1518}
1519
1520static void
1521com_while_stmt(c, n)
1522 struct compiling *c;
1523 node *n;
1524{
1525 int break_anchor = 0;
1526 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001527 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001528 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
1529 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001530 block_push(c, SETUP_LOOP);
1531 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001532 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001533 com_node(c, CHILD(n, 1));
1534 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1535 com_addbyte(c, POP_TOP);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001536 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001537 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001538 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001539 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1540 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001541 com_backpatch(c, anchor);
1542 com_addbyte(c, POP_TOP);
1543 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001544 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001545 if (NCH(n) > 4)
1546 com_node(c, CHILD(n, 6));
1547 com_backpatch(c, break_anchor);
1548}
1549
1550static void
1551com_for_stmt(c, n)
1552 struct compiling *c;
1553 node *n;
1554{
1555 object *v;
1556 int break_anchor = 0;
1557 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001558 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001559 REQ(n, for_stmt);
1560 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
1561 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001562 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001563 com_node(c, CHILD(n, 3));
1564 v = newintobject(0L);
1565 if (v == NULL)
1566 c->c_errors++;
1567 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
1568 XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001569 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001570 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001571 com_addfwref(c, FOR_LOOP, &anchor);
1572 com_assign(c, CHILD(n, 1), 1/*assigning*/);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001573 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001574 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001575 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001576 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1577 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001578 com_backpatch(c, anchor);
1579 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001580 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001581 if (NCH(n) > 8)
1582 com_node(c, CHILD(n, 8));
1583 com_backpatch(c, break_anchor);
1584}
1585
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001586/* Although 'execpt' and 'finally' clauses can be combined
1587 syntactically, they are compiled separately. In fact,
1588 try: S
1589 except E1: S1
1590 except E2: S2
1591 ...
1592 finally: Sf
1593 is equivalent to
1594 try:
1595 try: S
1596 except E1: S1
1597 except E2: S2
1598 ...
1599 finally: Sf
1600 meaning that the 'finally' clause is entered even if things
1601 go wrong again in an exception handler. Note that this is
1602 not the case for exception handlers: at most one is entered.
1603
1604 Code generated for "try: S finally: Sf" is as follows:
1605
1606 SETUP_FINALLY L
1607 <code for S>
1608 POP_BLOCK
1609 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001610 L: <code for Sf>
1611 END_FINALLY
1612
1613 The special instructions use the block stack. Each block
1614 stack entry contains the instruction that created it (here
1615 SETUP_FINALLY), the level of the value stack at the time the
1616 block stack entry was created, and a label (here L).
1617
1618 SETUP_FINALLY:
1619 Pushes the current value stack level and the label
1620 onto the block stack.
1621 POP_BLOCK:
1622 Pops en entry from the block stack, and pops the value
1623 stack until its level is the same as indicated on the
1624 block stack. (The label is ignored.)
1625 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001626 Pops a variable number of entries from the *value* stack
1627 and re-raises the exception they specify. The number of
1628 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001629
1630 The block stack is unwound when an exception is raised:
1631 when a SETUP_FINALLY entry is found, the exception is pushed
1632 onto the value stack (and the exception condition is cleared),
1633 and the interpreter jumps to the label gotten from the block
1634 stack.
1635
1636 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00001637 (The contents of the value stack is shown in [], with the top
1638 at the right; 'tb' is trace-back info, 'val' the exception's
1639 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001640
1641 Value stack Label Instruction Argument
1642 [] SETUP_EXCEPT L1
1643 [] <code for S>
1644 [] POP_BLOCK
1645 [] JUMP_FORWARD L0
1646
Guido van Rossum3f5da241990-12-20 15:06:42 +00001647 [tb, val, exc] L1: DUP )
1648 [tb, val, exc, exc] <evaluate E1> )
1649 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
1650 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
1651 [tb, val, exc, 1] POP )
1652 [tb, val, exc] POP
1653 [tb, val] <assign to V1> (or POP if no V1)
1654 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001655 [] <code for S1>
1656 JUMP_FORWARD L0
1657
Guido van Rossum3f5da241990-12-20 15:06:42 +00001658 [tb, val, exc, 0] L2: POP
1659 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001660 .............................etc.......................
1661
Guido van Rossum3f5da241990-12-20 15:06:42 +00001662 [tb, val, exc, 0] Ln+1: POP
1663 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001664
1665 [] L0: <next statement>
1666
1667 Of course, parts are not generated if Vi or Ei is not present.
1668*/
1669
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001670static void
1671com_try_stmt(c, n)
1672 struct compiling *c;
1673 node *n;
1674{
1675 int finally_anchor = 0;
1676 int except_anchor = 0;
1677 REQ(n, try_stmt);
Guido van Rossum94fb82e1992-04-05 14:24:50 +00001678 /* 'try' ':' suite (except_clause ':' suite)*
1679 | 'try' ':' 'finally' ':' suite */
1680
1681 /* XXX This can be simplified because except and finally can
1682 no longer be mixed in a single try statement */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001683
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001684 if (NCH(n) > 3 && TYPE(CHILD(n, NCH(n)-3)) != except_clause) {
1685 /* Have a 'finally' clause */
1686 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001687 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001688 }
1689 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == except_clause) {
1690 /* Have an 'except' clause */
1691 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001692 block_push(c, SETUP_EXCEPT);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001693 }
1694 com_node(c, CHILD(n, 2));
1695 if (except_anchor) {
1696 int end_anchor = 0;
1697 int i;
1698 node *ch;
1699 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001700 block_pop(c, SETUP_EXCEPT);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001701 com_addfwref(c, JUMP_FORWARD, &end_anchor);
1702 com_backpatch(c, except_anchor);
1703 for (i = 3;
1704 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
1705 i += 3) {
1706 /* except_clause: 'except' [expr [',' expr]] */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001707 if (except_anchor == 0) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001708 err_setstr(SyntaxError,
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001709 "default 'except:' must be last");
1710 c->c_errors++;
1711 break;
1712 }
1713 except_anchor = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001714 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001715 if (NCH(ch) > 1) {
1716 com_addbyte(c, DUP_TOP);
1717 com_node(c, CHILD(ch, 1));
1718 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001719 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001720 com_addbyte(c, POP_TOP);
1721 }
1722 com_addbyte(c, POP_TOP);
1723 if (NCH(ch) > 3)
1724 com_assign(c, CHILD(ch, 3), 1/*assigning*/);
1725 else
1726 com_addbyte(c, POP_TOP);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001727 com_addbyte(c, POP_TOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001728 com_node(c, CHILD(n, i+2));
1729 com_addfwref(c, JUMP_FORWARD, &end_anchor);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001730 if (except_anchor) {
1731 com_backpatch(c, except_anchor);
1732 com_addbyte(c, POP_TOP);
1733 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001734 }
1735 com_addbyte(c, END_FINALLY);
1736 com_backpatch(c, end_anchor);
1737 }
1738 if (finally_anchor) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001739 node *ch;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001740 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001741 block_pop(c, SETUP_FINALLY);
1742 block_push(c, END_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001743 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001744 com_backpatch(c, finally_anchor);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001745 ch = CHILD(n, NCH(n)-1);
1746 com_addoparg(c, SET_LINENO, ch->n_lineno);
1747 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001748 com_addbyte(c, END_FINALLY);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001749 block_pop(c, END_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001750 }
1751}
1752
1753static void
1754com_suite(c, n)
1755 struct compiling *c;
1756 node *n;
1757{
1758 REQ(n, suite);
1759 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
1760 if (NCH(n) == 1) {
1761 com_node(c, CHILD(n, 0));
1762 }
1763 else {
1764 int i;
1765 for (i = 0; i < NCH(n); i++) {
1766 node *ch = CHILD(n, i);
1767 if (TYPE(ch) == stmt)
1768 com_node(c, ch);
1769 }
1770 }
1771}
1772
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001773/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001774static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001775com_continue_stmt(c, n)
1776 struct compiling *c;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001777 node *n; /* Not used, but passed for consistency */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001778{
1779 int i = c->c_nblocks;
1780 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
1781 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1782 }
1783 else {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001784 err_setstr(SyntaxError, "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001785 c->c_errors++;
1786 }
1787 /* XXX Could allow it inside a 'finally' clause
1788 XXX if we could pop the exception still on the stack */
1789}
1790
1791static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001792com_funcdef(c, n)
1793 struct compiling *c;
1794 node *n;
1795{
1796 object *v;
1797 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001798 v = (object *)_compile(n, c->c_filename, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001799 if (v == NULL)
1800 c->c_errors++;
1801 else {
1802 int i = com_addconst(c, v);
1803 com_addoparg(c, LOAD_CONST, i);
1804 com_addbyte(c, BUILD_FUNCTION);
1805 com_addopname(c, STORE_NAME, CHILD(n, 1));
1806 DECREF(v);
1807 }
1808}
1809
1810static void
Guido van Rossum12d12c51993-10-26 17:58:25 +00001811com_lambda(c, n)
1812 struct compiling *c;
1813 node *n;
1814{
1815 object *v;
1816 REQ(n, lambda_input);
1817 v = (object *)_compile(n, c->c_filename, 1);
1818 if (v == NULL)
1819 c->c_errors++;
1820 else {
1821 int i = com_addconst(c, v);
1822 DECREF(v);
1823 com_addoparg(c, LOAD_CONST, i);
1824 com_addbyte(c, BUILD_FUNCTION);
1825 com_addbyte(c, RETURN_VALUE);
1826 }
1827}
1828
1829static void
Guido van Rossum25831651993-05-19 14:50:45 +00001830com_bases(c, n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00001831 struct compiling *c;
1832 node *n;
1833{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001834 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001835 REQ(n, testlist);
1836 /* testlist: test (',' test)* [','] */
1837 for (i = 0; i < NCH(n); i += 2)
1838 com_node(c, CHILD(n, i));
1839 com_addoparg(c, BUILD_TUPLE, (NCH(n)+1) / 2);
1840}
1841
1842static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001843com_classdef(c, n)
1844 struct compiling *c;
1845 node *n;
1846{
Guido van Rossum25831651993-05-19 14:50:45 +00001847 int i;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001848 object *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001849 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00001850 /* classdef: class NAME ['(' testlist ')'] ':' suite */
1851 if ((v = newstringobject(STR(CHILD(n, 1)))) == NULL) {
1852 c->c_errors++;
1853 return;
1854 }
1855 /* Push the class name on the stack */
1856 i = com_addconst(c, v);
1857 com_addoparg(c, LOAD_CONST, i);
1858 DECREF(v);
1859 /* Push the tuple of base classes on the stack */
1860 if (TYPE(CHILD(n, 2)) != LPAR)
Guido van Rossumc5e96291991-12-10 13:53:51 +00001861 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum25831651993-05-19 14:50:45 +00001862 else
1863 com_bases(c, CHILD(n, 3));
Guido van Rossum12d12c51993-10-26 17:58:25 +00001864 v = (object *)_compile(n, c->c_filename, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001865 if (v == NULL)
1866 c->c_errors++;
1867 else {
Guido van Rossum25831651993-05-19 14:50:45 +00001868 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001869 com_addoparg(c, LOAD_CONST, i);
1870 com_addbyte(c, BUILD_FUNCTION);
1871 com_addbyte(c, UNARY_CALL);
1872 com_addbyte(c, BUILD_CLASS);
1873 com_addopname(c, STORE_NAME, CHILD(n, 1));
1874 DECREF(v);
1875 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001876}
1877
1878static void
1879com_node(c, n)
1880 struct compiling *c;
1881 node *n;
1882{
1883 switch (TYPE(n)) {
1884
1885 /* Definition nodes */
1886
1887 case funcdef:
1888 com_funcdef(c, n);
1889 break;
1890 case classdef:
1891 com_classdef(c, n);
1892 break;
1893
1894 /* Trivial parse tree nodes */
1895
1896 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001897 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001898 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001899 com_node(c, CHILD(n, 0));
1900 break;
1901
1902 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001903 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
1904 com_addoparg(c, SET_LINENO, n->n_lineno);
1905 {
1906 int i;
1907 for (i = 0; i < NCH(n)-1; i += 2)
1908 com_node(c, CHILD(n, i));
1909 }
1910 break;
1911
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001912 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001913 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001914 com_node(c, CHILD(n, 0));
1915 break;
1916
1917 /* Statement nodes */
1918
1919 case expr_stmt:
1920 com_expr_stmt(c, n);
1921 break;
1922 case print_stmt:
1923 com_print_stmt(c, n);
1924 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001925 case del_stmt: /* 'del' exprlist */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001926 com_assign(c, CHILD(n, 1), 0/*delete*/);
1927 break;
1928 case pass_stmt:
1929 break;
1930 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001931 if (c->c_loops == 0) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001932 err_setstr(SyntaxError, "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001933 c->c_errors++;
1934 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001935 com_addbyte(c, BREAK_LOOP);
1936 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001937 case continue_stmt:
1938 com_continue_stmt(c, n);
1939 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001940 case return_stmt:
1941 com_return_stmt(c, n);
1942 break;
1943 case raise_stmt:
1944 com_raise_stmt(c, n);
1945 break;
1946 case import_stmt:
1947 com_import_stmt(c, n);
1948 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001949 case global_stmt:
1950 com_global_stmt(c, n);
1951 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001952 case access_stmt:
1953 com_access_stmt(c, n);
1954 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001955 case exec_stmt:
1956 com_exec_stmt(c, n);
1957 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001958 case if_stmt:
1959 com_if_stmt(c, n);
1960 break;
1961 case while_stmt:
1962 com_while_stmt(c, n);
1963 break;
1964 case for_stmt:
1965 com_for_stmt(c, n);
1966 break;
1967 case try_stmt:
1968 com_try_stmt(c, n);
1969 break;
1970 case suite:
1971 com_suite(c, n);
1972 break;
1973
1974 /* Expression nodes */
1975
1976 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00001977 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001978 break;
1979 case test:
1980 com_test(c, n);
1981 break;
1982 case and_test:
1983 com_and_test(c, n);
1984 break;
1985 case not_test:
1986 com_not_test(c, n);
1987 break;
1988 case comparison:
1989 com_comparison(c, n);
1990 break;
1991 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00001992 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001993 break;
1994 case expr:
1995 com_expr(c, n);
1996 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001997 case xor_expr:
1998 com_xor_expr(c, n);
1999 break;
2000 case and_expr:
2001 com_and_expr(c, n);
2002 break;
2003 case shift_expr:
2004 com_shift_expr(c, n);
2005 break;
2006 case arith_expr:
2007 com_arith_expr(c, n);
2008 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002009 case term:
2010 com_term(c, n);
2011 break;
2012 case factor:
2013 com_factor(c, n);
2014 break;
2015 case atom:
2016 com_atom(c, n);
2017 break;
2018
2019 default:
2020 fprintf(stderr, "node type %d\n", TYPE(n));
2021 err_setstr(SystemError, "com_node: unexpected node type");
2022 c->c_errors++;
2023 }
2024}
2025
2026static void com_fplist PROTO((struct compiling *, node *));
2027
2028static void
2029com_fpdef(c, n)
2030 struct compiling *c;
2031 node *n;
2032{
2033 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
2034 if (TYPE(CHILD(n, 0)) == LPAR)
2035 com_fplist(c, CHILD(n, 1));
2036 else
2037 com_addopname(c, STORE_NAME, CHILD(n, 0));
2038}
2039
2040static void
2041com_fplist(c, n)
2042 struct compiling *c;
2043 node *n;
2044{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00002045 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002046 if (NCH(n) == 1) {
2047 com_fpdef(c, CHILD(n, 0));
2048 }
2049 else {
2050 int i;
2051 com_addoparg(c, UNPACK_TUPLE, (NCH(n)+1)/2);
2052 for (i = 0; i < NCH(n); i += 2)
2053 com_fpdef(c, CHILD(n, i));
2054 }
2055}
2056
2057static void
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002058com_arglist(c, n)
2059 struct compiling *c;
2060 node *n;
2061{
2062 int i, nargs, op;
2063 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00002064 /* varargslist:
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002065 (fpdef ',')* '*' NAME | fpdef (',' fpdef)* [','] */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002066 op = UNPACK_ARG;
2067 nargs = (NCH(n) + 1) / 2;
2068 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumacbefef1992-01-19 16:33:51 +00002069 int t = TYPE(CHILD(n, i));
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002070 if (t == STAR) {
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002071 op = UNPACK_VARARG;
2072 nargs = i/2;
2073 break;
2074 }
2075 }
2076 com_addoparg(c, op, nargs);
2077 for (i = 0; i < 2*nargs; i += 2)
2078 com_fpdef(c, CHILD(n, i));
2079 if (op == UNPACK_VARARG)
2080 com_addopname(c, STORE_NAME, CHILD(n, 2*nargs+1));
2081}
2082
2083static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002084com_file_input(c, n)
2085 struct compiling *c;
2086 node *n;
2087{
2088 int i;
2089 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
2090 for (i = 0; i < NCH(n); i++) {
2091 node *ch = CHILD(n, i);
2092 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
2093 com_node(c, ch);
2094 }
2095}
2096
2097/* Top-level compile-node interface */
2098
2099static void
2100compile_funcdef(c, n)
2101 struct compiling *c;
2102 node *n;
2103{
2104 node *ch;
2105 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00002106 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002107 com_addoparg(c, RESERVE_FAST, com_addconst(c, None)); /* Patched! */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002108 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
2109 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002110 if (TYPE(ch) == RPAR)
Guido van Rossum288a60f1991-12-16 13:05:10 +00002111 com_addoparg(c, UNPACK_ARG, 0);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002112 else
2113 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002114 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002115 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002116 c->c_infunction = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002117 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2118 com_addbyte(c, RETURN_VALUE);
2119}
2120
2121static void
Guido van Rossum12d12c51993-10-26 17:58:25 +00002122compile_lambda(c, n)
2123 struct compiling *c;
2124 node *n;
2125{
2126 REQ(n, lambda_input)
2127 com_arglist(c, CHILD(n, 0));
2128 com_node(c, CHILD(n, 2));
2129 com_addbyte(c, RETURN_VALUE);
2130}
2131
2132static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002133compile_node(c, n)
2134 struct compiling *c;
2135 node *n;
2136{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002137 com_addoparg(c, SET_LINENO, n->n_lineno);
2138
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002139 switch (TYPE(n)) {
2140
Guido van Rossum4c417781991-01-21 16:09:22 +00002141 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002142 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
2143 n = CHILD(n, 0);
2144 if (TYPE(n) != NEWLINE)
2145 com_node(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002146 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2147 com_addbyte(c, RETURN_VALUE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002148 break;
2149
Guido van Rossum4c417781991-01-21 16:09:22 +00002150 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002151 com_file_input(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002152 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2153 com_addbyte(c, RETURN_VALUE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002154 break;
2155
Guido van Rossum12d12c51993-10-26 17:58:25 +00002156 case lambda_input: /* Built-in function lambda() */
2157 (c->c_inlambda ? compile_lambda : com_lambda)(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002158 break;
2159
Guido van Rossum12d12c51993-10-26 17:58:25 +00002160 case eval_input: /* Built-in functions eval() and input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00002161 com_node(c, CHILD(n, 0));
2162 com_addbyte(c, RETURN_VALUE);
2163 break;
2164
2165 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002166 compile_funcdef(c, n);
2167 break;
2168
Guido van Rossum4c417781991-01-21 16:09:22 +00002169 case classdef: /* A class definition */
Guido van Rossum25831651993-05-19 14:50:45 +00002170 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
2171 c->c_name = STR(CHILD(n, 1));
Guido van Rossumc5e96291991-12-10 13:53:51 +00002172 com_node(c, CHILD(n, NCH(n)-1)); /* The suite */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002173 com_addbyte(c, LOAD_LOCALS);
2174 com_addbyte(c, RETURN_VALUE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002175 break;
2176
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002177 default:
2178 fprintf(stderr, "node type %d\n", TYPE(n));
2179 err_setstr(SystemError, "compile_node: unexpected node type");
2180 c->c_errors++;
2181 }
2182}
2183
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002184/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00002185
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002186 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
2187 instructions that refer to local variables with LOAD_FAST etc.
2188 The latter instructions are much faster because they don't need to
2189 look up the variable name in a dictionary.
Guido van Rossum282914b1991-04-04 10:42:56 +00002190
2191 To find all local variables, we check all STORE_NAME and IMPORT_FROM
2192 instructions. This yields all local variables, including arguments,
2193 function definitions, class definitions and import statements.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002194 (We don't check DELETE_NAME instructions, since if there's no
2195 STORE_NAME the DELETE_NAME will surely fail.)
Guido van Rossum282914b1991-04-04 10:42:56 +00002196
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002197 There is one problem: 'from foo import *' introduces local variables
2198 that we can't know while compiling. If this is the case, wo don't
Guido van Rossum25831651993-05-19 14:50:45 +00002199 optimize at all (this rarely happens, since this form of import
2200 statement is mostly used at the module level).
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002201
2202 Note that, because of this optimization, code like the following
2203 won't work:
2204 eval('x = 1')
2205 print x
Guido van Rossum282914b1991-04-04 10:42:56 +00002206
2207 NB: this modifies the string object co->co_code!
2208*/
2209
2210static void
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002211optimize(c)
2212 struct compiling *c;
Guido van Rossum282914b1991-04-04 10:42:56 +00002213{
Guido van Rossum0a697f61991-04-16 08:39:12 +00002214 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00002215 object *locals;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002216 int nlocals;
Guido van Rossum282914b1991-04-04 10:42:56 +00002217 int opcode;
2218 int oparg;
2219 object *name;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002220 int fast_reserved;
2221 object *error_type, *error_value;
2222
Guido van Rossum282914b1991-04-04 10:42:56 +00002223#define NEXTOP() (*next_instr++)
2224#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
2225#define GETITEM(v, i) (getlistitem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002226#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
2227
Guido van Rossum282914b1991-04-04 10:42:56 +00002228 locals = newdictobject();
2229 if (locals == NULL) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002230 c->c_errors++;
2231 return;
Guido van Rossum282914b1991-04-04 10:42:56 +00002232 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002233 nlocals = 0;
2234
2235 err_get(&error_type, &error_value);
Guido van Rossum282914b1991-04-04 10:42:56 +00002236
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002237 next_instr = (unsigned char *) getstringvalue(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00002238 for (;;) {
2239 opcode = NEXTOP();
2240 if (opcode == STOP_CODE)
2241 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002242 if (opcode == EXEC_STMT)
2243 goto end; /* Don't optimize if exec present */
Guido van Rossum282914b1991-04-04 10:42:56 +00002244 if (HAS_ARG(opcode))
2245 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002246 if (opcode == STORE_NAME || opcode == DELETE_NAME ||
2247 opcode == IMPORT_FROM) {
2248 object *v;
Guido van Rossum282914b1991-04-04 10:42:56 +00002249 name = GETNAMEOBJ(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002250 if (dict2lookup(locals, name) != NULL)
2251 continue;
2252 err_clear();
2253 v = newintobject(nlocals);
2254 if (v == NULL) {
2255 c->c_errors++;
2256 goto err;
Guido van Rossum282914b1991-04-04 10:42:56 +00002257 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002258 nlocals++;
2259 if (dict2insert(locals, name, v) != 0) {
2260 DECREF(v);
2261 c->c_errors++;
2262 goto err;
2263 }
2264 DECREF(v);
Guido van Rossum282914b1991-04-04 10:42:56 +00002265 }
2266 }
2267
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002268 if (nlocals == 0 || dictlookup(locals, "*") != NULL) {
2269 /* Don't optimize anything */
2270 goto end;
2271 }
2272
2273 next_instr = (unsigned char *) getstringvalue(c->c_code);
2274 fast_reserved = 0;
Guido van Rossum282914b1991-04-04 10:42:56 +00002275 for (;;) {
2276 cur_instr = next_instr;
2277 opcode = NEXTOP();
2278 if (opcode == STOP_CODE)
2279 break;
2280 if (HAS_ARG(opcode))
2281 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002282 if (opcode == RESERVE_FAST) {
2283 int i = com_addconst(c, locals);
2284 cur_instr[1] = i & 0xff;
2285 cur_instr[2] = (i>>8) & 0xff;
2286 fast_reserved = 1;
2287 continue;
2288 }
2289 if (!fast_reserved)
2290 continue;
2291 if (opcode == LOAD_NAME ||
2292 opcode == STORE_NAME ||
2293 opcode == DELETE_NAME) {
2294 object *v;
2295 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00002296 name = GETNAMEOBJ(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002297 v = dict2lookup(locals, name);
2298 if (v == NULL) {
Guido van Rossum83163251991-08-16 08:58:43 +00002299 err_clear();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002300 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00002301 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002302 i = getintvalue(v);
2303 switch (opcode) {
2304 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
2305 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
2306 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
2307 }
2308 cur_instr[1] = i & 0xff;
2309 cur_instr[2] = (i>>8) & 0xff;
Guido van Rossum282914b1991-04-04 10:42:56 +00002310 }
2311 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002312
2313 end:
2314 err_setval(error_type, error_value);
2315 err:
Guido van Rossum282914b1991-04-04 10:42:56 +00002316 DECREF(locals);
2317}
2318
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002319codeobject *
Guido van Rossum12d12c51993-10-26 17:58:25 +00002320_compile(n, filename, inlambda)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002321 node *n;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002322 char *filename;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002323 int inlambda;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002324{
2325 struct compiling sc;
2326 codeobject *co;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002327 if (!com_init(&sc, filename, inlambda))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002328 return NULL;
2329 compile_node(&sc, n);
2330 com_done(&sc);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002331 if (TYPE(n) == funcdef && sc.c_errors == 0)
2332 optimize(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00002333 co = NULL;
2334 if (sc.c_errors == 0) {
2335 object *v, *w;
2336 v = newstringobject(sc.c_filename);
2337 w = newstringobject(sc.c_name);
2338 if (v != NULL && w != NULL)
2339 co = newcodeobject(sc.c_code, sc.c_consts,
2340 sc.c_names, v, w);
2341 XDECREF(v);
2342 XDECREF(w);
Guido van Rossuma082ce41991-06-04 19:41:56 +00002343 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002344 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002345 return co;
2346}