blob: 77752a494b718b20c8d888248e58f46bf92e4018 [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 Rossum2e8f8a31993-11-05 10:20:10 +000095static int
96code_compare(co, cp)
97 codeobject *co, *cp;
98{
99 int cmp;
100 cmp = cmpobject((object *)co->co_code, (object *)cp->co_code);
101 if (cmp) return cmp;
102 cmp = cmpobject(co->co_consts, cp->co_consts);
103 if (cmp) return cmp;
104 cmp = cmpobject(co->co_names, cp->co_names);
105 return cmp;
106}
107
108static long
109code_hash(co)
110 codeobject *co;
111{
112 long h, h1, h2, h3;
113 h1 = hashobject((object *)co->co_code);
114 if (h1 == -1) return -1;
115 h2 = hashobject(co->co_consts);
116 if (h2 == -1) return -1;
117 h3 = hashobject(co->co_names);
118 if (h3 == -1) return -1;
119 h = h1 ^ h2 ^ h3;
120 if (h == -1) h = -2;
121 return h;
122}
123
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000124typeobject Codetype = {
125 OB_HEAD_INIT(&Typetype)
126 0,
127 "code",
128 sizeof(codeobject),
129 0,
130 code_dealloc, /*tp_dealloc*/
131 0, /*tp_print*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000132 code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000133 0, /*tp_setattr*/
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000134 code_compare, /*tp_compare*/
Guido van Rossum2dff9911992-09-03 20:50:59 +0000135 code_repr, /*tp_repr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000136 0, /*tp_as_number*/
137 0, /*tp_as_sequence*/
138 0, /*tp_as_mapping*/
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000139 code_hash, /*tp_hash*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000140};
141
Guido van Rossuma082ce41991-06-04 19:41:56 +0000142codeobject *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000143newcodeobject(code, consts, names, filename, name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000144 object *code;
145 object *consts;
146 object *names;
Guido van Rossuma082ce41991-06-04 19:41:56 +0000147 object *filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000148 object *name;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000149{
150 codeobject *co;
151 int i;
152 /* Check argument types */
153 if (code == NULL || !is_stringobject(code) ||
154 consts == NULL || !is_listobject(consts) ||
Guido van Rossum9bfef441993-03-29 10:43:31 +0000155 names == NULL || !is_listobject(names) ||
Guido van Rossum590baa41993-11-30 13:40:46 +0000156 name == NULL || !(is_stringobject(name) || name == None)) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000157 err_badcall();
158 return NULL;
159 }
160 /* Make sure the list of names contains only strings */
161 for (i = getlistsize(names); --i >= 0; ) {
162 object *v = getlistitem(names, i);
163 if (v == NULL || !is_stringobject(v)) {
164 err_badcall();
165 return NULL;
166 }
167 }
168 co = NEWOBJ(codeobject, &Codetype);
169 if (co != NULL) {
170 INCREF(code);
171 co->co_code = (stringobject *)code;
172 INCREF(consts);
173 co->co_consts = consts;
174 INCREF(names);
175 co->co_names = names;
Guido van Rossuma082ce41991-06-04 19:41:56 +0000176 INCREF(filename);
177 co->co_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000178 INCREF(name);
179 co->co_name = name;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000180 }
181 return co;
182}
183
184
185/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000186
187#define MAXBLOCKS 20 /* Max static block nesting within a function */
188
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000189struct compiling {
190 object *c_code; /* string */
191 object *c_consts; /* list of objects */
192 object *c_names; /* list of strings (names) */
Guido van Rossumc5e96291991-12-10 13:53:51 +0000193 object *c_globals; /* dictionary */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000194 int c_nexti; /* index into c_code */
195 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000196 int c_infunction; /* set when compiling a function */
197 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000198 int c_begin; /* begin of current loop, for 'continue' */
199 int c_block[MAXBLOCKS]; /* stack of block types */
200 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000201 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000202 char *c_name; /* name of object (e.g. function) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000203};
204
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000205
206/* Interface to the block stack */
207
208static void
209block_push(c, type)
210 struct compiling *c;
211 int type;
212{
213 if (c->c_nblocks >= MAXBLOCKS) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +0000214 err_setstr(SystemError, "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000215 c->c_errors++;
216 }
217 else {
218 c->c_block[c->c_nblocks++] = type;
219 }
220}
221
222static void
223block_pop(c, type)
224 struct compiling *c;
225 int type;
226{
227 if (c->c_nblocks > 0)
228 c->c_nblocks--;
229 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
230 err_setstr(SystemError, "bad block pop");
231 c->c_errors++;
232 }
233}
234
235
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000236/* Prototypes */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000237
Guido van Rossum590baa41993-11-30 13:40:46 +0000238static int com_init PROTO((struct compiling *, char *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000239static void com_free PROTO((struct compiling *));
240static void com_done PROTO((struct compiling *));
241static void com_node PROTO((struct compiling *, struct _node *));
242static void com_addbyte PROTO((struct compiling *, int));
243static void com_addint PROTO((struct compiling *, int));
244static void com_addoparg PROTO((struct compiling *, int, int));
245static void com_addfwref PROTO((struct compiling *, int, int *));
246static void com_backpatch PROTO((struct compiling *, int));
247static int com_add PROTO((struct compiling *, object *, object *));
248static int com_addconst PROTO((struct compiling *, object *));
249static int com_addname PROTO((struct compiling *, object *));
250static void com_addopname PROTO((struct compiling *, int, node *));
Guido van Rossum288a60f1991-12-16 13:05:10 +0000251static void com_list PROTO((struct compiling *, node *, int));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000252
253static int
Guido van Rossum590baa41993-11-30 13:40:46 +0000254com_init(c, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000255 struct compiling *c;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000256 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000257{
Guido van Rossum62d46241991-04-03 19:00:23 +0000258 if ((c->c_code = newsizedstringobject((char *)NULL, 1000)) == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000259 goto fail_3;
260 if ((c->c_consts = newlistobject(0)) == NULL)
261 goto fail_2;
262 if ((c->c_names = newlistobject(0)) == NULL)
263 goto fail_1;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000264 if ((c->c_globals = newdictobject()) == NULL)
265 goto fail_0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000266 c->c_nexti = 0;
267 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000268 c->c_infunction = 0;
269 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000270 c->c_begin = 0;
271 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000272 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000273 c->c_name = "?";
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000274 return 1;
275
Guido van Rossumc5e96291991-12-10 13:53:51 +0000276 fail_0:
277 DECREF(c->c_names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000278 fail_1:
279 DECREF(c->c_consts);
280 fail_2:
281 DECREF(c->c_code);
282 fail_3:
283 return 0;
284}
285
286static void
287com_free(c)
288 struct compiling *c;
289{
290 XDECREF(c->c_code);
291 XDECREF(c->c_consts);
292 XDECREF(c->c_names);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000293 XDECREF(c->c_globals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000294}
295
296static void
297com_done(c)
298 struct compiling *c;
299{
300 if (c->c_code != NULL)
301 resizestring(&c->c_code, c->c_nexti);
302}
303
304static void
305com_addbyte(c, byte)
306 struct compiling *c;
307 int byte;
308{
309 int len;
310 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000311 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000312 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
313 abort();
Guido van Rossum01cfd441991-10-20 20:12:38 +0000314 */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000315 err_setstr(SystemError, "com_addbyte: byte out of range");
316 c->c_errors++;
317 }
318 if (c->c_code == NULL)
319 return;
320 len = getstringsize(c->c_code);
321 if (c->c_nexti >= len) {
322 if (resizestring(&c->c_code, len+1000) != 0) {
323 c->c_errors++;
324 return;
325 }
326 }
327 getstringvalue(c->c_code)[c->c_nexti++] = byte;
328}
329
330static void
331com_addint(c, x)
332 struct compiling *c;
333 int x;
334{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000335 com_addbyte(c, x & 0xff);
336 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000337}
338
339static void
340com_addoparg(c, op, arg)
341 struct compiling *c;
342 int op;
343 int arg;
344{
345 com_addbyte(c, op);
346 com_addint(c, arg);
347}
348
349static void
350com_addfwref(c, op, p_anchor)
351 struct compiling *c;
352 int op;
353 int *p_anchor;
354{
355 /* Compile a forward reference for backpatching */
356 int here;
357 int anchor;
358 com_addbyte(c, op);
359 here = c->c_nexti;
360 anchor = *p_anchor;
361 *p_anchor = here;
362 com_addint(c, anchor == 0 ? 0 : here - anchor);
363}
364
365static void
366com_backpatch(c, anchor)
367 struct compiling *c;
368 int anchor; /* Must be nonzero */
369{
370 unsigned char *code = (unsigned char *) getstringvalue(c->c_code);
371 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000372 int dist;
373 int prev;
374 for (;;) {
375 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000376 prev = code[anchor] + (code[anchor+1] << 8);
377 dist = target - (anchor+2);
378 code[anchor] = dist & 0xff;
379 code[anchor+1] = dist >> 8;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000380 if (!prev)
381 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000382 anchor -= prev;
383 }
384}
385
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000386/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000387
388static int
389com_add(c, list, v)
390 struct compiling *c;
391 object *list;
392 object *v;
393{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000394 int n = getlistsize(list);
395 int i;
396 for (i = n; --i >= 0; ) {
397 object *w = getlistitem(list, i);
Guido van Rossumefc0bd01991-07-01 18:44:20 +0000398 if (v->ob_type == w->ob_type && cmpobject(v, w) == 0)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000399 return i;
400 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000401 if (addlistitem(list, v) != 0)
402 c->c_errors++;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000403 return n;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000404}
405
406static int
407com_addconst(c, v)
408 struct compiling *c;
409 object *v;
410{
411 return com_add(c, c->c_consts, v);
412}
413
414static int
415com_addname(c, v)
416 struct compiling *c;
417 object *v;
418{
419 return com_add(c, c->c_names, v);
420}
421
422static void
423com_addopname(c, op, n)
424 struct compiling *c;
425 int op;
426 node *n;
427{
428 object *v;
429 int i;
430 char *name;
431 if (TYPE(n) == STAR)
432 name = "*";
433 else {
434 REQ(n, NAME);
435 name = STR(n);
436 }
437 if ((v = newstringobject(name)) == NULL) {
438 c->c_errors++;
439 i = 255;
440 }
441 else {
442 i = com_addname(c, v);
443 DECREF(v);
444 }
Guido van Rossumc5e96291991-12-10 13:53:51 +0000445 /* Hack to replace *_NAME opcodes by *_GLOBAL if necessary */
446 switch (op) {
447 case LOAD_NAME:
448 case STORE_NAME:
449 case DELETE_NAME:
450 if (dictlookup(c->c_globals, name) != NULL) {
451 switch (op) {
452 case LOAD_NAME: op = LOAD_GLOBAL; break;
453 case STORE_NAME: op = STORE_GLOBAL; break;
454 case DELETE_NAME: op = DELETE_GLOBAL; break;
455 }
456 }
457 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000458 com_addoparg(c, op, i);
459}
460
461static object *
462parsenumber(s)
463 char *s;
464{
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000465 extern long strtol PROTO((const char *, char **, int));
466 extern unsigned long strtoul PROTO((const char *, char **, int));
467 extern double strtod PROTO((const char *, char **));
Guido van Rossumc5e96291991-12-10 13:53:51 +0000468 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000469 long x;
Guido van Rossum282914b1991-04-04 10:42:56 +0000470 double xx;
471 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000472 end = s + strlen(s) - 1;
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000473 if (*end == 'l' || *end == 'L')
Guido van Rossumc5e96291991-12-10 13:53:51 +0000474 return long_scan(s, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000475 if (s[0] == '0')
476 x = (long) strtoul(s, &end, 0);
477 else
478 x = strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +0000479 if (*end == '\0') {
480 if (errno != 0) {
Guido van Rossumefb087b1991-12-16 15:41:41 +0000481 err_setstr(OverflowError,
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000482 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000483 return NULL;
484 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000485 return newintobject(x);
Guido van Rossum282914b1991-04-04 10:42:56 +0000486 }
487 errno = 0;
488 xx = strtod(s, &end);
489 if (*end == '\0') {
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000490#ifndef BROKEN_STRTOD
491 /* Some strtod() versions (e.g., in older SunOS systems)
492 set errno incorrectly; better to ignore overflows
493 than not to be able to use float literals at all! */
Guido van Rossum282914b1991-04-04 10:42:56 +0000494 if (errno != 0) {
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000495 err_setstr(OverflowError, "float literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000496 return NULL;
497 }
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000498#endif
Guido van Rossum282914b1991-04-04 10:42:56 +0000499 return newfloatobject(xx);
500 }
Guido van Rossumefb087b1991-12-16 15:41:41 +0000501 err_setstr(SystemError, "bad number syntax?!?!");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000502 return NULL;
503}
504
505static object *
506parsestr(s)
507 char *s;
508{
509 object *v;
510 int len;
511 char *buf;
512 char *p;
513 int c;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000514 int quote = *s;
515 if (quote != '\'' && quote != '\"') {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000516 err_badcall();
517 return NULL;
518 }
519 s++;
520 len = strlen(s);
Guido van Rossum8054fad1993-10-26 15:19:44 +0000521 if (s[--len] != quote) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000522 err_badcall();
523 return NULL;
524 }
525 if (strchr(s, '\\') == NULL)
526 return newsizedstringobject(s, len);
527 v = newsizedstringobject((char *)NULL, len);
528 p = buf = getstringvalue(v);
Guido van Rossuma3d78fb1993-11-10 09:23:53 +0000529 while (*s != '\0' && *s != quote) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000530 if (*s != '\\') {
531 *p++ = *s++;
532 continue;
533 }
534 s++;
535 switch (*s++) {
536 /* XXX This assumes ASCII! */
537 case '\\': *p++ = '\\'; break;
538 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000539 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000540 case 'b': *p++ = '\b'; break;
541 case 'f': *p++ = '\014'; break; /* FF */
542 case 't': *p++ = '\t'; break;
543 case 'n': *p++ = '\n'; break;
544 case 'r': *p++ = '\r'; break;
545 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000546 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
547 case '0': case '1': case '2': case '3':
548 case '4': case '5': case '6': case '7':
549 c = s[-1] - '0';
550 if ('0' <= *s && *s <= '7') {
551 c = (c<<3) + *s++ - '0';
552 if ('0' <= *s && *s <= '7')
553 c = (c<<3) + *s++ - '0';
554 }
555 *p++ = c;
556 break;
557 case 'x':
558 if (isxdigit(*s)) {
559 sscanf(s, "%x", &c);
560 *p++ = c;
561 do {
562 s++;
563 } while (isxdigit(*s));
564 break;
565 }
566 /* FALLTHROUGH */
567 default: *p++ = '\\'; *p++ = s[-1]; break;
568 }
569 }
570 resizestring(&v, (int)(p - buf));
571 return v;
572}
573
574static void
575com_list_constructor(c, n)
576 struct compiling *c;
577 node *n;
578{
579 int len;
580 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000581 if (TYPE(n) != testlist)
582 REQ(n, exprlist);
583 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
584 len = (NCH(n) + 1) / 2;
585 for (i = 0; i < NCH(n); i += 2)
586 com_node(c, CHILD(n, i));
587 com_addoparg(c, BUILD_LIST, len);
588}
589
590static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000591com_dictmaker(c, n)
592 struct compiling *c;
593 node *n;
594{
595 int i;
596 /* dictmaker: test ':' test (',' test ':' value)* [','] */
597 for (i = 0; i+2 < NCH(n); i += 4) {
598 /* We must arrange things just right for STORE_SUBSCR.
599 It wants the stack to look like (value) (dict) (key) */
600 com_addbyte(c, DUP_TOP);
601 com_node(c, CHILD(n, i+2)); /* value */
602 com_addbyte(c, ROT_TWO);
603 com_node(c, CHILD(n, i)); /* key */
604 com_addbyte(c, STORE_SUBSCR);
605 }
606}
607
608static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000609com_atom(c, n)
610 struct compiling *c;
611 node *n;
612{
613 node *ch;
614 object *v;
615 int i;
616 REQ(n, atom);
617 ch = CHILD(n, 0);
618 switch (TYPE(ch)) {
619 case LPAR:
620 if (TYPE(CHILD(n, 1)) == RPAR)
621 com_addoparg(c, BUILD_TUPLE, 0);
622 else
623 com_node(c, CHILD(n, 1));
624 break;
625 case LSQB:
626 if (TYPE(CHILD(n, 1)) == RSQB)
627 com_addoparg(c, BUILD_LIST, 0);
628 else
629 com_list_constructor(c, CHILD(n, 1));
630 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000631 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000632 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000633 if (TYPE(CHILD(n, 1)) != RBRACE)
634 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000635 break;
636 case BACKQUOTE:
637 com_node(c, CHILD(n, 1));
638 com_addbyte(c, UNARY_CONVERT);
639 break;
640 case NUMBER:
641 if ((v = parsenumber(STR(ch))) == NULL) {
642 c->c_errors++;
643 i = 255;
644 }
645 else {
646 i = com_addconst(c, v);
647 DECREF(v);
648 }
649 com_addoparg(c, LOAD_CONST, i);
650 break;
651 case STRING:
652 if ((v = parsestr(STR(ch))) == NULL) {
653 c->c_errors++;
654 i = 255;
655 }
656 else {
657 i = com_addconst(c, v);
658 DECREF(v);
659 }
660 com_addoparg(c, LOAD_CONST, i);
661 break;
Guido van Rossum590baa41993-11-30 13:40:46 +0000662 case lambdef:
663 if ((v = (object *) compile(ch, c->c_filename)) == NULL) {
664 c->c_errors++;
665 i = 255;
666 }
667 else {
668 i = com_addconst(c, v);
669 DECREF(v);
670 }
671 com_addoparg(c, LOAD_CONST, i);
672 com_addbyte(c, BUILD_FUNCTION);
673 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000674 case NAME:
675 com_addopname(c, LOAD_NAME, ch);
676 break;
677 default:
678 fprintf(stderr, "node type %d\n", TYPE(ch));
679 err_setstr(SystemError, "com_atom: unexpected node type");
680 c->c_errors++;
681 }
682}
683
684static void
685com_slice(c, n, op)
686 struct compiling *c;
687 node *n;
688 int op;
689{
690 if (NCH(n) == 1) {
691 com_addbyte(c, op);
692 }
693 else if (NCH(n) == 2) {
694 if (TYPE(CHILD(n, 0)) != COLON) {
695 com_node(c, CHILD(n, 0));
696 com_addbyte(c, op+1);
697 }
698 else {
699 com_node(c, CHILD(n, 1));
700 com_addbyte(c, op+2);
701 }
702 }
703 else {
704 com_node(c, CHILD(n, 0));
705 com_node(c, CHILD(n, 2));
706 com_addbyte(c, op+3);
707 }
708}
709
710static void
711com_apply_subscript(c, n)
712 struct compiling *c;
713 node *n;
714{
715 REQ(n, subscript);
716 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) != COLON) {
717 /* It's a single subscript */
718 com_node(c, CHILD(n, 0));
719 com_addbyte(c, BINARY_SUBSCR);
720 }
721 else {
722 /* It's a slice: [expr] ':' [expr] */
723 com_slice(c, n, SLICE);
724 }
725}
726
727static void
728com_call_function(c, n)
729 struct compiling *c;
730 node *n; /* EITHER testlist OR ')' */
731{
732 if (TYPE(n) == RPAR) {
Guido van Rossum288a60f1991-12-16 13:05:10 +0000733 com_addoparg(c, BUILD_TUPLE, 0);
734 com_addbyte(c, BINARY_CALL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000735 }
736 else {
Guido van Rossum288a60f1991-12-16 13:05:10 +0000737 REQ(n, testlist);
738 com_list(c, n, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000739 com_addbyte(c, BINARY_CALL);
740 }
741}
742
743static void
744com_select_member(c, n)
745 struct compiling *c;
746 node *n;
747{
748 com_addopname(c, LOAD_ATTR, n);
749}
750
751static void
752com_apply_trailer(c, n)
753 struct compiling *c;
754 node *n;
755{
756 REQ(n, trailer);
757 switch (TYPE(CHILD(n, 0))) {
758 case LPAR:
759 com_call_function(c, CHILD(n, 1));
760 break;
761 case DOT:
762 com_select_member(c, CHILD(n, 1));
763 break;
764 case LSQB:
765 com_apply_subscript(c, CHILD(n, 1));
766 break;
767 default:
768 err_setstr(SystemError,
769 "com_apply_trailer: unknown trailer type");
770 c->c_errors++;
771 }
772}
773
774static void
775com_factor(c, n)
776 struct compiling *c;
777 node *n;
778{
779 int i;
780 REQ(n, factor);
781 if (TYPE(CHILD(n, 0)) == PLUS) {
782 com_factor(c, CHILD(n, 1));
783 com_addbyte(c, UNARY_POSITIVE);
784 }
785 else if (TYPE(CHILD(n, 0)) == MINUS) {
786 com_factor(c, CHILD(n, 1));
787 com_addbyte(c, UNARY_NEGATIVE);
788 }
Guido van Rossum7928cd71991-10-24 14:59:31 +0000789 else if (TYPE(CHILD(n, 0)) == TILDE) {
790 com_factor(c, CHILD(n, 1));
791 com_addbyte(c, UNARY_INVERT);
792 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000793 else {
794 com_atom(c, CHILD(n, 0));
795 for (i = 1; i < NCH(n); i++)
796 com_apply_trailer(c, CHILD(n, i));
797 }
798}
799
800static void
801com_term(c, n)
802 struct compiling *c;
803 node *n;
804{
805 int i;
806 int op;
807 REQ(n, term);
808 com_factor(c, CHILD(n, 0));
809 for (i = 2; i < NCH(n); i += 2) {
810 com_factor(c, CHILD(n, i));
811 switch (TYPE(CHILD(n, i-1))) {
812 case STAR:
813 op = BINARY_MULTIPLY;
814 break;
815 case SLASH:
816 op = BINARY_DIVIDE;
817 break;
818 case PERCENT:
819 op = BINARY_MODULO;
820 break;
821 default:
822 err_setstr(SystemError,
Guido van Rossum7928cd71991-10-24 14:59:31 +0000823 "com_term: operator not *, / or %");
824 c->c_errors++;
825 op = 255;
826 }
827 com_addbyte(c, op);
828 }
829}
830
831static void
832com_arith_expr(c, n)
833 struct compiling *c;
834 node *n;
835{
836 int i;
837 int op;
838 REQ(n, arith_expr);
839 com_term(c, CHILD(n, 0));
840 for (i = 2; i < NCH(n); i += 2) {
841 com_term(c, CHILD(n, i));
842 switch (TYPE(CHILD(n, i-1))) {
843 case PLUS:
844 op = BINARY_ADD;
845 break;
846 case MINUS:
847 op = BINARY_SUBTRACT;
848 break;
849 default:
850 err_setstr(SystemError,
851 "com_arith_expr: operator not + or -");
852 c->c_errors++;
853 op = 255;
854 }
855 com_addbyte(c, op);
856 }
857}
858
859static void
860com_shift_expr(c, n)
861 struct compiling *c;
862 node *n;
863{
864 int i;
865 int op;
866 REQ(n, shift_expr);
867 com_arith_expr(c, CHILD(n, 0));
868 for (i = 2; i < NCH(n); i += 2) {
869 com_arith_expr(c, CHILD(n, i));
870 switch (TYPE(CHILD(n, i-1))) {
871 case LEFTSHIFT:
872 op = BINARY_LSHIFT;
873 break;
874 case RIGHTSHIFT:
875 op = BINARY_RSHIFT;
876 break;
877 default:
878 err_setstr(SystemError,
879 "com_shift_expr: operator not << or >>");
880 c->c_errors++;
881 op = 255;
882 }
883 com_addbyte(c, op);
884 }
885}
886
887static void
888com_and_expr(c, n)
889 struct compiling *c;
890 node *n;
891{
892 int i;
893 int op;
894 REQ(n, and_expr);
895 com_shift_expr(c, CHILD(n, 0));
896 for (i = 2; i < NCH(n); i += 2) {
897 com_shift_expr(c, CHILD(n, i));
898 if (TYPE(CHILD(n, i-1)) == AMPER) {
899 op = BINARY_AND;
900 }
901 else {
902 err_setstr(SystemError,
903 "com_and_expr: operator not &");
904 c->c_errors++;
905 op = 255;
906 }
907 com_addbyte(c, op);
908 }
909}
910
911static void
912com_xor_expr(c, n)
913 struct compiling *c;
914 node *n;
915{
916 int i;
917 int op;
918 REQ(n, xor_expr);
919 com_and_expr(c, CHILD(n, 0));
920 for (i = 2; i < NCH(n); i += 2) {
921 com_and_expr(c, CHILD(n, i));
922 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
923 op = BINARY_XOR;
924 }
925 else {
926 err_setstr(SystemError,
927 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000928 c->c_errors++;
929 op = 255;
930 }
931 com_addbyte(c, op);
932 }
933}
934
935static void
936com_expr(c, n)
937 struct compiling *c;
938 node *n;
939{
940 int i;
941 int op;
942 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000943 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000944 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +0000945 com_xor_expr(c, CHILD(n, i));
946 if (TYPE(CHILD(n, i-1)) == VBAR) {
947 op = BINARY_OR;
948 }
949 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000950 err_setstr(SystemError,
Guido van Rossum7928cd71991-10-24 14:59:31 +0000951 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000952 c->c_errors++;
953 op = 255;
954 }
955 com_addbyte(c, op);
956 }
957}
958
959static enum cmp_op
960cmp_type(n)
961 node *n;
962{
963 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +0000964 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000965 | 'in' | 'not' 'in' | 'is' | 'is' not' */
966 if (NCH(n) == 1) {
967 n = CHILD(n, 0);
968 switch (TYPE(n)) {
969 case LESS: return LT;
970 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +0000971 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000972 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +0000973 case LESSEQUAL: return LE;
974 case GREATEREQUAL: return GE;
975 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000976 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
977 if (strcmp(STR(n), "is") == 0) return IS;
978 }
979 }
980 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000981 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000982 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
983 return NOT_IN;
984 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
985 return IS_NOT;
986 }
987 }
988 return BAD;
989}
990
991static void
992com_comparison(c, n)
993 struct compiling *c;
994 node *n;
995{
996 int i;
997 enum cmp_op op;
998 int anchor;
999 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
1000 com_expr(c, CHILD(n, 0));
1001 if (NCH(n) == 1)
1002 return;
1003
1004 /****************************************************************
1005 The following code is generated for all but the last
1006 comparison in a chain:
1007
1008 label: on stack: opcode: jump to:
1009
1010 a <code to load b>
1011 a, b DUP_TOP
1012 a, b, b ROT_THREE
1013 b, a, b COMPARE_OP
1014 b, 0-or-1 JUMP_IF_FALSE L1
1015 b, 1 POP_TOP
1016 b
1017
1018 We are now ready to repeat this sequence for the next
1019 comparison in the chain.
1020
1021 For the last we generate:
1022
1023 b <code to load c>
1024 b, c COMPARE_OP
1025 0-or-1
1026
1027 If there were any jumps to L1 (i.e., there was more than one
1028 comparison), we generate:
1029
1030 0-or-1 JUMP_FORWARD L2
1031 L1: b, 0 ROT_TWO
1032 0, b POP_TOP
1033 0
1034 L2:
1035 ****************************************************************/
1036
1037 anchor = 0;
1038
1039 for (i = 2; i < NCH(n); i += 2) {
1040 com_expr(c, CHILD(n, i));
1041 if (i+2 < NCH(n)) {
1042 com_addbyte(c, DUP_TOP);
1043 com_addbyte(c, ROT_THREE);
1044 }
1045 op = cmp_type(CHILD(n, i-1));
1046 if (op == BAD) {
1047 err_setstr(SystemError,
1048 "com_comparison: unknown comparison op");
1049 c->c_errors++;
1050 }
1051 com_addoparg(c, COMPARE_OP, op);
1052 if (i+2 < NCH(n)) {
1053 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1054 com_addbyte(c, POP_TOP);
1055 }
1056 }
1057
1058 if (anchor) {
1059 int anchor2 = 0;
1060 com_addfwref(c, JUMP_FORWARD, &anchor2);
1061 com_backpatch(c, anchor);
1062 com_addbyte(c, ROT_TWO);
1063 com_addbyte(c, POP_TOP);
1064 com_backpatch(c, anchor2);
1065 }
1066}
1067
1068static void
1069com_not_test(c, n)
1070 struct compiling *c;
1071 node *n;
1072{
1073 REQ(n, not_test); /* 'not' not_test | comparison */
1074 if (NCH(n) == 1) {
1075 com_comparison(c, CHILD(n, 0));
1076 }
1077 else {
1078 com_not_test(c, CHILD(n, 1));
1079 com_addbyte(c, UNARY_NOT);
1080 }
1081}
1082
1083static void
1084com_and_test(c, n)
1085 struct compiling *c;
1086 node *n;
1087{
1088 int i;
1089 int anchor;
1090 REQ(n, and_test); /* not_test ('and' not_test)* */
1091 anchor = 0;
1092 i = 0;
1093 for (;;) {
1094 com_not_test(c, CHILD(n, i));
1095 if ((i += 2) >= NCH(n))
1096 break;
1097 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1098 com_addbyte(c, POP_TOP);
1099 }
1100 if (anchor)
1101 com_backpatch(c, anchor);
1102}
1103
1104static void
1105com_test(c, n)
1106 struct compiling *c;
1107 node *n;
1108{
1109 int i;
1110 int anchor;
1111 REQ(n, test); /* and_test ('and' and_test)* */
1112 anchor = 0;
1113 i = 0;
1114 for (;;) {
1115 com_and_test(c, CHILD(n, i));
1116 if ((i += 2) >= NCH(n))
1117 break;
1118 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1119 com_addbyte(c, POP_TOP);
1120 }
1121 if (anchor)
1122 com_backpatch(c, anchor);
1123}
1124
1125static void
Guido van Rossum288a60f1991-12-16 13:05:10 +00001126com_list(c, n, toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001127 struct compiling *c;
1128 node *n;
Guido van Rossum288a60f1991-12-16 13:05:10 +00001129 int toplevel; /* If nonzero, *always* build a tuple */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001130{
1131 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001132 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001133 com_node(c, CHILD(n, 0));
1134 }
1135 else {
1136 int i;
1137 int len;
1138 len = (NCH(n) + 1) / 2;
1139 for (i = 0; i < NCH(n); i += 2)
1140 com_node(c, CHILD(n, i));
1141 com_addoparg(c, BUILD_TUPLE, len);
1142 }
1143}
1144
1145
1146/* Begin of assignment compilation */
1147
1148static void com_assign_name PROTO((struct compiling *, node *, int));
1149static void com_assign PROTO((struct compiling *, node *, int));
1150
1151static void
1152com_assign_attr(c, n, assigning)
1153 struct compiling *c;
1154 node *n;
1155 int assigning;
1156{
1157 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
1158}
1159
1160static void
1161com_assign_slice(c, n, assigning)
1162 struct compiling *c;
1163 node *n;
1164 int assigning;
1165{
1166 com_slice(c, n, assigning ? STORE_SLICE : DELETE_SLICE);
1167}
1168
1169static void
1170com_assign_subscript(c, n, assigning)
1171 struct compiling *c;
1172 node *n;
1173 int assigning;
1174{
1175 com_node(c, n);
1176 com_addbyte(c, assigning ? STORE_SUBSCR : DELETE_SUBSCR);
1177}
1178
1179static void
1180com_assign_trailer(c, n, assigning)
1181 struct compiling *c;
1182 node *n;
1183 int assigning;
1184{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001185 REQ(n, trailer);
1186 switch (TYPE(CHILD(n, 0))) {
1187 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001188 err_setstr(SyntaxError, "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001189 c->c_errors++;
1190 break;
1191 case DOT: /* '.' NAME */
1192 com_assign_attr(c, CHILD(n, 1), assigning);
1193 break;
1194 case LSQB: /* '[' subscript ']' */
1195 n = CHILD(n, 1);
1196 REQ(n, subscript); /* subscript: expr | [expr] ':' [expr] */
1197 if (NCH(n) > 1 || TYPE(CHILD(n, 0)) == COLON)
1198 com_assign_slice(c, n, assigning);
1199 else
1200 com_assign_subscript(c, CHILD(n, 0), assigning);
1201 break;
1202 default:
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001203 err_setstr(SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001204 c->c_errors++;
1205 }
1206}
1207
1208static void
1209com_assign_tuple(c, n, assigning)
1210 struct compiling *c;
1211 node *n;
1212 int assigning;
1213{
1214 int i;
1215 if (TYPE(n) != testlist)
1216 REQ(n, exprlist);
1217 if (assigning)
1218 com_addoparg(c, UNPACK_TUPLE, (NCH(n)+1)/2);
1219 for (i = 0; i < NCH(n); i += 2)
1220 com_assign(c, CHILD(n, i), assigning);
1221}
1222
1223static void
1224com_assign_list(c, n, assigning)
1225 struct compiling *c;
1226 node *n;
1227 int assigning;
1228{
1229 int i;
1230 if (assigning)
1231 com_addoparg(c, UNPACK_LIST, (NCH(n)+1)/2);
1232 for (i = 0; i < NCH(n); i += 2)
1233 com_assign(c, CHILD(n, i), assigning);
1234}
1235
1236static void
1237com_assign_name(c, n, assigning)
1238 struct compiling *c;
1239 node *n;
1240 int assigning;
1241{
1242 REQ(n, NAME);
1243 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
1244}
1245
1246static void
1247com_assign(c, n, assigning)
1248 struct compiling *c;
1249 node *n;
1250 int assigning;
1251{
1252 /* Loop to avoid trivial recursion */
1253 for (;;) {
1254 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001255
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001256 case exprlist:
1257 case testlist:
1258 if (NCH(n) > 1) {
1259 com_assign_tuple(c, n, 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 test:
1266 case and_test:
1267 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001268 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001269 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001270 case xor_expr:
1271 case and_expr:
1272 case shift_expr:
1273 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001274 case term:
1275 if (NCH(n) > 1) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001276 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001277 "can't assign to operator");
1278 c->c_errors++;
1279 return;
1280 }
1281 n = CHILD(n, 0);
1282 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001283
Guido van Rossum7928cd71991-10-24 14:59:31 +00001284 case factor: /* ('+'|'-'|'~') factor | atom trailer* */
1285 if (TYPE(CHILD(n, 0)) != atom) { /* '+'|'-'|'~' */
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001286 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001287 "can't assign to operator");
1288 c->c_errors++;
1289 return;
1290 }
1291 if (NCH(n) > 1) { /* trailer present */
1292 int i;
1293 com_node(c, CHILD(n, 0));
1294 for (i = 1; i+1 < NCH(n); i++) {
1295 com_apply_trailer(c, CHILD(n, i));
1296 } /* NB i is still alive */
1297 com_assign_trailer(c,
1298 CHILD(n, i), assigning);
1299 return;
1300 }
1301 n = CHILD(n, 0);
1302 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001303
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001304 case atom:
1305 switch (TYPE(CHILD(n, 0))) {
1306 case LPAR:
1307 n = CHILD(n, 1);
1308 if (TYPE(n) == RPAR) {
1309 /* XXX Should allow () = () ??? */
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001310 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001311 "can't assign to ()");
1312 c->c_errors++;
1313 return;
1314 }
1315 break;
1316 case LSQB:
1317 n = CHILD(n, 1);
1318 if (TYPE(n) == RSQB) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001319 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001320 "can't assign to []");
1321 c->c_errors++;
1322 return;
1323 }
1324 com_assign_list(c, n, assigning);
1325 return;
1326 case NAME:
1327 com_assign_name(c, CHILD(n, 0), assigning);
1328 return;
1329 default:
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001330 err_setstr(SyntaxError,
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001331 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001332 c->c_errors++;
1333 return;
1334 }
1335 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001336
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001337 default:
1338 fprintf(stderr, "node type %d\n", TYPE(n));
1339 err_setstr(SystemError, "com_assign: bad node");
1340 c->c_errors++;
1341 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001342
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001343 }
1344 }
1345}
1346
1347static void
1348com_expr_stmt(c, n)
1349 struct compiling *c;
1350 node *n;
1351{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001352 REQ(n, expr_stmt); /* testlist ('=' testlist)* */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001353 com_node(c, CHILD(n, NCH(n)-1));
1354 if (NCH(n) == 1) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001355 com_addbyte(c, PRINT_EXPR);
1356 }
1357 else {
1358 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001359 for (i = 0; i < NCH(n)-2; i+=2) {
1360 if (i+2 < NCH(n)-2)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001361 com_addbyte(c, DUP_TOP);
1362 com_assign(c, CHILD(n, i), 1/*assign*/);
1363 }
1364 }
1365}
1366
1367static void
1368com_print_stmt(c, n)
1369 struct compiling *c;
1370 node *n;
1371{
1372 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001373 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
1374 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001375 com_node(c, CHILD(n, i));
1376 com_addbyte(c, PRINT_ITEM);
1377 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001378 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001379 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001380 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001381}
1382
1383static void
1384com_return_stmt(c, n)
1385 struct compiling *c;
1386 node *n;
1387{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001388 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001389 if (!c->c_infunction) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001390 err_setstr(SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001391 c->c_errors++;
1392 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001393 if (NCH(n) < 2)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001394 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1395 else
1396 com_node(c, CHILD(n, 1));
1397 com_addbyte(c, RETURN_VALUE);
1398}
1399
1400static void
1401com_raise_stmt(c, n)
1402 struct compiling *c;
1403 node *n;
1404{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001405 REQ(n, raise_stmt); /* 'raise' test [',' test] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001406 com_node(c, CHILD(n, 1));
1407 if (NCH(n) > 3)
1408 com_node(c, CHILD(n, 3));
1409 else
1410 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1411 com_addbyte(c, RAISE_EXCEPTION);
1412}
1413
1414static void
1415com_import_stmt(c, n)
1416 struct compiling *c;
1417 node *n;
1418{
1419 int i;
1420 REQ(n, import_stmt);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001421 /* 'import' NAME (',' NAME)* |
1422 'from' NAME 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001423 if (STR(CHILD(n, 0))[0] == 'f') {
1424 /* 'from' NAME 'import' ... */
1425 REQ(CHILD(n, 1), NAME);
1426 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
1427 for (i = 3; i < NCH(n); i += 2)
1428 com_addopname(c, IMPORT_FROM, CHILD(n, i));
1429 com_addbyte(c, POP_TOP);
1430 }
1431 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001432 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001433 for (i = 1; i < NCH(n); i += 2) {
1434 com_addopname(c, IMPORT_NAME, CHILD(n, i));
1435 com_addopname(c, STORE_NAME, CHILD(n, i));
1436 }
1437 }
1438}
1439
1440static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00001441com_global_stmt(c, n)
1442 struct compiling *c;
1443 node *n;
1444{
1445 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001446 REQ(n, global_stmt);
1447 /* 'global' NAME (',' NAME)* */
1448 for (i = 1; i < NCH(n); i += 2) {
1449 if (dictinsert(c->c_globals, STR(CHILD(n, i)), None) != 0)
1450 c->c_errors++;
1451 }
1452}
1453
Guido van Rossum25831651993-05-19 14:50:45 +00001454#define strequ(a, b) (strcmp((a), (b)) == 0)
1455
1456static void
1457com_access_stmt(c, n)
1458 struct compiling *c;
1459 node *n;
1460{
1461 int i, j, k, mode, imode;
1462 object *vmode;
1463 REQ(n, access_stmt);
1464 /* 'access' NAME (',' NAME)* ':' accesstype (',' accesstype)*
1465 accesstype: NAME+ */
1466
1467 /* Find where the colon is */
1468 i = 1;
1469 while (TYPE(CHILD(n,i-1)) != COLON)
1470 i += 1;
1471
1472 /* Calculate the mode mask */
1473 mode = 0;
1474 for (j = i; j < NCH(n); j += 2) {
Guido van Rossum81daa321993-05-20 14:24:46 +00001475 int r = 0, w = 0, p = 0;
1476 for (k = 0; k < NCH(CHILD(n,j)); k++) {
Guido van Rossum25831651993-05-19 14:50:45 +00001477 if (strequ(STR(CHILD(CHILD(n,j),k)), "public"))
1478 p = 0;
1479 else if (strequ(STR(CHILD(CHILD(n,j),k)), "protected"))
1480 p = 1;
1481 else if (strequ(STR(CHILD(CHILD(n,j),k)), "private"))
1482 p = 2;
1483 else if (strequ(STR(CHILD(CHILD(n,j),k)), "read"))
1484 r = 1;
1485 else if (strequ(STR(CHILD(CHILD(n,j),k)), "write"))
1486 w = 1;
1487 else /* XXX should make this an exception */
1488 fprintf(stderr, "bad access type %s\n",
1489 STR(CHILD(CHILD(n,j),k)));
1490 }
1491 if (r == 0 && w == 0)
Guido van Rossum81daa321993-05-20 14:24:46 +00001492 r = w = 1;
Guido van Rossum25831651993-05-19 14:50:45 +00001493 if (p == 0) {
1494 if (r == 1) mode |= AC_R_PUBLIC;
1495 if (w == 1) mode |= AC_W_PUBLIC;
1496 } else if (p == 1) {
1497 if (r == 1) mode |= AC_R_PROTECTED;
1498 if (w == 1) mode |= AC_W_PROTECTED;
1499 } else {
1500 if (r == 1) mode |= AC_R_PRIVATE;
1501 if (w == 1) mode |= AC_W_PRIVATE;
1502 }
1503 }
1504 vmode = newintobject((long)mode);
1505 imode = com_addconst(c, vmode);
1506 XDECREF(vmode);
1507 for (i = 1; TYPE(CHILD(n,i-1)) != COLON; i+=2) {
1508 com_addoparg(c, LOAD_CONST, imode);
1509 com_addopname(c, ACCESS_MODE, CHILD(n, i));
1510 }
1511}
1512
Guido van Rossumc5e96291991-12-10 13:53:51 +00001513static void
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001514com_exec_stmt(c, n)
1515 struct compiling *c;
1516 node *n;
1517{
1518 REQ(n, exec_stmt);
1519 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
1520 com_node(c, CHILD(n, 1));
1521 if (NCH(n) >= 4)
1522 com_node(c, CHILD(n, 3));
1523 else
1524 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1525 if (NCH(n) >= 6)
1526 com_node(c, CHILD(n, 5));
1527 else
1528 com_addbyte(c, DUP_TOP);
1529 com_addbyte(c, EXEC_STMT);
1530}
1531
1532static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001533com_if_stmt(c, n)
1534 struct compiling *c;
1535 node *n;
1536{
1537 int i;
1538 int anchor = 0;
1539 REQ(n, if_stmt);
1540 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
1541 for (i = 0; i+3 < NCH(n); i+=4) {
1542 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001543 node *ch = CHILD(n, i+1);
1544 if (i > 0)
1545 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001546 com_node(c, CHILD(n, i+1));
1547 com_addfwref(c, JUMP_IF_FALSE, &a);
1548 com_addbyte(c, POP_TOP);
1549 com_node(c, CHILD(n, i+3));
1550 com_addfwref(c, JUMP_FORWARD, &anchor);
1551 com_backpatch(c, a);
1552 com_addbyte(c, POP_TOP);
1553 }
1554 if (i+2 < NCH(n))
1555 com_node(c, CHILD(n, i+2));
1556 com_backpatch(c, anchor);
1557}
1558
1559static void
1560com_while_stmt(c, n)
1561 struct compiling *c;
1562 node *n;
1563{
1564 int break_anchor = 0;
1565 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001566 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001567 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
1568 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001569 block_push(c, SETUP_LOOP);
1570 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001571 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001572 com_node(c, CHILD(n, 1));
1573 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1574 com_addbyte(c, POP_TOP);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001575 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001576 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001577 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001578 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1579 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001580 com_backpatch(c, anchor);
1581 com_addbyte(c, POP_TOP);
1582 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001583 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001584 if (NCH(n) > 4)
1585 com_node(c, CHILD(n, 6));
1586 com_backpatch(c, break_anchor);
1587}
1588
1589static void
1590com_for_stmt(c, n)
1591 struct compiling *c;
1592 node *n;
1593{
1594 object *v;
1595 int break_anchor = 0;
1596 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001597 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001598 REQ(n, for_stmt);
1599 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
1600 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001601 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001602 com_node(c, CHILD(n, 3));
1603 v = newintobject(0L);
1604 if (v == NULL)
1605 c->c_errors++;
1606 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
1607 XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001608 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001609 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001610 com_addfwref(c, FOR_LOOP, &anchor);
1611 com_assign(c, CHILD(n, 1), 1/*assigning*/);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001612 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001613 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001614 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001615 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1616 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001617 com_backpatch(c, anchor);
1618 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001619 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001620 if (NCH(n) > 8)
1621 com_node(c, CHILD(n, 8));
1622 com_backpatch(c, break_anchor);
1623}
1624
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001625/* Although 'execpt' and 'finally' clauses can be combined
1626 syntactically, they are compiled separately. In fact,
1627 try: S
1628 except E1: S1
1629 except E2: S2
1630 ...
1631 finally: Sf
1632 is equivalent to
1633 try:
1634 try: S
1635 except E1: S1
1636 except E2: S2
1637 ...
1638 finally: Sf
1639 meaning that the 'finally' clause is entered even if things
1640 go wrong again in an exception handler. Note that this is
1641 not the case for exception handlers: at most one is entered.
1642
1643 Code generated for "try: S finally: Sf" is as follows:
1644
1645 SETUP_FINALLY L
1646 <code for S>
1647 POP_BLOCK
1648 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001649 L: <code for Sf>
1650 END_FINALLY
1651
1652 The special instructions use the block stack. Each block
1653 stack entry contains the instruction that created it (here
1654 SETUP_FINALLY), the level of the value stack at the time the
1655 block stack entry was created, and a label (here L).
1656
1657 SETUP_FINALLY:
1658 Pushes the current value stack level and the label
1659 onto the block stack.
1660 POP_BLOCK:
1661 Pops en entry from the block stack, and pops the value
1662 stack until its level is the same as indicated on the
1663 block stack. (The label is ignored.)
1664 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001665 Pops a variable number of entries from the *value* stack
1666 and re-raises the exception they specify. The number of
1667 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001668
1669 The block stack is unwound when an exception is raised:
1670 when a SETUP_FINALLY entry is found, the exception is pushed
1671 onto the value stack (and the exception condition is cleared),
1672 and the interpreter jumps to the label gotten from the block
1673 stack.
1674
1675 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00001676 (The contents of the value stack is shown in [], with the top
1677 at the right; 'tb' is trace-back info, 'val' the exception's
1678 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001679
1680 Value stack Label Instruction Argument
1681 [] SETUP_EXCEPT L1
1682 [] <code for S>
1683 [] POP_BLOCK
1684 [] JUMP_FORWARD L0
1685
Guido van Rossum3f5da241990-12-20 15:06:42 +00001686 [tb, val, exc] L1: DUP )
1687 [tb, val, exc, exc] <evaluate E1> )
1688 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
1689 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
1690 [tb, val, exc, 1] POP )
1691 [tb, val, exc] POP
1692 [tb, val] <assign to V1> (or POP if no V1)
1693 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001694 [] <code for S1>
1695 JUMP_FORWARD L0
1696
Guido van Rossum3f5da241990-12-20 15:06:42 +00001697 [tb, val, exc, 0] L2: POP
1698 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001699 .............................etc.......................
1700
Guido van Rossum3f5da241990-12-20 15:06:42 +00001701 [tb, val, exc, 0] Ln+1: POP
1702 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001703
1704 [] L0: <next statement>
1705
1706 Of course, parts are not generated if Vi or Ei is not present.
1707*/
1708
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001709static void
1710com_try_stmt(c, n)
1711 struct compiling *c;
1712 node *n;
1713{
1714 int finally_anchor = 0;
1715 int except_anchor = 0;
1716 REQ(n, try_stmt);
Guido van Rossum94fb82e1992-04-05 14:24:50 +00001717 /* 'try' ':' suite (except_clause ':' suite)*
1718 | 'try' ':' 'finally' ':' suite */
1719
1720 /* XXX This can be simplified because except and finally can
1721 no longer be mixed in a single try statement */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001722
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001723 if (NCH(n) > 3 && TYPE(CHILD(n, NCH(n)-3)) != except_clause) {
1724 /* Have a 'finally' clause */
1725 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001726 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001727 }
1728 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == except_clause) {
1729 /* Have an 'except' clause */
1730 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001731 block_push(c, SETUP_EXCEPT);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001732 }
1733 com_node(c, CHILD(n, 2));
1734 if (except_anchor) {
1735 int end_anchor = 0;
1736 int i;
1737 node *ch;
1738 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001739 block_pop(c, SETUP_EXCEPT);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001740 com_addfwref(c, JUMP_FORWARD, &end_anchor);
1741 com_backpatch(c, except_anchor);
1742 for (i = 3;
1743 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
1744 i += 3) {
1745 /* except_clause: 'except' [expr [',' expr]] */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001746 if (except_anchor == 0) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001747 err_setstr(SyntaxError,
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001748 "default 'except:' must be last");
1749 c->c_errors++;
1750 break;
1751 }
1752 except_anchor = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001753 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001754 if (NCH(ch) > 1) {
1755 com_addbyte(c, DUP_TOP);
1756 com_node(c, CHILD(ch, 1));
1757 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001758 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001759 com_addbyte(c, POP_TOP);
1760 }
1761 com_addbyte(c, POP_TOP);
1762 if (NCH(ch) > 3)
1763 com_assign(c, CHILD(ch, 3), 1/*assigning*/);
1764 else
1765 com_addbyte(c, POP_TOP);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001766 com_addbyte(c, POP_TOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001767 com_node(c, CHILD(n, i+2));
1768 com_addfwref(c, JUMP_FORWARD, &end_anchor);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001769 if (except_anchor) {
1770 com_backpatch(c, except_anchor);
1771 com_addbyte(c, POP_TOP);
1772 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001773 }
1774 com_addbyte(c, END_FINALLY);
1775 com_backpatch(c, end_anchor);
1776 }
1777 if (finally_anchor) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001778 node *ch;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001779 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001780 block_pop(c, SETUP_FINALLY);
1781 block_push(c, END_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001782 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001783 com_backpatch(c, finally_anchor);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001784 ch = CHILD(n, NCH(n)-1);
1785 com_addoparg(c, SET_LINENO, ch->n_lineno);
1786 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001787 com_addbyte(c, END_FINALLY);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001788 block_pop(c, END_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001789 }
1790}
1791
1792static void
1793com_suite(c, n)
1794 struct compiling *c;
1795 node *n;
1796{
1797 REQ(n, suite);
1798 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
1799 if (NCH(n) == 1) {
1800 com_node(c, CHILD(n, 0));
1801 }
1802 else {
1803 int i;
1804 for (i = 0; i < NCH(n); i++) {
1805 node *ch = CHILD(n, i);
1806 if (TYPE(ch) == stmt)
1807 com_node(c, ch);
1808 }
1809 }
1810}
1811
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001812/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001813static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001814com_continue_stmt(c, n)
1815 struct compiling *c;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001816 node *n; /* Not used, but passed for consistency */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001817{
1818 int i = c->c_nblocks;
1819 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
1820 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1821 }
1822 else {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001823 err_setstr(SyntaxError, "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001824 c->c_errors++;
1825 }
1826 /* XXX Could allow it inside a 'finally' clause
1827 XXX if we could pop the exception still on the stack */
1828}
1829
1830static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001831com_funcdef(c, n)
1832 struct compiling *c;
1833 node *n;
1834{
1835 object *v;
1836 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum590baa41993-11-30 13:40:46 +00001837 v = (object *)compile(n, c->c_filename);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001838 if (v == NULL)
1839 c->c_errors++;
1840 else {
1841 int i = com_addconst(c, v);
1842 com_addoparg(c, LOAD_CONST, i);
1843 com_addbyte(c, BUILD_FUNCTION);
1844 com_addopname(c, STORE_NAME, CHILD(n, 1));
1845 DECREF(v);
1846 }
1847}
1848
1849static void
Guido van Rossum25831651993-05-19 14:50:45 +00001850com_bases(c, n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00001851 struct compiling *c;
1852 node *n;
1853{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001854 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001855 REQ(n, testlist);
1856 /* testlist: test (',' test)* [','] */
1857 for (i = 0; i < NCH(n); i += 2)
1858 com_node(c, CHILD(n, i));
1859 com_addoparg(c, BUILD_TUPLE, (NCH(n)+1) / 2);
1860}
1861
1862static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001863com_classdef(c, n)
1864 struct compiling *c;
1865 node *n;
1866{
Guido van Rossum25831651993-05-19 14:50:45 +00001867 int i;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001868 object *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001869 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00001870 /* classdef: class NAME ['(' testlist ')'] ':' suite */
1871 if ((v = newstringobject(STR(CHILD(n, 1)))) == NULL) {
1872 c->c_errors++;
1873 return;
1874 }
1875 /* Push the class name on the stack */
1876 i = com_addconst(c, v);
1877 com_addoparg(c, LOAD_CONST, i);
1878 DECREF(v);
1879 /* Push the tuple of base classes on the stack */
1880 if (TYPE(CHILD(n, 2)) != LPAR)
Guido van Rossumc5e96291991-12-10 13:53:51 +00001881 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum25831651993-05-19 14:50:45 +00001882 else
1883 com_bases(c, CHILD(n, 3));
Guido van Rossum590baa41993-11-30 13:40:46 +00001884 v = (object *)compile(n, c->c_filename);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001885 if (v == NULL)
1886 c->c_errors++;
1887 else {
Guido van Rossum25831651993-05-19 14:50:45 +00001888 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001889 com_addoparg(c, LOAD_CONST, i);
1890 com_addbyte(c, BUILD_FUNCTION);
1891 com_addbyte(c, UNARY_CALL);
1892 com_addbyte(c, BUILD_CLASS);
1893 com_addopname(c, STORE_NAME, CHILD(n, 1));
1894 DECREF(v);
1895 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001896}
1897
1898static void
1899com_node(c, n)
1900 struct compiling *c;
1901 node *n;
1902{
1903 switch (TYPE(n)) {
1904
1905 /* Definition nodes */
1906
1907 case funcdef:
1908 com_funcdef(c, n);
1909 break;
1910 case classdef:
1911 com_classdef(c, n);
1912 break;
1913
1914 /* Trivial parse tree nodes */
1915
1916 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001917 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001918 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001919 com_node(c, CHILD(n, 0));
1920 break;
1921
1922 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001923 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
1924 com_addoparg(c, SET_LINENO, n->n_lineno);
1925 {
1926 int i;
1927 for (i = 0; i < NCH(n)-1; i += 2)
1928 com_node(c, CHILD(n, i));
1929 }
1930 break;
1931
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001932 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001933 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001934 com_node(c, CHILD(n, 0));
1935 break;
1936
1937 /* Statement nodes */
1938
1939 case expr_stmt:
1940 com_expr_stmt(c, n);
1941 break;
1942 case print_stmt:
1943 com_print_stmt(c, n);
1944 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001945 case del_stmt: /* 'del' exprlist */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001946 com_assign(c, CHILD(n, 1), 0/*delete*/);
1947 break;
1948 case pass_stmt:
1949 break;
1950 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001951 if (c->c_loops == 0) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001952 err_setstr(SyntaxError, "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001953 c->c_errors++;
1954 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001955 com_addbyte(c, BREAK_LOOP);
1956 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001957 case continue_stmt:
1958 com_continue_stmt(c, n);
1959 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001960 case return_stmt:
1961 com_return_stmt(c, n);
1962 break;
1963 case raise_stmt:
1964 com_raise_stmt(c, n);
1965 break;
1966 case import_stmt:
1967 com_import_stmt(c, n);
1968 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001969 case global_stmt:
1970 com_global_stmt(c, n);
1971 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001972 case access_stmt:
1973 com_access_stmt(c, n);
1974 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001975 case exec_stmt:
1976 com_exec_stmt(c, n);
1977 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001978 case if_stmt:
1979 com_if_stmt(c, n);
1980 break;
1981 case while_stmt:
1982 com_while_stmt(c, n);
1983 break;
1984 case for_stmt:
1985 com_for_stmt(c, n);
1986 break;
1987 case try_stmt:
1988 com_try_stmt(c, n);
1989 break;
1990 case suite:
1991 com_suite(c, n);
1992 break;
1993
1994 /* Expression nodes */
1995
1996 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00001997 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001998 break;
1999 case test:
2000 com_test(c, n);
2001 break;
2002 case and_test:
2003 com_and_test(c, n);
2004 break;
2005 case not_test:
2006 com_not_test(c, n);
2007 break;
2008 case comparison:
2009 com_comparison(c, n);
2010 break;
2011 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002012 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002013 break;
2014 case expr:
2015 com_expr(c, n);
2016 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002017 case xor_expr:
2018 com_xor_expr(c, n);
2019 break;
2020 case and_expr:
2021 com_and_expr(c, n);
2022 break;
2023 case shift_expr:
2024 com_shift_expr(c, n);
2025 break;
2026 case arith_expr:
2027 com_arith_expr(c, n);
2028 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002029 case term:
2030 com_term(c, n);
2031 break;
2032 case factor:
2033 com_factor(c, n);
2034 break;
2035 case atom:
2036 com_atom(c, n);
2037 break;
2038
2039 default:
2040 fprintf(stderr, "node type %d\n", TYPE(n));
2041 err_setstr(SystemError, "com_node: unexpected node type");
2042 c->c_errors++;
2043 }
2044}
2045
2046static void com_fplist PROTO((struct compiling *, node *));
2047
2048static void
2049com_fpdef(c, n)
2050 struct compiling *c;
2051 node *n;
2052{
2053 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
2054 if (TYPE(CHILD(n, 0)) == LPAR)
2055 com_fplist(c, CHILD(n, 1));
2056 else
2057 com_addopname(c, STORE_NAME, CHILD(n, 0));
2058}
2059
2060static void
2061com_fplist(c, n)
2062 struct compiling *c;
2063 node *n;
2064{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00002065 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002066 if (NCH(n) == 1) {
2067 com_fpdef(c, CHILD(n, 0));
2068 }
2069 else {
2070 int i;
2071 com_addoparg(c, UNPACK_TUPLE, (NCH(n)+1)/2);
2072 for (i = 0; i < NCH(n); i += 2)
2073 com_fpdef(c, CHILD(n, i));
2074 }
2075}
2076
2077static void
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002078com_arglist(c, n)
2079 struct compiling *c;
2080 node *n;
2081{
2082 int i, nargs, op;
2083 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00002084 /* varargslist:
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002085 (fpdef ',')* '*' NAME | fpdef (',' fpdef)* [','] */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002086 op = UNPACK_ARG;
2087 nargs = (NCH(n) + 1) / 2;
2088 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumacbefef1992-01-19 16:33:51 +00002089 int t = TYPE(CHILD(n, i));
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002090 if (t == STAR) {
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002091 op = UNPACK_VARARG;
2092 nargs = i/2;
2093 break;
2094 }
2095 }
2096 com_addoparg(c, op, nargs);
2097 for (i = 0; i < 2*nargs; i += 2)
2098 com_fpdef(c, CHILD(n, i));
2099 if (op == UNPACK_VARARG)
2100 com_addopname(c, STORE_NAME, CHILD(n, 2*nargs+1));
2101}
2102
2103static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002104com_file_input(c, n)
2105 struct compiling *c;
2106 node *n;
2107{
2108 int i;
2109 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
2110 for (i = 0; i < NCH(n); i++) {
2111 node *ch = CHILD(n, i);
2112 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
2113 com_node(c, ch);
2114 }
2115}
2116
2117/* Top-level compile-node interface */
2118
2119static void
2120compile_funcdef(c, n)
2121 struct compiling *c;
2122 node *n;
2123{
2124 node *ch;
2125 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00002126 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002127 com_addoparg(c, RESERVE_FAST, com_addconst(c, None)); /* Patched! */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002128 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
2129 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002130 if (TYPE(ch) == RPAR)
Guido van Rossum288a60f1991-12-16 13:05:10 +00002131 com_addoparg(c, UNPACK_ARG, 0);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002132 else
2133 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002134 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002135 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002136 c->c_infunction = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002137 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2138 com_addbyte(c, RETURN_VALUE);
2139}
2140
2141static void
Guido van Rossum590baa41993-11-30 13:40:46 +00002142compile_lambdef(c, n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002143 struct compiling *c;
2144 node *n;
2145{
Guido van Rossum590baa41993-11-30 13:40:46 +00002146 node *ch;
2147 REQ(n, lambdef); /* lambdef: 'lambda' [parameters] ':' test */
2148 c->c_name = NULL;
2149
2150 ch = CHILD(n, 1);
2151 if (TYPE(ch) == COLON) {
2152 com_addoparg(c, UNPACK_ARG, 0);
2153 com_node(c, CHILD(n, 2));
2154 }
2155 else {
2156 com_addoparg(c, RESERVE_FAST, com_addconst(c, None));
2157 com_arglist(c, ch);
2158 com_node(c, CHILD(n, 3));
2159 }
2160
Guido van Rossum12d12c51993-10-26 17:58:25 +00002161 com_addbyte(c, RETURN_VALUE);
2162}
2163
2164static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002165compile_node(c, n)
2166 struct compiling *c;
2167 node *n;
2168{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002169 com_addoparg(c, SET_LINENO, n->n_lineno);
2170
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002171 switch (TYPE(n)) {
2172
Guido van Rossum4c417781991-01-21 16:09:22 +00002173 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002174 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
2175 n = CHILD(n, 0);
2176 if (TYPE(n) != NEWLINE)
2177 com_node(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002178 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2179 com_addbyte(c, RETURN_VALUE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002180 break;
2181
Guido van Rossum4c417781991-01-21 16:09:22 +00002182 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002183 com_file_input(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002184 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2185 com_addbyte(c, RETURN_VALUE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002186 break;
2187
Guido van Rossum590baa41993-11-30 13:40:46 +00002188 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00002189 com_node(c, CHILD(n, 0));
2190 com_addbyte(c, RETURN_VALUE);
2191 break;
2192
Guido van Rossum590baa41993-11-30 13:40:46 +00002193 case lambdef: /* anonymous function definition */
2194 compile_lambdef(c, n);
2195 break;
2196
Guido van Rossum4c417781991-01-21 16:09:22 +00002197 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002198 compile_funcdef(c, n);
2199 break;
2200
Guido van Rossum4c417781991-01-21 16:09:22 +00002201 case classdef: /* A class definition */
Guido van Rossum25831651993-05-19 14:50:45 +00002202 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
2203 c->c_name = STR(CHILD(n, 1));
Guido van Rossumc5e96291991-12-10 13:53:51 +00002204 com_node(c, CHILD(n, NCH(n)-1)); /* The suite */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002205 com_addbyte(c, LOAD_LOCALS);
2206 com_addbyte(c, RETURN_VALUE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002207 break;
2208
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002209 default:
2210 fprintf(stderr, "node type %d\n", TYPE(n));
2211 err_setstr(SystemError, "compile_node: unexpected node type");
2212 c->c_errors++;
2213 }
2214}
2215
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002216/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00002217
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002218 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
2219 instructions that refer to local variables with LOAD_FAST etc.
2220 The latter instructions are much faster because they don't need to
2221 look up the variable name in a dictionary.
Guido van Rossum282914b1991-04-04 10:42:56 +00002222
2223 To find all local variables, we check all STORE_NAME and IMPORT_FROM
2224 instructions. This yields all local variables, including arguments,
2225 function definitions, class definitions and import statements.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002226 (We don't check DELETE_NAME instructions, since if there's no
2227 STORE_NAME the DELETE_NAME will surely fail.)
Guido van Rossum282914b1991-04-04 10:42:56 +00002228
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002229 There is one problem: 'from foo import *' introduces local variables
2230 that we can't know while compiling. If this is the case, wo don't
Guido van Rossum25831651993-05-19 14:50:45 +00002231 optimize at all (this rarely happens, since this form of import
2232 statement is mostly used at the module level).
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002233
2234 Note that, because of this optimization, code like the following
2235 won't work:
2236 eval('x = 1')
2237 print x
Guido van Rossum282914b1991-04-04 10:42:56 +00002238
2239 NB: this modifies the string object co->co_code!
2240*/
2241
2242static void
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002243optimize(c)
2244 struct compiling *c;
Guido van Rossum282914b1991-04-04 10:42:56 +00002245{
Guido van Rossum0a697f61991-04-16 08:39:12 +00002246 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00002247 object *locals;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002248 int nlocals;
Guido van Rossum282914b1991-04-04 10:42:56 +00002249 int opcode;
2250 int oparg;
2251 object *name;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002252 int fast_reserved;
2253 object *error_type, *error_value;
2254
Guido van Rossum282914b1991-04-04 10:42:56 +00002255#define NEXTOP() (*next_instr++)
2256#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
2257#define GETITEM(v, i) (getlistitem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002258#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
2259
Guido van Rossum282914b1991-04-04 10:42:56 +00002260 locals = newdictobject();
2261 if (locals == NULL) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002262 c->c_errors++;
2263 return;
Guido van Rossum282914b1991-04-04 10:42:56 +00002264 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002265 nlocals = 0;
2266
2267 err_get(&error_type, &error_value);
Guido van Rossum282914b1991-04-04 10:42:56 +00002268
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002269 next_instr = (unsigned char *) getstringvalue(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00002270 for (;;) {
2271 opcode = NEXTOP();
2272 if (opcode == STOP_CODE)
2273 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002274 if (opcode == EXEC_STMT)
2275 goto end; /* Don't optimize if exec present */
Guido van Rossum282914b1991-04-04 10:42:56 +00002276 if (HAS_ARG(opcode))
2277 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002278 if (opcode == STORE_NAME || opcode == DELETE_NAME ||
2279 opcode == IMPORT_FROM) {
2280 object *v;
Guido van Rossum282914b1991-04-04 10:42:56 +00002281 name = GETNAMEOBJ(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002282 if (dict2lookup(locals, name) != NULL)
2283 continue;
2284 err_clear();
2285 v = newintobject(nlocals);
2286 if (v == NULL) {
2287 c->c_errors++;
2288 goto err;
Guido van Rossum282914b1991-04-04 10:42:56 +00002289 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002290 nlocals++;
2291 if (dict2insert(locals, name, v) != 0) {
2292 DECREF(v);
2293 c->c_errors++;
2294 goto err;
2295 }
2296 DECREF(v);
Guido van Rossum282914b1991-04-04 10:42:56 +00002297 }
2298 }
2299
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002300 if (nlocals == 0 || dictlookup(locals, "*") != NULL) {
2301 /* Don't optimize anything */
2302 goto end;
2303 }
2304
2305 next_instr = (unsigned char *) getstringvalue(c->c_code);
2306 fast_reserved = 0;
Guido van Rossum282914b1991-04-04 10:42:56 +00002307 for (;;) {
2308 cur_instr = next_instr;
2309 opcode = NEXTOP();
2310 if (opcode == STOP_CODE)
2311 break;
2312 if (HAS_ARG(opcode))
2313 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002314 if (opcode == RESERVE_FAST) {
2315 int i = com_addconst(c, locals);
2316 cur_instr[1] = i & 0xff;
2317 cur_instr[2] = (i>>8) & 0xff;
2318 fast_reserved = 1;
2319 continue;
2320 }
2321 if (!fast_reserved)
2322 continue;
2323 if (opcode == LOAD_NAME ||
2324 opcode == STORE_NAME ||
2325 opcode == DELETE_NAME) {
2326 object *v;
2327 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00002328 name = GETNAMEOBJ(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002329 v = dict2lookup(locals, name);
2330 if (v == NULL) {
Guido van Rossum83163251991-08-16 08:58:43 +00002331 err_clear();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002332 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00002333 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002334 i = getintvalue(v);
2335 switch (opcode) {
2336 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
2337 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
2338 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
2339 }
2340 cur_instr[1] = i & 0xff;
2341 cur_instr[2] = (i>>8) & 0xff;
Guido van Rossum282914b1991-04-04 10:42:56 +00002342 }
2343 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002344
2345 end:
2346 err_setval(error_type, error_value);
2347 err:
Guido van Rossum282914b1991-04-04 10:42:56 +00002348 DECREF(locals);
2349}
2350
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002351codeobject *
Guido van Rossum590baa41993-11-30 13:40:46 +00002352compile(n, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002353 node *n;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002354 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002355{
2356 struct compiling sc;
2357 codeobject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00002358 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002359 return NULL;
2360 compile_node(&sc, n);
2361 com_done(&sc);
Guido van Rossum590baa41993-11-30 13:40:46 +00002362 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0)
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002363 optimize(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00002364 co = NULL;
2365 if (sc.c_errors == 0) {
2366 object *v, *w;
2367 v = newstringobject(sc.c_filename);
Guido van Rossum590baa41993-11-30 13:40:46 +00002368 if (sc.c_name)
2369 w = newstringobject(sc.c_name);
2370 else {
2371 INCREF(None);
2372 w = None;
2373 }
Guido van Rossum9bfef441993-03-29 10:43:31 +00002374 if (v != NULL && w != NULL)
2375 co = newcodeobject(sc.c_code, sc.c_consts,
2376 sc.c_names, v, w);
2377 XDECREF(v);
2378 XDECREF(w);
Guido van Rossuma082ce41991-06-04 19:41:56 +00002379 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002380 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002381 return co;
2382}