blob: dd7993707e1827de6624f6d4c917150e3dd7682e [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>
42
Guido van Rossum282914b1991-04-04 10:42:56 +000043extern int errno;
44
Guido van Rossum3f5da241990-12-20 15:06:42 +000045#define OFF(x) offsetof(codeobject, x)
46
47static struct memberlist code_memberlist[] = {
Guido van Rossum39d942d1992-01-12 02:30:05 +000048 {"co_code", T_OBJECT, OFF(co_code), READONLY},
49 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
50 {"co_names", T_OBJECT, OFF(co_names), READONLY},
51 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000052 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000053 {NULL} /* Sentinel */
54};
55
56static object *
57code_getattr(co, name)
58 codeobject *co;
59 char *name;
60{
61 return getmember((char *)co, code_memberlist, name);
62}
Guido van Rossum10dc2e81990-11-18 17:27:39 +000063
64static void
Guido van Rossum3f5da241990-12-20 15:06:42 +000065code_dealloc(co)
66 codeobject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +000067{
Guido van Rossum3f5da241990-12-20 15:06:42 +000068 XDECREF(co->co_code);
69 XDECREF(co->co_consts);
70 XDECREF(co->co_names);
71 XDECREF(co->co_filename);
Guido van Rossum9bfef441993-03-29 10:43:31 +000072 XDECREF(co->co_name);
Guido van Rossum3f5da241990-12-20 15:06:42 +000073 DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +000074}
75
Guido van Rossum2dff9911992-09-03 20:50:59 +000076static object *
77code_repr(co)
78 codeobject *co;
79{
80 char buf[500];
81 int lineno = -1;
82 char *p = GETSTRINGVALUE(co->co_code);
83 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +000084 char *name = "???";
Guido van Rossum2dff9911992-09-03 20:50:59 +000085 if (*p == SET_LINENO)
86 lineno = (p[1] & 0xff) | ((p[2] & 0xff) << 8);
87 if (co->co_filename && is_stringobject(co->co_filename))
88 filename = getstringvalue(co->co_filename);
Guido van Rossum9bfef441993-03-29 10:43:31 +000089 if (co->co_name && is_stringobject(co->co_name))
90 name = getstringvalue(co->co_name);
91 sprintf(buf, "<code object %.100s at %lx, file \"%.300s\", line %d>",
92 name, (long)co, filename, lineno);
Guido van Rossum2dff9911992-09-03 20:50:59 +000093 return newstringobject(buf);
94}
95
Guido van Rossum10dc2e81990-11-18 17:27:39 +000096typeobject Codetype = {
97 OB_HEAD_INIT(&Typetype)
98 0,
99 "code",
100 sizeof(codeobject),
101 0,
102 code_dealloc, /*tp_dealloc*/
103 0, /*tp_print*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000104 code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000105 0, /*tp_setattr*/
106 0, /*tp_compare*/
Guido van Rossum2dff9911992-09-03 20:50:59 +0000107 code_repr, /*tp_repr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000108 0, /*tp_as_number*/
109 0, /*tp_as_sequence*/
110 0, /*tp_as_mapping*/
111};
112
Guido van Rossuma082ce41991-06-04 19:41:56 +0000113codeobject *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000114newcodeobject(code, consts, names, filename, name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000115 object *code;
116 object *consts;
117 object *names;
Guido van Rossuma082ce41991-06-04 19:41:56 +0000118 object *filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000119 object *name;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000120{
121 codeobject *co;
122 int i;
123 /* Check argument types */
124 if (code == NULL || !is_stringobject(code) ||
125 consts == NULL || !is_listobject(consts) ||
Guido van Rossum9bfef441993-03-29 10:43:31 +0000126 names == NULL || !is_listobject(names) ||
127 name == NULL || !is_stringobject(name)) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000128 err_badcall();
129 return NULL;
130 }
131 /* Make sure the list of names contains only strings */
132 for (i = getlistsize(names); --i >= 0; ) {
133 object *v = getlistitem(names, i);
134 if (v == NULL || !is_stringobject(v)) {
135 err_badcall();
136 return NULL;
137 }
138 }
139 co = NEWOBJ(codeobject, &Codetype);
140 if (co != NULL) {
141 INCREF(code);
142 co->co_code = (stringobject *)code;
143 INCREF(consts);
144 co->co_consts = consts;
145 INCREF(names);
146 co->co_names = names;
Guido van Rossuma082ce41991-06-04 19:41:56 +0000147 INCREF(filename);
148 co->co_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000149 INCREF(name);
150 co->co_name = name;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000151 }
152 return co;
153}
154
155
156/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000157
158#define MAXBLOCKS 20 /* Max static block nesting within a function */
159
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000160struct compiling {
161 object *c_code; /* string */
162 object *c_consts; /* list of objects */
163 object *c_names; /* list of strings (names) */
Guido van Rossumc5e96291991-12-10 13:53:51 +0000164 object *c_globals; /* dictionary */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000165 int c_nexti; /* index into c_code */
166 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000167 int c_infunction; /* set when compiling a function */
168 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000169 int c_begin; /* begin of current loop, for 'continue' */
170 int c_block[MAXBLOCKS]; /* stack of block types */
171 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000172 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000173 char *c_name; /* name of object (e.g. function) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000174};
175
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000176
177/* Interface to the block stack */
178
179static void
180block_push(c, type)
181 struct compiling *c;
182 int type;
183{
184 if (c->c_nblocks >= MAXBLOCKS) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +0000185 err_setstr(SystemError, "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000186 c->c_errors++;
187 }
188 else {
189 c->c_block[c->c_nblocks++] = type;
190 }
191}
192
193static void
194block_pop(c, type)
195 struct compiling *c;
196 int type;
197{
198 if (c->c_nblocks > 0)
199 c->c_nblocks--;
200 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
201 err_setstr(SystemError, "bad block pop");
202 c->c_errors++;
203 }
204}
205
206
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000207/* Prototypes */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000208
Guido van Rossum3f5da241990-12-20 15:06:42 +0000209static int com_init PROTO((struct compiling *, char *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000210static void com_free PROTO((struct compiling *));
211static void com_done PROTO((struct compiling *));
212static void com_node PROTO((struct compiling *, struct _node *));
213static void com_addbyte PROTO((struct compiling *, int));
214static void com_addint PROTO((struct compiling *, int));
215static void com_addoparg PROTO((struct compiling *, int, int));
216static void com_addfwref PROTO((struct compiling *, int, int *));
217static void com_backpatch PROTO((struct compiling *, int));
218static int com_add PROTO((struct compiling *, object *, object *));
219static int com_addconst PROTO((struct compiling *, object *));
220static int com_addname PROTO((struct compiling *, object *));
221static void com_addopname PROTO((struct compiling *, int, node *));
Guido van Rossum288a60f1991-12-16 13:05:10 +0000222static void com_list PROTO((struct compiling *, node *, int));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000223
224static int
Guido van Rossum3f5da241990-12-20 15:06:42 +0000225com_init(c, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000226 struct compiling *c;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000227 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000228{
Guido van Rossum62d46241991-04-03 19:00:23 +0000229 if ((c->c_code = newsizedstringobject((char *)NULL, 1000)) == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000230 goto fail_3;
231 if ((c->c_consts = newlistobject(0)) == NULL)
232 goto fail_2;
233 if ((c->c_names = newlistobject(0)) == NULL)
234 goto fail_1;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000235 if ((c->c_globals = newdictobject()) == NULL)
236 goto fail_0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000237 c->c_nexti = 0;
238 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000239 c->c_infunction = 0;
240 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000241 c->c_begin = 0;
242 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000243 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000244 c->c_name = "?";
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000245 return 1;
246
Guido van Rossumc5e96291991-12-10 13:53:51 +0000247 fail_0:
248 DECREF(c->c_names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000249 fail_1:
250 DECREF(c->c_consts);
251 fail_2:
252 DECREF(c->c_code);
253 fail_3:
254 return 0;
255}
256
257static void
258com_free(c)
259 struct compiling *c;
260{
261 XDECREF(c->c_code);
262 XDECREF(c->c_consts);
263 XDECREF(c->c_names);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000264 XDECREF(c->c_globals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000265}
266
267static void
268com_done(c)
269 struct compiling *c;
270{
271 if (c->c_code != NULL)
272 resizestring(&c->c_code, c->c_nexti);
273}
274
275static void
276com_addbyte(c, byte)
277 struct compiling *c;
278 int byte;
279{
280 int len;
281 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000282 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000283 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
284 abort();
Guido van Rossum01cfd441991-10-20 20:12:38 +0000285 */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000286 err_setstr(SystemError, "com_addbyte: byte out of range");
287 c->c_errors++;
288 }
289 if (c->c_code == NULL)
290 return;
291 len = getstringsize(c->c_code);
292 if (c->c_nexti >= len) {
293 if (resizestring(&c->c_code, len+1000) != 0) {
294 c->c_errors++;
295 return;
296 }
297 }
298 getstringvalue(c->c_code)[c->c_nexti++] = byte;
299}
300
301static void
302com_addint(c, x)
303 struct compiling *c;
304 int x;
305{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000306 com_addbyte(c, x & 0xff);
307 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000308}
309
310static void
311com_addoparg(c, op, arg)
312 struct compiling *c;
313 int op;
314 int arg;
315{
316 com_addbyte(c, op);
317 com_addint(c, arg);
318}
319
320static void
321com_addfwref(c, op, p_anchor)
322 struct compiling *c;
323 int op;
324 int *p_anchor;
325{
326 /* Compile a forward reference for backpatching */
327 int here;
328 int anchor;
329 com_addbyte(c, op);
330 here = c->c_nexti;
331 anchor = *p_anchor;
332 *p_anchor = here;
333 com_addint(c, anchor == 0 ? 0 : here - anchor);
334}
335
336static void
337com_backpatch(c, anchor)
338 struct compiling *c;
339 int anchor; /* Must be nonzero */
340{
341 unsigned char *code = (unsigned char *) getstringvalue(c->c_code);
342 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000343 int dist;
344 int prev;
345 for (;;) {
346 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000347 prev = code[anchor] + (code[anchor+1] << 8);
348 dist = target - (anchor+2);
349 code[anchor] = dist & 0xff;
350 code[anchor+1] = dist >> 8;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000351 if (!prev)
352 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000353 anchor -= prev;
354 }
355}
356
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000357/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000358
359static int
360com_add(c, list, v)
361 struct compiling *c;
362 object *list;
363 object *v;
364{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000365 int n = getlistsize(list);
366 int i;
367 for (i = n; --i >= 0; ) {
368 object *w = getlistitem(list, i);
Guido van Rossumefc0bd01991-07-01 18:44:20 +0000369 if (v->ob_type == w->ob_type && cmpobject(v, w) == 0)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000370 return i;
371 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000372 if (addlistitem(list, v) != 0)
373 c->c_errors++;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000374 return n;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000375}
376
377static int
378com_addconst(c, v)
379 struct compiling *c;
380 object *v;
381{
382 return com_add(c, c->c_consts, v);
383}
384
385static int
386com_addname(c, v)
387 struct compiling *c;
388 object *v;
389{
390 return com_add(c, c->c_names, v);
391}
392
393static void
394com_addopname(c, op, n)
395 struct compiling *c;
396 int op;
397 node *n;
398{
399 object *v;
400 int i;
401 char *name;
402 if (TYPE(n) == STAR)
403 name = "*";
404 else {
405 REQ(n, NAME);
406 name = STR(n);
407 }
408 if ((v = newstringobject(name)) == NULL) {
409 c->c_errors++;
410 i = 255;
411 }
412 else {
413 i = com_addname(c, v);
414 DECREF(v);
415 }
Guido van Rossumc5e96291991-12-10 13:53:51 +0000416 /* Hack to replace *_NAME opcodes by *_GLOBAL if necessary */
417 switch (op) {
418 case LOAD_NAME:
419 case STORE_NAME:
420 case DELETE_NAME:
421 if (dictlookup(c->c_globals, name) != NULL) {
422 switch (op) {
423 case LOAD_NAME: op = LOAD_GLOBAL; break;
424 case STORE_NAME: op = STORE_GLOBAL; break;
425 case DELETE_NAME: op = DELETE_GLOBAL; break;
426 }
427 }
428 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000429 com_addoparg(c, op, i);
430}
431
432static object *
433parsenumber(s)
434 char *s;
435{
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000436 extern long strtol PROTO((const char *, char **, int));
437 extern unsigned long strtoul PROTO((const char *, char **, int));
438 extern double strtod PROTO((const char *, char **));
Guido van Rossumc5e96291991-12-10 13:53:51 +0000439 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000440 long x;
Guido van Rossum282914b1991-04-04 10:42:56 +0000441 double xx;
442 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000443 end = s + strlen(s) - 1;
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000444 if (*end == 'l' || *end == 'L')
Guido van Rossumc5e96291991-12-10 13:53:51 +0000445 return long_scan(s, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000446 if (s[0] == '0')
447 x = (long) strtoul(s, &end, 0);
448 else
449 x = strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +0000450 if (*end == '\0') {
451 if (errno != 0) {
Guido van Rossumefb087b1991-12-16 15:41:41 +0000452 err_setstr(OverflowError,
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000453 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000454 return NULL;
455 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000456 return newintobject(x);
Guido van Rossum282914b1991-04-04 10:42:56 +0000457 }
458 errno = 0;
459 xx = strtod(s, &end);
460 if (*end == '\0') {
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000461#ifndef BROKEN_STRTOD
462 /* Some strtod() versions (e.g., in older SunOS systems)
463 set errno incorrectly; better to ignore overflows
464 than not to be able to use float literals at all! */
Guido van Rossum282914b1991-04-04 10:42:56 +0000465 if (errno != 0) {
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000466 err_setstr(OverflowError, "float literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000467 return NULL;
468 }
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000469#endif
Guido van Rossum282914b1991-04-04 10:42:56 +0000470 return newfloatobject(xx);
471 }
Guido van Rossumefb087b1991-12-16 15:41:41 +0000472 err_setstr(SystemError, "bad number syntax?!?!");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000473 return NULL;
474}
475
476static object *
477parsestr(s)
478 char *s;
479{
480 object *v;
481 int len;
482 char *buf;
483 char *p;
484 int c;
485 if (*s != '\'') {
486 err_badcall();
487 return NULL;
488 }
489 s++;
490 len = strlen(s);
491 if (s[--len] != '\'') {
492 err_badcall();
493 return NULL;
494 }
495 if (strchr(s, '\\') == NULL)
496 return newsizedstringobject(s, len);
497 v = newsizedstringobject((char *)NULL, len);
498 p = buf = getstringvalue(v);
499 while (*s != '\0' && *s != '\'') {
500 if (*s != '\\') {
501 *p++ = *s++;
502 continue;
503 }
504 s++;
505 switch (*s++) {
506 /* XXX This assumes ASCII! */
507 case '\\': *p++ = '\\'; break;
508 case '\'': *p++ = '\''; break;
509 case 'b': *p++ = '\b'; break;
510 case 'f': *p++ = '\014'; break; /* FF */
511 case 't': *p++ = '\t'; break;
512 case 'n': *p++ = '\n'; break;
513 case 'r': *p++ = '\r'; break;
514 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000515 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
516 case '0': case '1': case '2': case '3':
517 case '4': case '5': case '6': case '7':
518 c = s[-1] - '0';
519 if ('0' <= *s && *s <= '7') {
520 c = (c<<3) + *s++ - '0';
521 if ('0' <= *s && *s <= '7')
522 c = (c<<3) + *s++ - '0';
523 }
524 *p++ = c;
525 break;
526 case 'x':
527 if (isxdigit(*s)) {
528 sscanf(s, "%x", &c);
529 *p++ = c;
530 do {
531 s++;
532 } while (isxdigit(*s));
533 break;
534 }
535 /* FALLTHROUGH */
536 default: *p++ = '\\'; *p++ = s[-1]; break;
537 }
538 }
539 resizestring(&v, (int)(p - buf));
540 return v;
541}
542
543static void
544com_list_constructor(c, n)
545 struct compiling *c;
546 node *n;
547{
548 int len;
549 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000550 if (TYPE(n) != testlist)
551 REQ(n, exprlist);
552 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
553 len = (NCH(n) + 1) / 2;
554 for (i = 0; i < NCH(n); i += 2)
555 com_node(c, CHILD(n, i));
556 com_addoparg(c, BUILD_LIST, len);
557}
558
559static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000560com_dictmaker(c, n)
561 struct compiling *c;
562 node *n;
563{
564 int i;
565 /* dictmaker: test ':' test (',' test ':' value)* [','] */
566 for (i = 0; i+2 < NCH(n); i += 4) {
567 /* We must arrange things just right for STORE_SUBSCR.
568 It wants the stack to look like (value) (dict) (key) */
569 com_addbyte(c, DUP_TOP);
570 com_node(c, CHILD(n, i+2)); /* value */
571 com_addbyte(c, ROT_TWO);
572 com_node(c, CHILD(n, i)); /* key */
573 com_addbyte(c, STORE_SUBSCR);
574 }
575}
576
577static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000578com_atom(c, n)
579 struct compiling *c;
580 node *n;
581{
582 node *ch;
583 object *v;
584 int i;
585 REQ(n, atom);
586 ch = CHILD(n, 0);
587 switch (TYPE(ch)) {
588 case LPAR:
589 if (TYPE(CHILD(n, 1)) == RPAR)
590 com_addoparg(c, BUILD_TUPLE, 0);
591 else
592 com_node(c, CHILD(n, 1));
593 break;
594 case LSQB:
595 if (TYPE(CHILD(n, 1)) == RSQB)
596 com_addoparg(c, BUILD_LIST, 0);
597 else
598 com_list_constructor(c, CHILD(n, 1));
599 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000600 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000601 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000602 if (TYPE(CHILD(n, 1)) != RBRACE)
603 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000604 break;
605 case BACKQUOTE:
606 com_node(c, CHILD(n, 1));
607 com_addbyte(c, UNARY_CONVERT);
608 break;
609 case NUMBER:
610 if ((v = parsenumber(STR(ch))) == NULL) {
611 c->c_errors++;
612 i = 255;
613 }
614 else {
615 i = com_addconst(c, v);
616 DECREF(v);
617 }
618 com_addoparg(c, LOAD_CONST, i);
619 break;
620 case STRING:
621 if ((v = parsestr(STR(ch))) == NULL) {
622 c->c_errors++;
623 i = 255;
624 }
625 else {
626 i = com_addconst(c, v);
627 DECREF(v);
628 }
629 com_addoparg(c, LOAD_CONST, i);
630 break;
631 case NAME:
632 com_addopname(c, LOAD_NAME, ch);
633 break;
634 default:
635 fprintf(stderr, "node type %d\n", TYPE(ch));
636 err_setstr(SystemError, "com_atom: unexpected node type");
637 c->c_errors++;
638 }
639}
640
641static void
642com_slice(c, n, op)
643 struct compiling *c;
644 node *n;
645 int op;
646{
647 if (NCH(n) == 1) {
648 com_addbyte(c, op);
649 }
650 else if (NCH(n) == 2) {
651 if (TYPE(CHILD(n, 0)) != COLON) {
652 com_node(c, CHILD(n, 0));
653 com_addbyte(c, op+1);
654 }
655 else {
656 com_node(c, CHILD(n, 1));
657 com_addbyte(c, op+2);
658 }
659 }
660 else {
661 com_node(c, CHILD(n, 0));
662 com_node(c, CHILD(n, 2));
663 com_addbyte(c, op+3);
664 }
665}
666
667static void
668com_apply_subscript(c, n)
669 struct compiling *c;
670 node *n;
671{
672 REQ(n, subscript);
673 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) != COLON) {
674 /* It's a single subscript */
675 com_node(c, CHILD(n, 0));
676 com_addbyte(c, BINARY_SUBSCR);
677 }
678 else {
679 /* It's a slice: [expr] ':' [expr] */
680 com_slice(c, n, SLICE);
681 }
682}
683
684static void
685com_call_function(c, n)
686 struct compiling *c;
687 node *n; /* EITHER testlist OR ')' */
688{
689 if (TYPE(n) == RPAR) {
Guido van Rossum288a60f1991-12-16 13:05:10 +0000690 com_addoparg(c, BUILD_TUPLE, 0);
691 com_addbyte(c, BINARY_CALL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000692 }
693 else {
Guido van Rossum288a60f1991-12-16 13:05:10 +0000694 REQ(n, testlist);
695 com_list(c, n, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000696 com_addbyte(c, BINARY_CALL);
697 }
698}
699
700static void
701com_select_member(c, n)
702 struct compiling *c;
703 node *n;
704{
705 com_addopname(c, LOAD_ATTR, n);
706}
707
708static void
709com_apply_trailer(c, n)
710 struct compiling *c;
711 node *n;
712{
713 REQ(n, trailer);
714 switch (TYPE(CHILD(n, 0))) {
715 case LPAR:
716 com_call_function(c, CHILD(n, 1));
717 break;
718 case DOT:
719 com_select_member(c, CHILD(n, 1));
720 break;
721 case LSQB:
722 com_apply_subscript(c, CHILD(n, 1));
723 break;
724 default:
725 err_setstr(SystemError,
726 "com_apply_trailer: unknown trailer type");
727 c->c_errors++;
728 }
729}
730
731static void
732com_factor(c, n)
733 struct compiling *c;
734 node *n;
735{
736 int i;
737 REQ(n, factor);
738 if (TYPE(CHILD(n, 0)) == PLUS) {
739 com_factor(c, CHILD(n, 1));
740 com_addbyte(c, UNARY_POSITIVE);
741 }
742 else if (TYPE(CHILD(n, 0)) == MINUS) {
743 com_factor(c, CHILD(n, 1));
744 com_addbyte(c, UNARY_NEGATIVE);
745 }
Guido van Rossum7928cd71991-10-24 14:59:31 +0000746 else if (TYPE(CHILD(n, 0)) == TILDE) {
747 com_factor(c, CHILD(n, 1));
748 com_addbyte(c, UNARY_INVERT);
749 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000750 else {
751 com_atom(c, CHILD(n, 0));
752 for (i = 1; i < NCH(n); i++)
753 com_apply_trailer(c, CHILD(n, i));
754 }
755}
756
757static void
758com_term(c, n)
759 struct compiling *c;
760 node *n;
761{
762 int i;
763 int op;
764 REQ(n, term);
765 com_factor(c, CHILD(n, 0));
766 for (i = 2; i < NCH(n); i += 2) {
767 com_factor(c, CHILD(n, i));
768 switch (TYPE(CHILD(n, i-1))) {
769 case STAR:
770 op = BINARY_MULTIPLY;
771 break;
772 case SLASH:
773 op = BINARY_DIVIDE;
774 break;
775 case PERCENT:
776 op = BINARY_MODULO;
777 break;
778 default:
779 err_setstr(SystemError,
Guido van Rossum7928cd71991-10-24 14:59:31 +0000780 "com_term: operator not *, / or %");
781 c->c_errors++;
782 op = 255;
783 }
784 com_addbyte(c, op);
785 }
786}
787
788static void
789com_arith_expr(c, n)
790 struct compiling *c;
791 node *n;
792{
793 int i;
794 int op;
795 REQ(n, arith_expr);
796 com_term(c, CHILD(n, 0));
797 for (i = 2; i < NCH(n); i += 2) {
798 com_term(c, CHILD(n, i));
799 switch (TYPE(CHILD(n, i-1))) {
800 case PLUS:
801 op = BINARY_ADD;
802 break;
803 case MINUS:
804 op = BINARY_SUBTRACT;
805 break;
806 default:
807 err_setstr(SystemError,
808 "com_arith_expr: operator not + or -");
809 c->c_errors++;
810 op = 255;
811 }
812 com_addbyte(c, op);
813 }
814}
815
816static void
817com_shift_expr(c, n)
818 struct compiling *c;
819 node *n;
820{
821 int i;
822 int op;
823 REQ(n, shift_expr);
824 com_arith_expr(c, CHILD(n, 0));
825 for (i = 2; i < NCH(n); i += 2) {
826 com_arith_expr(c, CHILD(n, i));
827 switch (TYPE(CHILD(n, i-1))) {
828 case LEFTSHIFT:
829 op = BINARY_LSHIFT;
830 break;
831 case RIGHTSHIFT:
832 op = BINARY_RSHIFT;
833 break;
834 default:
835 err_setstr(SystemError,
836 "com_shift_expr: operator not << or >>");
837 c->c_errors++;
838 op = 255;
839 }
840 com_addbyte(c, op);
841 }
842}
843
844static void
845com_and_expr(c, n)
846 struct compiling *c;
847 node *n;
848{
849 int i;
850 int op;
851 REQ(n, and_expr);
852 com_shift_expr(c, CHILD(n, 0));
853 for (i = 2; i < NCH(n); i += 2) {
854 com_shift_expr(c, CHILD(n, i));
855 if (TYPE(CHILD(n, i-1)) == AMPER) {
856 op = BINARY_AND;
857 }
858 else {
859 err_setstr(SystemError,
860 "com_and_expr: operator not &");
861 c->c_errors++;
862 op = 255;
863 }
864 com_addbyte(c, op);
865 }
866}
867
868static void
869com_xor_expr(c, n)
870 struct compiling *c;
871 node *n;
872{
873 int i;
874 int op;
875 REQ(n, xor_expr);
876 com_and_expr(c, CHILD(n, 0));
877 for (i = 2; i < NCH(n); i += 2) {
878 com_and_expr(c, CHILD(n, i));
879 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
880 op = BINARY_XOR;
881 }
882 else {
883 err_setstr(SystemError,
884 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000885 c->c_errors++;
886 op = 255;
887 }
888 com_addbyte(c, op);
889 }
890}
891
892static void
893com_expr(c, n)
894 struct compiling *c;
895 node *n;
896{
897 int i;
898 int op;
899 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000900 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000901 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +0000902 com_xor_expr(c, CHILD(n, i));
903 if (TYPE(CHILD(n, i-1)) == VBAR) {
904 op = BINARY_OR;
905 }
906 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000907 err_setstr(SystemError,
Guido van Rossum7928cd71991-10-24 14:59:31 +0000908 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000909 c->c_errors++;
910 op = 255;
911 }
912 com_addbyte(c, op);
913 }
914}
915
916static enum cmp_op
917cmp_type(n)
918 node *n;
919{
920 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +0000921 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000922 | 'in' | 'not' 'in' | 'is' | 'is' not' */
923 if (NCH(n) == 1) {
924 n = CHILD(n, 0);
925 switch (TYPE(n)) {
926 case LESS: return LT;
927 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +0000928 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000929 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +0000930 case LESSEQUAL: return LE;
931 case GREATEREQUAL: return GE;
932 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000933 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
934 if (strcmp(STR(n), "is") == 0) return IS;
935 }
936 }
937 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000938 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000939 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
940 return NOT_IN;
941 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
942 return IS_NOT;
943 }
944 }
945 return BAD;
946}
947
948static void
949com_comparison(c, n)
950 struct compiling *c;
951 node *n;
952{
953 int i;
954 enum cmp_op op;
955 int anchor;
956 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
957 com_expr(c, CHILD(n, 0));
958 if (NCH(n) == 1)
959 return;
960
961 /****************************************************************
962 The following code is generated for all but the last
963 comparison in a chain:
964
965 label: on stack: opcode: jump to:
966
967 a <code to load b>
968 a, b DUP_TOP
969 a, b, b ROT_THREE
970 b, a, b COMPARE_OP
971 b, 0-or-1 JUMP_IF_FALSE L1
972 b, 1 POP_TOP
973 b
974
975 We are now ready to repeat this sequence for the next
976 comparison in the chain.
977
978 For the last we generate:
979
980 b <code to load c>
981 b, c COMPARE_OP
982 0-or-1
983
984 If there were any jumps to L1 (i.e., there was more than one
985 comparison), we generate:
986
987 0-or-1 JUMP_FORWARD L2
988 L1: b, 0 ROT_TWO
989 0, b POP_TOP
990 0
991 L2:
992 ****************************************************************/
993
994 anchor = 0;
995
996 for (i = 2; i < NCH(n); i += 2) {
997 com_expr(c, CHILD(n, i));
998 if (i+2 < NCH(n)) {
999 com_addbyte(c, DUP_TOP);
1000 com_addbyte(c, ROT_THREE);
1001 }
1002 op = cmp_type(CHILD(n, i-1));
1003 if (op == BAD) {
1004 err_setstr(SystemError,
1005 "com_comparison: unknown comparison op");
1006 c->c_errors++;
1007 }
1008 com_addoparg(c, COMPARE_OP, op);
1009 if (i+2 < NCH(n)) {
1010 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1011 com_addbyte(c, POP_TOP);
1012 }
1013 }
1014
1015 if (anchor) {
1016 int anchor2 = 0;
1017 com_addfwref(c, JUMP_FORWARD, &anchor2);
1018 com_backpatch(c, anchor);
1019 com_addbyte(c, ROT_TWO);
1020 com_addbyte(c, POP_TOP);
1021 com_backpatch(c, anchor2);
1022 }
1023}
1024
1025static void
1026com_not_test(c, n)
1027 struct compiling *c;
1028 node *n;
1029{
1030 REQ(n, not_test); /* 'not' not_test | comparison */
1031 if (NCH(n) == 1) {
1032 com_comparison(c, CHILD(n, 0));
1033 }
1034 else {
1035 com_not_test(c, CHILD(n, 1));
1036 com_addbyte(c, UNARY_NOT);
1037 }
1038}
1039
1040static void
1041com_and_test(c, n)
1042 struct compiling *c;
1043 node *n;
1044{
1045 int i;
1046 int anchor;
1047 REQ(n, and_test); /* not_test ('and' not_test)* */
1048 anchor = 0;
1049 i = 0;
1050 for (;;) {
1051 com_not_test(c, CHILD(n, i));
1052 if ((i += 2) >= NCH(n))
1053 break;
1054 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1055 com_addbyte(c, POP_TOP);
1056 }
1057 if (anchor)
1058 com_backpatch(c, anchor);
1059}
1060
1061static void
1062com_test(c, n)
1063 struct compiling *c;
1064 node *n;
1065{
1066 int i;
1067 int anchor;
1068 REQ(n, test); /* and_test ('and' and_test)* */
1069 anchor = 0;
1070 i = 0;
1071 for (;;) {
1072 com_and_test(c, CHILD(n, i));
1073 if ((i += 2) >= NCH(n))
1074 break;
1075 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1076 com_addbyte(c, POP_TOP);
1077 }
1078 if (anchor)
1079 com_backpatch(c, anchor);
1080}
1081
1082static void
Guido van Rossum288a60f1991-12-16 13:05:10 +00001083com_list(c, n, toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001084 struct compiling *c;
1085 node *n;
Guido van Rossum288a60f1991-12-16 13:05:10 +00001086 int toplevel; /* If nonzero, *always* build a tuple */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001087{
1088 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001089 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001090 com_node(c, CHILD(n, 0));
1091 }
1092 else {
1093 int i;
1094 int len;
1095 len = (NCH(n) + 1) / 2;
1096 for (i = 0; i < NCH(n); i += 2)
1097 com_node(c, CHILD(n, i));
1098 com_addoparg(c, BUILD_TUPLE, len);
1099 }
1100}
1101
1102
1103/* Begin of assignment compilation */
1104
1105static void com_assign_name PROTO((struct compiling *, node *, int));
1106static void com_assign PROTO((struct compiling *, node *, int));
1107
1108static void
1109com_assign_attr(c, n, assigning)
1110 struct compiling *c;
1111 node *n;
1112 int assigning;
1113{
1114 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
1115}
1116
1117static void
1118com_assign_slice(c, n, assigning)
1119 struct compiling *c;
1120 node *n;
1121 int assigning;
1122{
1123 com_slice(c, n, assigning ? STORE_SLICE : DELETE_SLICE);
1124}
1125
1126static void
1127com_assign_subscript(c, n, assigning)
1128 struct compiling *c;
1129 node *n;
1130 int assigning;
1131{
1132 com_node(c, n);
1133 com_addbyte(c, assigning ? STORE_SUBSCR : DELETE_SUBSCR);
1134}
1135
1136static void
1137com_assign_trailer(c, n, assigning)
1138 struct compiling *c;
1139 node *n;
1140 int assigning;
1141{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001142 REQ(n, trailer);
1143 switch (TYPE(CHILD(n, 0))) {
1144 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001145 err_setstr(SyntaxError, "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001146 c->c_errors++;
1147 break;
1148 case DOT: /* '.' NAME */
1149 com_assign_attr(c, CHILD(n, 1), assigning);
1150 break;
1151 case LSQB: /* '[' subscript ']' */
1152 n = CHILD(n, 1);
1153 REQ(n, subscript); /* subscript: expr | [expr] ':' [expr] */
1154 if (NCH(n) > 1 || TYPE(CHILD(n, 0)) == COLON)
1155 com_assign_slice(c, n, assigning);
1156 else
1157 com_assign_subscript(c, CHILD(n, 0), assigning);
1158 break;
1159 default:
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001160 err_setstr(SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001161 c->c_errors++;
1162 }
1163}
1164
1165static void
1166com_assign_tuple(c, n, assigning)
1167 struct compiling *c;
1168 node *n;
1169 int assigning;
1170{
1171 int i;
1172 if (TYPE(n) != testlist)
1173 REQ(n, exprlist);
1174 if (assigning)
1175 com_addoparg(c, UNPACK_TUPLE, (NCH(n)+1)/2);
1176 for (i = 0; i < NCH(n); i += 2)
1177 com_assign(c, CHILD(n, i), assigning);
1178}
1179
1180static void
1181com_assign_list(c, n, assigning)
1182 struct compiling *c;
1183 node *n;
1184 int assigning;
1185{
1186 int i;
1187 if (assigning)
1188 com_addoparg(c, UNPACK_LIST, (NCH(n)+1)/2);
1189 for (i = 0; i < NCH(n); i += 2)
1190 com_assign(c, CHILD(n, i), assigning);
1191}
1192
1193static void
1194com_assign_name(c, n, assigning)
1195 struct compiling *c;
1196 node *n;
1197 int assigning;
1198{
1199 REQ(n, NAME);
1200 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
1201}
1202
1203static void
1204com_assign(c, n, assigning)
1205 struct compiling *c;
1206 node *n;
1207 int assigning;
1208{
1209 /* Loop to avoid trivial recursion */
1210 for (;;) {
1211 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001212
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001213 case exprlist:
1214 case testlist:
1215 if (NCH(n) > 1) {
1216 com_assign_tuple(c, n, assigning);
1217 return;
1218 }
1219 n = CHILD(n, 0);
1220 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001221
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001222 case test:
1223 case and_test:
1224 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001225 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001226 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001227 case xor_expr:
1228 case and_expr:
1229 case shift_expr:
1230 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001231 case term:
1232 if (NCH(n) > 1) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001233 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001234 "can't assign to operator");
1235 c->c_errors++;
1236 return;
1237 }
1238 n = CHILD(n, 0);
1239 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001240
Guido van Rossum7928cd71991-10-24 14:59:31 +00001241 case factor: /* ('+'|'-'|'~') factor | atom trailer* */
1242 if (TYPE(CHILD(n, 0)) != atom) { /* '+'|'-'|'~' */
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001243 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001244 "can't assign to operator");
1245 c->c_errors++;
1246 return;
1247 }
1248 if (NCH(n) > 1) { /* trailer present */
1249 int i;
1250 com_node(c, CHILD(n, 0));
1251 for (i = 1; i+1 < NCH(n); i++) {
1252 com_apply_trailer(c, CHILD(n, i));
1253 } /* NB i is still alive */
1254 com_assign_trailer(c,
1255 CHILD(n, i), assigning);
1256 return;
1257 }
1258 n = CHILD(n, 0);
1259 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001260
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001261 case atom:
1262 switch (TYPE(CHILD(n, 0))) {
1263 case LPAR:
1264 n = CHILD(n, 1);
1265 if (TYPE(n) == RPAR) {
1266 /* XXX Should allow () = () ??? */
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 ()");
1269 c->c_errors++;
1270 return;
1271 }
1272 break;
1273 case LSQB:
1274 n = CHILD(n, 1);
1275 if (TYPE(n) == RSQB) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001276 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001277 "can't assign to []");
1278 c->c_errors++;
1279 return;
1280 }
1281 com_assign_list(c, n, assigning);
1282 return;
1283 case NAME:
1284 com_assign_name(c, CHILD(n, 0), assigning);
1285 return;
1286 default:
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001287 err_setstr(SyntaxError,
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001288 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001289 c->c_errors++;
1290 return;
1291 }
1292 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001293
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001294 default:
1295 fprintf(stderr, "node type %d\n", TYPE(n));
1296 err_setstr(SystemError, "com_assign: bad node");
1297 c->c_errors++;
1298 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001299
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001300 }
1301 }
1302}
1303
1304static void
1305com_expr_stmt(c, n)
1306 struct compiling *c;
1307 node *n;
1308{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001309 REQ(n, expr_stmt); /* exprlist ('=' exprlist)* */
1310 com_node(c, CHILD(n, NCH(n)-1));
1311 if (NCH(n) == 1) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001312 com_addbyte(c, PRINT_EXPR);
1313 }
1314 else {
1315 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001316 for (i = 0; i < NCH(n)-2; i+=2) {
1317 if (i+2 < NCH(n)-2)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001318 com_addbyte(c, DUP_TOP);
1319 com_assign(c, CHILD(n, i), 1/*assign*/);
1320 }
1321 }
1322}
1323
1324static void
1325com_print_stmt(c, n)
1326 struct compiling *c;
1327 node *n;
1328{
1329 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001330 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
1331 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001332 com_node(c, CHILD(n, i));
1333 com_addbyte(c, PRINT_ITEM);
1334 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001335 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001336 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001337 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001338}
1339
1340static void
1341com_return_stmt(c, n)
1342 struct compiling *c;
1343 node *n;
1344{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001345 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001346 if (!c->c_infunction) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001347 err_setstr(SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001348 c->c_errors++;
1349 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001350 if (NCH(n) < 2)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001351 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1352 else
1353 com_node(c, CHILD(n, 1));
1354 com_addbyte(c, RETURN_VALUE);
1355}
1356
1357static void
1358com_raise_stmt(c, n)
1359 struct compiling *c;
1360 node *n;
1361{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001362 REQ(n, raise_stmt); /* 'raise' test [',' test] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001363 com_node(c, CHILD(n, 1));
1364 if (NCH(n) > 3)
1365 com_node(c, CHILD(n, 3));
1366 else
1367 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1368 com_addbyte(c, RAISE_EXCEPTION);
1369}
1370
1371static void
1372com_import_stmt(c, n)
1373 struct compiling *c;
1374 node *n;
1375{
1376 int i;
1377 REQ(n, import_stmt);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001378 /* 'import' NAME (',' NAME)* |
1379 'from' NAME 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001380 if (STR(CHILD(n, 0))[0] == 'f') {
1381 /* 'from' NAME 'import' ... */
1382 REQ(CHILD(n, 1), NAME);
1383 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
1384 for (i = 3; i < NCH(n); i += 2)
1385 com_addopname(c, IMPORT_FROM, CHILD(n, i));
1386 com_addbyte(c, POP_TOP);
1387 }
1388 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001389 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001390 for (i = 1; i < NCH(n); i += 2) {
1391 com_addopname(c, IMPORT_NAME, CHILD(n, i));
1392 com_addopname(c, STORE_NAME, CHILD(n, i));
1393 }
1394 }
1395}
1396
1397static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00001398com_global_stmt(c, n)
1399 struct compiling *c;
1400 node *n;
1401{
1402 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001403 REQ(n, global_stmt);
1404 /* 'global' NAME (',' NAME)* */
1405 for (i = 1; i < NCH(n); i += 2) {
1406 if (dictinsert(c->c_globals, STR(CHILD(n, i)), None) != 0)
1407 c->c_errors++;
1408 }
1409}
1410
1411static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001412com_if_stmt(c, n)
1413 struct compiling *c;
1414 node *n;
1415{
1416 int i;
1417 int anchor = 0;
1418 REQ(n, if_stmt);
1419 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
1420 for (i = 0; i+3 < NCH(n); i+=4) {
1421 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001422 node *ch = CHILD(n, i+1);
1423 if (i > 0)
1424 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001425 com_node(c, CHILD(n, i+1));
1426 com_addfwref(c, JUMP_IF_FALSE, &a);
1427 com_addbyte(c, POP_TOP);
1428 com_node(c, CHILD(n, i+3));
1429 com_addfwref(c, JUMP_FORWARD, &anchor);
1430 com_backpatch(c, a);
1431 com_addbyte(c, POP_TOP);
1432 }
1433 if (i+2 < NCH(n))
1434 com_node(c, CHILD(n, i+2));
1435 com_backpatch(c, anchor);
1436}
1437
1438static void
1439com_while_stmt(c, n)
1440 struct compiling *c;
1441 node *n;
1442{
1443 int break_anchor = 0;
1444 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001445 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001446 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
1447 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001448 block_push(c, SETUP_LOOP);
1449 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001450 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001451 com_node(c, CHILD(n, 1));
1452 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1453 com_addbyte(c, POP_TOP);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001454 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001455 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001456 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001457 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1458 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001459 com_backpatch(c, anchor);
1460 com_addbyte(c, POP_TOP);
1461 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001462 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001463 if (NCH(n) > 4)
1464 com_node(c, CHILD(n, 6));
1465 com_backpatch(c, break_anchor);
1466}
1467
1468static void
1469com_for_stmt(c, n)
1470 struct compiling *c;
1471 node *n;
1472{
1473 object *v;
1474 int break_anchor = 0;
1475 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001476 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001477 REQ(n, for_stmt);
1478 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
1479 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001480 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001481 com_node(c, CHILD(n, 3));
1482 v = newintobject(0L);
1483 if (v == NULL)
1484 c->c_errors++;
1485 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
1486 XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001487 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001488 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001489 com_addfwref(c, FOR_LOOP, &anchor);
1490 com_assign(c, CHILD(n, 1), 1/*assigning*/);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001491 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001492 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001493 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001494 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1495 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001496 com_backpatch(c, anchor);
1497 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001498 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001499 if (NCH(n) > 8)
1500 com_node(c, CHILD(n, 8));
1501 com_backpatch(c, break_anchor);
1502}
1503
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001504/* Although 'execpt' and 'finally' clauses can be combined
1505 syntactically, they are compiled separately. In fact,
1506 try: S
1507 except E1: S1
1508 except E2: S2
1509 ...
1510 finally: Sf
1511 is equivalent to
1512 try:
1513 try: S
1514 except E1: S1
1515 except E2: S2
1516 ...
1517 finally: Sf
1518 meaning that the 'finally' clause is entered even if things
1519 go wrong again in an exception handler. Note that this is
1520 not the case for exception handlers: at most one is entered.
1521
1522 Code generated for "try: S finally: Sf" is as follows:
1523
1524 SETUP_FINALLY L
1525 <code for S>
1526 POP_BLOCK
1527 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001528 L: <code for Sf>
1529 END_FINALLY
1530
1531 The special instructions use the block stack. Each block
1532 stack entry contains the instruction that created it (here
1533 SETUP_FINALLY), the level of the value stack at the time the
1534 block stack entry was created, and a label (here L).
1535
1536 SETUP_FINALLY:
1537 Pushes the current value stack level and the label
1538 onto the block stack.
1539 POP_BLOCK:
1540 Pops en entry from the block stack, and pops the value
1541 stack until its level is the same as indicated on the
1542 block stack. (The label is ignored.)
1543 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001544 Pops a variable number of entries from the *value* stack
1545 and re-raises the exception they specify. The number of
1546 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001547
1548 The block stack is unwound when an exception is raised:
1549 when a SETUP_FINALLY entry is found, the exception is pushed
1550 onto the value stack (and the exception condition is cleared),
1551 and the interpreter jumps to the label gotten from the block
1552 stack.
1553
1554 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00001555 (The contents of the value stack is shown in [], with the top
1556 at the right; 'tb' is trace-back info, 'val' the exception's
1557 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001558
1559 Value stack Label Instruction Argument
1560 [] SETUP_EXCEPT L1
1561 [] <code for S>
1562 [] POP_BLOCK
1563 [] JUMP_FORWARD L0
1564
Guido van Rossum3f5da241990-12-20 15:06:42 +00001565 [tb, val, exc] L1: DUP )
1566 [tb, val, exc, exc] <evaluate E1> )
1567 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
1568 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
1569 [tb, val, exc, 1] POP )
1570 [tb, val, exc] POP
1571 [tb, val] <assign to V1> (or POP if no V1)
1572 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001573 [] <code for S1>
1574 JUMP_FORWARD L0
1575
Guido van Rossum3f5da241990-12-20 15:06:42 +00001576 [tb, val, exc, 0] L2: POP
1577 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001578 .............................etc.......................
1579
Guido van Rossum3f5da241990-12-20 15:06:42 +00001580 [tb, val, exc, 0] Ln+1: POP
1581 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001582
1583 [] L0: <next statement>
1584
1585 Of course, parts are not generated if Vi or Ei is not present.
1586*/
1587
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001588static void
1589com_try_stmt(c, n)
1590 struct compiling *c;
1591 node *n;
1592{
1593 int finally_anchor = 0;
1594 int except_anchor = 0;
1595 REQ(n, try_stmt);
Guido van Rossum94fb82e1992-04-05 14:24:50 +00001596 /* 'try' ':' suite (except_clause ':' suite)*
1597 | 'try' ':' 'finally' ':' suite */
1598
1599 /* XXX This can be simplified because except and finally can
1600 no longer be mixed in a single try statement */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001601
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001602 if (NCH(n) > 3 && TYPE(CHILD(n, NCH(n)-3)) != except_clause) {
1603 /* Have a 'finally' clause */
1604 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001605 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001606 }
1607 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == except_clause) {
1608 /* Have an 'except' clause */
1609 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001610 block_push(c, SETUP_EXCEPT);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001611 }
1612 com_node(c, CHILD(n, 2));
1613 if (except_anchor) {
1614 int end_anchor = 0;
1615 int i;
1616 node *ch;
1617 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001618 block_pop(c, SETUP_EXCEPT);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001619 com_addfwref(c, JUMP_FORWARD, &end_anchor);
1620 com_backpatch(c, except_anchor);
1621 for (i = 3;
1622 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
1623 i += 3) {
1624 /* except_clause: 'except' [expr [',' expr]] */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001625 if (except_anchor == 0) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001626 err_setstr(SyntaxError,
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001627 "default 'except:' must be last");
1628 c->c_errors++;
1629 break;
1630 }
1631 except_anchor = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001632 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001633 if (NCH(ch) > 1) {
1634 com_addbyte(c, DUP_TOP);
1635 com_node(c, CHILD(ch, 1));
1636 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001637 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001638 com_addbyte(c, POP_TOP);
1639 }
1640 com_addbyte(c, POP_TOP);
1641 if (NCH(ch) > 3)
1642 com_assign(c, CHILD(ch, 3), 1/*assigning*/);
1643 else
1644 com_addbyte(c, POP_TOP);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001645 com_addbyte(c, POP_TOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001646 com_node(c, CHILD(n, i+2));
1647 com_addfwref(c, JUMP_FORWARD, &end_anchor);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001648 if (except_anchor) {
1649 com_backpatch(c, except_anchor);
1650 com_addbyte(c, POP_TOP);
1651 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001652 }
1653 com_addbyte(c, END_FINALLY);
1654 com_backpatch(c, end_anchor);
1655 }
1656 if (finally_anchor) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001657 node *ch;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001658 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001659 block_pop(c, SETUP_FINALLY);
1660 block_push(c, END_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001661 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001662 com_backpatch(c, finally_anchor);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001663 ch = CHILD(n, NCH(n)-1);
1664 com_addoparg(c, SET_LINENO, ch->n_lineno);
1665 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001666 com_addbyte(c, END_FINALLY);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001667 block_pop(c, END_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001668 }
1669}
1670
1671static void
1672com_suite(c, n)
1673 struct compiling *c;
1674 node *n;
1675{
1676 REQ(n, suite);
1677 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
1678 if (NCH(n) == 1) {
1679 com_node(c, CHILD(n, 0));
1680 }
1681 else {
1682 int i;
1683 for (i = 0; i < NCH(n); i++) {
1684 node *ch = CHILD(n, i);
1685 if (TYPE(ch) == stmt)
1686 com_node(c, ch);
1687 }
1688 }
1689}
1690
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001691/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001692static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001693com_continue_stmt(c, n)
1694 struct compiling *c;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001695 node *n; /* Not used, but passed for consistency */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001696{
1697 int i = c->c_nblocks;
1698 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
1699 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1700 }
1701 else {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001702 err_setstr(SyntaxError, "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001703 c->c_errors++;
1704 }
1705 /* XXX Could allow it inside a 'finally' clause
1706 XXX if we could pop the exception still on the stack */
1707}
1708
1709static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001710com_funcdef(c, n)
1711 struct compiling *c;
1712 node *n;
1713{
1714 object *v;
1715 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001716 v = (object *)compile(n, c->c_filename);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001717 if (v == NULL)
1718 c->c_errors++;
1719 else {
1720 int i = com_addconst(c, v);
1721 com_addoparg(c, LOAD_CONST, i);
1722 com_addbyte(c, BUILD_FUNCTION);
1723 com_addopname(c, STORE_NAME, CHILD(n, 1));
1724 DECREF(v);
1725 }
1726}
1727
1728static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00001729com_oldbases(c, n)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001730 struct compiling *c;
1731 node *n;
1732{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001733 int i;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001734 REQ(n, baselist);
1735 /*
1736 baselist: atom arguments (',' atom arguments)*
Guido van Rossumc5e96291991-12-10 13:53:51 +00001737 arguments: '(' ')'
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001738 */
1739 for (i = 0; i < NCH(n); i += 3)
1740 com_node(c, CHILD(n, i));
1741 com_addoparg(c, BUILD_TUPLE, (NCH(n)+1) / 3);
1742}
1743
1744static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00001745com_newbases(c, n)
1746 struct compiling *c;
1747 node *n;
1748{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001749 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001750 REQ(n, testlist);
1751 /* testlist: test (',' test)* [','] */
1752 for (i = 0; i < NCH(n); i += 2)
1753 com_node(c, CHILD(n, i));
1754 com_addoparg(c, BUILD_TUPLE, (NCH(n)+1) / 2);
1755}
1756
1757static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001758com_classdef(c, n)
1759 struct compiling *c;
1760 node *n;
1761{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001762 object *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001763 REQ(n, classdef);
1764 /*
Guido van Rossumc5e96291991-12-10 13:53:51 +00001765 classdef: 'class' NAME
1766 ['(' testlist ')' |'(' ')' ['=' baselist]] ':' suite
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001767 baselist: atom arguments (',' atom arguments)*
Guido van Rossumc5e96291991-12-10 13:53:51 +00001768 arguments: '(' ')'
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001769 */
Guido van Rossumc5e96291991-12-10 13:53:51 +00001770 /* This piece of code must push a tuple on the stack (the bases) */
1771 if (TYPE(CHILD(n, 2)) != LPAR) {
1772 /* New syntax without base classes:
1773 class NAME ':' suite
1774 ___________^
1775 */
1776 com_addoparg(c, BUILD_TUPLE, 0);
1777 }
1778 else {
1779 if (TYPE(CHILD(n, 3)) == RPAR) {
1780 /* Old syntax with or without base classes:
1781 class NAME '(' ')' ['=' baselist] ':' suite
1782 _______________^....^...^
1783 */
1784 if (TYPE(CHILD(n, 4)) == EQUAL)
1785 com_oldbases(c, CHILD(n, 5));
1786 else
1787 com_addoparg(c, BUILD_TUPLE, 0);
1788 }
1789 else {
1790 /* New syntax with base classes:
1791 class NAME '(' testlist ')' ':' suite
1792 _______________^
1793 */
1794 com_newbases(c, CHILD(n, 3));
1795 }
1796 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001797 v = (object *)compile(n, c->c_filename);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001798 if (v == NULL)
1799 c->c_errors++;
1800 else {
1801 int i = com_addconst(c, v);
1802 com_addoparg(c, LOAD_CONST, i);
1803 com_addbyte(c, BUILD_FUNCTION);
1804 com_addbyte(c, UNARY_CALL);
1805 com_addbyte(c, BUILD_CLASS);
1806 com_addopname(c, STORE_NAME, CHILD(n, 1));
1807 DECREF(v);
1808 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001809}
1810
1811static void
1812com_node(c, n)
1813 struct compiling *c;
1814 node *n;
1815{
1816 switch (TYPE(n)) {
1817
1818 /* Definition nodes */
1819
1820 case funcdef:
1821 com_funcdef(c, n);
1822 break;
1823 case classdef:
1824 com_classdef(c, n);
1825 break;
1826
1827 /* Trivial parse tree nodes */
1828
1829 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001830 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001831 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001832 com_node(c, CHILD(n, 0));
1833 break;
1834
1835 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001836 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
1837 com_addoparg(c, SET_LINENO, n->n_lineno);
1838 {
1839 int i;
1840 for (i = 0; i < NCH(n)-1; i += 2)
1841 com_node(c, CHILD(n, i));
1842 }
1843 break;
1844
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001845 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001846 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001847 com_node(c, CHILD(n, 0));
1848 break;
1849
1850 /* Statement nodes */
1851
1852 case expr_stmt:
1853 com_expr_stmt(c, n);
1854 break;
1855 case print_stmt:
1856 com_print_stmt(c, n);
1857 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001858 case del_stmt: /* 'del' exprlist */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001859 com_assign(c, CHILD(n, 1), 0/*delete*/);
1860 break;
1861 case pass_stmt:
1862 break;
1863 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001864 if (c->c_loops == 0) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001865 err_setstr(SyntaxError, "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001866 c->c_errors++;
1867 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001868 com_addbyte(c, BREAK_LOOP);
1869 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001870 case continue_stmt:
1871 com_continue_stmt(c, n);
1872 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001873 case return_stmt:
1874 com_return_stmt(c, n);
1875 break;
1876 case raise_stmt:
1877 com_raise_stmt(c, n);
1878 break;
1879 case import_stmt:
1880 com_import_stmt(c, n);
1881 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001882 case global_stmt:
1883 com_global_stmt(c, n);
1884 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001885 case if_stmt:
1886 com_if_stmt(c, n);
1887 break;
1888 case while_stmt:
1889 com_while_stmt(c, n);
1890 break;
1891 case for_stmt:
1892 com_for_stmt(c, n);
1893 break;
1894 case try_stmt:
1895 com_try_stmt(c, n);
1896 break;
1897 case suite:
1898 com_suite(c, n);
1899 break;
1900
1901 /* Expression nodes */
1902
1903 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00001904 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001905 break;
1906 case test:
1907 com_test(c, n);
1908 break;
1909 case and_test:
1910 com_and_test(c, n);
1911 break;
1912 case not_test:
1913 com_not_test(c, n);
1914 break;
1915 case comparison:
1916 com_comparison(c, n);
1917 break;
1918 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00001919 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001920 break;
1921 case expr:
1922 com_expr(c, n);
1923 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001924 case xor_expr:
1925 com_xor_expr(c, n);
1926 break;
1927 case and_expr:
1928 com_and_expr(c, n);
1929 break;
1930 case shift_expr:
1931 com_shift_expr(c, n);
1932 break;
1933 case arith_expr:
1934 com_arith_expr(c, n);
1935 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001936 case term:
1937 com_term(c, n);
1938 break;
1939 case factor:
1940 com_factor(c, n);
1941 break;
1942 case atom:
1943 com_atom(c, n);
1944 break;
1945
1946 default:
1947 fprintf(stderr, "node type %d\n", TYPE(n));
1948 err_setstr(SystemError, "com_node: unexpected node type");
1949 c->c_errors++;
1950 }
1951}
1952
1953static void com_fplist PROTO((struct compiling *, node *));
1954
1955static void
1956com_fpdef(c, n)
1957 struct compiling *c;
1958 node *n;
1959{
1960 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
1961 if (TYPE(CHILD(n, 0)) == LPAR)
1962 com_fplist(c, CHILD(n, 1));
1963 else
1964 com_addopname(c, STORE_NAME, CHILD(n, 0));
1965}
1966
1967static void
1968com_fplist(c, n)
1969 struct compiling *c;
1970 node *n;
1971{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001972 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001973 if (NCH(n) == 1) {
1974 com_fpdef(c, CHILD(n, 0));
1975 }
1976 else {
1977 int i;
1978 com_addoparg(c, UNPACK_TUPLE, (NCH(n)+1)/2);
1979 for (i = 0; i < NCH(n); i += 2)
1980 com_fpdef(c, CHILD(n, i));
1981 }
1982}
1983
1984static void
Guido van Rossum49d6dc41992-01-14 18:30:26 +00001985com_arglist(c, n)
1986 struct compiling *c;
1987 node *n;
1988{
1989 int i, nargs, op;
1990 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001991 /* varargslist:
Guido van Rossum94fb82e1992-04-05 14:24:50 +00001992 (fpdef ',')* '*' NAME | fpdef (',' fpdef)* [','] */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00001993 op = UNPACK_ARG;
1994 nargs = (NCH(n) + 1) / 2;
1995 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumacbefef1992-01-19 16:33:51 +00001996 int t = TYPE(CHILD(n, i));
Guido van Rossum94fb82e1992-04-05 14:24:50 +00001997 if (t == STAR) {
Guido van Rossum49d6dc41992-01-14 18:30:26 +00001998 op = UNPACK_VARARG;
1999 nargs = i/2;
2000 break;
2001 }
2002 }
2003 com_addoparg(c, op, nargs);
2004 for (i = 0; i < 2*nargs; i += 2)
2005 com_fpdef(c, CHILD(n, i));
2006 if (op == UNPACK_VARARG)
2007 com_addopname(c, STORE_NAME, CHILD(n, 2*nargs+1));
2008}
2009
2010static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002011com_file_input(c, n)
2012 struct compiling *c;
2013 node *n;
2014{
2015 int i;
2016 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
2017 for (i = 0; i < NCH(n); i++) {
2018 node *ch = CHILD(n, i);
2019 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
2020 com_node(c, ch);
2021 }
2022}
2023
2024/* Top-level compile-node interface */
2025
2026static void
2027compile_funcdef(c, n)
2028 struct compiling *c;
2029 node *n;
2030{
2031 node *ch;
2032 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00002033 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002034 com_addoparg(c, RESERVE_FAST, com_addconst(c, None)); /* Patched! */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002035 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
2036 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002037 if (TYPE(ch) == RPAR)
Guido van Rossum288a60f1991-12-16 13:05:10 +00002038 com_addoparg(c, UNPACK_ARG, 0);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002039 else
2040 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002041 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002042 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002043 c->c_infunction = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002044 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2045 com_addbyte(c, RETURN_VALUE);
2046}
2047
2048static void
2049compile_node(c, n)
2050 struct compiling *c;
2051 node *n;
2052{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002053 com_addoparg(c, SET_LINENO, n->n_lineno);
2054
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002055 switch (TYPE(n)) {
2056
Guido van Rossum4c417781991-01-21 16:09:22 +00002057 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002058 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
2059 n = CHILD(n, 0);
2060 if (TYPE(n) != NEWLINE)
2061 com_node(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002062 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2063 com_addbyte(c, RETURN_VALUE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002064 break;
2065
Guido van Rossum4c417781991-01-21 16:09:22 +00002066 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002067 com_file_input(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002068 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2069 com_addbyte(c, RETURN_VALUE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002070 break;
2071
Guido van Rossum4c417781991-01-21 16:09:22 +00002072 case expr_input: /* Built-in function eval() */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002073 com_node(c, CHILD(n, 0));
2074 com_addbyte(c, RETURN_VALUE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002075 break;
2076
Guido van Rossum4c417781991-01-21 16:09:22 +00002077 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00002078 com_node(c, CHILD(n, 0));
2079 com_addbyte(c, RETURN_VALUE);
2080 break;
2081
2082 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002083 compile_funcdef(c, n);
2084 break;
2085
Guido van Rossum4c417781991-01-21 16:09:22 +00002086 case classdef: /* A class definition */
Guido van Rossumc5e96291991-12-10 13:53:51 +00002087 /* classdef: 'class' NAME
2088 ['(' testlist ')' |'(' ')' ['=' baselist]]
2089 ':' suite */
Guido van Rossumc5e96291991-12-10 13:53:51 +00002090 com_node(c, CHILD(n, NCH(n)-1)); /* The suite */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002091 com_addbyte(c, LOAD_LOCALS);
2092 com_addbyte(c, RETURN_VALUE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002093 break;
2094
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002095 default:
2096 fprintf(stderr, "node type %d\n", TYPE(n));
2097 err_setstr(SystemError, "compile_node: unexpected node type");
2098 c->c_errors++;
2099 }
2100}
2101
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002102/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00002103
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002104 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
2105 instructions that refer to local variables with LOAD_FAST etc.
2106 The latter instructions are much faster because they don't need to
2107 look up the variable name in a dictionary.
Guido van Rossum282914b1991-04-04 10:42:56 +00002108
2109 To find all local variables, we check all STORE_NAME and IMPORT_FROM
2110 instructions. This yields all local variables, including arguments,
2111 function definitions, class definitions and import statements.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002112 (We don't check DELETE_NAME instructions, since if there's no
2113 STORE_NAME the DELETE_NAME will surely fail.)
Guido van Rossum282914b1991-04-04 10:42:56 +00002114
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002115 There is one problem: 'from foo import *' introduces local variables
2116 that we can't know while compiling. If this is the case, wo don't
2117 optimize at all (this rarely happens, since import is mostly used
2118 at the module level).
2119
2120 Note that, because of this optimization, code like the following
2121 won't work:
2122 eval('x = 1')
2123 print x
Guido van Rossum282914b1991-04-04 10:42:56 +00002124
2125 NB: this modifies the string object co->co_code!
2126*/
2127
2128static void
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002129optimize(c)
2130 struct compiling *c;
Guido van Rossum282914b1991-04-04 10:42:56 +00002131{
Guido van Rossum0a697f61991-04-16 08:39:12 +00002132 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00002133 object *locals;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002134 int nlocals;
Guido van Rossum282914b1991-04-04 10:42:56 +00002135 int opcode;
2136 int oparg;
2137 object *name;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002138 int fast_reserved;
2139 object *error_type, *error_value;
2140
Guido van Rossum282914b1991-04-04 10:42:56 +00002141#define NEXTOP() (*next_instr++)
2142#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
2143#define GETITEM(v, i) (getlistitem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002144#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
2145
Guido van Rossum282914b1991-04-04 10:42:56 +00002146 locals = newdictobject();
2147 if (locals == NULL) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002148 c->c_errors++;
2149 return;
Guido van Rossum282914b1991-04-04 10:42:56 +00002150 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002151 nlocals = 0;
2152
2153 err_get(&error_type, &error_value);
Guido van Rossum282914b1991-04-04 10:42:56 +00002154
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002155 next_instr = (unsigned char *) getstringvalue(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00002156 for (;;) {
2157 opcode = NEXTOP();
2158 if (opcode == STOP_CODE)
2159 break;
2160 if (HAS_ARG(opcode))
2161 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002162 if (opcode == STORE_NAME || opcode == DELETE_NAME ||
2163 opcode == IMPORT_FROM) {
2164 object *v;
Guido van Rossum282914b1991-04-04 10:42:56 +00002165 name = GETNAMEOBJ(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002166 if (dict2lookup(locals, name) != NULL)
2167 continue;
2168 err_clear();
2169 v = newintobject(nlocals);
2170 if (v == NULL) {
2171 c->c_errors++;
2172 goto err;
Guido van Rossum282914b1991-04-04 10:42:56 +00002173 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002174 nlocals++;
2175 if (dict2insert(locals, name, v) != 0) {
2176 DECREF(v);
2177 c->c_errors++;
2178 goto err;
2179 }
2180 DECREF(v);
Guido van Rossum282914b1991-04-04 10:42:56 +00002181 }
2182 }
2183
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002184 if (nlocals == 0 || dictlookup(locals, "*") != NULL) {
2185 /* Don't optimize anything */
2186 goto end;
2187 }
2188
2189 next_instr = (unsigned char *) getstringvalue(c->c_code);
2190 fast_reserved = 0;
Guido van Rossum282914b1991-04-04 10:42:56 +00002191 for (;;) {
2192 cur_instr = next_instr;
2193 opcode = NEXTOP();
2194 if (opcode == STOP_CODE)
2195 break;
2196 if (HAS_ARG(opcode))
2197 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002198 if (opcode == RESERVE_FAST) {
2199 int i = com_addconst(c, locals);
2200 cur_instr[1] = i & 0xff;
2201 cur_instr[2] = (i>>8) & 0xff;
2202 fast_reserved = 1;
2203 continue;
2204 }
2205 if (!fast_reserved)
2206 continue;
2207 if (opcode == LOAD_NAME ||
2208 opcode == STORE_NAME ||
2209 opcode == DELETE_NAME) {
2210 object *v;
2211 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00002212 name = GETNAMEOBJ(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002213 v = dict2lookup(locals, name);
2214 if (v == NULL) {
Guido van Rossum83163251991-08-16 08:58:43 +00002215 err_clear();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002216 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00002217 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002218 i = getintvalue(v);
2219 switch (opcode) {
2220 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
2221 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
2222 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
2223 }
2224 cur_instr[1] = i & 0xff;
2225 cur_instr[2] = (i>>8) & 0xff;
Guido van Rossum282914b1991-04-04 10:42:56 +00002226 }
2227 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002228
2229 end:
2230 err_setval(error_type, error_value);
2231 err:
Guido van Rossum282914b1991-04-04 10:42:56 +00002232 DECREF(locals);
2233}
2234
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002235codeobject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002236compile(n, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002237 node *n;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002238 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002239{
2240 struct compiling sc;
2241 codeobject *co;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002242 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002243 return NULL;
2244 compile_node(&sc, n);
2245 com_done(&sc);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002246 if (TYPE(n) == funcdef && sc.c_errors == 0)
2247 optimize(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00002248 co = NULL;
2249 if (sc.c_errors == 0) {
2250 object *v, *w;
2251 v = newstringobject(sc.c_filename);
2252 w = newstringobject(sc.c_name);
2253 if (v != NULL && w != NULL)
2254 co = newcodeobject(sc.c_code, sc.c_consts,
2255 sc.c_names, v, w);
2256 XDECREF(v);
2257 XDECREF(w);
Guido van Rossuma082ce41991-06-04 19:41:56 +00002258 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002259 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002260 return co;
2261}