blob: 565c65cbfcdaf4bad4ebc95749b31b8b157b4e7c [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) ||
156 name == NULL || !is_stringobject(name)) {
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 */
Guido van Rossum12d12c51993-10-26 17:58:25 +0000197 int c_inlambda; /* set when compiling an expression */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000198 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000199 int c_begin; /* begin of current loop, for 'continue' */
200 int c_block[MAXBLOCKS]; /* stack of block types */
201 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000202 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000203 char *c_name; /* name of object (e.g. function) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000204};
205
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000206
207/* Interface to the block stack */
208
209static void
210block_push(c, type)
211 struct compiling *c;
212 int type;
213{
214 if (c->c_nblocks >= MAXBLOCKS) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +0000215 err_setstr(SystemError, "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000216 c->c_errors++;
217 }
218 else {
219 c->c_block[c->c_nblocks++] = type;
220 }
221}
222
223static void
224block_pop(c, type)
225 struct compiling *c;
226 int type;
227{
228 if (c->c_nblocks > 0)
229 c->c_nblocks--;
230 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
231 err_setstr(SystemError, "bad block pop");
232 c->c_errors++;
233 }
234}
235
236
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000237/* Prototypes */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000238
Guido van Rossum12d12c51993-10-26 17:58:25 +0000239static int com_init PROTO((struct compiling *, char *, int));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000240static void com_free PROTO((struct compiling *));
241static void com_done PROTO((struct compiling *));
242static void com_node PROTO((struct compiling *, struct _node *));
243static void com_addbyte PROTO((struct compiling *, int));
244static void com_addint PROTO((struct compiling *, int));
245static void com_addoparg PROTO((struct compiling *, int, int));
246static void com_addfwref PROTO((struct compiling *, int, int *));
247static void com_backpatch PROTO((struct compiling *, int));
248static int com_add PROTO((struct compiling *, object *, object *));
249static int com_addconst PROTO((struct compiling *, object *));
250static int com_addname PROTO((struct compiling *, object *));
251static void com_addopname PROTO((struct compiling *, int, node *));
Guido van Rossum288a60f1991-12-16 13:05:10 +0000252static void com_list PROTO((struct compiling *, node *, int));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000253
254static int
Guido van Rossum12d12c51993-10-26 17:58:25 +0000255com_init(c, filename, inlambda)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000256 struct compiling *c;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000257 char *filename;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000258 int inlambda;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000259{
Guido van Rossum62d46241991-04-03 19:00:23 +0000260 if ((c->c_code = newsizedstringobject((char *)NULL, 1000)) == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000261 goto fail_3;
262 if ((c->c_consts = newlistobject(0)) == NULL)
263 goto fail_2;
264 if ((c->c_names = newlistobject(0)) == NULL)
265 goto fail_1;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000266 if ((c->c_globals = newdictobject()) == NULL)
267 goto fail_0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000268 c->c_nexti = 0;
269 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000270 c->c_infunction = 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000271 c->c_inlambda = inlambda;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000272 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000273 c->c_begin = 0;
274 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000275 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000276 c->c_name = "?";
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000277 return 1;
278
Guido van Rossumc5e96291991-12-10 13:53:51 +0000279 fail_0:
280 DECREF(c->c_names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000281 fail_1:
282 DECREF(c->c_consts);
283 fail_2:
284 DECREF(c->c_code);
285 fail_3:
286 return 0;
287}
288
289static void
290com_free(c)
291 struct compiling *c;
292{
293 XDECREF(c->c_code);
294 XDECREF(c->c_consts);
295 XDECREF(c->c_names);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000296 XDECREF(c->c_globals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000297}
298
299static void
300com_done(c)
301 struct compiling *c;
302{
303 if (c->c_code != NULL)
304 resizestring(&c->c_code, c->c_nexti);
305}
306
307static void
308com_addbyte(c, byte)
309 struct compiling *c;
310 int byte;
311{
312 int len;
313 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000314 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000315 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
316 abort();
Guido van Rossum01cfd441991-10-20 20:12:38 +0000317 */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000318 err_setstr(SystemError, "com_addbyte: byte out of range");
319 c->c_errors++;
320 }
321 if (c->c_code == NULL)
322 return;
323 len = getstringsize(c->c_code);
324 if (c->c_nexti >= len) {
325 if (resizestring(&c->c_code, len+1000) != 0) {
326 c->c_errors++;
327 return;
328 }
329 }
330 getstringvalue(c->c_code)[c->c_nexti++] = byte;
331}
332
333static void
334com_addint(c, x)
335 struct compiling *c;
336 int x;
337{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000338 com_addbyte(c, x & 0xff);
339 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000340}
341
342static void
343com_addoparg(c, op, arg)
344 struct compiling *c;
345 int op;
346 int arg;
347{
348 com_addbyte(c, op);
349 com_addint(c, arg);
350}
351
352static void
353com_addfwref(c, op, p_anchor)
354 struct compiling *c;
355 int op;
356 int *p_anchor;
357{
358 /* Compile a forward reference for backpatching */
359 int here;
360 int anchor;
361 com_addbyte(c, op);
362 here = c->c_nexti;
363 anchor = *p_anchor;
364 *p_anchor = here;
365 com_addint(c, anchor == 0 ? 0 : here - anchor);
366}
367
368static void
369com_backpatch(c, anchor)
370 struct compiling *c;
371 int anchor; /* Must be nonzero */
372{
373 unsigned char *code = (unsigned char *) getstringvalue(c->c_code);
374 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000375 int dist;
376 int prev;
377 for (;;) {
378 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000379 prev = code[anchor] + (code[anchor+1] << 8);
380 dist = target - (anchor+2);
381 code[anchor] = dist & 0xff;
382 code[anchor+1] = dist >> 8;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000383 if (!prev)
384 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000385 anchor -= prev;
386 }
387}
388
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000389/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000390
391static int
392com_add(c, list, v)
393 struct compiling *c;
394 object *list;
395 object *v;
396{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000397 int n = getlistsize(list);
398 int i;
399 for (i = n; --i >= 0; ) {
400 object *w = getlistitem(list, i);
Guido van Rossumefc0bd01991-07-01 18:44:20 +0000401 if (v->ob_type == w->ob_type && cmpobject(v, w) == 0)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000402 return i;
403 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000404 if (addlistitem(list, v) != 0)
405 c->c_errors++;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000406 return n;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000407}
408
409static int
410com_addconst(c, v)
411 struct compiling *c;
412 object *v;
413{
414 return com_add(c, c->c_consts, v);
415}
416
417static int
418com_addname(c, v)
419 struct compiling *c;
420 object *v;
421{
422 return com_add(c, c->c_names, v);
423}
424
425static void
426com_addopname(c, op, n)
427 struct compiling *c;
428 int op;
429 node *n;
430{
431 object *v;
432 int i;
433 char *name;
434 if (TYPE(n) == STAR)
435 name = "*";
436 else {
437 REQ(n, NAME);
438 name = STR(n);
439 }
440 if ((v = newstringobject(name)) == NULL) {
441 c->c_errors++;
442 i = 255;
443 }
444 else {
445 i = com_addname(c, v);
446 DECREF(v);
447 }
Guido van Rossumc5e96291991-12-10 13:53:51 +0000448 /* Hack to replace *_NAME opcodes by *_GLOBAL if necessary */
449 switch (op) {
450 case LOAD_NAME:
451 case STORE_NAME:
452 case DELETE_NAME:
453 if (dictlookup(c->c_globals, name) != NULL) {
454 switch (op) {
455 case LOAD_NAME: op = LOAD_GLOBAL; break;
456 case STORE_NAME: op = STORE_GLOBAL; break;
457 case DELETE_NAME: op = DELETE_GLOBAL; break;
458 }
459 }
460 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000461 com_addoparg(c, op, i);
462}
463
464static object *
465parsenumber(s)
466 char *s;
467{
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000468 extern long strtol PROTO((const char *, char **, int));
469 extern unsigned long strtoul PROTO((const char *, char **, int));
470 extern double strtod PROTO((const char *, char **));
Guido van Rossumc5e96291991-12-10 13:53:51 +0000471 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000472 long x;
Guido van Rossum282914b1991-04-04 10:42:56 +0000473 double xx;
474 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000475 end = s + strlen(s) - 1;
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000476 if (*end == 'l' || *end == 'L')
Guido van Rossumc5e96291991-12-10 13:53:51 +0000477 return long_scan(s, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000478 if (s[0] == '0')
479 x = (long) strtoul(s, &end, 0);
480 else
481 x = strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +0000482 if (*end == '\0') {
483 if (errno != 0) {
Guido van Rossumefb087b1991-12-16 15:41:41 +0000484 err_setstr(OverflowError,
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000485 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000486 return NULL;
487 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000488 return newintobject(x);
Guido van Rossum282914b1991-04-04 10:42:56 +0000489 }
490 errno = 0;
491 xx = strtod(s, &end);
492 if (*end == '\0') {
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000493#ifndef BROKEN_STRTOD
494 /* Some strtod() versions (e.g., in older SunOS systems)
495 set errno incorrectly; better to ignore overflows
496 than not to be able to use float literals at all! */
Guido van Rossum282914b1991-04-04 10:42:56 +0000497 if (errno != 0) {
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000498 err_setstr(OverflowError, "float literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000499 return NULL;
500 }
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000501#endif
Guido van Rossum282914b1991-04-04 10:42:56 +0000502 return newfloatobject(xx);
503 }
Guido van Rossumefb087b1991-12-16 15:41:41 +0000504 err_setstr(SystemError, "bad number syntax?!?!");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000505 return NULL;
506}
507
508static object *
509parsestr(s)
510 char *s;
511{
512 object *v;
513 int len;
514 char *buf;
515 char *p;
516 int c;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000517 int quote = *s;
518 if (quote != '\'' && quote != '\"') {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000519 err_badcall();
520 return NULL;
521 }
522 s++;
523 len = strlen(s);
Guido van Rossum8054fad1993-10-26 15:19:44 +0000524 if (s[--len] != quote) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000525 err_badcall();
526 return NULL;
527 }
528 if (strchr(s, '\\') == NULL)
529 return newsizedstringobject(s, len);
530 v = newsizedstringobject((char *)NULL, len);
531 p = buf = getstringvalue(v);
532 while (*s != '\0' && *s != '\'') {
533 if (*s != '\\') {
534 *p++ = *s++;
535 continue;
536 }
537 s++;
538 switch (*s++) {
539 /* XXX This assumes ASCII! */
540 case '\\': *p++ = '\\'; break;
541 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000542 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000543 case 'b': *p++ = '\b'; break;
544 case 'f': *p++ = '\014'; break; /* FF */
545 case 't': *p++ = '\t'; break;
546 case 'n': *p++ = '\n'; break;
547 case 'r': *p++ = '\r'; break;
548 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000549 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
550 case '0': case '1': case '2': case '3':
551 case '4': case '5': case '6': case '7':
552 c = s[-1] - '0';
553 if ('0' <= *s && *s <= '7') {
554 c = (c<<3) + *s++ - '0';
555 if ('0' <= *s && *s <= '7')
556 c = (c<<3) + *s++ - '0';
557 }
558 *p++ = c;
559 break;
560 case 'x':
561 if (isxdigit(*s)) {
562 sscanf(s, "%x", &c);
563 *p++ = c;
564 do {
565 s++;
566 } while (isxdigit(*s));
567 break;
568 }
569 /* FALLTHROUGH */
570 default: *p++ = '\\'; *p++ = s[-1]; break;
571 }
572 }
573 resizestring(&v, (int)(p - buf));
574 return v;
575}
576
577static void
578com_list_constructor(c, n)
579 struct compiling *c;
580 node *n;
581{
582 int len;
583 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000584 if (TYPE(n) != testlist)
585 REQ(n, exprlist);
586 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
587 len = (NCH(n) + 1) / 2;
588 for (i = 0; i < NCH(n); i += 2)
589 com_node(c, CHILD(n, i));
590 com_addoparg(c, BUILD_LIST, len);
591}
592
593static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000594com_dictmaker(c, n)
595 struct compiling *c;
596 node *n;
597{
598 int i;
599 /* dictmaker: test ':' test (',' test ':' value)* [','] */
600 for (i = 0; i+2 < NCH(n); i += 4) {
601 /* We must arrange things just right for STORE_SUBSCR.
602 It wants the stack to look like (value) (dict) (key) */
603 com_addbyte(c, DUP_TOP);
604 com_node(c, CHILD(n, i+2)); /* value */
605 com_addbyte(c, ROT_TWO);
606 com_node(c, CHILD(n, i)); /* key */
607 com_addbyte(c, STORE_SUBSCR);
608 }
609}
610
611static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000612com_atom(c, n)
613 struct compiling *c;
614 node *n;
615{
616 node *ch;
617 object *v;
618 int i;
619 REQ(n, atom);
620 ch = CHILD(n, 0);
621 switch (TYPE(ch)) {
622 case LPAR:
623 if (TYPE(CHILD(n, 1)) == RPAR)
624 com_addoparg(c, BUILD_TUPLE, 0);
625 else
626 com_node(c, CHILD(n, 1));
627 break;
628 case LSQB:
629 if (TYPE(CHILD(n, 1)) == RSQB)
630 com_addoparg(c, BUILD_LIST, 0);
631 else
632 com_list_constructor(c, CHILD(n, 1));
633 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000634 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000635 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000636 if (TYPE(CHILD(n, 1)) != RBRACE)
637 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000638 break;
639 case BACKQUOTE:
640 com_node(c, CHILD(n, 1));
641 com_addbyte(c, UNARY_CONVERT);
642 break;
643 case NUMBER:
644 if ((v = parsenumber(STR(ch))) == NULL) {
645 c->c_errors++;
646 i = 255;
647 }
648 else {
649 i = com_addconst(c, v);
650 DECREF(v);
651 }
652 com_addoparg(c, LOAD_CONST, i);
653 break;
654 case STRING:
655 if ((v = parsestr(STR(ch))) == NULL) {
656 c->c_errors++;
657 i = 255;
658 }
659 else {
660 i = com_addconst(c, v);
661 DECREF(v);
662 }
663 com_addoparg(c, LOAD_CONST, i);
664 break;
665 case NAME:
666 com_addopname(c, LOAD_NAME, ch);
667 break;
668 default:
669 fprintf(stderr, "node type %d\n", TYPE(ch));
670 err_setstr(SystemError, "com_atom: unexpected node type");
671 c->c_errors++;
672 }
673}
674
675static void
676com_slice(c, n, op)
677 struct compiling *c;
678 node *n;
679 int op;
680{
681 if (NCH(n) == 1) {
682 com_addbyte(c, op);
683 }
684 else if (NCH(n) == 2) {
685 if (TYPE(CHILD(n, 0)) != COLON) {
686 com_node(c, CHILD(n, 0));
687 com_addbyte(c, op+1);
688 }
689 else {
690 com_node(c, CHILD(n, 1));
691 com_addbyte(c, op+2);
692 }
693 }
694 else {
695 com_node(c, CHILD(n, 0));
696 com_node(c, CHILD(n, 2));
697 com_addbyte(c, op+3);
698 }
699}
700
701static void
702com_apply_subscript(c, n)
703 struct compiling *c;
704 node *n;
705{
706 REQ(n, subscript);
707 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) != COLON) {
708 /* It's a single subscript */
709 com_node(c, CHILD(n, 0));
710 com_addbyte(c, BINARY_SUBSCR);
711 }
712 else {
713 /* It's a slice: [expr] ':' [expr] */
714 com_slice(c, n, SLICE);
715 }
716}
717
718static void
719com_call_function(c, n)
720 struct compiling *c;
721 node *n; /* EITHER testlist OR ')' */
722{
723 if (TYPE(n) == RPAR) {
Guido van Rossum288a60f1991-12-16 13:05:10 +0000724 com_addoparg(c, BUILD_TUPLE, 0);
725 com_addbyte(c, BINARY_CALL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000726 }
727 else {
Guido van Rossum288a60f1991-12-16 13:05:10 +0000728 REQ(n, testlist);
729 com_list(c, n, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000730 com_addbyte(c, BINARY_CALL);
731 }
732}
733
734static void
735com_select_member(c, n)
736 struct compiling *c;
737 node *n;
738{
739 com_addopname(c, LOAD_ATTR, n);
740}
741
742static void
743com_apply_trailer(c, n)
744 struct compiling *c;
745 node *n;
746{
747 REQ(n, trailer);
748 switch (TYPE(CHILD(n, 0))) {
749 case LPAR:
750 com_call_function(c, CHILD(n, 1));
751 break;
752 case DOT:
753 com_select_member(c, CHILD(n, 1));
754 break;
755 case LSQB:
756 com_apply_subscript(c, CHILD(n, 1));
757 break;
758 default:
759 err_setstr(SystemError,
760 "com_apply_trailer: unknown trailer type");
761 c->c_errors++;
762 }
763}
764
765static void
766com_factor(c, n)
767 struct compiling *c;
768 node *n;
769{
770 int i;
771 REQ(n, factor);
772 if (TYPE(CHILD(n, 0)) == PLUS) {
773 com_factor(c, CHILD(n, 1));
774 com_addbyte(c, UNARY_POSITIVE);
775 }
776 else if (TYPE(CHILD(n, 0)) == MINUS) {
777 com_factor(c, CHILD(n, 1));
778 com_addbyte(c, UNARY_NEGATIVE);
779 }
Guido van Rossum7928cd71991-10-24 14:59:31 +0000780 else if (TYPE(CHILD(n, 0)) == TILDE) {
781 com_factor(c, CHILD(n, 1));
782 com_addbyte(c, UNARY_INVERT);
783 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000784 else {
785 com_atom(c, CHILD(n, 0));
786 for (i = 1; i < NCH(n); i++)
787 com_apply_trailer(c, CHILD(n, i));
788 }
789}
790
791static void
792com_term(c, n)
793 struct compiling *c;
794 node *n;
795{
796 int i;
797 int op;
798 REQ(n, term);
799 com_factor(c, CHILD(n, 0));
800 for (i = 2; i < NCH(n); i += 2) {
801 com_factor(c, CHILD(n, i));
802 switch (TYPE(CHILD(n, i-1))) {
803 case STAR:
804 op = BINARY_MULTIPLY;
805 break;
806 case SLASH:
807 op = BINARY_DIVIDE;
808 break;
809 case PERCENT:
810 op = BINARY_MODULO;
811 break;
812 default:
813 err_setstr(SystemError,
Guido van Rossum7928cd71991-10-24 14:59:31 +0000814 "com_term: operator not *, / or %");
815 c->c_errors++;
816 op = 255;
817 }
818 com_addbyte(c, op);
819 }
820}
821
822static void
823com_arith_expr(c, n)
824 struct compiling *c;
825 node *n;
826{
827 int i;
828 int op;
829 REQ(n, arith_expr);
830 com_term(c, CHILD(n, 0));
831 for (i = 2; i < NCH(n); i += 2) {
832 com_term(c, CHILD(n, i));
833 switch (TYPE(CHILD(n, i-1))) {
834 case PLUS:
835 op = BINARY_ADD;
836 break;
837 case MINUS:
838 op = BINARY_SUBTRACT;
839 break;
840 default:
841 err_setstr(SystemError,
842 "com_arith_expr: operator not + or -");
843 c->c_errors++;
844 op = 255;
845 }
846 com_addbyte(c, op);
847 }
848}
849
850static void
851com_shift_expr(c, n)
852 struct compiling *c;
853 node *n;
854{
855 int i;
856 int op;
857 REQ(n, shift_expr);
858 com_arith_expr(c, CHILD(n, 0));
859 for (i = 2; i < NCH(n); i += 2) {
860 com_arith_expr(c, CHILD(n, i));
861 switch (TYPE(CHILD(n, i-1))) {
862 case LEFTSHIFT:
863 op = BINARY_LSHIFT;
864 break;
865 case RIGHTSHIFT:
866 op = BINARY_RSHIFT;
867 break;
868 default:
869 err_setstr(SystemError,
870 "com_shift_expr: operator not << or >>");
871 c->c_errors++;
872 op = 255;
873 }
874 com_addbyte(c, op);
875 }
876}
877
878static void
879com_and_expr(c, n)
880 struct compiling *c;
881 node *n;
882{
883 int i;
884 int op;
885 REQ(n, and_expr);
886 com_shift_expr(c, CHILD(n, 0));
887 for (i = 2; i < NCH(n); i += 2) {
888 com_shift_expr(c, CHILD(n, i));
889 if (TYPE(CHILD(n, i-1)) == AMPER) {
890 op = BINARY_AND;
891 }
892 else {
893 err_setstr(SystemError,
894 "com_and_expr: operator not &");
895 c->c_errors++;
896 op = 255;
897 }
898 com_addbyte(c, op);
899 }
900}
901
902static void
903com_xor_expr(c, n)
904 struct compiling *c;
905 node *n;
906{
907 int i;
908 int op;
909 REQ(n, xor_expr);
910 com_and_expr(c, CHILD(n, 0));
911 for (i = 2; i < NCH(n); i += 2) {
912 com_and_expr(c, CHILD(n, i));
913 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
914 op = BINARY_XOR;
915 }
916 else {
917 err_setstr(SystemError,
918 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000919 c->c_errors++;
920 op = 255;
921 }
922 com_addbyte(c, op);
923 }
924}
925
926static void
927com_expr(c, n)
928 struct compiling *c;
929 node *n;
930{
931 int i;
932 int op;
933 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000934 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000935 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +0000936 com_xor_expr(c, CHILD(n, i));
937 if (TYPE(CHILD(n, i-1)) == VBAR) {
938 op = BINARY_OR;
939 }
940 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000941 err_setstr(SystemError,
Guido van Rossum7928cd71991-10-24 14:59:31 +0000942 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000943 c->c_errors++;
944 op = 255;
945 }
946 com_addbyte(c, op);
947 }
948}
949
950static enum cmp_op
951cmp_type(n)
952 node *n;
953{
954 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +0000955 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000956 | 'in' | 'not' 'in' | 'is' | 'is' not' */
957 if (NCH(n) == 1) {
958 n = CHILD(n, 0);
959 switch (TYPE(n)) {
960 case LESS: return LT;
961 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +0000962 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000963 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +0000964 case LESSEQUAL: return LE;
965 case GREATEREQUAL: return GE;
966 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000967 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
968 if (strcmp(STR(n), "is") == 0) return IS;
969 }
970 }
971 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000972 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000973 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
974 return NOT_IN;
975 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
976 return IS_NOT;
977 }
978 }
979 return BAD;
980}
981
982static void
983com_comparison(c, n)
984 struct compiling *c;
985 node *n;
986{
987 int i;
988 enum cmp_op op;
989 int anchor;
990 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
991 com_expr(c, CHILD(n, 0));
992 if (NCH(n) == 1)
993 return;
994
995 /****************************************************************
996 The following code is generated for all but the last
997 comparison in a chain:
998
999 label: on stack: opcode: jump to:
1000
1001 a <code to load b>
1002 a, b DUP_TOP
1003 a, b, b ROT_THREE
1004 b, a, b COMPARE_OP
1005 b, 0-or-1 JUMP_IF_FALSE L1
1006 b, 1 POP_TOP
1007 b
1008
1009 We are now ready to repeat this sequence for the next
1010 comparison in the chain.
1011
1012 For the last we generate:
1013
1014 b <code to load c>
1015 b, c COMPARE_OP
1016 0-or-1
1017
1018 If there were any jumps to L1 (i.e., there was more than one
1019 comparison), we generate:
1020
1021 0-or-1 JUMP_FORWARD L2
1022 L1: b, 0 ROT_TWO
1023 0, b POP_TOP
1024 0
1025 L2:
1026 ****************************************************************/
1027
1028 anchor = 0;
1029
1030 for (i = 2; i < NCH(n); i += 2) {
1031 com_expr(c, CHILD(n, i));
1032 if (i+2 < NCH(n)) {
1033 com_addbyte(c, DUP_TOP);
1034 com_addbyte(c, ROT_THREE);
1035 }
1036 op = cmp_type(CHILD(n, i-1));
1037 if (op == BAD) {
1038 err_setstr(SystemError,
1039 "com_comparison: unknown comparison op");
1040 c->c_errors++;
1041 }
1042 com_addoparg(c, COMPARE_OP, op);
1043 if (i+2 < NCH(n)) {
1044 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1045 com_addbyte(c, POP_TOP);
1046 }
1047 }
1048
1049 if (anchor) {
1050 int anchor2 = 0;
1051 com_addfwref(c, JUMP_FORWARD, &anchor2);
1052 com_backpatch(c, anchor);
1053 com_addbyte(c, ROT_TWO);
1054 com_addbyte(c, POP_TOP);
1055 com_backpatch(c, anchor2);
1056 }
1057}
1058
1059static void
1060com_not_test(c, n)
1061 struct compiling *c;
1062 node *n;
1063{
1064 REQ(n, not_test); /* 'not' not_test | comparison */
1065 if (NCH(n) == 1) {
1066 com_comparison(c, CHILD(n, 0));
1067 }
1068 else {
1069 com_not_test(c, CHILD(n, 1));
1070 com_addbyte(c, UNARY_NOT);
1071 }
1072}
1073
1074static void
1075com_and_test(c, n)
1076 struct compiling *c;
1077 node *n;
1078{
1079 int i;
1080 int anchor;
1081 REQ(n, and_test); /* not_test ('and' not_test)* */
1082 anchor = 0;
1083 i = 0;
1084 for (;;) {
1085 com_not_test(c, CHILD(n, i));
1086 if ((i += 2) >= NCH(n))
1087 break;
1088 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1089 com_addbyte(c, POP_TOP);
1090 }
1091 if (anchor)
1092 com_backpatch(c, anchor);
1093}
1094
1095static void
1096com_test(c, n)
1097 struct compiling *c;
1098 node *n;
1099{
1100 int i;
1101 int anchor;
1102 REQ(n, test); /* and_test ('and' and_test)* */
1103 anchor = 0;
1104 i = 0;
1105 for (;;) {
1106 com_and_test(c, CHILD(n, i));
1107 if ((i += 2) >= NCH(n))
1108 break;
1109 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1110 com_addbyte(c, POP_TOP);
1111 }
1112 if (anchor)
1113 com_backpatch(c, anchor);
1114}
1115
1116static void
Guido van Rossum288a60f1991-12-16 13:05:10 +00001117com_list(c, n, toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001118 struct compiling *c;
1119 node *n;
Guido van Rossum288a60f1991-12-16 13:05:10 +00001120 int toplevel; /* If nonzero, *always* build a tuple */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001121{
1122 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001123 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001124 com_node(c, CHILD(n, 0));
1125 }
1126 else {
1127 int i;
1128 int len;
1129 len = (NCH(n) + 1) / 2;
1130 for (i = 0; i < NCH(n); i += 2)
1131 com_node(c, CHILD(n, i));
1132 com_addoparg(c, BUILD_TUPLE, len);
1133 }
1134}
1135
1136
1137/* Begin of assignment compilation */
1138
1139static void com_assign_name PROTO((struct compiling *, node *, int));
1140static void com_assign PROTO((struct compiling *, node *, int));
1141
1142static void
1143com_assign_attr(c, n, assigning)
1144 struct compiling *c;
1145 node *n;
1146 int assigning;
1147{
1148 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
1149}
1150
1151static void
1152com_assign_slice(c, n, assigning)
1153 struct compiling *c;
1154 node *n;
1155 int assigning;
1156{
1157 com_slice(c, n, assigning ? STORE_SLICE : DELETE_SLICE);
1158}
1159
1160static void
1161com_assign_subscript(c, n, assigning)
1162 struct compiling *c;
1163 node *n;
1164 int assigning;
1165{
1166 com_node(c, n);
1167 com_addbyte(c, assigning ? STORE_SUBSCR : DELETE_SUBSCR);
1168}
1169
1170static void
1171com_assign_trailer(c, n, assigning)
1172 struct compiling *c;
1173 node *n;
1174 int assigning;
1175{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001176 REQ(n, trailer);
1177 switch (TYPE(CHILD(n, 0))) {
1178 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001179 err_setstr(SyntaxError, "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001180 c->c_errors++;
1181 break;
1182 case DOT: /* '.' NAME */
1183 com_assign_attr(c, CHILD(n, 1), assigning);
1184 break;
1185 case LSQB: /* '[' subscript ']' */
1186 n = CHILD(n, 1);
1187 REQ(n, subscript); /* subscript: expr | [expr] ':' [expr] */
1188 if (NCH(n) > 1 || TYPE(CHILD(n, 0)) == COLON)
1189 com_assign_slice(c, n, assigning);
1190 else
1191 com_assign_subscript(c, CHILD(n, 0), assigning);
1192 break;
1193 default:
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001194 err_setstr(SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001195 c->c_errors++;
1196 }
1197}
1198
1199static void
1200com_assign_tuple(c, n, assigning)
1201 struct compiling *c;
1202 node *n;
1203 int assigning;
1204{
1205 int i;
1206 if (TYPE(n) != testlist)
1207 REQ(n, exprlist);
1208 if (assigning)
1209 com_addoparg(c, UNPACK_TUPLE, (NCH(n)+1)/2);
1210 for (i = 0; i < NCH(n); i += 2)
1211 com_assign(c, CHILD(n, i), assigning);
1212}
1213
1214static void
1215com_assign_list(c, n, assigning)
1216 struct compiling *c;
1217 node *n;
1218 int assigning;
1219{
1220 int i;
1221 if (assigning)
1222 com_addoparg(c, UNPACK_LIST, (NCH(n)+1)/2);
1223 for (i = 0; i < NCH(n); i += 2)
1224 com_assign(c, CHILD(n, i), assigning);
1225}
1226
1227static void
1228com_assign_name(c, n, assigning)
1229 struct compiling *c;
1230 node *n;
1231 int assigning;
1232{
1233 REQ(n, NAME);
1234 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
1235}
1236
1237static void
1238com_assign(c, n, assigning)
1239 struct compiling *c;
1240 node *n;
1241 int assigning;
1242{
1243 /* Loop to avoid trivial recursion */
1244 for (;;) {
1245 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001246
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001247 case exprlist:
1248 case testlist:
1249 if (NCH(n) > 1) {
1250 com_assign_tuple(c, n, assigning);
1251 return;
1252 }
1253 n = CHILD(n, 0);
1254 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001255
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001256 case test:
1257 case and_test:
1258 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001259 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001260 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001261 case xor_expr:
1262 case and_expr:
1263 case shift_expr:
1264 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001265 case term:
1266 if (NCH(n) > 1) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001267 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001268 "can't assign to operator");
1269 c->c_errors++;
1270 return;
1271 }
1272 n = CHILD(n, 0);
1273 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001274
Guido van Rossum7928cd71991-10-24 14:59:31 +00001275 case factor: /* ('+'|'-'|'~') factor | atom trailer* */
1276 if (TYPE(CHILD(n, 0)) != atom) { /* '+'|'-'|'~' */
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001277 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001278 "can't assign to operator");
1279 c->c_errors++;
1280 return;
1281 }
1282 if (NCH(n) > 1) { /* trailer present */
1283 int i;
1284 com_node(c, CHILD(n, 0));
1285 for (i = 1; i+1 < NCH(n); i++) {
1286 com_apply_trailer(c, CHILD(n, i));
1287 } /* NB i is still alive */
1288 com_assign_trailer(c,
1289 CHILD(n, i), assigning);
1290 return;
1291 }
1292 n = CHILD(n, 0);
1293 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001294
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001295 case atom:
1296 switch (TYPE(CHILD(n, 0))) {
1297 case LPAR:
1298 n = CHILD(n, 1);
1299 if (TYPE(n) == RPAR) {
1300 /* XXX Should allow () = () ??? */
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001301 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001302 "can't assign to ()");
1303 c->c_errors++;
1304 return;
1305 }
1306 break;
1307 case LSQB:
1308 n = CHILD(n, 1);
1309 if (TYPE(n) == RSQB) {
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 com_assign_list(c, n, assigning);
1316 return;
1317 case NAME:
1318 com_assign_name(c, CHILD(n, 0), assigning);
1319 return;
1320 default:
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001321 err_setstr(SyntaxError,
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001322 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001323 c->c_errors++;
1324 return;
1325 }
1326 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001327
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001328 default:
1329 fprintf(stderr, "node type %d\n", TYPE(n));
1330 err_setstr(SystemError, "com_assign: bad node");
1331 c->c_errors++;
1332 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001333
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001334 }
1335 }
1336}
1337
1338static void
1339com_expr_stmt(c, n)
1340 struct compiling *c;
1341 node *n;
1342{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001343 REQ(n, expr_stmt); /* testlist ('=' testlist)* */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001344 com_node(c, CHILD(n, NCH(n)-1));
1345 if (NCH(n) == 1) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001346 com_addbyte(c, PRINT_EXPR);
1347 }
1348 else {
1349 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001350 for (i = 0; i < NCH(n)-2; i+=2) {
1351 if (i+2 < NCH(n)-2)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001352 com_addbyte(c, DUP_TOP);
1353 com_assign(c, CHILD(n, i), 1/*assign*/);
1354 }
1355 }
1356}
1357
1358static void
1359com_print_stmt(c, n)
1360 struct compiling *c;
1361 node *n;
1362{
1363 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001364 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
1365 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001366 com_node(c, CHILD(n, i));
1367 com_addbyte(c, PRINT_ITEM);
1368 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001369 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001370 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001371 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001372}
1373
1374static void
1375com_return_stmt(c, n)
1376 struct compiling *c;
1377 node *n;
1378{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001379 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001380 if (!c->c_infunction) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001381 err_setstr(SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001382 c->c_errors++;
1383 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001384 if (NCH(n) < 2)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001385 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1386 else
1387 com_node(c, CHILD(n, 1));
1388 com_addbyte(c, RETURN_VALUE);
1389}
1390
1391static void
1392com_raise_stmt(c, n)
1393 struct compiling *c;
1394 node *n;
1395{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001396 REQ(n, raise_stmt); /* 'raise' test [',' test] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001397 com_node(c, CHILD(n, 1));
1398 if (NCH(n) > 3)
1399 com_node(c, CHILD(n, 3));
1400 else
1401 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1402 com_addbyte(c, RAISE_EXCEPTION);
1403}
1404
1405static void
1406com_import_stmt(c, n)
1407 struct compiling *c;
1408 node *n;
1409{
1410 int i;
1411 REQ(n, import_stmt);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001412 /* 'import' NAME (',' NAME)* |
1413 'from' NAME 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001414 if (STR(CHILD(n, 0))[0] == 'f') {
1415 /* 'from' NAME 'import' ... */
1416 REQ(CHILD(n, 1), NAME);
1417 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
1418 for (i = 3; i < NCH(n); i += 2)
1419 com_addopname(c, IMPORT_FROM, CHILD(n, i));
1420 com_addbyte(c, POP_TOP);
1421 }
1422 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001423 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001424 for (i = 1; i < NCH(n); i += 2) {
1425 com_addopname(c, IMPORT_NAME, CHILD(n, i));
1426 com_addopname(c, STORE_NAME, CHILD(n, i));
1427 }
1428 }
1429}
1430
1431static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00001432com_global_stmt(c, n)
1433 struct compiling *c;
1434 node *n;
1435{
1436 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001437 REQ(n, global_stmt);
1438 /* 'global' NAME (',' NAME)* */
1439 for (i = 1; i < NCH(n); i += 2) {
1440 if (dictinsert(c->c_globals, STR(CHILD(n, i)), None) != 0)
1441 c->c_errors++;
1442 }
1443}
1444
Guido van Rossum25831651993-05-19 14:50:45 +00001445#define strequ(a, b) (strcmp((a), (b)) == 0)
1446
1447static void
1448com_access_stmt(c, n)
1449 struct compiling *c;
1450 node *n;
1451{
1452 int i, j, k, mode, imode;
1453 object *vmode;
1454 REQ(n, access_stmt);
1455 /* 'access' NAME (',' NAME)* ':' accesstype (',' accesstype)*
1456 accesstype: NAME+ */
1457
1458 /* Find where the colon is */
1459 i = 1;
1460 while (TYPE(CHILD(n,i-1)) != COLON)
1461 i += 1;
1462
1463 /* Calculate the mode mask */
1464 mode = 0;
1465 for (j = i; j < NCH(n); j += 2) {
Guido van Rossum81daa321993-05-20 14:24:46 +00001466 int r = 0, w = 0, p = 0;
1467 for (k = 0; k < NCH(CHILD(n,j)); k++) {
Guido van Rossum25831651993-05-19 14:50:45 +00001468 if (strequ(STR(CHILD(CHILD(n,j),k)), "public"))
1469 p = 0;
1470 else if (strequ(STR(CHILD(CHILD(n,j),k)), "protected"))
1471 p = 1;
1472 else if (strequ(STR(CHILD(CHILD(n,j),k)), "private"))
1473 p = 2;
1474 else if (strequ(STR(CHILD(CHILD(n,j),k)), "read"))
1475 r = 1;
1476 else if (strequ(STR(CHILD(CHILD(n,j),k)), "write"))
1477 w = 1;
1478 else /* XXX should make this an exception */
1479 fprintf(stderr, "bad access type %s\n",
1480 STR(CHILD(CHILD(n,j),k)));
1481 }
1482 if (r == 0 && w == 0)
Guido van Rossum81daa321993-05-20 14:24:46 +00001483 r = w = 1;
Guido van Rossum25831651993-05-19 14:50:45 +00001484 if (p == 0) {
1485 if (r == 1) mode |= AC_R_PUBLIC;
1486 if (w == 1) mode |= AC_W_PUBLIC;
1487 } else if (p == 1) {
1488 if (r == 1) mode |= AC_R_PROTECTED;
1489 if (w == 1) mode |= AC_W_PROTECTED;
1490 } else {
1491 if (r == 1) mode |= AC_R_PRIVATE;
1492 if (w == 1) mode |= AC_W_PRIVATE;
1493 }
1494 }
1495 vmode = newintobject((long)mode);
1496 imode = com_addconst(c, vmode);
1497 XDECREF(vmode);
1498 for (i = 1; TYPE(CHILD(n,i-1)) != COLON; i+=2) {
1499 com_addoparg(c, LOAD_CONST, imode);
1500 com_addopname(c, ACCESS_MODE, CHILD(n, i));
1501 }
1502}
1503
Guido van Rossumc5e96291991-12-10 13:53:51 +00001504static void
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001505com_exec_stmt(c, n)
1506 struct compiling *c;
1507 node *n;
1508{
1509 REQ(n, exec_stmt);
1510 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
1511 com_node(c, CHILD(n, 1));
1512 if (NCH(n) >= 4)
1513 com_node(c, CHILD(n, 3));
1514 else
1515 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1516 if (NCH(n) >= 6)
1517 com_node(c, CHILD(n, 5));
1518 else
1519 com_addbyte(c, DUP_TOP);
1520 com_addbyte(c, EXEC_STMT);
1521}
1522
1523static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001524com_if_stmt(c, n)
1525 struct compiling *c;
1526 node *n;
1527{
1528 int i;
1529 int anchor = 0;
1530 REQ(n, if_stmt);
1531 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
1532 for (i = 0; i+3 < NCH(n); i+=4) {
1533 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001534 node *ch = CHILD(n, i+1);
1535 if (i > 0)
1536 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001537 com_node(c, CHILD(n, i+1));
1538 com_addfwref(c, JUMP_IF_FALSE, &a);
1539 com_addbyte(c, POP_TOP);
1540 com_node(c, CHILD(n, i+3));
1541 com_addfwref(c, JUMP_FORWARD, &anchor);
1542 com_backpatch(c, a);
1543 com_addbyte(c, POP_TOP);
1544 }
1545 if (i+2 < NCH(n))
1546 com_node(c, CHILD(n, i+2));
1547 com_backpatch(c, anchor);
1548}
1549
1550static void
1551com_while_stmt(c, n)
1552 struct compiling *c;
1553 node *n;
1554{
1555 int break_anchor = 0;
1556 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001557 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001558 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
1559 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001560 block_push(c, SETUP_LOOP);
1561 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001562 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001563 com_node(c, CHILD(n, 1));
1564 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1565 com_addbyte(c, POP_TOP);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001566 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001567 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001568 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001569 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1570 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001571 com_backpatch(c, anchor);
1572 com_addbyte(c, POP_TOP);
1573 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001574 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001575 if (NCH(n) > 4)
1576 com_node(c, CHILD(n, 6));
1577 com_backpatch(c, break_anchor);
1578}
1579
1580static void
1581com_for_stmt(c, n)
1582 struct compiling *c;
1583 node *n;
1584{
1585 object *v;
1586 int break_anchor = 0;
1587 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001588 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001589 REQ(n, for_stmt);
1590 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
1591 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001592 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001593 com_node(c, CHILD(n, 3));
1594 v = newintobject(0L);
1595 if (v == NULL)
1596 c->c_errors++;
1597 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
1598 XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001599 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001600 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001601 com_addfwref(c, FOR_LOOP, &anchor);
1602 com_assign(c, CHILD(n, 1), 1/*assigning*/);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001603 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001604 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001605 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001606 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1607 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001608 com_backpatch(c, anchor);
1609 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001610 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001611 if (NCH(n) > 8)
1612 com_node(c, CHILD(n, 8));
1613 com_backpatch(c, break_anchor);
1614}
1615
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001616/* Although 'execpt' and 'finally' clauses can be combined
1617 syntactically, they are compiled separately. In fact,
1618 try: S
1619 except E1: S1
1620 except E2: S2
1621 ...
1622 finally: Sf
1623 is equivalent to
1624 try:
1625 try: S
1626 except E1: S1
1627 except E2: S2
1628 ...
1629 finally: Sf
1630 meaning that the 'finally' clause is entered even if things
1631 go wrong again in an exception handler. Note that this is
1632 not the case for exception handlers: at most one is entered.
1633
1634 Code generated for "try: S finally: Sf" is as follows:
1635
1636 SETUP_FINALLY L
1637 <code for S>
1638 POP_BLOCK
1639 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001640 L: <code for Sf>
1641 END_FINALLY
1642
1643 The special instructions use the block stack. Each block
1644 stack entry contains the instruction that created it (here
1645 SETUP_FINALLY), the level of the value stack at the time the
1646 block stack entry was created, and a label (here L).
1647
1648 SETUP_FINALLY:
1649 Pushes the current value stack level and the label
1650 onto the block stack.
1651 POP_BLOCK:
1652 Pops en entry from the block stack, and pops the value
1653 stack until its level is the same as indicated on the
1654 block stack. (The label is ignored.)
1655 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001656 Pops a variable number of entries from the *value* stack
1657 and re-raises the exception they specify. The number of
1658 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001659
1660 The block stack is unwound when an exception is raised:
1661 when a SETUP_FINALLY entry is found, the exception is pushed
1662 onto the value stack (and the exception condition is cleared),
1663 and the interpreter jumps to the label gotten from the block
1664 stack.
1665
1666 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00001667 (The contents of the value stack is shown in [], with the top
1668 at the right; 'tb' is trace-back info, 'val' the exception's
1669 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001670
1671 Value stack Label Instruction Argument
1672 [] SETUP_EXCEPT L1
1673 [] <code for S>
1674 [] POP_BLOCK
1675 [] JUMP_FORWARD L0
1676
Guido van Rossum3f5da241990-12-20 15:06:42 +00001677 [tb, val, exc] L1: DUP )
1678 [tb, val, exc, exc] <evaluate E1> )
1679 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
1680 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
1681 [tb, val, exc, 1] POP )
1682 [tb, val, exc] POP
1683 [tb, val] <assign to V1> (or POP if no V1)
1684 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001685 [] <code for S1>
1686 JUMP_FORWARD L0
1687
Guido van Rossum3f5da241990-12-20 15:06:42 +00001688 [tb, val, exc, 0] L2: POP
1689 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001690 .............................etc.......................
1691
Guido van Rossum3f5da241990-12-20 15:06:42 +00001692 [tb, val, exc, 0] Ln+1: POP
1693 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001694
1695 [] L0: <next statement>
1696
1697 Of course, parts are not generated if Vi or Ei is not present.
1698*/
1699
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001700static void
1701com_try_stmt(c, n)
1702 struct compiling *c;
1703 node *n;
1704{
1705 int finally_anchor = 0;
1706 int except_anchor = 0;
1707 REQ(n, try_stmt);
Guido van Rossum94fb82e1992-04-05 14:24:50 +00001708 /* 'try' ':' suite (except_clause ':' suite)*
1709 | 'try' ':' 'finally' ':' suite */
1710
1711 /* XXX This can be simplified because except and finally can
1712 no longer be mixed in a single try statement */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001713
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001714 if (NCH(n) > 3 && TYPE(CHILD(n, NCH(n)-3)) != except_clause) {
1715 /* Have a 'finally' clause */
1716 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001717 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001718 }
1719 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == except_clause) {
1720 /* Have an 'except' clause */
1721 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001722 block_push(c, SETUP_EXCEPT);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001723 }
1724 com_node(c, CHILD(n, 2));
1725 if (except_anchor) {
1726 int end_anchor = 0;
1727 int i;
1728 node *ch;
1729 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001730 block_pop(c, SETUP_EXCEPT);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001731 com_addfwref(c, JUMP_FORWARD, &end_anchor);
1732 com_backpatch(c, except_anchor);
1733 for (i = 3;
1734 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
1735 i += 3) {
1736 /* except_clause: 'except' [expr [',' expr]] */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001737 if (except_anchor == 0) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001738 err_setstr(SyntaxError,
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001739 "default 'except:' must be last");
1740 c->c_errors++;
1741 break;
1742 }
1743 except_anchor = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001744 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001745 if (NCH(ch) > 1) {
1746 com_addbyte(c, DUP_TOP);
1747 com_node(c, CHILD(ch, 1));
1748 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001749 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001750 com_addbyte(c, POP_TOP);
1751 }
1752 com_addbyte(c, POP_TOP);
1753 if (NCH(ch) > 3)
1754 com_assign(c, CHILD(ch, 3), 1/*assigning*/);
1755 else
1756 com_addbyte(c, POP_TOP);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001757 com_addbyte(c, POP_TOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001758 com_node(c, CHILD(n, i+2));
1759 com_addfwref(c, JUMP_FORWARD, &end_anchor);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001760 if (except_anchor) {
1761 com_backpatch(c, except_anchor);
1762 com_addbyte(c, POP_TOP);
1763 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001764 }
1765 com_addbyte(c, END_FINALLY);
1766 com_backpatch(c, end_anchor);
1767 }
1768 if (finally_anchor) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001769 node *ch;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001770 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001771 block_pop(c, SETUP_FINALLY);
1772 block_push(c, END_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001773 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001774 com_backpatch(c, finally_anchor);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001775 ch = CHILD(n, NCH(n)-1);
1776 com_addoparg(c, SET_LINENO, ch->n_lineno);
1777 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001778 com_addbyte(c, END_FINALLY);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001779 block_pop(c, END_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001780 }
1781}
1782
1783static void
1784com_suite(c, n)
1785 struct compiling *c;
1786 node *n;
1787{
1788 REQ(n, suite);
1789 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
1790 if (NCH(n) == 1) {
1791 com_node(c, CHILD(n, 0));
1792 }
1793 else {
1794 int i;
1795 for (i = 0; i < NCH(n); i++) {
1796 node *ch = CHILD(n, i);
1797 if (TYPE(ch) == stmt)
1798 com_node(c, ch);
1799 }
1800 }
1801}
1802
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001803/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001804static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001805com_continue_stmt(c, n)
1806 struct compiling *c;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001807 node *n; /* Not used, but passed for consistency */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001808{
1809 int i = c->c_nblocks;
1810 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
1811 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1812 }
1813 else {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001814 err_setstr(SyntaxError, "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001815 c->c_errors++;
1816 }
1817 /* XXX Could allow it inside a 'finally' clause
1818 XXX if we could pop the exception still on the stack */
1819}
1820
1821static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001822com_funcdef(c, n)
1823 struct compiling *c;
1824 node *n;
1825{
1826 object *v;
1827 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001828 v = (object *)_compile(n, c->c_filename, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001829 if (v == NULL)
1830 c->c_errors++;
1831 else {
1832 int i = com_addconst(c, v);
1833 com_addoparg(c, LOAD_CONST, i);
1834 com_addbyte(c, BUILD_FUNCTION);
1835 com_addopname(c, STORE_NAME, CHILD(n, 1));
1836 DECREF(v);
1837 }
1838}
1839
1840static void
Guido van Rossum12d12c51993-10-26 17:58:25 +00001841com_lambda(c, n)
1842 struct compiling *c;
1843 node *n;
1844{
1845 object *v;
1846 REQ(n, lambda_input);
1847 v = (object *)_compile(n, c->c_filename, 1);
1848 if (v == NULL)
1849 c->c_errors++;
1850 else {
1851 int i = com_addconst(c, v);
1852 DECREF(v);
1853 com_addoparg(c, LOAD_CONST, i);
1854 com_addbyte(c, BUILD_FUNCTION);
1855 com_addbyte(c, RETURN_VALUE);
1856 }
1857}
1858
1859static void
Guido van Rossum25831651993-05-19 14:50:45 +00001860com_bases(c, n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00001861 struct compiling *c;
1862 node *n;
1863{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001864 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001865 REQ(n, testlist);
1866 /* testlist: test (',' test)* [','] */
1867 for (i = 0; i < NCH(n); i += 2)
1868 com_node(c, CHILD(n, i));
1869 com_addoparg(c, BUILD_TUPLE, (NCH(n)+1) / 2);
1870}
1871
1872static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001873com_classdef(c, n)
1874 struct compiling *c;
1875 node *n;
1876{
Guido van Rossum25831651993-05-19 14:50:45 +00001877 int i;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001878 object *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001879 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00001880 /* classdef: class NAME ['(' testlist ')'] ':' suite */
1881 if ((v = newstringobject(STR(CHILD(n, 1)))) == NULL) {
1882 c->c_errors++;
1883 return;
1884 }
1885 /* Push the class name on the stack */
1886 i = com_addconst(c, v);
1887 com_addoparg(c, LOAD_CONST, i);
1888 DECREF(v);
1889 /* Push the tuple of base classes on the stack */
1890 if (TYPE(CHILD(n, 2)) != LPAR)
Guido van Rossumc5e96291991-12-10 13:53:51 +00001891 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum25831651993-05-19 14:50:45 +00001892 else
1893 com_bases(c, CHILD(n, 3));
Guido van Rossum12d12c51993-10-26 17:58:25 +00001894 v = (object *)_compile(n, c->c_filename, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001895 if (v == NULL)
1896 c->c_errors++;
1897 else {
Guido van Rossum25831651993-05-19 14:50:45 +00001898 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001899 com_addoparg(c, LOAD_CONST, i);
1900 com_addbyte(c, BUILD_FUNCTION);
1901 com_addbyte(c, UNARY_CALL);
1902 com_addbyte(c, BUILD_CLASS);
1903 com_addopname(c, STORE_NAME, CHILD(n, 1));
1904 DECREF(v);
1905 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001906}
1907
1908static void
1909com_node(c, n)
1910 struct compiling *c;
1911 node *n;
1912{
1913 switch (TYPE(n)) {
1914
1915 /* Definition nodes */
1916
1917 case funcdef:
1918 com_funcdef(c, n);
1919 break;
1920 case classdef:
1921 com_classdef(c, n);
1922 break;
1923
1924 /* Trivial parse tree nodes */
1925
1926 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001927 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001928 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001929 com_node(c, CHILD(n, 0));
1930 break;
1931
1932 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001933 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
1934 com_addoparg(c, SET_LINENO, n->n_lineno);
1935 {
1936 int i;
1937 for (i = 0; i < NCH(n)-1; i += 2)
1938 com_node(c, CHILD(n, i));
1939 }
1940 break;
1941
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001942 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001943 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001944 com_node(c, CHILD(n, 0));
1945 break;
1946
1947 /* Statement nodes */
1948
1949 case expr_stmt:
1950 com_expr_stmt(c, n);
1951 break;
1952 case print_stmt:
1953 com_print_stmt(c, n);
1954 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001955 case del_stmt: /* 'del' exprlist */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001956 com_assign(c, CHILD(n, 1), 0/*delete*/);
1957 break;
1958 case pass_stmt:
1959 break;
1960 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001961 if (c->c_loops == 0) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001962 err_setstr(SyntaxError, "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001963 c->c_errors++;
1964 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001965 com_addbyte(c, BREAK_LOOP);
1966 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001967 case continue_stmt:
1968 com_continue_stmt(c, n);
1969 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001970 case return_stmt:
1971 com_return_stmt(c, n);
1972 break;
1973 case raise_stmt:
1974 com_raise_stmt(c, n);
1975 break;
1976 case import_stmt:
1977 com_import_stmt(c, n);
1978 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001979 case global_stmt:
1980 com_global_stmt(c, n);
1981 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001982 case access_stmt:
1983 com_access_stmt(c, n);
1984 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001985 case exec_stmt:
1986 com_exec_stmt(c, n);
1987 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001988 case if_stmt:
1989 com_if_stmt(c, n);
1990 break;
1991 case while_stmt:
1992 com_while_stmt(c, n);
1993 break;
1994 case for_stmt:
1995 com_for_stmt(c, n);
1996 break;
1997 case try_stmt:
1998 com_try_stmt(c, n);
1999 break;
2000 case suite:
2001 com_suite(c, n);
2002 break;
2003
2004 /* Expression nodes */
2005
2006 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002007 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002008 break;
2009 case test:
2010 com_test(c, n);
2011 break;
2012 case and_test:
2013 com_and_test(c, n);
2014 break;
2015 case not_test:
2016 com_not_test(c, n);
2017 break;
2018 case comparison:
2019 com_comparison(c, n);
2020 break;
2021 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002022 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002023 break;
2024 case expr:
2025 com_expr(c, n);
2026 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002027 case xor_expr:
2028 com_xor_expr(c, n);
2029 break;
2030 case and_expr:
2031 com_and_expr(c, n);
2032 break;
2033 case shift_expr:
2034 com_shift_expr(c, n);
2035 break;
2036 case arith_expr:
2037 com_arith_expr(c, n);
2038 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002039 case term:
2040 com_term(c, n);
2041 break;
2042 case factor:
2043 com_factor(c, n);
2044 break;
2045 case atom:
2046 com_atom(c, n);
2047 break;
2048
2049 default:
2050 fprintf(stderr, "node type %d\n", TYPE(n));
2051 err_setstr(SystemError, "com_node: unexpected node type");
2052 c->c_errors++;
2053 }
2054}
2055
2056static void com_fplist PROTO((struct compiling *, node *));
2057
2058static void
2059com_fpdef(c, n)
2060 struct compiling *c;
2061 node *n;
2062{
2063 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
2064 if (TYPE(CHILD(n, 0)) == LPAR)
2065 com_fplist(c, CHILD(n, 1));
2066 else
2067 com_addopname(c, STORE_NAME, CHILD(n, 0));
2068}
2069
2070static void
2071com_fplist(c, n)
2072 struct compiling *c;
2073 node *n;
2074{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00002075 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002076 if (NCH(n) == 1) {
2077 com_fpdef(c, CHILD(n, 0));
2078 }
2079 else {
2080 int i;
2081 com_addoparg(c, UNPACK_TUPLE, (NCH(n)+1)/2);
2082 for (i = 0; i < NCH(n); i += 2)
2083 com_fpdef(c, CHILD(n, i));
2084 }
2085}
2086
2087static void
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002088com_arglist(c, n)
2089 struct compiling *c;
2090 node *n;
2091{
2092 int i, nargs, op;
2093 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00002094 /* varargslist:
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002095 (fpdef ',')* '*' NAME | fpdef (',' fpdef)* [','] */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002096 op = UNPACK_ARG;
2097 nargs = (NCH(n) + 1) / 2;
2098 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumacbefef1992-01-19 16:33:51 +00002099 int t = TYPE(CHILD(n, i));
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002100 if (t == STAR) {
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002101 op = UNPACK_VARARG;
2102 nargs = i/2;
2103 break;
2104 }
2105 }
2106 com_addoparg(c, op, nargs);
2107 for (i = 0; i < 2*nargs; i += 2)
2108 com_fpdef(c, CHILD(n, i));
2109 if (op == UNPACK_VARARG)
2110 com_addopname(c, STORE_NAME, CHILD(n, 2*nargs+1));
2111}
2112
2113static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002114com_file_input(c, n)
2115 struct compiling *c;
2116 node *n;
2117{
2118 int i;
2119 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
2120 for (i = 0; i < NCH(n); i++) {
2121 node *ch = CHILD(n, i);
2122 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
2123 com_node(c, ch);
2124 }
2125}
2126
2127/* Top-level compile-node interface */
2128
2129static void
2130compile_funcdef(c, n)
2131 struct compiling *c;
2132 node *n;
2133{
2134 node *ch;
2135 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00002136 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002137 com_addoparg(c, RESERVE_FAST, com_addconst(c, None)); /* Patched! */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002138 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
2139 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002140 if (TYPE(ch) == RPAR)
Guido van Rossum288a60f1991-12-16 13:05:10 +00002141 com_addoparg(c, UNPACK_ARG, 0);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002142 else
2143 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002144 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002145 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002146 c->c_infunction = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002147 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2148 com_addbyte(c, RETURN_VALUE);
2149}
2150
2151static void
Guido van Rossum12d12c51993-10-26 17:58:25 +00002152compile_lambda(c, n)
2153 struct compiling *c;
2154 node *n;
2155{
2156 REQ(n, lambda_input)
2157 com_arglist(c, CHILD(n, 0));
2158 com_node(c, CHILD(n, 2));
2159 com_addbyte(c, RETURN_VALUE);
2160}
2161
2162static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002163compile_node(c, n)
2164 struct compiling *c;
2165 node *n;
2166{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002167 com_addoparg(c, SET_LINENO, n->n_lineno);
2168
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002169 switch (TYPE(n)) {
2170
Guido van Rossum4c417781991-01-21 16:09:22 +00002171 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002172 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
2173 n = CHILD(n, 0);
2174 if (TYPE(n) != NEWLINE)
2175 com_node(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002176 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2177 com_addbyte(c, RETURN_VALUE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002178 break;
2179
Guido van Rossum4c417781991-01-21 16:09:22 +00002180 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002181 com_file_input(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002182 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2183 com_addbyte(c, RETURN_VALUE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002184 break;
2185
Guido van Rossum12d12c51993-10-26 17:58:25 +00002186 case lambda_input: /* Built-in function lambda() */
2187 (c->c_inlambda ? compile_lambda : com_lambda)(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002188 break;
2189
Guido van Rossum12d12c51993-10-26 17:58:25 +00002190 case eval_input: /* Built-in functions eval() and input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00002191 com_node(c, CHILD(n, 0));
2192 com_addbyte(c, RETURN_VALUE);
2193 break;
2194
2195 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002196 compile_funcdef(c, n);
2197 break;
2198
Guido van Rossum4c417781991-01-21 16:09:22 +00002199 case classdef: /* A class definition */
Guido van Rossum25831651993-05-19 14:50:45 +00002200 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
2201 c->c_name = STR(CHILD(n, 1));
Guido van Rossumc5e96291991-12-10 13:53:51 +00002202 com_node(c, CHILD(n, NCH(n)-1)); /* The suite */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002203 com_addbyte(c, LOAD_LOCALS);
2204 com_addbyte(c, RETURN_VALUE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002205 break;
2206
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002207 default:
2208 fprintf(stderr, "node type %d\n", TYPE(n));
2209 err_setstr(SystemError, "compile_node: unexpected node type");
2210 c->c_errors++;
2211 }
2212}
2213
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002214/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00002215
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002216 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
2217 instructions that refer to local variables with LOAD_FAST etc.
2218 The latter instructions are much faster because they don't need to
2219 look up the variable name in a dictionary.
Guido van Rossum282914b1991-04-04 10:42:56 +00002220
2221 To find all local variables, we check all STORE_NAME and IMPORT_FROM
2222 instructions. This yields all local variables, including arguments,
2223 function definitions, class definitions and import statements.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002224 (We don't check DELETE_NAME instructions, since if there's no
2225 STORE_NAME the DELETE_NAME will surely fail.)
Guido van Rossum282914b1991-04-04 10:42:56 +00002226
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002227 There is one problem: 'from foo import *' introduces local variables
2228 that we can't know while compiling. If this is the case, wo don't
Guido van Rossum25831651993-05-19 14:50:45 +00002229 optimize at all (this rarely happens, since this form of import
2230 statement is mostly used at the module level).
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002231
2232 Note that, because of this optimization, code like the following
2233 won't work:
2234 eval('x = 1')
2235 print x
Guido van Rossum282914b1991-04-04 10:42:56 +00002236
2237 NB: this modifies the string object co->co_code!
2238*/
2239
2240static void
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002241optimize(c)
2242 struct compiling *c;
Guido van Rossum282914b1991-04-04 10:42:56 +00002243{
Guido van Rossum0a697f61991-04-16 08:39:12 +00002244 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00002245 object *locals;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002246 int nlocals;
Guido van Rossum282914b1991-04-04 10:42:56 +00002247 int opcode;
2248 int oparg;
2249 object *name;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002250 int fast_reserved;
2251 object *error_type, *error_value;
2252
Guido van Rossum282914b1991-04-04 10:42:56 +00002253#define NEXTOP() (*next_instr++)
2254#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
2255#define GETITEM(v, i) (getlistitem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002256#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
2257
Guido van Rossum282914b1991-04-04 10:42:56 +00002258 locals = newdictobject();
2259 if (locals == NULL) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002260 c->c_errors++;
2261 return;
Guido van Rossum282914b1991-04-04 10:42:56 +00002262 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002263 nlocals = 0;
2264
2265 err_get(&error_type, &error_value);
Guido van Rossum282914b1991-04-04 10:42:56 +00002266
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002267 next_instr = (unsigned char *) getstringvalue(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00002268 for (;;) {
2269 opcode = NEXTOP();
2270 if (opcode == STOP_CODE)
2271 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002272 if (opcode == EXEC_STMT)
2273 goto end; /* Don't optimize if exec present */
Guido van Rossum282914b1991-04-04 10:42:56 +00002274 if (HAS_ARG(opcode))
2275 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002276 if (opcode == STORE_NAME || opcode == DELETE_NAME ||
2277 opcode == IMPORT_FROM) {
2278 object *v;
Guido van Rossum282914b1991-04-04 10:42:56 +00002279 name = GETNAMEOBJ(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002280 if (dict2lookup(locals, name) != NULL)
2281 continue;
2282 err_clear();
2283 v = newintobject(nlocals);
2284 if (v == NULL) {
2285 c->c_errors++;
2286 goto err;
Guido van Rossum282914b1991-04-04 10:42:56 +00002287 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002288 nlocals++;
2289 if (dict2insert(locals, name, v) != 0) {
2290 DECREF(v);
2291 c->c_errors++;
2292 goto err;
2293 }
2294 DECREF(v);
Guido van Rossum282914b1991-04-04 10:42:56 +00002295 }
2296 }
2297
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002298 if (nlocals == 0 || dictlookup(locals, "*") != NULL) {
2299 /* Don't optimize anything */
2300 goto end;
2301 }
2302
2303 next_instr = (unsigned char *) getstringvalue(c->c_code);
2304 fast_reserved = 0;
Guido van Rossum282914b1991-04-04 10:42:56 +00002305 for (;;) {
2306 cur_instr = next_instr;
2307 opcode = NEXTOP();
2308 if (opcode == STOP_CODE)
2309 break;
2310 if (HAS_ARG(opcode))
2311 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002312 if (opcode == RESERVE_FAST) {
2313 int i = com_addconst(c, locals);
2314 cur_instr[1] = i & 0xff;
2315 cur_instr[2] = (i>>8) & 0xff;
2316 fast_reserved = 1;
2317 continue;
2318 }
2319 if (!fast_reserved)
2320 continue;
2321 if (opcode == LOAD_NAME ||
2322 opcode == STORE_NAME ||
2323 opcode == DELETE_NAME) {
2324 object *v;
2325 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00002326 name = GETNAMEOBJ(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002327 v = dict2lookup(locals, name);
2328 if (v == NULL) {
Guido van Rossum83163251991-08-16 08:58:43 +00002329 err_clear();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002330 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00002331 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002332 i = getintvalue(v);
2333 switch (opcode) {
2334 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
2335 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
2336 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
2337 }
2338 cur_instr[1] = i & 0xff;
2339 cur_instr[2] = (i>>8) & 0xff;
Guido van Rossum282914b1991-04-04 10:42:56 +00002340 }
2341 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002342
2343 end:
2344 err_setval(error_type, error_value);
2345 err:
Guido van Rossum282914b1991-04-04 10:42:56 +00002346 DECREF(locals);
2347}
2348
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002349codeobject *
Guido van Rossum12d12c51993-10-26 17:58:25 +00002350_compile(n, filename, inlambda)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002351 node *n;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002352 char *filename;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002353 int inlambda;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002354{
2355 struct compiling sc;
2356 codeobject *co;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002357 if (!com_init(&sc, filename, inlambda))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002358 return NULL;
2359 compile_node(&sc, n);
2360 com_done(&sc);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002361 if (TYPE(n) == funcdef && sc.c_errors == 0)
2362 optimize(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00002363 co = NULL;
2364 if (sc.c_errors == 0) {
2365 object *v, *w;
2366 v = newstringobject(sc.c_filename);
2367 w = newstringobject(sc.c_name);
2368 if (v != NULL && w != NULL)
2369 co = newcodeobject(sc.c_code, sc.c_consts,
2370 sc.c_names, v, w);
2371 XDECREF(v);
2372 XDECREF(w);
Guido van Rossuma082ce41991-06-04 19:41:56 +00002373 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002374 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002375 return co;
2376}