blob: aee25850c7c3f10e896285dafd0834acff96cdbb [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;
662 case NAME:
663 com_addopname(c, LOAD_NAME, ch);
664 break;
665 default:
666 fprintf(stderr, "node type %d\n", TYPE(ch));
667 err_setstr(SystemError, "com_atom: unexpected node type");
668 c->c_errors++;
669 }
670}
671
672static void
673com_slice(c, n, op)
674 struct compiling *c;
675 node *n;
676 int op;
677{
678 if (NCH(n) == 1) {
679 com_addbyte(c, op);
680 }
681 else if (NCH(n) == 2) {
682 if (TYPE(CHILD(n, 0)) != COLON) {
683 com_node(c, CHILD(n, 0));
684 com_addbyte(c, op+1);
685 }
686 else {
687 com_node(c, CHILD(n, 1));
688 com_addbyte(c, op+2);
689 }
690 }
691 else {
692 com_node(c, CHILD(n, 0));
693 com_node(c, CHILD(n, 2));
694 com_addbyte(c, op+3);
695 }
696}
697
698static void
699com_apply_subscript(c, n)
700 struct compiling *c;
701 node *n;
702{
703 REQ(n, subscript);
704 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) != COLON) {
705 /* It's a single subscript */
706 com_node(c, CHILD(n, 0));
707 com_addbyte(c, BINARY_SUBSCR);
708 }
709 else {
710 /* It's a slice: [expr] ':' [expr] */
711 com_slice(c, n, SLICE);
712 }
713}
714
715static void
716com_call_function(c, n)
717 struct compiling *c;
718 node *n; /* EITHER testlist OR ')' */
719{
720 if (TYPE(n) == RPAR) {
Guido van Rossum288a60f1991-12-16 13:05:10 +0000721 com_addoparg(c, BUILD_TUPLE, 0);
722 com_addbyte(c, BINARY_CALL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000723 }
724 else {
Guido van Rossum288a60f1991-12-16 13:05:10 +0000725 REQ(n, testlist);
726 com_list(c, n, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000727 com_addbyte(c, BINARY_CALL);
728 }
729}
730
731static void
732com_select_member(c, n)
733 struct compiling *c;
734 node *n;
735{
736 com_addopname(c, LOAD_ATTR, n);
737}
738
739static void
740com_apply_trailer(c, n)
741 struct compiling *c;
742 node *n;
743{
744 REQ(n, trailer);
745 switch (TYPE(CHILD(n, 0))) {
746 case LPAR:
747 com_call_function(c, CHILD(n, 1));
748 break;
749 case DOT:
750 com_select_member(c, CHILD(n, 1));
751 break;
752 case LSQB:
753 com_apply_subscript(c, CHILD(n, 1));
754 break;
755 default:
756 err_setstr(SystemError,
757 "com_apply_trailer: unknown trailer type");
758 c->c_errors++;
759 }
760}
761
762static void
763com_factor(c, n)
764 struct compiling *c;
765 node *n;
766{
767 int i;
768 REQ(n, factor);
769 if (TYPE(CHILD(n, 0)) == PLUS) {
770 com_factor(c, CHILD(n, 1));
771 com_addbyte(c, UNARY_POSITIVE);
772 }
773 else if (TYPE(CHILD(n, 0)) == MINUS) {
774 com_factor(c, CHILD(n, 1));
775 com_addbyte(c, UNARY_NEGATIVE);
776 }
Guido van Rossum7928cd71991-10-24 14:59:31 +0000777 else if (TYPE(CHILD(n, 0)) == TILDE) {
778 com_factor(c, CHILD(n, 1));
779 com_addbyte(c, UNARY_INVERT);
780 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000781 else {
782 com_atom(c, CHILD(n, 0));
783 for (i = 1; i < NCH(n); i++)
784 com_apply_trailer(c, CHILD(n, i));
785 }
786}
787
788static void
789com_term(c, n)
790 struct compiling *c;
791 node *n;
792{
793 int i;
794 int op;
795 REQ(n, term);
796 com_factor(c, CHILD(n, 0));
797 for (i = 2; i < NCH(n); i += 2) {
798 com_factor(c, CHILD(n, i));
799 switch (TYPE(CHILD(n, i-1))) {
800 case STAR:
801 op = BINARY_MULTIPLY;
802 break;
803 case SLASH:
804 op = BINARY_DIVIDE;
805 break;
806 case PERCENT:
807 op = BINARY_MODULO;
808 break;
809 default:
810 err_setstr(SystemError,
Guido van Rossum7928cd71991-10-24 14:59:31 +0000811 "com_term: operator not *, / or %");
812 c->c_errors++;
813 op = 255;
814 }
815 com_addbyte(c, op);
816 }
817}
818
819static void
820com_arith_expr(c, n)
821 struct compiling *c;
822 node *n;
823{
824 int i;
825 int op;
826 REQ(n, arith_expr);
827 com_term(c, CHILD(n, 0));
828 for (i = 2; i < NCH(n); i += 2) {
829 com_term(c, CHILD(n, i));
830 switch (TYPE(CHILD(n, i-1))) {
831 case PLUS:
832 op = BINARY_ADD;
833 break;
834 case MINUS:
835 op = BINARY_SUBTRACT;
836 break;
837 default:
838 err_setstr(SystemError,
839 "com_arith_expr: operator not + or -");
840 c->c_errors++;
841 op = 255;
842 }
843 com_addbyte(c, op);
844 }
845}
846
847static void
848com_shift_expr(c, n)
849 struct compiling *c;
850 node *n;
851{
852 int i;
853 int op;
854 REQ(n, shift_expr);
855 com_arith_expr(c, CHILD(n, 0));
856 for (i = 2; i < NCH(n); i += 2) {
857 com_arith_expr(c, CHILD(n, i));
858 switch (TYPE(CHILD(n, i-1))) {
859 case LEFTSHIFT:
860 op = BINARY_LSHIFT;
861 break;
862 case RIGHTSHIFT:
863 op = BINARY_RSHIFT;
864 break;
865 default:
866 err_setstr(SystemError,
867 "com_shift_expr: operator not << or >>");
868 c->c_errors++;
869 op = 255;
870 }
871 com_addbyte(c, op);
872 }
873}
874
875static void
876com_and_expr(c, n)
877 struct compiling *c;
878 node *n;
879{
880 int i;
881 int op;
882 REQ(n, and_expr);
883 com_shift_expr(c, CHILD(n, 0));
884 for (i = 2; i < NCH(n); i += 2) {
885 com_shift_expr(c, CHILD(n, i));
886 if (TYPE(CHILD(n, i-1)) == AMPER) {
887 op = BINARY_AND;
888 }
889 else {
890 err_setstr(SystemError,
891 "com_and_expr: operator not &");
892 c->c_errors++;
893 op = 255;
894 }
895 com_addbyte(c, op);
896 }
897}
898
899static void
900com_xor_expr(c, n)
901 struct compiling *c;
902 node *n;
903{
904 int i;
905 int op;
906 REQ(n, xor_expr);
907 com_and_expr(c, CHILD(n, 0));
908 for (i = 2; i < NCH(n); i += 2) {
909 com_and_expr(c, CHILD(n, i));
910 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
911 op = BINARY_XOR;
912 }
913 else {
914 err_setstr(SystemError,
915 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000916 c->c_errors++;
917 op = 255;
918 }
919 com_addbyte(c, op);
920 }
921}
922
923static void
924com_expr(c, n)
925 struct compiling *c;
926 node *n;
927{
928 int i;
929 int op;
930 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000931 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000932 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +0000933 com_xor_expr(c, CHILD(n, i));
934 if (TYPE(CHILD(n, i-1)) == VBAR) {
935 op = BINARY_OR;
936 }
937 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000938 err_setstr(SystemError,
Guido van Rossum7928cd71991-10-24 14:59:31 +0000939 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000940 c->c_errors++;
941 op = 255;
942 }
943 com_addbyte(c, op);
944 }
945}
946
947static enum cmp_op
948cmp_type(n)
949 node *n;
950{
951 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +0000952 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000953 | 'in' | 'not' 'in' | 'is' | 'is' not' */
954 if (NCH(n) == 1) {
955 n = CHILD(n, 0);
956 switch (TYPE(n)) {
957 case LESS: return LT;
958 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +0000959 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000960 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +0000961 case LESSEQUAL: return LE;
962 case GREATEREQUAL: return GE;
963 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000964 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
965 if (strcmp(STR(n), "is") == 0) return IS;
966 }
967 }
968 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000969 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000970 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
971 return NOT_IN;
972 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
973 return IS_NOT;
974 }
975 }
976 return BAD;
977}
978
979static void
980com_comparison(c, n)
981 struct compiling *c;
982 node *n;
983{
984 int i;
985 enum cmp_op op;
986 int anchor;
987 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
988 com_expr(c, CHILD(n, 0));
989 if (NCH(n) == 1)
990 return;
991
992 /****************************************************************
993 The following code is generated for all but the last
994 comparison in a chain:
995
996 label: on stack: opcode: jump to:
997
998 a <code to load b>
999 a, b DUP_TOP
1000 a, b, b ROT_THREE
1001 b, a, b COMPARE_OP
1002 b, 0-or-1 JUMP_IF_FALSE L1
1003 b, 1 POP_TOP
1004 b
1005
1006 We are now ready to repeat this sequence for the next
1007 comparison in the chain.
1008
1009 For the last we generate:
1010
1011 b <code to load c>
1012 b, c COMPARE_OP
1013 0-or-1
1014
1015 If there were any jumps to L1 (i.e., there was more than one
1016 comparison), we generate:
1017
1018 0-or-1 JUMP_FORWARD L2
1019 L1: b, 0 ROT_TWO
1020 0, b POP_TOP
1021 0
1022 L2:
1023 ****************************************************************/
1024
1025 anchor = 0;
1026
1027 for (i = 2; i < NCH(n); i += 2) {
1028 com_expr(c, CHILD(n, i));
1029 if (i+2 < NCH(n)) {
1030 com_addbyte(c, DUP_TOP);
1031 com_addbyte(c, ROT_THREE);
1032 }
1033 op = cmp_type(CHILD(n, i-1));
1034 if (op == BAD) {
1035 err_setstr(SystemError,
1036 "com_comparison: unknown comparison op");
1037 c->c_errors++;
1038 }
1039 com_addoparg(c, COMPARE_OP, op);
1040 if (i+2 < NCH(n)) {
1041 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1042 com_addbyte(c, POP_TOP);
1043 }
1044 }
1045
1046 if (anchor) {
1047 int anchor2 = 0;
1048 com_addfwref(c, JUMP_FORWARD, &anchor2);
1049 com_backpatch(c, anchor);
1050 com_addbyte(c, ROT_TWO);
1051 com_addbyte(c, POP_TOP);
1052 com_backpatch(c, anchor2);
1053 }
1054}
1055
1056static void
1057com_not_test(c, n)
1058 struct compiling *c;
1059 node *n;
1060{
1061 REQ(n, not_test); /* 'not' not_test | comparison */
1062 if (NCH(n) == 1) {
1063 com_comparison(c, CHILD(n, 0));
1064 }
1065 else {
1066 com_not_test(c, CHILD(n, 1));
1067 com_addbyte(c, UNARY_NOT);
1068 }
1069}
1070
1071static void
1072com_and_test(c, n)
1073 struct compiling *c;
1074 node *n;
1075{
1076 int i;
1077 int anchor;
1078 REQ(n, and_test); /* not_test ('and' not_test)* */
1079 anchor = 0;
1080 i = 0;
1081 for (;;) {
1082 com_not_test(c, CHILD(n, i));
1083 if ((i += 2) >= NCH(n))
1084 break;
1085 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1086 com_addbyte(c, POP_TOP);
1087 }
1088 if (anchor)
1089 com_backpatch(c, anchor);
1090}
1091
1092static void
1093com_test(c, n)
1094 struct compiling *c;
1095 node *n;
1096{
Guido van Rossum57531fe1993-11-30 14:57:42 +00001097 REQ(n, test); /* and_test ('and' and_test)* | lambdef */
1098 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
1099 object *v;
1100 int i;
1101 v = (object *) compile(CHILD(n, 0), c->c_filename);
1102 if (v == NULL) {
1103 c->c_errors++;
1104 i = 255;
1105 }
1106 else {
1107 i = com_addconst(c, v);
1108 DECREF(v);
1109 }
1110 com_addoparg(c, LOAD_CONST, i);
1111 com_addbyte(c, BUILD_FUNCTION);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001112 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00001113 else {
1114 int anchor = 0;
1115 int i = 0;
1116 for (;;) {
1117 com_and_test(c, CHILD(n, i));
1118 if ((i += 2) >= NCH(n))
1119 break;
1120 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1121 com_addbyte(c, POP_TOP);
1122 }
1123 if (anchor)
1124 com_backpatch(c, anchor);
1125 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001126}
1127
1128static void
Guido van Rossum288a60f1991-12-16 13:05:10 +00001129com_list(c, n, toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001130 struct compiling *c;
1131 node *n;
Guido van Rossum288a60f1991-12-16 13:05:10 +00001132 int toplevel; /* If nonzero, *always* build a tuple */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001133{
1134 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001135 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001136 com_node(c, CHILD(n, 0));
1137 }
1138 else {
1139 int i;
1140 int len;
1141 len = (NCH(n) + 1) / 2;
1142 for (i = 0; i < NCH(n); i += 2)
1143 com_node(c, CHILD(n, i));
1144 com_addoparg(c, BUILD_TUPLE, len);
1145 }
1146}
1147
1148
1149/* Begin of assignment compilation */
1150
1151static void com_assign_name PROTO((struct compiling *, node *, int));
1152static void com_assign PROTO((struct compiling *, node *, int));
1153
1154static void
1155com_assign_attr(c, n, assigning)
1156 struct compiling *c;
1157 node *n;
1158 int assigning;
1159{
1160 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
1161}
1162
1163static void
1164com_assign_slice(c, n, assigning)
1165 struct compiling *c;
1166 node *n;
1167 int assigning;
1168{
1169 com_slice(c, n, assigning ? STORE_SLICE : DELETE_SLICE);
1170}
1171
1172static void
1173com_assign_subscript(c, n, assigning)
1174 struct compiling *c;
1175 node *n;
1176 int assigning;
1177{
1178 com_node(c, n);
1179 com_addbyte(c, assigning ? STORE_SUBSCR : DELETE_SUBSCR);
1180}
1181
1182static void
1183com_assign_trailer(c, n, assigning)
1184 struct compiling *c;
1185 node *n;
1186 int assigning;
1187{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001188 REQ(n, trailer);
1189 switch (TYPE(CHILD(n, 0))) {
1190 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001191 err_setstr(SyntaxError, "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001192 c->c_errors++;
1193 break;
1194 case DOT: /* '.' NAME */
1195 com_assign_attr(c, CHILD(n, 1), assigning);
1196 break;
1197 case LSQB: /* '[' subscript ']' */
1198 n = CHILD(n, 1);
1199 REQ(n, subscript); /* subscript: expr | [expr] ':' [expr] */
1200 if (NCH(n) > 1 || TYPE(CHILD(n, 0)) == COLON)
1201 com_assign_slice(c, n, assigning);
1202 else
1203 com_assign_subscript(c, CHILD(n, 0), assigning);
1204 break;
1205 default:
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001206 err_setstr(SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001207 c->c_errors++;
1208 }
1209}
1210
1211static void
1212com_assign_tuple(c, n, assigning)
1213 struct compiling *c;
1214 node *n;
1215 int assigning;
1216{
1217 int i;
1218 if (TYPE(n) != testlist)
1219 REQ(n, exprlist);
1220 if (assigning)
1221 com_addoparg(c, UNPACK_TUPLE, (NCH(n)+1)/2);
1222 for (i = 0; i < NCH(n); i += 2)
1223 com_assign(c, CHILD(n, i), assigning);
1224}
1225
1226static void
1227com_assign_list(c, n, assigning)
1228 struct compiling *c;
1229 node *n;
1230 int assigning;
1231{
1232 int i;
1233 if (assigning)
1234 com_addoparg(c, UNPACK_LIST, (NCH(n)+1)/2);
1235 for (i = 0; i < NCH(n); i += 2)
1236 com_assign(c, CHILD(n, i), assigning);
1237}
1238
1239static void
1240com_assign_name(c, n, assigning)
1241 struct compiling *c;
1242 node *n;
1243 int assigning;
1244{
1245 REQ(n, NAME);
1246 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
1247}
1248
1249static void
1250com_assign(c, n, assigning)
1251 struct compiling *c;
1252 node *n;
1253 int assigning;
1254{
1255 /* Loop to avoid trivial recursion */
1256 for (;;) {
1257 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001258
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001259 case exprlist:
1260 case testlist:
1261 if (NCH(n) > 1) {
1262 com_assign_tuple(c, n, assigning);
1263 return;
1264 }
1265 n = CHILD(n, 0);
1266 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001267
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001268 case test:
1269 case and_test:
1270 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001271 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001272 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001273 case xor_expr:
1274 case and_expr:
1275 case shift_expr:
1276 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001277 case term:
1278 if (NCH(n) > 1) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001279 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001280 "can't assign to operator");
1281 c->c_errors++;
1282 return;
1283 }
1284 n = CHILD(n, 0);
1285 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001286
Guido van Rossum7928cd71991-10-24 14:59:31 +00001287 case factor: /* ('+'|'-'|'~') factor | atom trailer* */
1288 if (TYPE(CHILD(n, 0)) != atom) { /* '+'|'-'|'~' */
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001289 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001290 "can't assign to operator");
1291 c->c_errors++;
1292 return;
1293 }
1294 if (NCH(n) > 1) { /* trailer present */
1295 int i;
1296 com_node(c, CHILD(n, 0));
1297 for (i = 1; i+1 < NCH(n); i++) {
1298 com_apply_trailer(c, CHILD(n, i));
1299 } /* NB i is still alive */
1300 com_assign_trailer(c,
1301 CHILD(n, i), assigning);
1302 return;
1303 }
1304 n = CHILD(n, 0);
1305 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001306
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001307 case atom:
1308 switch (TYPE(CHILD(n, 0))) {
1309 case LPAR:
1310 n = CHILD(n, 1);
1311 if (TYPE(n) == RPAR) {
1312 /* XXX Should allow () = () ??? */
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001313 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001314 "can't assign to ()");
1315 c->c_errors++;
1316 return;
1317 }
1318 break;
1319 case LSQB:
1320 n = CHILD(n, 1);
1321 if (TYPE(n) == RSQB) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001322 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001323 "can't assign to []");
1324 c->c_errors++;
1325 return;
1326 }
1327 com_assign_list(c, n, assigning);
1328 return;
1329 case NAME:
1330 com_assign_name(c, CHILD(n, 0), assigning);
1331 return;
1332 default:
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001333 err_setstr(SyntaxError,
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001334 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001335 c->c_errors++;
1336 return;
1337 }
1338 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001339
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001340 default:
1341 fprintf(stderr, "node type %d\n", TYPE(n));
1342 err_setstr(SystemError, "com_assign: bad node");
1343 c->c_errors++;
1344 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001345
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001346 }
1347 }
1348}
1349
1350static void
1351com_expr_stmt(c, n)
1352 struct compiling *c;
1353 node *n;
1354{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001355 REQ(n, expr_stmt); /* testlist ('=' testlist)* */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001356 com_node(c, CHILD(n, NCH(n)-1));
1357 if (NCH(n) == 1) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001358 com_addbyte(c, PRINT_EXPR);
1359 }
1360 else {
1361 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001362 for (i = 0; i < NCH(n)-2; i+=2) {
1363 if (i+2 < NCH(n)-2)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001364 com_addbyte(c, DUP_TOP);
1365 com_assign(c, CHILD(n, i), 1/*assign*/);
1366 }
1367 }
1368}
1369
1370static void
1371com_print_stmt(c, n)
1372 struct compiling *c;
1373 node *n;
1374{
1375 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001376 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
1377 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001378 com_node(c, CHILD(n, i));
1379 com_addbyte(c, PRINT_ITEM);
1380 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001381 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001382 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001383 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001384}
1385
1386static void
1387com_return_stmt(c, n)
1388 struct compiling *c;
1389 node *n;
1390{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001391 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001392 if (!c->c_infunction) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001393 err_setstr(SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001394 c->c_errors++;
1395 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001396 if (NCH(n) < 2)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001397 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1398 else
1399 com_node(c, CHILD(n, 1));
1400 com_addbyte(c, RETURN_VALUE);
1401}
1402
1403static void
1404com_raise_stmt(c, n)
1405 struct compiling *c;
1406 node *n;
1407{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001408 REQ(n, raise_stmt); /* 'raise' test [',' test] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001409 com_node(c, CHILD(n, 1));
1410 if (NCH(n) > 3)
1411 com_node(c, CHILD(n, 3));
1412 else
1413 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1414 com_addbyte(c, RAISE_EXCEPTION);
1415}
1416
1417static void
1418com_import_stmt(c, n)
1419 struct compiling *c;
1420 node *n;
1421{
1422 int i;
1423 REQ(n, import_stmt);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001424 /* 'import' NAME (',' NAME)* |
1425 'from' NAME 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001426 if (STR(CHILD(n, 0))[0] == 'f') {
1427 /* 'from' NAME 'import' ... */
1428 REQ(CHILD(n, 1), NAME);
1429 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
1430 for (i = 3; i < NCH(n); i += 2)
1431 com_addopname(c, IMPORT_FROM, CHILD(n, i));
1432 com_addbyte(c, POP_TOP);
1433 }
1434 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001435 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001436 for (i = 1; i < NCH(n); i += 2) {
1437 com_addopname(c, IMPORT_NAME, CHILD(n, i));
1438 com_addopname(c, STORE_NAME, CHILD(n, i));
1439 }
1440 }
1441}
1442
1443static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00001444com_global_stmt(c, n)
1445 struct compiling *c;
1446 node *n;
1447{
1448 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001449 REQ(n, global_stmt);
1450 /* 'global' NAME (',' NAME)* */
1451 for (i = 1; i < NCH(n); i += 2) {
1452 if (dictinsert(c->c_globals, STR(CHILD(n, i)), None) != 0)
1453 c->c_errors++;
1454 }
1455}
1456
Guido van Rossum25831651993-05-19 14:50:45 +00001457#define strequ(a, b) (strcmp((a), (b)) == 0)
1458
1459static void
1460com_access_stmt(c, n)
1461 struct compiling *c;
1462 node *n;
1463{
1464 int i, j, k, mode, imode;
1465 object *vmode;
1466 REQ(n, access_stmt);
1467 /* 'access' NAME (',' NAME)* ':' accesstype (',' accesstype)*
1468 accesstype: NAME+ */
1469
1470 /* Find where the colon is */
1471 i = 1;
1472 while (TYPE(CHILD(n,i-1)) != COLON)
1473 i += 1;
1474
1475 /* Calculate the mode mask */
1476 mode = 0;
1477 for (j = i; j < NCH(n); j += 2) {
Guido van Rossum81daa321993-05-20 14:24:46 +00001478 int r = 0, w = 0, p = 0;
1479 for (k = 0; k < NCH(CHILD(n,j)); k++) {
Guido van Rossum25831651993-05-19 14:50:45 +00001480 if (strequ(STR(CHILD(CHILD(n,j),k)), "public"))
1481 p = 0;
1482 else if (strequ(STR(CHILD(CHILD(n,j),k)), "protected"))
1483 p = 1;
1484 else if (strequ(STR(CHILD(CHILD(n,j),k)), "private"))
1485 p = 2;
1486 else if (strequ(STR(CHILD(CHILD(n,j),k)), "read"))
1487 r = 1;
1488 else if (strequ(STR(CHILD(CHILD(n,j),k)), "write"))
1489 w = 1;
1490 else /* XXX should make this an exception */
1491 fprintf(stderr, "bad access type %s\n",
1492 STR(CHILD(CHILD(n,j),k)));
1493 }
1494 if (r == 0 && w == 0)
Guido van Rossum81daa321993-05-20 14:24:46 +00001495 r = w = 1;
Guido van Rossum25831651993-05-19 14:50:45 +00001496 if (p == 0) {
1497 if (r == 1) mode |= AC_R_PUBLIC;
1498 if (w == 1) mode |= AC_W_PUBLIC;
1499 } else if (p == 1) {
1500 if (r == 1) mode |= AC_R_PROTECTED;
1501 if (w == 1) mode |= AC_W_PROTECTED;
1502 } else {
1503 if (r == 1) mode |= AC_R_PRIVATE;
1504 if (w == 1) mode |= AC_W_PRIVATE;
1505 }
1506 }
1507 vmode = newintobject((long)mode);
1508 imode = com_addconst(c, vmode);
1509 XDECREF(vmode);
1510 for (i = 1; TYPE(CHILD(n,i-1)) != COLON; i+=2) {
1511 com_addoparg(c, LOAD_CONST, imode);
1512 com_addopname(c, ACCESS_MODE, CHILD(n, i));
1513 }
1514}
1515
Guido van Rossumc5e96291991-12-10 13:53:51 +00001516static void
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001517com_exec_stmt(c, n)
1518 struct compiling *c;
1519 node *n;
1520{
1521 REQ(n, exec_stmt);
1522 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
1523 com_node(c, CHILD(n, 1));
1524 if (NCH(n) >= 4)
1525 com_node(c, CHILD(n, 3));
1526 else
1527 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1528 if (NCH(n) >= 6)
1529 com_node(c, CHILD(n, 5));
1530 else
1531 com_addbyte(c, DUP_TOP);
1532 com_addbyte(c, EXEC_STMT);
1533}
1534
1535static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001536com_if_stmt(c, n)
1537 struct compiling *c;
1538 node *n;
1539{
1540 int i;
1541 int anchor = 0;
1542 REQ(n, if_stmt);
1543 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
1544 for (i = 0; i+3 < NCH(n); i+=4) {
1545 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001546 node *ch = CHILD(n, i+1);
1547 if (i > 0)
1548 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001549 com_node(c, CHILD(n, i+1));
1550 com_addfwref(c, JUMP_IF_FALSE, &a);
1551 com_addbyte(c, POP_TOP);
1552 com_node(c, CHILD(n, i+3));
1553 com_addfwref(c, JUMP_FORWARD, &anchor);
1554 com_backpatch(c, a);
1555 com_addbyte(c, POP_TOP);
1556 }
1557 if (i+2 < NCH(n))
1558 com_node(c, CHILD(n, i+2));
1559 com_backpatch(c, anchor);
1560}
1561
1562static void
1563com_while_stmt(c, n)
1564 struct compiling *c;
1565 node *n;
1566{
1567 int break_anchor = 0;
1568 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001569 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001570 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
1571 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001572 block_push(c, SETUP_LOOP);
1573 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001574 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001575 com_node(c, CHILD(n, 1));
1576 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1577 com_addbyte(c, POP_TOP);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001578 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001579 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001580 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001581 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1582 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001583 com_backpatch(c, anchor);
1584 com_addbyte(c, POP_TOP);
1585 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001586 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001587 if (NCH(n) > 4)
1588 com_node(c, CHILD(n, 6));
1589 com_backpatch(c, break_anchor);
1590}
1591
1592static void
1593com_for_stmt(c, n)
1594 struct compiling *c;
1595 node *n;
1596{
1597 object *v;
1598 int break_anchor = 0;
1599 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001600 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001601 REQ(n, for_stmt);
1602 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
1603 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001604 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001605 com_node(c, CHILD(n, 3));
1606 v = newintobject(0L);
1607 if (v == NULL)
1608 c->c_errors++;
1609 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
1610 XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001611 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001612 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001613 com_addfwref(c, FOR_LOOP, &anchor);
1614 com_assign(c, CHILD(n, 1), 1/*assigning*/);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001615 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001616 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001617 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001618 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1619 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001620 com_backpatch(c, anchor);
1621 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001622 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001623 if (NCH(n) > 8)
1624 com_node(c, CHILD(n, 8));
1625 com_backpatch(c, break_anchor);
1626}
1627
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001628/* Although 'execpt' and 'finally' clauses can be combined
1629 syntactically, they are compiled separately. In fact,
1630 try: S
1631 except E1: S1
1632 except E2: S2
1633 ...
1634 finally: Sf
1635 is equivalent to
1636 try:
1637 try: S
1638 except E1: S1
1639 except E2: S2
1640 ...
1641 finally: Sf
1642 meaning that the 'finally' clause is entered even if things
1643 go wrong again in an exception handler. Note that this is
1644 not the case for exception handlers: at most one is entered.
1645
1646 Code generated for "try: S finally: Sf" is as follows:
1647
1648 SETUP_FINALLY L
1649 <code for S>
1650 POP_BLOCK
1651 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001652 L: <code for Sf>
1653 END_FINALLY
1654
1655 The special instructions use the block stack. Each block
1656 stack entry contains the instruction that created it (here
1657 SETUP_FINALLY), the level of the value stack at the time the
1658 block stack entry was created, and a label (here L).
1659
1660 SETUP_FINALLY:
1661 Pushes the current value stack level and the label
1662 onto the block stack.
1663 POP_BLOCK:
1664 Pops en entry from the block stack, and pops the value
1665 stack until its level is the same as indicated on the
1666 block stack. (The label is ignored.)
1667 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001668 Pops a variable number of entries from the *value* stack
1669 and re-raises the exception they specify. The number of
1670 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001671
1672 The block stack is unwound when an exception is raised:
1673 when a SETUP_FINALLY entry is found, the exception is pushed
1674 onto the value stack (and the exception condition is cleared),
1675 and the interpreter jumps to the label gotten from the block
1676 stack.
1677
1678 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00001679 (The contents of the value stack is shown in [], with the top
1680 at the right; 'tb' is trace-back info, 'val' the exception's
1681 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001682
1683 Value stack Label Instruction Argument
1684 [] SETUP_EXCEPT L1
1685 [] <code for S>
1686 [] POP_BLOCK
1687 [] JUMP_FORWARD L0
1688
Guido van Rossum3f5da241990-12-20 15:06:42 +00001689 [tb, val, exc] L1: DUP )
1690 [tb, val, exc, exc] <evaluate E1> )
1691 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
1692 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
1693 [tb, val, exc, 1] POP )
1694 [tb, val, exc] POP
1695 [tb, val] <assign to V1> (or POP if no V1)
1696 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001697 [] <code for S1>
1698 JUMP_FORWARD L0
1699
Guido van Rossum3f5da241990-12-20 15:06:42 +00001700 [tb, val, exc, 0] L2: POP
1701 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001702 .............................etc.......................
1703
Guido van Rossum3f5da241990-12-20 15:06:42 +00001704 [tb, val, exc, 0] Ln+1: POP
1705 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001706
1707 [] L0: <next statement>
1708
1709 Of course, parts are not generated if Vi or Ei is not present.
1710*/
1711
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001712static void
1713com_try_stmt(c, n)
1714 struct compiling *c;
1715 node *n;
1716{
1717 int finally_anchor = 0;
1718 int except_anchor = 0;
1719 REQ(n, try_stmt);
Guido van Rossum94fb82e1992-04-05 14:24:50 +00001720 /* 'try' ':' suite (except_clause ':' suite)*
1721 | 'try' ':' 'finally' ':' suite */
1722
1723 /* XXX This can be simplified because except and finally can
1724 no longer be mixed in a single try statement */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001725
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001726 if (NCH(n) > 3 && TYPE(CHILD(n, NCH(n)-3)) != except_clause) {
1727 /* Have a 'finally' clause */
1728 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001729 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001730 }
1731 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == except_clause) {
1732 /* Have an 'except' clause */
1733 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001734 block_push(c, SETUP_EXCEPT);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001735 }
1736 com_node(c, CHILD(n, 2));
1737 if (except_anchor) {
1738 int end_anchor = 0;
1739 int i;
1740 node *ch;
1741 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001742 block_pop(c, SETUP_EXCEPT);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001743 com_addfwref(c, JUMP_FORWARD, &end_anchor);
1744 com_backpatch(c, except_anchor);
1745 for (i = 3;
1746 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
1747 i += 3) {
1748 /* except_clause: 'except' [expr [',' expr]] */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001749 if (except_anchor == 0) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001750 err_setstr(SyntaxError,
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001751 "default 'except:' must be last");
1752 c->c_errors++;
1753 break;
1754 }
1755 except_anchor = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001756 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001757 if (NCH(ch) > 1) {
1758 com_addbyte(c, DUP_TOP);
1759 com_node(c, CHILD(ch, 1));
1760 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001761 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001762 com_addbyte(c, POP_TOP);
1763 }
1764 com_addbyte(c, POP_TOP);
1765 if (NCH(ch) > 3)
1766 com_assign(c, CHILD(ch, 3), 1/*assigning*/);
1767 else
1768 com_addbyte(c, POP_TOP);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001769 com_addbyte(c, POP_TOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001770 com_node(c, CHILD(n, i+2));
1771 com_addfwref(c, JUMP_FORWARD, &end_anchor);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001772 if (except_anchor) {
1773 com_backpatch(c, except_anchor);
1774 com_addbyte(c, POP_TOP);
1775 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001776 }
1777 com_addbyte(c, END_FINALLY);
1778 com_backpatch(c, end_anchor);
1779 }
1780 if (finally_anchor) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001781 node *ch;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001782 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001783 block_pop(c, SETUP_FINALLY);
1784 block_push(c, END_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001785 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001786 com_backpatch(c, finally_anchor);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001787 ch = CHILD(n, NCH(n)-1);
1788 com_addoparg(c, SET_LINENO, ch->n_lineno);
1789 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001790 com_addbyte(c, END_FINALLY);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001791 block_pop(c, END_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001792 }
1793}
1794
1795static void
1796com_suite(c, n)
1797 struct compiling *c;
1798 node *n;
1799{
1800 REQ(n, suite);
1801 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
1802 if (NCH(n) == 1) {
1803 com_node(c, CHILD(n, 0));
1804 }
1805 else {
1806 int i;
1807 for (i = 0; i < NCH(n); i++) {
1808 node *ch = CHILD(n, i);
1809 if (TYPE(ch) == stmt)
1810 com_node(c, ch);
1811 }
1812 }
1813}
1814
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001815/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001816static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001817com_continue_stmt(c, n)
1818 struct compiling *c;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001819 node *n; /* Not used, but passed for consistency */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001820{
1821 int i = c->c_nblocks;
1822 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
1823 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1824 }
1825 else {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001826 err_setstr(SyntaxError, "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001827 c->c_errors++;
1828 }
1829 /* XXX Could allow it inside a 'finally' clause
1830 XXX if we could pop the exception still on the stack */
1831}
1832
1833static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001834com_funcdef(c, n)
1835 struct compiling *c;
1836 node *n;
1837{
1838 object *v;
1839 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum590baa41993-11-30 13:40:46 +00001840 v = (object *)compile(n, c->c_filename);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001841 if (v == NULL)
1842 c->c_errors++;
1843 else {
1844 int i = com_addconst(c, v);
1845 com_addoparg(c, LOAD_CONST, i);
1846 com_addbyte(c, BUILD_FUNCTION);
1847 com_addopname(c, STORE_NAME, CHILD(n, 1));
1848 DECREF(v);
1849 }
1850}
1851
1852static void
Guido van Rossum25831651993-05-19 14:50:45 +00001853com_bases(c, n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00001854 struct compiling *c;
1855 node *n;
1856{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001857 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001858 REQ(n, testlist);
1859 /* testlist: test (',' test)* [','] */
1860 for (i = 0; i < NCH(n); i += 2)
1861 com_node(c, CHILD(n, i));
1862 com_addoparg(c, BUILD_TUPLE, (NCH(n)+1) / 2);
1863}
1864
1865static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001866com_classdef(c, n)
1867 struct compiling *c;
1868 node *n;
1869{
Guido van Rossum25831651993-05-19 14:50:45 +00001870 int i;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001871 object *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001872 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00001873 /* classdef: class NAME ['(' testlist ')'] ':' suite */
1874 if ((v = newstringobject(STR(CHILD(n, 1)))) == NULL) {
1875 c->c_errors++;
1876 return;
1877 }
1878 /* Push the class name on the stack */
1879 i = com_addconst(c, v);
1880 com_addoparg(c, LOAD_CONST, i);
1881 DECREF(v);
1882 /* Push the tuple of base classes on the stack */
1883 if (TYPE(CHILD(n, 2)) != LPAR)
Guido van Rossumc5e96291991-12-10 13:53:51 +00001884 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum25831651993-05-19 14:50:45 +00001885 else
1886 com_bases(c, CHILD(n, 3));
Guido van Rossum590baa41993-11-30 13:40:46 +00001887 v = (object *)compile(n, c->c_filename);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001888 if (v == NULL)
1889 c->c_errors++;
1890 else {
Guido van Rossum25831651993-05-19 14:50:45 +00001891 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001892 com_addoparg(c, LOAD_CONST, i);
1893 com_addbyte(c, BUILD_FUNCTION);
1894 com_addbyte(c, UNARY_CALL);
1895 com_addbyte(c, BUILD_CLASS);
1896 com_addopname(c, STORE_NAME, CHILD(n, 1));
1897 DECREF(v);
1898 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001899}
1900
1901static void
1902com_node(c, n)
1903 struct compiling *c;
1904 node *n;
1905{
1906 switch (TYPE(n)) {
1907
1908 /* Definition nodes */
1909
1910 case funcdef:
1911 com_funcdef(c, n);
1912 break;
1913 case classdef:
1914 com_classdef(c, n);
1915 break;
1916
1917 /* Trivial parse tree nodes */
1918
1919 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001920 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001921 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001922 com_node(c, CHILD(n, 0));
1923 break;
1924
1925 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001926 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
1927 com_addoparg(c, SET_LINENO, n->n_lineno);
1928 {
1929 int i;
1930 for (i = 0; i < NCH(n)-1; i += 2)
1931 com_node(c, CHILD(n, i));
1932 }
1933 break;
1934
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001935 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001936 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001937 com_node(c, CHILD(n, 0));
1938 break;
1939
1940 /* Statement nodes */
1941
1942 case expr_stmt:
1943 com_expr_stmt(c, n);
1944 break;
1945 case print_stmt:
1946 com_print_stmt(c, n);
1947 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001948 case del_stmt: /* 'del' exprlist */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001949 com_assign(c, CHILD(n, 1), 0/*delete*/);
1950 break;
1951 case pass_stmt:
1952 break;
1953 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001954 if (c->c_loops == 0) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001955 err_setstr(SyntaxError, "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001956 c->c_errors++;
1957 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001958 com_addbyte(c, BREAK_LOOP);
1959 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001960 case continue_stmt:
1961 com_continue_stmt(c, n);
1962 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001963 case return_stmt:
1964 com_return_stmt(c, n);
1965 break;
1966 case raise_stmt:
1967 com_raise_stmt(c, n);
1968 break;
1969 case import_stmt:
1970 com_import_stmt(c, n);
1971 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001972 case global_stmt:
1973 com_global_stmt(c, n);
1974 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001975 case access_stmt:
1976 com_access_stmt(c, n);
1977 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001978 case exec_stmt:
1979 com_exec_stmt(c, n);
1980 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001981 case if_stmt:
1982 com_if_stmt(c, n);
1983 break;
1984 case while_stmt:
1985 com_while_stmt(c, n);
1986 break;
1987 case for_stmt:
1988 com_for_stmt(c, n);
1989 break;
1990 case try_stmt:
1991 com_try_stmt(c, n);
1992 break;
1993 case suite:
1994 com_suite(c, n);
1995 break;
1996
1997 /* Expression nodes */
1998
1999 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002000 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002001 break;
2002 case test:
2003 com_test(c, n);
2004 break;
2005 case and_test:
2006 com_and_test(c, n);
2007 break;
2008 case not_test:
2009 com_not_test(c, n);
2010 break;
2011 case comparison:
2012 com_comparison(c, n);
2013 break;
2014 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002015 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002016 break;
2017 case expr:
2018 com_expr(c, n);
2019 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002020 case xor_expr:
2021 com_xor_expr(c, n);
2022 break;
2023 case and_expr:
2024 com_and_expr(c, n);
2025 break;
2026 case shift_expr:
2027 com_shift_expr(c, n);
2028 break;
2029 case arith_expr:
2030 com_arith_expr(c, n);
2031 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002032 case term:
2033 com_term(c, n);
2034 break;
2035 case factor:
2036 com_factor(c, n);
2037 break;
2038 case atom:
2039 com_atom(c, n);
2040 break;
2041
2042 default:
2043 fprintf(stderr, "node type %d\n", TYPE(n));
2044 err_setstr(SystemError, "com_node: unexpected node type");
2045 c->c_errors++;
2046 }
2047}
2048
2049static void com_fplist PROTO((struct compiling *, node *));
2050
2051static void
2052com_fpdef(c, n)
2053 struct compiling *c;
2054 node *n;
2055{
2056 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
2057 if (TYPE(CHILD(n, 0)) == LPAR)
2058 com_fplist(c, CHILD(n, 1));
2059 else
2060 com_addopname(c, STORE_NAME, CHILD(n, 0));
2061}
2062
2063static void
2064com_fplist(c, n)
2065 struct compiling *c;
2066 node *n;
2067{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00002068 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002069 if (NCH(n) == 1) {
2070 com_fpdef(c, CHILD(n, 0));
2071 }
2072 else {
2073 int i;
2074 com_addoparg(c, UNPACK_TUPLE, (NCH(n)+1)/2);
2075 for (i = 0; i < NCH(n); i += 2)
2076 com_fpdef(c, CHILD(n, i));
2077 }
2078}
2079
2080static void
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002081com_arglist(c, n)
2082 struct compiling *c;
2083 node *n;
2084{
2085 int i, nargs, op;
2086 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00002087 /* varargslist:
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002088 (fpdef ',')* '*' NAME | fpdef (',' fpdef)* [','] */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002089 op = UNPACK_ARG;
2090 nargs = (NCH(n) + 1) / 2;
2091 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumacbefef1992-01-19 16:33:51 +00002092 int t = TYPE(CHILD(n, i));
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002093 if (t == STAR) {
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002094 op = UNPACK_VARARG;
2095 nargs = i/2;
2096 break;
2097 }
2098 }
2099 com_addoparg(c, op, nargs);
2100 for (i = 0; i < 2*nargs; i += 2)
2101 com_fpdef(c, CHILD(n, i));
2102 if (op == UNPACK_VARARG)
2103 com_addopname(c, STORE_NAME, CHILD(n, 2*nargs+1));
2104}
2105
2106static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002107com_file_input(c, n)
2108 struct compiling *c;
2109 node *n;
2110{
2111 int i;
2112 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
2113 for (i = 0; i < NCH(n); i++) {
2114 node *ch = CHILD(n, i);
2115 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
2116 com_node(c, ch);
2117 }
2118}
2119
2120/* Top-level compile-node interface */
2121
2122static void
2123compile_funcdef(c, n)
2124 struct compiling *c;
2125 node *n;
2126{
2127 node *ch;
2128 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00002129 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002130 com_addoparg(c, RESERVE_FAST, com_addconst(c, None)); /* Patched! */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002131 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
2132 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002133 if (TYPE(ch) == RPAR)
Guido van Rossum288a60f1991-12-16 13:05:10 +00002134 com_addoparg(c, UNPACK_ARG, 0);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002135 else
2136 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002137 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002138 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002139 c->c_infunction = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002140 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2141 com_addbyte(c, RETURN_VALUE);
2142}
2143
2144static void
Guido van Rossum590baa41993-11-30 13:40:46 +00002145compile_lambdef(c, n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002146 struct compiling *c;
2147 node *n;
2148{
Guido van Rossum590baa41993-11-30 13:40:46 +00002149 node *ch;
2150 REQ(n, lambdef); /* lambdef: 'lambda' [parameters] ':' test */
2151 c->c_name = NULL;
2152
2153 ch = CHILD(n, 1);
2154 if (TYPE(ch) == COLON) {
2155 com_addoparg(c, UNPACK_ARG, 0);
2156 com_node(c, CHILD(n, 2));
2157 }
2158 else {
2159 com_addoparg(c, RESERVE_FAST, com_addconst(c, None));
2160 com_arglist(c, ch);
2161 com_node(c, CHILD(n, 3));
2162 }
2163
Guido van Rossum12d12c51993-10-26 17:58:25 +00002164 com_addbyte(c, RETURN_VALUE);
2165}
2166
2167static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002168compile_node(c, n)
2169 struct compiling *c;
2170 node *n;
2171{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002172 com_addoparg(c, SET_LINENO, n->n_lineno);
2173
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002174 switch (TYPE(n)) {
2175
Guido van Rossum4c417781991-01-21 16:09:22 +00002176 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002177 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
2178 n = CHILD(n, 0);
2179 if (TYPE(n) != NEWLINE)
2180 com_node(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002181 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2182 com_addbyte(c, RETURN_VALUE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002183 break;
2184
Guido van Rossum4c417781991-01-21 16:09:22 +00002185 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002186 com_file_input(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002187 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2188 com_addbyte(c, RETURN_VALUE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002189 break;
2190
Guido van Rossum590baa41993-11-30 13:40:46 +00002191 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00002192 com_node(c, CHILD(n, 0));
2193 com_addbyte(c, RETURN_VALUE);
2194 break;
2195
Guido van Rossum590baa41993-11-30 13:40:46 +00002196 case lambdef: /* anonymous function definition */
2197 compile_lambdef(c, n);
2198 break;
2199
Guido van Rossum4c417781991-01-21 16:09:22 +00002200 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002201 compile_funcdef(c, n);
2202 break;
2203
Guido van Rossum4c417781991-01-21 16:09:22 +00002204 case classdef: /* A class definition */
Guido van Rossum25831651993-05-19 14:50:45 +00002205 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
2206 c->c_name = STR(CHILD(n, 1));
Guido van Rossumc5e96291991-12-10 13:53:51 +00002207 com_node(c, CHILD(n, NCH(n)-1)); /* The suite */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002208 com_addbyte(c, LOAD_LOCALS);
2209 com_addbyte(c, RETURN_VALUE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002210 break;
2211
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002212 default:
2213 fprintf(stderr, "node type %d\n", TYPE(n));
2214 err_setstr(SystemError, "compile_node: unexpected node type");
2215 c->c_errors++;
2216 }
2217}
2218
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002219/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00002220
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002221 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
2222 instructions that refer to local variables with LOAD_FAST etc.
2223 The latter instructions are much faster because they don't need to
2224 look up the variable name in a dictionary.
Guido van Rossum282914b1991-04-04 10:42:56 +00002225
2226 To find all local variables, we check all STORE_NAME and IMPORT_FROM
2227 instructions. This yields all local variables, including arguments,
2228 function definitions, class definitions and import statements.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002229 (We don't check DELETE_NAME instructions, since if there's no
2230 STORE_NAME the DELETE_NAME will surely fail.)
Guido van Rossum282914b1991-04-04 10:42:56 +00002231
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002232 There is one problem: 'from foo import *' introduces local variables
2233 that we can't know while compiling. If this is the case, wo don't
Guido van Rossum25831651993-05-19 14:50:45 +00002234 optimize at all (this rarely happens, since this form of import
2235 statement is mostly used at the module level).
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002236
2237 Note that, because of this optimization, code like the following
2238 won't work:
2239 eval('x = 1')
2240 print x
Guido van Rossum282914b1991-04-04 10:42:56 +00002241
2242 NB: this modifies the string object co->co_code!
2243*/
2244
2245static void
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002246optimize(c)
2247 struct compiling *c;
Guido van Rossum282914b1991-04-04 10:42:56 +00002248{
Guido van Rossum0a697f61991-04-16 08:39:12 +00002249 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00002250 object *locals;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002251 int nlocals;
Guido van Rossum282914b1991-04-04 10:42:56 +00002252 int opcode;
2253 int oparg;
2254 object *name;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002255 int fast_reserved;
2256 object *error_type, *error_value;
2257
Guido van Rossum282914b1991-04-04 10:42:56 +00002258#define NEXTOP() (*next_instr++)
2259#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
2260#define GETITEM(v, i) (getlistitem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002261#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
2262
Guido van Rossum282914b1991-04-04 10:42:56 +00002263 locals = newdictobject();
2264 if (locals == NULL) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002265 c->c_errors++;
2266 return;
Guido van Rossum282914b1991-04-04 10:42:56 +00002267 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002268 nlocals = 0;
2269
2270 err_get(&error_type, &error_value);
Guido van Rossum282914b1991-04-04 10:42:56 +00002271
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002272 next_instr = (unsigned char *) getstringvalue(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00002273 for (;;) {
2274 opcode = NEXTOP();
2275 if (opcode == STOP_CODE)
2276 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002277 if (opcode == EXEC_STMT)
2278 goto end; /* Don't optimize if exec present */
Guido van Rossum282914b1991-04-04 10:42:56 +00002279 if (HAS_ARG(opcode))
2280 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002281 if (opcode == STORE_NAME || opcode == DELETE_NAME ||
2282 opcode == IMPORT_FROM) {
2283 object *v;
Guido van Rossum282914b1991-04-04 10:42:56 +00002284 name = GETNAMEOBJ(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002285 if (dict2lookup(locals, name) != NULL)
2286 continue;
2287 err_clear();
2288 v = newintobject(nlocals);
2289 if (v == NULL) {
2290 c->c_errors++;
2291 goto err;
Guido van Rossum282914b1991-04-04 10:42:56 +00002292 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002293 nlocals++;
2294 if (dict2insert(locals, name, v) != 0) {
2295 DECREF(v);
2296 c->c_errors++;
2297 goto err;
2298 }
2299 DECREF(v);
Guido van Rossum282914b1991-04-04 10:42:56 +00002300 }
2301 }
2302
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002303 if (nlocals == 0 || dictlookup(locals, "*") != NULL) {
2304 /* Don't optimize anything */
2305 goto end;
2306 }
2307
2308 next_instr = (unsigned char *) getstringvalue(c->c_code);
2309 fast_reserved = 0;
Guido van Rossum282914b1991-04-04 10:42:56 +00002310 for (;;) {
2311 cur_instr = next_instr;
2312 opcode = NEXTOP();
2313 if (opcode == STOP_CODE)
2314 break;
2315 if (HAS_ARG(opcode))
2316 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002317 if (opcode == RESERVE_FAST) {
2318 int i = com_addconst(c, locals);
2319 cur_instr[1] = i & 0xff;
2320 cur_instr[2] = (i>>8) & 0xff;
2321 fast_reserved = 1;
2322 continue;
2323 }
2324 if (!fast_reserved)
2325 continue;
2326 if (opcode == LOAD_NAME ||
2327 opcode == STORE_NAME ||
2328 opcode == DELETE_NAME) {
2329 object *v;
2330 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00002331 name = GETNAMEOBJ(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002332 v = dict2lookup(locals, name);
2333 if (v == NULL) {
Guido van Rossum83163251991-08-16 08:58:43 +00002334 err_clear();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002335 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00002336 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002337 i = getintvalue(v);
2338 switch (opcode) {
2339 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
2340 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
2341 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
2342 }
2343 cur_instr[1] = i & 0xff;
2344 cur_instr[2] = (i>>8) & 0xff;
Guido van Rossum282914b1991-04-04 10:42:56 +00002345 }
2346 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002347
2348 end:
2349 err_setval(error_type, error_value);
2350 err:
Guido van Rossum282914b1991-04-04 10:42:56 +00002351 DECREF(locals);
2352}
2353
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002354codeobject *
Guido van Rossum590baa41993-11-30 13:40:46 +00002355compile(n, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002356 node *n;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002357 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002358{
2359 struct compiling sc;
2360 codeobject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00002361 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002362 return NULL;
2363 compile_node(&sc, n);
2364 com_done(&sc);
Guido van Rossum590baa41993-11-30 13:40:46 +00002365 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0)
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002366 optimize(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00002367 co = NULL;
2368 if (sc.c_errors == 0) {
2369 object *v, *w;
2370 v = newstringobject(sc.c_filename);
Guido van Rossum590baa41993-11-30 13:40:46 +00002371 if (sc.c_name)
2372 w = newstringobject(sc.c_name);
2373 else {
2374 INCREF(None);
2375 w = None;
2376 }
Guido van Rossum9bfef441993-03-29 10:43:31 +00002377 if (v != NULL && w != NULL)
2378 co = newcodeobject(sc.c_code, sc.c_consts,
2379 sc.c_names, v, w);
2380 XDECREF(v);
2381 XDECREF(w);
Guido van Rossuma082ce41991-06-04 19:41:56 +00002382 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002383 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002384 return co;
2385}