blob: df81f8f86fb511c99a92c1a04ac03e1b3f9e9f4e [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The 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,
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000130 (destructor)code_dealloc, /*tp_dealloc*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000131 0, /*tp_print*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000132 (getattrfunc)code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000133 0, /*tp_setattr*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000134 (cmpfunc)code_compare, /*tp_compare*/
135 (reprfunc)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 Rossum4ca6c9d1994-08-29 12:16:12 +0000139 (hashfunc)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) ||
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000154 consts == NULL ||
155 names == NULL ||
Guido van Rossum590baa41993-11-30 13:40:46 +0000156 name == NULL || !(is_stringobject(name) || name == None)) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000157 err_badcall();
158 return NULL;
159 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000160 /* Allow two lists instead of two tuples */
161 if (is_listobject(consts) && is_listobject(names)) {
162 consts = listtuple(consts);
163 if (consts == NULL)
164 return NULL;
165 names = listtuple(names);
166 if (names == NULL) {
167 DECREF(consts);
168 return NULL;
169 }
170 }
171 else if (!is_tupleobject(consts) && !is_tupleobject(names)) {
172 err_badcall();
173 return NULL;
174 }
175 else {
176 INCREF(consts);
177 INCREF(names);
178 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000179 /* Make sure the list of names contains only strings */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000180 for (i = gettuplesize(names); --i >= 0; ) {
181 object *v = gettupleitem(names, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000182 if (v == NULL || !is_stringobject(v)) {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000183 DECREF(consts);
184 DECREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000185 err_badcall();
186 return NULL;
187 }
188 }
189 co = NEWOBJ(codeobject, &Codetype);
190 if (co != NULL) {
191 INCREF(code);
192 co->co_code = (stringobject *)code;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000193 co->co_consts = consts;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000194 co->co_names = names;
Guido van Rossuma082ce41991-06-04 19:41:56 +0000195 INCREF(filename);
196 co->co_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000197 INCREF(name);
198 co->co_name = name;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000199 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000200 else {
201 DECREF(consts);
202 DECREF(names);
203 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000204 return co;
205}
206
207
208/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000209
210#define MAXBLOCKS 20 /* Max static block nesting within a function */
211
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000212struct compiling {
213 object *c_code; /* string */
214 object *c_consts; /* list of objects */
215 object *c_names; /* list of strings (names) */
Guido van Rossumc5e96291991-12-10 13:53:51 +0000216 object *c_globals; /* dictionary */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000217 int c_nexti; /* index into c_code */
218 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000219 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000220 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000221 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000222 int c_begin; /* begin of current loop, for 'continue' */
223 int c_block[MAXBLOCKS]; /* stack of block types */
224 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000225 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000226 char *c_name; /* name of object (e.g. function) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000227};
228
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000229
230/* Interface to the block stack */
231
232static void
233block_push(c, type)
234 struct compiling *c;
235 int type;
236{
237 if (c->c_nblocks >= MAXBLOCKS) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +0000238 err_setstr(SystemError, "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000239 c->c_errors++;
240 }
241 else {
242 c->c_block[c->c_nblocks++] = type;
243 }
244}
245
246static void
247block_pop(c, type)
248 struct compiling *c;
249 int type;
250{
251 if (c->c_nblocks > 0)
252 c->c_nblocks--;
253 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
254 err_setstr(SystemError, "bad block pop");
255 c->c_errors++;
256 }
257}
258
259
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000260/* Prototypes */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000261
Guido van Rossum590baa41993-11-30 13:40:46 +0000262static int com_init PROTO((struct compiling *, char *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000263static void com_free PROTO((struct compiling *));
264static void com_done PROTO((struct compiling *));
265static void com_node PROTO((struct compiling *, struct _node *));
266static void com_addbyte PROTO((struct compiling *, int));
267static void com_addint PROTO((struct compiling *, int));
268static void com_addoparg PROTO((struct compiling *, int, int));
269static void com_addfwref PROTO((struct compiling *, int, int *));
270static void com_backpatch PROTO((struct compiling *, int));
271static int com_add PROTO((struct compiling *, object *, object *));
272static int com_addconst PROTO((struct compiling *, object *));
273static int com_addname PROTO((struct compiling *, object *));
274static void com_addopname PROTO((struct compiling *, int, node *));
Guido van Rossum288a60f1991-12-16 13:05:10 +0000275static void com_list PROTO((struct compiling *, node *, int));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000276static int com_argdefs PROTO((struct compiling *, node *, int *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000277
278static int
Guido van Rossum590baa41993-11-30 13:40:46 +0000279com_init(c, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000280 struct compiling *c;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000281 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000282{
Guido van Rossum62d46241991-04-03 19:00:23 +0000283 if ((c->c_code = newsizedstringobject((char *)NULL, 1000)) == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000284 goto fail_3;
285 if ((c->c_consts = newlistobject(0)) == NULL)
286 goto fail_2;
287 if ((c->c_names = newlistobject(0)) == NULL)
288 goto fail_1;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000289 if ((c->c_globals = newdictobject()) == NULL)
290 goto fail_0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000291 c->c_nexti = 0;
292 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000293 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000294 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000295 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000296 c->c_begin = 0;
297 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000298 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000299 c->c_name = "?";
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000300 return 1;
301
Guido van Rossumc5e96291991-12-10 13:53:51 +0000302 fail_0:
303 DECREF(c->c_names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000304 fail_1:
305 DECREF(c->c_consts);
306 fail_2:
307 DECREF(c->c_code);
308 fail_3:
309 return 0;
310}
311
312static void
313com_free(c)
314 struct compiling *c;
315{
316 XDECREF(c->c_code);
317 XDECREF(c->c_consts);
318 XDECREF(c->c_names);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000319 XDECREF(c->c_globals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000320}
321
322static void
323com_done(c)
324 struct compiling *c;
325{
326 if (c->c_code != NULL)
327 resizestring(&c->c_code, c->c_nexti);
328}
329
330static void
331com_addbyte(c, byte)
332 struct compiling *c;
333 int byte;
334{
335 int len;
336 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000337 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000338 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000339 fatal("com_addbyte: byte out of range");
Guido van Rossum01cfd441991-10-20 20:12:38 +0000340 */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000341 err_setstr(SystemError, "com_addbyte: byte out of range");
342 c->c_errors++;
343 }
344 if (c->c_code == NULL)
345 return;
346 len = getstringsize(c->c_code);
347 if (c->c_nexti >= len) {
348 if (resizestring(&c->c_code, len+1000) != 0) {
349 c->c_errors++;
350 return;
351 }
352 }
353 getstringvalue(c->c_code)[c->c_nexti++] = byte;
354}
355
356static void
357com_addint(c, x)
358 struct compiling *c;
359 int x;
360{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000361 com_addbyte(c, x & 0xff);
362 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000363}
364
365static void
366com_addoparg(c, op, arg)
367 struct compiling *c;
368 int op;
369 int arg;
370{
371 com_addbyte(c, op);
372 com_addint(c, arg);
373}
374
375static void
376com_addfwref(c, op, p_anchor)
377 struct compiling *c;
378 int op;
379 int *p_anchor;
380{
381 /* Compile a forward reference for backpatching */
382 int here;
383 int anchor;
384 com_addbyte(c, op);
385 here = c->c_nexti;
386 anchor = *p_anchor;
387 *p_anchor = here;
388 com_addint(c, anchor == 0 ? 0 : here - anchor);
389}
390
391static void
392com_backpatch(c, anchor)
393 struct compiling *c;
394 int anchor; /* Must be nonzero */
395{
396 unsigned char *code = (unsigned char *) getstringvalue(c->c_code);
397 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000398 int dist;
399 int prev;
400 for (;;) {
401 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000402 prev = code[anchor] + (code[anchor+1] << 8);
403 dist = target - (anchor+2);
404 code[anchor] = dist & 0xff;
405 code[anchor+1] = dist >> 8;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000406 if (!prev)
407 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000408 anchor -= prev;
409 }
410}
411
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000412/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000413
414static int
415com_add(c, list, v)
416 struct compiling *c;
417 object *list;
418 object *v;
419{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000420 int n = getlistsize(list);
421 int i;
422 for (i = n; --i >= 0; ) {
423 object *w = getlistitem(list, i);
Guido van Rossumefc0bd01991-07-01 18:44:20 +0000424 if (v->ob_type == w->ob_type && cmpobject(v, w) == 0)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000425 return i;
426 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000427 if (addlistitem(list, v) != 0)
428 c->c_errors++;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000429 return n;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000430}
431
432static int
433com_addconst(c, v)
434 struct compiling *c;
435 object *v;
436{
437 return com_add(c, c->c_consts, v);
438}
439
440static int
441com_addname(c, v)
442 struct compiling *c;
443 object *v;
444{
445 return com_add(c, c->c_names, v);
446}
447
448static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000449com_addopnamestr(c, op, name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000450 struct compiling *c;
451 int op;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000452 char *name;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000453{
454 object *v;
455 int i;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000456 if (name == NULL || (v = newstringobject(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000457 c->c_errors++;
458 i = 255;
459 }
460 else {
461 i = com_addname(c, v);
462 DECREF(v);
463 }
Guido van Rossumc5e96291991-12-10 13:53:51 +0000464 /* Hack to replace *_NAME opcodes by *_GLOBAL if necessary */
465 switch (op) {
466 case LOAD_NAME:
467 case STORE_NAME:
468 case DELETE_NAME:
469 if (dictlookup(c->c_globals, name) != NULL) {
470 switch (op) {
471 case LOAD_NAME: op = LOAD_GLOBAL; break;
472 case STORE_NAME: op = STORE_GLOBAL; break;
473 case DELETE_NAME: op = DELETE_GLOBAL; break;
474 }
475 }
476 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000477 com_addoparg(c, op, i);
478}
479
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000480static void
481com_addopname(c, op, n)
482 struct compiling *c;
483 int op;
484 node *n;
485{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000486 char *name;
487 char buffer[1000];
488 /* XXX it is possible to write this code without the 1000
489 chars on the total length of dotted names, I just can't be
490 bothered right now */
491 if (TYPE(n) == STAR)
492 name = "*";
493 else if (TYPE(n) == dotted_name) {
494 char *p = buffer;
495 int i;
496 name = buffer;
497 for (i = 0; i < NCH(n); i += 2) {
498 char *s = STR(CHILD(n, i));
499 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
500 err_setstr(MemoryError,
501 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +0000502 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000503 break;
504 }
505 if (p != buffer)
506 *p++ = '.';
507 strcpy(p, s);
508 p = strchr(p, '\0');
509 }
510 }
511 else {
512 REQ(n, NAME);
513 name = STR(n);
514 }
515 com_addopnamestr(c, op, name);
516}
517
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000518static object *
519parsenumber(s)
520 char *s;
521{
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000522 extern long mystrtol PROTO((const char *, char **, int));
523 extern unsigned long mystrtoul PROTO((const char *, char **, int));
524 extern double atof PROTO((const char *));
Guido van Rossumc5e96291991-12-10 13:53:51 +0000525 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000526 long x;
Guido van Rossum282914b1991-04-04 10:42:56 +0000527 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000528 end = s + strlen(s) - 1;
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000529 if (*end == 'l' || *end == 'L')
Guido van Rossumc5e96291991-12-10 13:53:51 +0000530 return long_scan(s, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000531 if (s[0] == '0')
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000532 x = (long) mystrtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000533 else
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000534 x = mystrtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +0000535 if (*end == '\0') {
536 if (errno != 0) {
Guido van Rossumefb087b1991-12-16 15:41:41 +0000537 err_setstr(OverflowError,
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000538 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000539 return NULL;
540 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000541 return newintobject(x);
Guido van Rossum282914b1991-04-04 10:42:56 +0000542 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000543 /* XXX Huge floats may silently fail */
544 return newfloatobject(atof(s));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000545}
546
547static object *
548parsestr(s)
549 char *s;
550{
551 object *v;
552 int len;
553 char *buf;
554 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000555 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000556 int c;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000557 int quote = *s;
558 if (quote != '\'' && quote != '\"') {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000559 err_badcall();
560 return NULL;
561 }
562 s++;
563 len = strlen(s);
Guido van Rossum8054fad1993-10-26 15:19:44 +0000564 if (s[--len] != quote) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000565 err_badcall();
566 return NULL;
567 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000568 if (len >= 4 && s[0] == quote && s[1] == quote) {
569 s += 2;
570 len -= 2;
571 if (s[--len] != quote || s[--len] != quote) {
572 err_badcall();
573 return NULL;
574 }
575 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000576 if (strchr(s, '\\') == NULL)
577 return newsizedstringobject(s, len);
578 v = newsizedstringobject((char *)NULL, len);
579 p = buf = getstringvalue(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000580 end = s + len;
581 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000582 if (*s != '\\') {
583 *p++ = *s++;
584 continue;
585 }
586 s++;
587 switch (*s++) {
588 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000589 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000590 case '\\': *p++ = '\\'; break;
591 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000592 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000593 case 'b': *p++ = '\b'; break;
594 case 'f': *p++ = '\014'; break; /* FF */
595 case 't': *p++ = '\t'; break;
596 case 'n': *p++ = '\n'; break;
597 case 'r': *p++ = '\r'; break;
598 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000599 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
600 case '0': case '1': case '2': case '3':
601 case '4': case '5': case '6': case '7':
602 c = s[-1] - '0';
603 if ('0' <= *s && *s <= '7') {
604 c = (c<<3) + *s++ - '0';
605 if ('0' <= *s && *s <= '7')
606 c = (c<<3) + *s++ - '0';
607 }
608 *p++ = c;
609 break;
610 case 'x':
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000611 if (isxdigit(Py_CHARMASK(*s))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000612 sscanf(s, "%x", &c);
613 *p++ = c;
614 do {
615 s++;
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000616 } while (isxdigit(Py_CHARMASK(*s)));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000617 break;
618 }
619 /* FALLTHROUGH */
620 default: *p++ = '\\'; *p++ = s[-1]; break;
621 }
622 }
623 resizestring(&v, (int)(p - buf));
624 return v;
625}
626
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000627static object *
628parsestrplus(n)
629 node *n;
630{
631 object *v;
632 int i;
633 REQ(CHILD(n, 0), STRING);
634 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
635 /* String literal concatenation */
636 for (i = 1; i < NCH(n) && v != NULL; i++) {
637 joinstring_decref(&v, parsestr(STR(CHILD(n, i))));
638 }
639 }
640 return v;
641}
642
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000643static void
644com_list_constructor(c, n)
645 struct compiling *c;
646 node *n;
647{
648 int len;
649 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000650 if (TYPE(n) != testlist)
651 REQ(n, exprlist);
652 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
653 len = (NCH(n) + 1) / 2;
654 for (i = 0; i < NCH(n); i += 2)
655 com_node(c, CHILD(n, i));
656 com_addoparg(c, BUILD_LIST, len);
657}
658
659static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000660com_dictmaker(c, n)
661 struct compiling *c;
662 node *n;
663{
664 int i;
665 /* dictmaker: test ':' test (',' test ':' value)* [','] */
666 for (i = 0; i+2 < NCH(n); i += 4) {
667 /* We must arrange things just right for STORE_SUBSCR.
668 It wants the stack to look like (value) (dict) (key) */
669 com_addbyte(c, DUP_TOP);
670 com_node(c, CHILD(n, i+2)); /* value */
671 com_addbyte(c, ROT_TWO);
672 com_node(c, CHILD(n, i)); /* key */
673 com_addbyte(c, STORE_SUBSCR);
674 }
675}
676
677static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000678com_atom(c, n)
679 struct compiling *c;
680 node *n;
681{
682 node *ch;
683 object *v;
684 int i;
685 REQ(n, atom);
686 ch = CHILD(n, 0);
687 switch (TYPE(ch)) {
688 case LPAR:
689 if (TYPE(CHILD(n, 1)) == RPAR)
690 com_addoparg(c, BUILD_TUPLE, 0);
691 else
692 com_node(c, CHILD(n, 1));
693 break;
694 case LSQB:
695 if (TYPE(CHILD(n, 1)) == RSQB)
696 com_addoparg(c, BUILD_LIST, 0);
697 else
698 com_list_constructor(c, CHILD(n, 1));
699 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000700 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000701 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000702 if (TYPE(CHILD(n, 1)) != RBRACE)
703 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000704 break;
705 case BACKQUOTE:
706 com_node(c, CHILD(n, 1));
707 com_addbyte(c, UNARY_CONVERT);
708 break;
709 case NUMBER:
710 if ((v = parsenumber(STR(ch))) == NULL) {
711 c->c_errors++;
712 i = 255;
713 }
714 else {
715 i = com_addconst(c, v);
716 DECREF(v);
717 }
718 com_addoparg(c, LOAD_CONST, i);
719 break;
720 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000721 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000722 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000723 c->c_errors++;
724 i = 255;
725 }
726 else {
727 i = com_addconst(c, v);
728 DECREF(v);
729 }
730 com_addoparg(c, LOAD_CONST, i);
731 break;
732 case NAME:
733 com_addopname(c, LOAD_NAME, ch);
734 break;
735 default:
736 fprintf(stderr, "node type %d\n", TYPE(ch));
737 err_setstr(SystemError, "com_atom: unexpected node type");
738 c->c_errors++;
739 }
740}
741
742static void
743com_slice(c, n, op)
744 struct compiling *c;
745 node *n;
746 int op;
747{
748 if (NCH(n) == 1) {
749 com_addbyte(c, op);
750 }
751 else if (NCH(n) == 2) {
752 if (TYPE(CHILD(n, 0)) != COLON) {
753 com_node(c, CHILD(n, 0));
754 com_addbyte(c, op+1);
755 }
756 else {
757 com_node(c, CHILD(n, 1));
758 com_addbyte(c, op+2);
759 }
760 }
761 else {
762 com_node(c, CHILD(n, 0));
763 com_node(c, CHILD(n, 2));
764 com_addbyte(c, op+3);
765 }
766}
767
768static void
769com_apply_subscript(c, n)
770 struct compiling *c;
771 node *n;
772{
773 REQ(n, subscript);
774 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) != COLON) {
775 /* It's a single subscript */
776 com_node(c, CHILD(n, 0));
777 com_addbyte(c, BINARY_SUBSCR);
778 }
779 else {
780 /* It's a slice: [expr] ':' [expr] */
781 com_slice(c, n, SLICE);
782 }
783}
784
Guido van Rossumf10570b1995-07-07 22:53:21 +0000785static int
786com_argument(c, n, inkeywords)
787 struct compiling *c;
788 node *n; /* argument */
789 int inkeywords;
790{
791 node *m;
792 REQ(n, argument); /* [test '='] test; really [ keyword '='] keyword */
793 if (NCH(n) == 1) {
794 if (inkeywords) {
795 err_setstr(SyntaxError,
796 "non-keyword arg after keyword arg");
797 c->c_errors++;
798 }
799 else {
800 com_node(c, CHILD(n, 0));
801 }
802 return 0;
803 }
804 m = n;
805 do {
806 m = CHILD(m, 0);
807 } while (NCH(m) == 1);
808 if (TYPE(m) != NAME) {
809 err_setstr(SyntaxError, "keyword can't be an expression");
810 c->c_errors++;
811 }
812 else {
813 object *v = newstringobject(STR(m));
814 if (v == NULL)
815 c->c_errors++;
816 else {
817 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
818 DECREF(v);
819 }
820 }
821 com_node(c, CHILD(n, 2));
822 return 1;
823}
824
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000825static void
826com_call_function(c, n)
827 struct compiling *c;
Guido van Rossumf10570b1995-07-07 22:53:21 +0000828 node *n; /* EITHER arglist OR ')' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000829{
830 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +0000831 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000832 }
833 else {
Guido van Rossumf10570b1995-07-07 22:53:21 +0000834 int inkeywords, i, na, nk;
835 REQ(n, arglist);
836 inkeywords = 0;
837 na = 0;
838 nk = 0;
839 for (i = 0; i < NCH(n); i += 2) {
840 inkeywords = com_argument(c, CHILD(n, i), inkeywords);
841 if (!inkeywords)
842 na++;
843 else
844 nk++;
845 }
846 if (na > 255 || nk > 255) {
847 err_setstr(SyntaxError, "more than 255 arguments");
848 c->c_errors++;
849 }
850 com_addoparg(c, CALL_FUNCTION, na | (nk << 8));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000851 }
852}
853
854static void
855com_select_member(c, n)
856 struct compiling *c;
857 node *n;
858{
859 com_addopname(c, LOAD_ATTR, n);
860}
861
862static void
863com_apply_trailer(c, n)
864 struct compiling *c;
865 node *n;
866{
867 REQ(n, trailer);
868 switch (TYPE(CHILD(n, 0))) {
869 case LPAR:
870 com_call_function(c, CHILD(n, 1));
871 break;
872 case DOT:
873 com_select_member(c, CHILD(n, 1));
874 break;
875 case LSQB:
876 com_apply_subscript(c, CHILD(n, 1));
877 break;
878 default:
879 err_setstr(SystemError,
880 "com_apply_trailer: unknown trailer type");
881 c->c_errors++;
882 }
883}
884
885static void
886com_factor(c, n)
887 struct compiling *c;
888 node *n;
889{
890 int i;
891 REQ(n, factor);
892 if (TYPE(CHILD(n, 0)) == PLUS) {
893 com_factor(c, CHILD(n, 1));
894 com_addbyte(c, UNARY_POSITIVE);
895 }
896 else if (TYPE(CHILD(n, 0)) == MINUS) {
897 com_factor(c, CHILD(n, 1));
898 com_addbyte(c, UNARY_NEGATIVE);
899 }
Guido van Rossum7928cd71991-10-24 14:59:31 +0000900 else if (TYPE(CHILD(n, 0)) == TILDE) {
901 com_factor(c, CHILD(n, 1));
902 com_addbyte(c, UNARY_INVERT);
903 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000904 else {
905 com_atom(c, CHILD(n, 0));
906 for (i = 1; i < NCH(n); i++)
907 com_apply_trailer(c, CHILD(n, i));
908 }
909}
910
911static void
912com_term(c, n)
913 struct compiling *c;
914 node *n;
915{
916 int i;
917 int op;
918 REQ(n, term);
919 com_factor(c, CHILD(n, 0));
920 for (i = 2; i < NCH(n); i += 2) {
921 com_factor(c, CHILD(n, i));
922 switch (TYPE(CHILD(n, i-1))) {
923 case STAR:
924 op = BINARY_MULTIPLY;
925 break;
926 case SLASH:
927 op = BINARY_DIVIDE;
928 break;
929 case PERCENT:
930 op = BINARY_MODULO;
931 break;
932 default:
933 err_setstr(SystemError,
Guido van Rossum7928cd71991-10-24 14:59:31 +0000934 "com_term: operator not *, / or %");
935 c->c_errors++;
936 op = 255;
937 }
938 com_addbyte(c, op);
939 }
940}
941
942static void
943com_arith_expr(c, n)
944 struct compiling *c;
945 node *n;
946{
947 int i;
948 int op;
949 REQ(n, arith_expr);
950 com_term(c, CHILD(n, 0));
951 for (i = 2; i < NCH(n); i += 2) {
952 com_term(c, CHILD(n, i));
953 switch (TYPE(CHILD(n, i-1))) {
954 case PLUS:
955 op = BINARY_ADD;
956 break;
957 case MINUS:
958 op = BINARY_SUBTRACT;
959 break;
960 default:
961 err_setstr(SystemError,
962 "com_arith_expr: operator not + or -");
963 c->c_errors++;
964 op = 255;
965 }
966 com_addbyte(c, op);
967 }
968}
969
970static void
971com_shift_expr(c, n)
972 struct compiling *c;
973 node *n;
974{
975 int i;
976 int op;
977 REQ(n, shift_expr);
978 com_arith_expr(c, CHILD(n, 0));
979 for (i = 2; i < NCH(n); i += 2) {
980 com_arith_expr(c, CHILD(n, i));
981 switch (TYPE(CHILD(n, i-1))) {
982 case LEFTSHIFT:
983 op = BINARY_LSHIFT;
984 break;
985 case RIGHTSHIFT:
986 op = BINARY_RSHIFT;
987 break;
988 default:
989 err_setstr(SystemError,
990 "com_shift_expr: operator not << or >>");
991 c->c_errors++;
992 op = 255;
993 }
994 com_addbyte(c, op);
995 }
996}
997
998static void
999com_and_expr(c, n)
1000 struct compiling *c;
1001 node *n;
1002{
1003 int i;
1004 int op;
1005 REQ(n, and_expr);
1006 com_shift_expr(c, CHILD(n, 0));
1007 for (i = 2; i < NCH(n); i += 2) {
1008 com_shift_expr(c, CHILD(n, i));
1009 if (TYPE(CHILD(n, i-1)) == AMPER) {
1010 op = BINARY_AND;
1011 }
1012 else {
1013 err_setstr(SystemError,
1014 "com_and_expr: operator not &");
1015 c->c_errors++;
1016 op = 255;
1017 }
1018 com_addbyte(c, op);
1019 }
1020}
1021
1022static void
1023com_xor_expr(c, n)
1024 struct compiling *c;
1025 node *n;
1026{
1027 int i;
1028 int op;
1029 REQ(n, xor_expr);
1030 com_and_expr(c, CHILD(n, 0));
1031 for (i = 2; i < NCH(n); i += 2) {
1032 com_and_expr(c, CHILD(n, i));
1033 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1034 op = BINARY_XOR;
1035 }
1036 else {
1037 err_setstr(SystemError,
1038 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001039 c->c_errors++;
1040 op = 255;
1041 }
1042 com_addbyte(c, op);
1043 }
1044}
1045
1046static void
1047com_expr(c, n)
1048 struct compiling *c;
1049 node *n;
1050{
1051 int i;
1052 int op;
1053 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001054 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001055 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001056 com_xor_expr(c, CHILD(n, i));
1057 if (TYPE(CHILD(n, i-1)) == VBAR) {
1058 op = BINARY_OR;
1059 }
1060 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001061 err_setstr(SystemError,
Guido van Rossum7928cd71991-10-24 14:59:31 +00001062 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001063 c->c_errors++;
1064 op = 255;
1065 }
1066 com_addbyte(c, op);
1067 }
1068}
1069
1070static enum cmp_op
1071cmp_type(n)
1072 node *n;
1073{
1074 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001075 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001076 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1077 if (NCH(n) == 1) {
1078 n = CHILD(n, 0);
1079 switch (TYPE(n)) {
1080 case LESS: return LT;
1081 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001082 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001083 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001084 case LESSEQUAL: return LE;
1085 case GREATEREQUAL: return GE;
1086 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001087 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1088 if (strcmp(STR(n), "is") == 0) return IS;
1089 }
1090 }
1091 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001092 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001093 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1094 return NOT_IN;
1095 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1096 return IS_NOT;
1097 }
1098 }
1099 return BAD;
1100}
1101
1102static void
1103com_comparison(c, n)
1104 struct compiling *c;
1105 node *n;
1106{
1107 int i;
1108 enum cmp_op op;
1109 int anchor;
1110 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
1111 com_expr(c, CHILD(n, 0));
1112 if (NCH(n) == 1)
1113 return;
1114
1115 /****************************************************************
1116 The following code is generated for all but the last
1117 comparison in a chain:
1118
1119 label: on stack: opcode: jump to:
1120
1121 a <code to load b>
1122 a, b DUP_TOP
1123 a, b, b ROT_THREE
1124 b, a, b COMPARE_OP
1125 b, 0-or-1 JUMP_IF_FALSE L1
1126 b, 1 POP_TOP
1127 b
1128
1129 We are now ready to repeat this sequence for the next
1130 comparison in the chain.
1131
1132 For the last we generate:
1133
1134 b <code to load c>
1135 b, c COMPARE_OP
1136 0-or-1
1137
1138 If there were any jumps to L1 (i.e., there was more than one
1139 comparison), we generate:
1140
1141 0-or-1 JUMP_FORWARD L2
1142 L1: b, 0 ROT_TWO
1143 0, b POP_TOP
1144 0
1145 L2:
1146 ****************************************************************/
1147
1148 anchor = 0;
1149
1150 for (i = 2; i < NCH(n); i += 2) {
1151 com_expr(c, CHILD(n, i));
1152 if (i+2 < NCH(n)) {
1153 com_addbyte(c, DUP_TOP);
1154 com_addbyte(c, ROT_THREE);
1155 }
1156 op = cmp_type(CHILD(n, i-1));
1157 if (op == BAD) {
1158 err_setstr(SystemError,
1159 "com_comparison: unknown comparison op");
1160 c->c_errors++;
1161 }
1162 com_addoparg(c, COMPARE_OP, op);
1163 if (i+2 < NCH(n)) {
1164 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1165 com_addbyte(c, POP_TOP);
1166 }
1167 }
1168
1169 if (anchor) {
1170 int anchor2 = 0;
1171 com_addfwref(c, JUMP_FORWARD, &anchor2);
1172 com_backpatch(c, anchor);
1173 com_addbyte(c, ROT_TWO);
1174 com_addbyte(c, POP_TOP);
1175 com_backpatch(c, anchor2);
1176 }
1177}
1178
1179static void
1180com_not_test(c, n)
1181 struct compiling *c;
1182 node *n;
1183{
1184 REQ(n, not_test); /* 'not' not_test | comparison */
1185 if (NCH(n) == 1) {
1186 com_comparison(c, CHILD(n, 0));
1187 }
1188 else {
1189 com_not_test(c, CHILD(n, 1));
1190 com_addbyte(c, UNARY_NOT);
1191 }
1192}
1193
1194static void
1195com_and_test(c, n)
1196 struct compiling *c;
1197 node *n;
1198{
1199 int i;
1200 int anchor;
1201 REQ(n, and_test); /* not_test ('and' not_test)* */
1202 anchor = 0;
1203 i = 0;
1204 for (;;) {
1205 com_not_test(c, CHILD(n, i));
1206 if ((i += 2) >= NCH(n))
1207 break;
1208 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1209 com_addbyte(c, POP_TOP);
1210 }
1211 if (anchor)
1212 com_backpatch(c, anchor);
1213}
1214
1215static void
1216com_test(c, n)
1217 struct compiling *c;
1218 node *n;
1219{
Guido van Rossum57531fe1993-11-30 14:57:42 +00001220 REQ(n, test); /* and_test ('and' and_test)* | lambdef */
1221 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
1222 object *v;
1223 int i;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001224 int argcount;
1225 int ndefs = com_argdefs(c, CHILD(n, 0), &argcount);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001226 v = (object *) compile(CHILD(n, 0), c->c_filename);
1227 if (v == NULL) {
1228 c->c_errors++;
1229 i = 255;
1230 }
1231 else {
1232 i = com_addconst(c, v);
1233 DECREF(v);
1234 }
1235 com_addoparg(c, LOAD_CONST, i);
1236 com_addbyte(c, BUILD_FUNCTION);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001237 if (ndefs > 0)
1238 com_addoparg(c, SET_FUNC_ARGS, argcount);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001239 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00001240 else {
1241 int anchor = 0;
1242 int i = 0;
1243 for (;;) {
1244 com_and_test(c, CHILD(n, i));
1245 if ((i += 2) >= NCH(n))
1246 break;
1247 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1248 com_addbyte(c, POP_TOP);
1249 }
1250 if (anchor)
1251 com_backpatch(c, anchor);
1252 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001253}
1254
1255static void
Guido van Rossum288a60f1991-12-16 13:05:10 +00001256com_list(c, n, toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001257 struct compiling *c;
1258 node *n;
Guido van Rossum288a60f1991-12-16 13:05:10 +00001259 int toplevel; /* If nonzero, *always* build a tuple */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001260{
1261 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001262 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001263 com_node(c, CHILD(n, 0));
1264 }
1265 else {
1266 int i;
1267 int len;
1268 len = (NCH(n) + 1) / 2;
1269 for (i = 0; i < NCH(n); i += 2)
1270 com_node(c, CHILD(n, i));
1271 com_addoparg(c, BUILD_TUPLE, len);
1272 }
1273}
1274
1275
1276/* Begin of assignment compilation */
1277
1278static void com_assign_name PROTO((struct compiling *, node *, int));
1279static void com_assign PROTO((struct compiling *, node *, int));
1280
1281static void
1282com_assign_attr(c, n, assigning)
1283 struct compiling *c;
1284 node *n;
1285 int assigning;
1286{
1287 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
1288}
1289
1290static void
1291com_assign_slice(c, n, assigning)
1292 struct compiling *c;
1293 node *n;
1294 int assigning;
1295{
1296 com_slice(c, n, assigning ? STORE_SLICE : DELETE_SLICE);
1297}
1298
1299static void
1300com_assign_subscript(c, n, assigning)
1301 struct compiling *c;
1302 node *n;
1303 int assigning;
1304{
1305 com_node(c, n);
1306 com_addbyte(c, assigning ? STORE_SUBSCR : DELETE_SUBSCR);
1307}
1308
1309static void
1310com_assign_trailer(c, n, assigning)
1311 struct compiling *c;
1312 node *n;
1313 int assigning;
1314{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001315 REQ(n, trailer);
1316 switch (TYPE(CHILD(n, 0))) {
1317 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001318 err_setstr(SyntaxError, "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001319 c->c_errors++;
1320 break;
1321 case DOT: /* '.' NAME */
1322 com_assign_attr(c, CHILD(n, 1), assigning);
1323 break;
1324 case LSQB: /* '[' subscript ']' */
1325 n = CHILD(n, 1);
1326 REQ(n, subscript); /* subscript: expr | [expr] ':' [expr] */
1327 if (NCH(n) > 1 || TYPE(CHILD(n, 0)) == COLON)
1328 com_assign_slice(c, n, assigning);
1329 else
1330 com_assign_subscript(c, CHILD(n, 0), assigning);
1331 break;
1332 default:
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001333 err_setstr(SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001334 c->c_errors++;
1335 }
1336}
1337
1338static void
1339com_assign_tuple(c, n, assigning)
1340 struct compiling *c;
1341 node *n;
1342 int assigning;
1343{
1344 int i;
1345 if (TYPE(n) != testlist)
1346 REQ(n, exprlist);
1347 if (assigning)
1348 com_addoparg(c, UNPACK_TUPLE, (NCH(n)+1)/2);
1349 for (i = 0; i < NCH(n); i += 2)
1350 com_assign(c, CHILD(n, i), assigning);
1351}
1352
1353static void
1354com_assign_list(c, n, assigning)
1355 struct compiling *c;
1356 node *n;
1357 int assigning;
1358{
1359 int i;
1360 if (assigning)
1361 com_addoparg(c, UNPACK_LIST, (NCH(n)+1)/2);
1362 for (i = 0; i < NCH(n); i += 2)
1363 com_assign(c, CHILD(n, i), assigning);
1364}
1365
1366static void
1367com_assign_name(c, n, assigning)
1368 struct compiling *c;
1369 node *n;
1370 int assigning;
1371{
1372 REQ(n, NAME);
1373 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
1374}
1375
1376static void
1377com_assign(c, n, assigning)
1378 struct compiling *c;
1379 node *n;
1380 int assigning;
1381{
1382 /* Loop to avoid trivial recursion */
1383 for (;;) {
1384 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001385
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001386 case exprlist:
1387 case testlist:
1388 if (NCH(n) > 1) {
1389 com_assign_tuple(c, n, assigning);
1390 return;
1391 }
1392 n = CHILD(n, 0);
1393 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001394
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001395 case test:
1396 case and_test:
1397 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001398 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001399 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001400 case xor_expr:
1401 case and_expr:
1402 case shift_expr:
1403 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001404 case term:
1405 if (NCH(n) > 1) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001406 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001407 "can't assign to operator");
1408 c->c_errors++;
1409 return;
1410 }
1411 n = CHILD(n, 0);
1412 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001413
Guido van Rossum7928cd71991-10-24 14:59:31 +00001414 case factor: /* ('+'|'-'|'~') factor | atom trailer* */
1415 if (TYPE(CHILD(n, 0)) != atom) { /* '+'|'-'|'~' */
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001416 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001417 "can't assign to operator");
1418 c->c_errors++;
1419 return;
1420 }
1421 if (NCH(n) > 1) { /* trailer present */
1422 int i;
1423 com_node(c, CHILD(n, 0));
1424 for (i = 1; i+1 < NCH(n); i++) {
1425 com_apply_trailer(c, CHILD(n, i));
1426 } /* NB i is still alive */
1427 com_assign_trailer(c,
1428 CHILD(n, i), assigning);
1429 return;
1430 }
1431 n = CHILD(n, 0);
1432 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001433
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001434 case atom:
1435 switch (TYPE(CHILD(n, 0))) {
1436 case LPAR:
1437 n = CHILD(n, 1);
1438 if (TYPE(n) == RPAR) {
1439 /* XXX Should allow () = () ??? */
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001440 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001441 "can't assign to ()");
1442 c->c_errors++;
1443 return;
1444 }
1445 break;
1446 case LSQB:
1447 n = CHILD(n, 1);
1448 if (TYPE(n) == RSQB) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001449 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001450 "can't assign to []");
1451 c->c_errors++;
1452 return;
1453 }
1454 com_assign_list(c, n, assigning);
1455 return;
1456 case NAME:
1457 com_assign_name(c, CHILD(n, 0), assigning);
1458 return;
1459 default:
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001460 err_setstr(SyntaxError,
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001461 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001462 c->c_errors++;
1463 return;
1464 }
1465 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001466
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001467 default:
1468 fprintf(stderr, "node type %d\n", TYPE(n));
1469 err_setstr(SystemError, "com_assign: bad node");
1470 c->c_errors++;
1471 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001472
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001473 }
1474 }
1475}
1476
1477static void
1478com_expr_stmt(c, n)
1479 struct compiling *c;
1480 node *n;
1481{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001482 REQ(n, expr_stmt); /* testlist ('=' testlist)* */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001483 com_node(c, CHILD(n, NCH(n)-1));
1484 if (NCH(n) == 1) {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001485 if (c->c_interactive)
1486 com_addbyte(c, PRINT_EXPR);
1487 else
1488 com_addbyte(c, POP_TOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001489 }
1490 else {
1491 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001492 for (i = 0; i < NCH(n)-2; i+=2) {
1493 if (i+2 < NCH(n)-2)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001494 com_addbyte(c, DUP_TOP);
1495 com_assign(c, CHILD(n, i), 1/*assign*/);
1496 }
1497 }
1498}
1499
1500static void
1501com_print_stmt(c, n)
1502 struct compiling *c;
1503 node *n;
1504{
1505 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001506 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
1507 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001508 com_node(c, CHILD(n, i));
1509 com_addbyte(c, PRINT_ITEM);
1510 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001511 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001512 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001513 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001514}
1515
1516static void
1517com_return_stmt(c, n)
1518 struct compiling *c;
1519 node *n;
1520{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001521 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001522 if (!c->c_infunction) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001523 err_setstr(SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001524 c->c_errors++;
1525 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001526 if (NCH(n) < 2)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001527 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1528 else
1529 com_node(c, CHILD(n, 1));
1530 com_addbyte(c, RETURN_VALUE);
1531}
1532
1533static void
1534com_raise_stmt(c, n)
1535 struct compiling *c;
1536 node *n;
1537{
Guido van Rossumf10570b1995-07-07 22:53:21 +00001538 REQ(n, raise_stmt); /* 'raise' test [',' test [',' test]] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001539 com_node(c, CHILD(n, 1));
1540 if (NCH(n) > 3)
1541 com_node(c, CHILD(n, 3));
1542 else
1543 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001544 if (NCH(n) > 5) {
1545 com_node(c, CHILD(n, 5));
1546 com_addoparg(c, RAISE_VARARGS, 3);
1547 }
1548 else
1549 com_addbyte(c, RAISE_EXCEPTION);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001550}
1551
1552static void
1553com_import_stmt(c, n)
1554 struct compiling *c;
1555 node *n;
1556{
1557 int i;
1558 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001559 /* 'import' dotted_name (',' dotted_name)* |
1560 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001561 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001562 /* 'from' dotted_name 'import' ... */
1563 REQ(CHILD(n, 1), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001564 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
1565 for (i = 3; i < NCH(n); i += 2)
1566 com_addopname(c, IMPORT_FROM, CHILD(n, i));
1567 com_addbyte(c, POP_TOP);
1568 }
1569 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001570 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001571 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001572 REQ(CHILD(n, i), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001573 com_addopname(c, IMPORT_NAME, CHILD(n, i));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001574 com_addopname(c, STORE_NAME, CHILD(CHILD(n, i), 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001575 }
1576 }
1577}
1578
1579static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00001580com_global_stmt(c, n)
1581 struct compiling *c;
1582 node *n;
1583{
1584 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001585 REQ(n, global_stmt);
1586 /* 'global' NAME (',' NAME)* */
1587 for (i = 1; i < NCH(n); i += 2) {
1588 if (dictinsert(c->c_globals, STR(CHILD(n, i)), None) != 0)
1589 c->c_errors++;
1590 }
1591}
1592
Guido van Rossum25831651993-05-19 14:50:45 +00001593#define strequ(a, b) (strcmp((a), (b)) == 0)
1594
1595static void
1596com_access_stmt(c, n)
1597 struct compiling *c;
1598 node *n;
1599{
1600 int i, j, k, mode, imode;
1601 object *vmode;
1602 REQ(n, access_stmt);
1603 /* 'access' NAME (',' NAME)* ':' accesstype (',' accesstype)*
1604 accesstype: NAME+ */
1605
1606 /* Find where the colon is */
1607 i = 1;
1608 while (TYPE(CHILD(n,i-1)) != COLON)
1609 i += 1;
1610
1611 /* Calculate the mode mask */
1612 mode = 0;
1613 for (j = i; j < NCH(n); j += 2) {
Guido van Rossum81daa321993-05-20 14:24:46 +00001614 int r = 0, w = 0, p = 0;
1615 for (k = 0; k < NCH(CHILD(n,j)); k++) {
Guido van Rossum25831651993-05-19 14:50:45 +00001616 if (strequ(STR(CHILD(CHILD(n,j),k)), "public"))
1617 p = 0;
1618 else if (strequ(STR(CHILD(CHILD(n,j),k)), "protected"))
1619 p = 1;
1620 else if (strequ(STR(CHILD(CHILD(n,j),k)), "private"))
1621 p = 2;
1622 else if (strequ(STR(CHILD(CHILD(n,j),k)), "read"))
1623 r = 1;
1624 else if (strequ(STR(CHILD(CHILD(n,j),k)), "write"))
1625 w = 1;
1626 else /* XXX should make this an exception */
1627 fprintf(stderr, "bad access type %s\n",
1628 STR(CHILD(CHILD(n,j),k)));
1629 }
1630 if (r == 0 && w == 0)
Guido van Rossum81daa321993-05-20 14:24:46 +00001631 r = w = 1;
Guido van Rossum25831651993-05-19 14:50:45 +00001632 if (p == 0) {
1633 if (r == 1) mode |= AC_R_PUBLIC;
1634 if (w == 1) mode |= AC_W_PUBLIC;
1635 } else if (p == 1) {
1636 if (r == 1) mode |= AC_R_PROTECTED;
1637 if (w == 1) mode |= AC_W_PROTECTED;
1638 } else {
1639 if (r == 1) mode |= AC_R_PRIVATE;
1640 if (w == 1) mode |= AC_W_PRIVATE;
1641 }
1642 }
1643 vmode = newintobject((long)mode);
1644 imode = com_addconst(c, vmode);
1645 XDECREF(vmode);
1646 for (i = 1; TYPE(CHILD(n,i-1)) != COLON; i+=2) {
1647 com_addoparg(c, LOAD_CONST, imode);
1648 com_addopname(c, ACCESS_MODE, CHILD(n, i));
1649 }
1650}
1651
Guido van Rossumc5e96291991-12-10 13:53:51 +00001652static void
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001653com_exec_stmt(c, n)
1654 struct compiling *c;
1655 node *n;
1656{
1657 REQ(n, exec_stmt);
1658 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
1659 com_node(c, CHILD(n, 1));
1660 if (NCH(n) >= 4)
1661 com_node(c, CHILD(n, 3));
1662 else
1663 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1664 if (NCH(n) >= 6)
1665 com_node(c, CHILD(n, 5));
1666 else
1667 com_addbyte(c, DUP_TOP);
1668 com_addbyte(c, EXEC_STMT);
1669}
1670
1671static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001672com_if_stmt(c, n)
1673 struct compiling *c;
1674 node *n;
1675{
1676 int i;
1677 int anchor = 0;
1678 REQ(n, if_stmt);
1679 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
1680 for (i = 0; i+3 < NCH(n); i+=4) {
1681 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001682 node *ch = CHILD(n, i+1);
1683 if (i > 0)
1684 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001685 com_node(c, CHILD(n, i+1));
1686 com_addfwref(c, JUMP_IF_FALSE, &a);
1687 com_addbyte(c, POP_TOP);
1688 com_node(c, CHILD(n, i+3));
1689 com_addfwref(c, JUMP_FORWARD, &anchor);
1690 com_backpatch(c, a);
1691 com_addbyte(c, POP_TOP);
1692 }
1693 if (i+2 < NCH(n))
1694 com_node(c, CHILD(n, i+2));
1695 com_backpatch(c, anchor);
1696}
1697
1698static void
1699com_while_stmt(c, n)
1700 struct compiling *c;
1701 node *n;
1702{
1703 int break_anchor = 0;
1704 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001705 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001706 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
1707 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001708 block_push(c, SETUP_LOOP);
1709 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001710 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001711 com_node(c, CHILD(n, 1));
1712 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1713 com_addbyte(c, POP_TOP);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001714 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001715 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001716 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001717 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1718 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001719 com_backpatch(c, anchor);
1720 com_addbyte(c, POP_TOP);
1721 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001722 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001723 if (NCH(n) > 4)
1724 com_node(c, CHILD(n, 6));
1725 com_backpatch(c, break_anchor);
1726}
1727
1728static void
1729com_for_stmt(c, n)
1730 struct compiling *c;
1731 node *n;
1732{
1733 object *v;
1734 int break_anchor = 0;
1735 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001736 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001737 REQ(n, for_stmt);
1738 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
1739 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001740 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001741 com_node(c, CHILD(n, 3));
1742 v = newintobject(0L);
1743 if (v == NULL)
1744 c->c_errors++;
1745 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
1746 XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001747 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001748 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001749 com_addfwref(c, FOR_LOOP, &anchor);
1750 com_assign(c, CHILD(n, 1), 1/*assigning*/);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001751 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001752 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001753 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001754 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1755 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001756 com_backpatch(c, anchor);
1757 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001758 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001759 if (NCH(n) > 8)
1760 com_node(c, CHILD(n, 8));
1761 com_backpatch(c, break_anchor);
1762}
1763
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001764/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001765
1766 SETUP_FINALLY L
1767 <code for S>
1768 POP_BLOCK
1769 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001770 L: <code for Sf>
1771 END_FINALLY
1772
1773 The special instructions use the block stack. Each block
1774 stack entry contains the instruction that created it (here
1775 SETUP_FINALLY), the level of the value stack at the time the
1776 block stack entry was created, and a label (here L).
1777
1778 SETUP_FINALLY:
1779 Pushes the current value stack level and the label
1780 onto the block stack.
1781 POP_BLOCK:
1782 Pops en entry from the block stack, and pops the value
1783 stack until its level is the same as indicated on the
1784 block stack. (The label is ignored.)
1785 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001786 Pops a variable number of entries from the *value* stack
1787 and re-raises the exception they specify. The number of
1788 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001789
1790 The block stack is unwound when an exception is raised:
1791 when a SETUP_FINALLY entry is found, the exception is pushed
1792 onto the value stack (and the exception condition is cleared),
1793 and the interpreter jumps to the label gotten from the block
1794 stack.
1795
1796 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00001797 (The contents of the value stack is shown in [], with the top
1798 at the right; 'tb' is trace-back info, 'val' the exception's
1799 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001800
1801 Value stack Label Instruction Argument
1802 [] SETUP_EXCEPT L1
1803 [] <code for S>
1804 [] POP_BLOCK
1805 [] JUMP_FORWARD L0
1806
Guido van Rossum3f5da241990-12-20 15:06:42 +00001807 [tb, val, exc] L1: DUP )
1808 [tb, val, exc, exc] <evaluate E1> )
1809 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
1810 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
1811 [tb, val, exc, 1] POP )
1812 [tb, val, exc] POP
1813 [tb, val] <assign to V1> (or POP if no V1)
1814 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001815 [] <code for S1>
1816 JUMP_FORWARD L0
1817
Guido van Rossum3f5da241990-12-20 15:06:42 +00001818 [tb, val, exc, 0] L2: POP
1819 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001820 .............................etc.......................
1821
Guido van Rossum3f5da241990-12-20 15:06:42 +00001822 [tb, val, exc, 0] Ln+1: POP
1823 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001824
1825 [] L0: <next statement>
1826
1827 Of course, parts are not generated if Vi or Ei is not present.
1828*/
1829
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001830static void
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001831com_try_except(c, n)
1832 struct compiling *c;
1833 node *n;
1834{
1835 int except_anchor = 0;
1836 int end_anchor = 0;
1837 int else_anchor = 0;
1838 int i;
1839 node *ch;
1840
1841 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
1842 block_push(c, SETUP_EXCEPT);
1843 com_node(c, CHILD(n, 2));
1844 com_addbyte(c, POP_BLOCK);
1845 block_pop(c, SETUP_EXCEPT);
1846 com_addfwref(c, JUMP_FORWARD, &else_anchor);
1847 com_backpatch(c, except_anchor);
1848 for (i = 3;
1849 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
1850 i += 3) {
1851 /* except_clause: 'except' [expr [',' expr]] */
1852 if (except_anchor == 0) {
1853 err_setstr(SyntaxError,
1854 "default 'except:' must be last");
1855 c->c_errors++;
1856 break;
1857 }
1858 except_anchor = 0;
1859 com_addoparg(c, SET_LINENO, ch->n_lineno);
1860 if (NCH(ch) > 1) {
1861 com_addbyte(c, DUP_TOP);
1862 com_node(c, CHILD(ch, 1));
1863 com_addoparg(c, COMPARE_OP, EXC_MATCH);
1864 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
1865 com_addbyte(c, POP_TOP);
1866 }
1867 com_addbyte(c, POP_TOP);
1868 if (NCH(ch) > 3)
1869 com_assign(c, CHILD(ch, 3), 1/*assigning*/);
1870 else
1871 com_addbyte(c, POP_TOP);
1872 com_addbyte(c, POP_TOP);
1873 com_node(c, CHILD(n, i+2));
1874 com_addfwref(c, JUMP_FORWARD, &end_anchor);
1875 if (except_anchor) {
1876 com_backpatch(c, except_anchor);
1877 com_addbyte(c, POP_TOP);
1878 }
1879 }
1880 com_addbyte(c, END_FINALLY);
1881 com_backpatch(c, else_anchor);
1882 if (i < NCH(n))
1883 com_node(c, CHILD(n, i+2));
1884 com_backpatch(c, end_anchor);
1885}
1886
1887static void
1888com_try_finally(c, n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001889 struct compiling *c;
1890 node *n;
1891{
1892 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001893 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00001894
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001895 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
1896 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001897 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001898 com_addbyte(c, POP_BLOCK);
1899 block_pop(c, SETUP_FINALLY);
1900 block_push(c, END_FINALLY);
1901 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1902 com_backpatch(c, finally_anchor);
1903 ch = CHILD(n, NCH(n)-1);
1904 com_addoparg(c, SET_LINENO, ch->n_lineno);
1905 com_node(c, ch);
1906 com_addbyte(c, END_FINALLY);
1907 block_pop(c, END_FINALLY);
1908}
1909
1910static void
1911com_try_stmt(c, n)
1912 struct compiling *c;
1913 node *n;
1914{
1915 REQ(n, try_stmt);
1916 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
1917 | 'try' ':' suite 'finally' ':' suite */
1918 if (TYPE(CHILD(n, 3)) != except_clause)
1919 com_try_finally(c, n);
1920 else
1921 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001922}
1923
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001924static object *
1925get_docstring(n)
1926 node *n;
1927{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00001928 int i;
1929
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001930 switch (TYPE(n)) {
1931
1932 case suite:
1933 if (NCH(n) == 1)
1934 return get_docstring(CHILD(n, 0));
1935 else {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001936 for (i = 0; i < NCH(n); i++) {
1937 node *ch = CHILD(n, i);
1938 if (TYPE(ch) == stmt)
1939 return get_docstring(ch);
1940 }
1941 }
1942 break;
1943
Guido van Rossum164d4ff1995-01-26 00:40:09 +00001944 case file_input:
1945 for (i = 0; i < NCH(n); i++) {
1946 node *ch = CHILD(n, i);
1947 if (TYPE(ch) == stmt)
1948 return get_docstring(ch);
1949 }
1950 break;
1951
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001952 case stmt:
1953 case simple_stmt:
1954 case small_stmt:
1955 return get_docstring(CHILD(n, 0));
1956
1957 case expr_stmt:
1958 case testlist:
1959 case test:
1960 case and_test:
1961 case not_test:
1962 case comparison:
1963 case expr:
1964 case xor_expr:
1965 case and_expr:
1966 case shift_expr:
1967 case arith_expr:
1968 case term:
1969 case factor:
1970 if (NCH(n) == 1)
1971 return get_docstring(CHILD(n, 0));
1972 break;
1973
1974 case atom:
1975 if (TYPE(CHILD(n, 0)) == STRING)
1976 return parsestrplus(n);
1977 break;
1978
1979 }
1980 return NULL;
1981}
1982
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001983static void
1984com_suite(c, n)
1985 struct compiling *c;
1986 node *n;
1987{
1988 REQ(n, suite);
1989 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
1990 if (NCH(n) == 1) {
1991 com_node(c, CHILD(n, 0));
1992 }
1993 else {
1994 int i;
1995 for (i = 0; i < NCH(n); i++) {
1996 node *ch = CHILD(n, i);
1997 if (TYPE(ch) == stmt)
1998 com_node(c, ch);
1999 }
2000 }
2001}
2002
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002003/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002004static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002005com_continue_stmt(c, n)
2006 struct compiling *c;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002007 node *n; /* Not used, but passed for consistency */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002008{
2009 int i = c->c_nblocks;
2010 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
2011 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2012 }
2013 else {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00002014 err_setstr(SyntaxError, "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002015 c->c_errors++;
2016 }
2017 /* XXX Could allow it inside a 'finally' clause
2018 XXX if we could pop the exception still on the stack */
2019}
2020
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002021static int
2022com_argdefs(c, n, argcount_return)
2023 struct compiling *c;
2024 node *n;
2025 int *argcount_return;
2026{
2027 int i, nch, nargs, ndefs, star;
2028 if (TYPE(n) == lambdef) {
2029 /* lambdef: 'lambda' [varargslist] ':' test */
2030 n = CHILD(n, 1);
2031 }
2032 else {
2033 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
2034 n = CHILD(n, 2);
2035 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
2036 n = CHILD(n, 1);
2037 }
2038 if (TYPE(n) != varargslist)
2039 return -1;
2040 /* varargslist:
Guido van Rossumf10570b1995-07-07 22:53:21 +00002041 (fpdef ['=' test] ',')* '*' NAME ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002042 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
2043 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002044 nargs = 0;
2045 ndefs = 0;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002046 star = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002047 for (i = 0; i < nch; i++) {
2048 int t;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002049 if (TYPE(CHILD(n, i)) == STAR)
2050 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002051 nargs++;
2052 i++;
2053 if (i >= nch)
2054 break;
2055 t = TYPE(CHILD(n, i));
2056 if (t == EQUAL) {
2057 i++;
2058 ndefs++;
2059 com_node(c, CHILD(n, i));
2060 i++;
2061 if (i >= nch)
2062 break;
2063 t = TYPE(CHILD(n, i));
2064 }
2065 else {
2066 /* Treat "(a=1, b)" as "(a=1, b=None)" */
2067 if (ndefs) {
2068 com_addoparg(c, LOAD_CONST,
2069 com_addconst(c, None));
2070 ndefs++;
2071 }
2072 }
2073 if (t != COMMA)
2074 break;
2075 }
2076 if (star)
2077 nargs ^= 0x4000;
2078 *argcount_return = nargs;
2079 if (ndefs > 0)
2080 com_addoparg(c, BUILD_TUPLE, ndefs);
2081 return ndefs;
2082}
2083
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002084static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002085com_funcdef(c, n)
2086 struct compiling *c;
2087 node *n;
2088{
2089 object *v;
2090 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum590baa41993-11-30 13:40:46 +00002091 v = (object *)compile(n, c->c_filename);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002092 if (v == NULL)
2093 c->c_errors++;
2094 else {
2095 int i = com_addconst(c, v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002096 int argcount;
2097 int ndefs = com_argdefs(c, n, &argcount);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002098 com_addoparg(c, LOAD_CONST, i);
2099 com_addbyte(c, BUILD_FUNCTION);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002100 if (ndefs > 0)
2101 com_addoparg(c, SET_FUNC_ARGS, argcount);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002102 com_addopname(c, STORE_NAME, CHILD(n, 1));
2103 DECREF(v);
2104 }
2105}
2106
2107static void
Guido van Rossum25831651993-05-19 14:50:45 +00002108com_bases(c, n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002109 struct compiling *c;
2110 node *n;
2111{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002112 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002113 REQ(n, testlist);
2114 /* testlist: test (',' test)* [','] */
2115 for (i = 0; i < NCH(n); i += 2)
2116 com_node(c, CHILD(n, i));
2117 com_addoparg(c, BUILD_TUPLE, (NCH(n)+1) / 2);
2118}
2119
2120static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002121com_classdef(c, n)
2122 struct compiling *c;
2123 node *n;
2124{
Guido van Rossum25831651993-05-19 14:50:45 +00002125 int i;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002126 object *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002127 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00002128 /* classdef: class NAME ['(' testlist ')'] ':' suite */
2129 if ((v = newstringobject(STR(CHILD(n, 1)))) == NULL) {
2130 c->c_errors++;
2131 return;
2132 }
2133 /* Push the class name on the stack */
2134 i = com_addconst(c, v);
2135 com_addoparg(c, LOAD_CONST, i);
2136 DECREF(v);
2137 /* Push the tuple of base classes on the stack */
2138 if (TYPE(CHILD(n, 2)) != LPAR)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002139 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum25831651993-05-19 14:50:45 +00002140 else
2141 com_bases(c, CHILD(n, 3));
Guido van Rossum590baa41993-11-30 13:40:46 +00002142 v = (object *)compile(n, c->c_filename);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002143 if (v == NULL)
2144 c->c_errors++;
2145 else {
Guido van Rossum25831651993-05-19 14:50:45 +00002146 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002147 com_addoparg(c, LOAD_CONST, i);
2148 com_addbyte(c, BUILD_FUNCTION);
2149 com_addbyte(c, UNARY_CALL);
2150 com_addbyte(c, BUILD_CLASS);
2151 com_addopname(c, STORE_NAME, CHILD(n, 1));
2152 DECREF(v);
2153 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002154}
2155
2156static void
2157com_node(c, n)
2158 struct compiling *c;
2159 node *n;
2160{
2161 switch (TYPE(n)) {
2162
2163 /* Definition nodes */
2164
2165 case funcdef:
2166 com_funcdef(c, n);
2167 break;
2168 case classdef:
2169 com_classdef(c, n);
2170 break;
2171
2172 /* Trivial parse tree nodes */
2173
2174 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002175 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002176 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002177 com_node(c, CHILD(n, 0));
2178 break;
2179
2180 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002181 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
2182 com_addoparg(c, SET_LINENO, n->n_lineno);
2183 {
2184 int i;
2185 for (i = 0; i < NCH(n)-1; i += 2)
2186 com_node(c, CHILD(n, i));
2187 }
2188 break;
2189
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002190 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002191 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002192 com_node(c, CHILD(n, 0));
2193 break;
2194
2195 /* Statement nodes */
2196
2197 case expr_stmt:
2198 com_expr_stmt(c, n);
2199 break;
2200 case print_stmt:
2201 com_print_stmt(c, n);
2202 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002203 case del_stmt: /* 'del' exprlist */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002204 com_assign(c, CHILD(n, 1), 0/*delete*/);
2205 break;
2206 case pass_stmt:
2207 break;
2208 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002209 if (c->c_loops == 0) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00002210 err_setstr(SyntaxError, "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002211 c->c_errors++;
2212 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002213 com_addbyte(c, BREAK_LOOP);
2214 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002215 case continue_stmt:
2216 com_continue_stmt(c, n);
2217 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002218 case return_stmt:
2219 com_return_stmt(c, n);
2220 break;
2221 case raise_stmt:
2222 com_raise_stmt(c, n);
2223 break;
2224 case import_stmt:
2225 com_import_stmt(c, n);
2226 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002227 case global_stmt:
2228 com_global_stmt(c, n);
2229 break;
Guido van Rossum25831651993-05-19 14:50:45 +00002230 case access_stmt:
2231 com_access_stmt(c, n);
2232 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002233 case exec_stmt:
2234 com_exec_stmt(c, n);
2235 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002236 case if_stmt:
2237 com_if_stmt(c, n);
2238 break;
2239 case while_stmt:
2240 com_while_stmt(c, n);
2241 break;
2242 case for_stmt:
2243 com_for_stmt(c, n);
2244 break;
2245 case try_stmt:
2246 com_try_stmt(c, n);
2247 break;
2248 case suite:
2249 com_suite(c, n);
2250 break;
2251
2252 /* Expression nodes */
2253
2254 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002255 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002256 break;
2257 case test:
2258 com_test(c, n);
2259 break;
2260 case and_test:
2261 com_and_test(c, n);
2262 break;
2263 case not_test:
2264 com_not_test(c, n);
2265 break;
2266 case comparison:
2267 com_comparison(c, n);
2268 break;
2269 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002270 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002271 break;
2272 case expr:
2273 com_expr(c, n);
2274 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002275 case xor_expr:
2276 com_xor_expr(c, n);
2277 break;
2278 case and_expr:
2279 com_and_expr(c, n);
2280 break;
2281 case shift_expr:
2282 com_shift_expr(c, n);
2283 break;
2284 case arith_expr:
2285 com_arith_expr(c, n);
2286 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002287 case term:
2288 com_term(c, n);
2289 break;
2290 case factor:
2291 com_factor(c, n);
2292 break;
2293 case atom:
2294 com_atom(c, n);
2295 break;
2296
2297 default:
2298 fprintf(stderr, "node type %d\n", TYPE(n));
2299 err_setstr(SystemError, "com_node: unexpected node type");
2300 c->c_errors++;
2301 }
2302}
2303
2304static void com_fplist PROTO((struct compiling *, node *));
2305
2306static void
2307com_fpdef(c, n)
2308 struct compiling *c;
2309 node *n;
2310{
2311 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
2312 if (TYPE(CHILD(n, 0)) == LPAR)
2313 com_fplist(c, CHILD(n, 1));
2314 else
2315 com_addopname(c, STORE_NAME, CHILD(n, 0));
2316}
2317
2318static void
2319com_fplist(c, n)
2320 struct compiling *c;
2321 node *n;
2322{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00002323 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002324 if (NCH(n) == 1) {
2325 com_fpdef(c, CHILD(n, 0));
2326 }
2327 else {
2328 int i;
2329 com_addoparg(c, UNPACK_TUPLE, (NCH(n)+1)/2);
2330 for (i = 0; i < NCH(n); i += 2)
2331 com_fpdef(c, CHILD(n, i));
2332 }
2333}
2334
2335static void
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002336com_arglist(c, n)
2337 struct compiling *c;
2338 node *n;
2339{
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002340 int nch, op, nargs, i, t;
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002341 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00002342 /* varargslist:
Guido van Rossumf10570b1995-07-07 22:53:21 +00002343 (fpdef ['=' test] ',')* '*' NAME ..... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002344 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
2345 nch = NCH(n);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002346 op = UNPACK_ARG;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002347 nargs = 0;
2348 for (i = 0; i < nch; i++) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00002349 if (TYPE(CHILD(n, i)) == STAR) {
2350 nch = i;
2351 if (TYPE(CHILD(n, i+1)) != STAR)
2352 op = UNPACK_VARARG;
2353 break;
2354 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002355 nargs++;
2356 i++;
2357 if (i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002358 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002359 t = TYPE(CHILD(n, i));
2360 if (t == EQUAL) {
2361 i += 2;
2362 if (i >= nch)
2363 break;
2364 t = TYPE(CHILD(n, i));
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002365 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002366 if (t != COMMA)
2367 break;
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002368 }
2369 com_addoparg(c, op, nargs);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002370 for (i = 0; i < nch; i++) {
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002371 com_fpdef(c, CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002372 i++;
2373 if (i >= nch)
2374 break;
2375 t = TYPE(CHILD(n, i));
2376 if (t == EQUAL) {
2377 i += 2;
2378 if (i >= nch)
2379 break;
2380 t = TYPE(CHILD(n, i));
2381 }
2382 if (t != COMMA)
2383 break;
2384 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002385 if (op == UNPACK_VARARG)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002386 com_addopname(c, STORE_NAME, CHILD(n, nch+1));
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002387}
2388
2389static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002390com_file_input(c, n)
2391 struct compiling *c;
2392 node *n;
2393{
2394 int i;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002395 object *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002396 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002397 doc = get_docstring(n);
2398 if (doc != NULL) {
2399 int i = com_addconst(c, doc);
2400 DECREF(doc);
2401 com_addoparg(c, LOAD_CONST, i);
2402 com_addopnamestr(c, STORE_NAME, "__doc__");
2403 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002404 for (i = 0; i < NCH(n); i++) {
2405 node *ch = CHILD(n, i);
2406 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
2407 com_node(c, ch);
2408 }
2409}
2410
2411/* Top-level compile-node interface */
2412
2413static void
2414compile_funcdef(c, n)
2415 struct compiling *c;
2416 node *n;
2417{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002418 object *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002419 node *ch;
2420 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00002421 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002422 doc = get_docstring(CHILD(n, 4));
2423 if (doc != NULL) {
2424 (void) com_addconst(c, doc);
2425 DECREF(doc);
2426 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002427 com_addoparg(c, RESERVE_FAST, com_addconst(c, None)); /* Patched! */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002428 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
2429 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002430 if (TYPE(ch) == RPAR)
Guido van Rossum288a60f1991-12-16 13:05:10 +00002431 com_addoparg(c, UNPACK_ARG, 0);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002432 else
2433 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002434 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002435 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002436 c->c_infunction = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002437 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2438 com_addbyte(c, RETURN_VALUE);
2439}
2440
2441static void
Guido van Rossum590baa41993-11-30 13:40:46 +00002442compile_lambdef(c, n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002443 struct compiling *c;
2444 node *n;
2445{
Guido van Rossum590baa41993-11-30 13:40:46 +00002446 node *ch;
2447 REQ(n, lambdef); /* lambdef: 'lambda' [parameters] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00002448 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00002449
2450 ch = CHILD(n, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002451 (void) com_addconst(c, None);
Guido van Rossum590baa41993-11-30 13:40:46 +00002452 if (TYPE(ch) == COLON) {
2453 com_addoparg(c, UNPACK_ARG, 0);
2454 com_node(c, CHILD(n, 2));
2455 }
2456 else {
2457 com_addoparg(c, RESERVE_FAST, com_addconst(c, None));
2458 com_arglist(c, ch);
2459 com_node(c, CHILD(n, 3));
2460 }
2461
Guido van Rossum12d12c51993-10-26 17:58:25 +00002462 com_addbyte(c, RETURN_VALUE);
2463}
2464
2465static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002466compile_classdef(c, n)
2467 struct compiling *c;
2468 node *n;
2469{
2470 node *ch;
2471 object *doc;
2472 REQ(n, classdef);
2473 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
2474 c->c_name = STR(CHILD(n, 1));
2475 ch = CHILD(n, NCH(n)-1); /* The suite */
2476 doc = get_docstring(ch);
2477 if (doc != NULL) {
2478 int i = com_addconst(c, doc);
2479 DECREF(doc);
2480 com_addoparg(c, LOAD_CONST, i);
2481 com_addopnamestr(c, STORE_NAME, "__doc__");
2482 }
2483 else
2484 (void) com_addconst(c, None);
2485 com_node(c, ch);
2486 com_addbyte(c, LOAD_LOCALS);
2487 com_addbyte(c, RETURN_VALUE);
2488}
2489
2490static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002491compile_node(c, n)
2492 struct compiling *c;
2493 node *n;
2494{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002495 com_addoparg(c, SET_LINENO, n->n_lineno);
2496
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002497 switch (TYPE(n)) {
2498
Guido van Rossum4c417781991-01-21 16:09:22 +00002499 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002500 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002501 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002502 n = CHILD(n, 0);
2503 if (TYPE(n) != NEWLINE)
2504 com_node(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002505 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2506 com_addbyte(c, RETURN_VALUE);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002507 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002508 break;
2509
Guido van Rossum4c417781991-01-21 16:09:22 +00002510 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002511 com_file_input(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002512 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2513 com_addbyte(c, RETURN_VALUE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002514 break;
2515
Guido van Rossum590baa41993-11-30 13:40:46 +00002516 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00002517 com_node(c, CHILD(n, 0));
2518 com_addbyte(c, RETURN_VALUE);
2519 break;
2520
Guido van Rossum590baa41993-11-30 13:40:46 +00002521 case lambdef: /* anonymous function definition */
2522 compile_lambdef(c, n);
2523 break;
2524
Guido van Rossum4c417781991-01-21 16:09:22 +00002525 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002526 compile_funcdef(c, n);
2527 break;
2528
Guido van Rossum4c417781991-01-21 16:09:22 +00002529 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002530 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002531 break;
2532
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002533 default:
2534 fprintf(stderr, "node type %d\n", TYPE(n));
2535 err_setstr(SystemError, "compile_node: unexpected node type");
2536 c->c_errors++;
2537 }
2538}
2539
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002540/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00002541
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002542 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
2543 instructions that refer to local variables with LOAD_FAST etc.
2544 The latter instructions are much faster because they don't need to
2545 look up the variable name in a dictionary.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002546
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002547 To find all local variables, we check all STORE_NAME, IMPORT_FROM and
2548 DELETE_NAME instructions. This yields all local variables, including
2549 arguments, function definitions, class definitions and import
2550 statements.
2551
2552 All remaining LOAD_NAME instructions must refer to non-local (global
2553 or builtin) variables, so are replaced by LOAD_GLOBAL.
2554
2555 There are two problems: 'from foo import *' and 'exec' may introduce
2556 local variables that we can't know while compiling. If this is the
2557 case, we don't optimize at all (this rarely happens, since exec is
2558 rare, & this form of import statement is mostly used at the module
2559 level).
2560
Guido van Rossum282914b1991-04-04 10:42:56 +00002561 NB: this modifies the string object co->co_code!
2562*/
2563
2564static void
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002565optimize(c)
2566 struct compiling *c;
Guido van Rossum282914b1991-04-04 10:42:56 +00002567{
Guido van Rossum0a697f61991-04-16 08:39:12 +00002568 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00002569 object *locals;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002570 int nlocals;
Guido van Rossum282914b1991-04-04 10:42:56 +00002571 int opcode;
2572 int oparg;
2573 object *name;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002574 int fast_reserved;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002575 object *error_type, *error_value, *error_traceback;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002576
Guido van Rossum282914b1991-04-04 10:42:56 +00002577#define NEXTOP() (*next_instr++)
2578#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
2579#define GETITEM(v, i) (getlistitem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002580#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
2581
Guido van Rossum282914b1991-04-04 10:42:56 +00002582 locals = newdictobject();
2583 if (locals == NULL) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002584 c->c_errors++;
2585 return;
Guido van Rossum282914b1991-04-04 10:42:56 +00002586 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002587 nlocals = 0;
2588
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002589 err_fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum282914b1991-04-04 10:42:56 +00002590
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002591 next_instr = (unsigned char *) getstringvalue(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00002592 for (;;) {
2593 opcode = NEXTOP();
2594 if (opcode == STOP_CODE)
2595 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002596 if (opcode == EXEC_STMT)
2597 goto end; /* Don't optimize if exec present */
Guido van Rossum282914b1991-04-04 10:42:56 +00002598 if (HAS_ARG(opcode))
2599 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002600 if (opcode == STORE_NAME || opcode == DELETE_NAME ||
2601 opcode == IMPORT_FROM) {
2602 object *v;
Guido van Rossum282914b1991-04-04 10:42:56 +00002603 name = GETNAMEOBJ(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002604 if (dict2lookup(locals, name) != NULL)
2605 continue;
2606 err_clear();
2607 v = newintobject(nlocals);
2608 if (v == NULL) {
2609 c->c_errors++;
2610 goto err;
Guido van Rossum282914b1991-04-04 10:42:56 +00002611 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002612 nlocals++;
2613 if (dict2insert(locals, name, v) != 0) {
2614 DECREF(v);
2615 c->c_errors++;
2616 goto err;
2617 }
2618 DECREF(v);
Guido van Rossum282914b1991-04-04 10:42:56 +00002619 }
2620 }
2621
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002622 if (dictlookup(locals, "*") != NULL) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002623 /* Don't optimize anything */
2624 goto end;
2625 }
2626
2627 next_instr = (unsigned char *) getstringvalue(c->c_code);
2628 fast_reserved = 0;
Guido van Rossum282914b1991-04-04 10:42:56 +00002629 for (;;) {
2630 cur_instr = next_instr;
2631 opcode = NEXTOP();
2632 if (opcode == STOP_CODE)
2633 break;
2634 if (HAS_ARG(opcode))
2635 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002636 if (opcode == RESERVE_FAST) {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002637 int i;
2638 object *localmap = newtupleobject(nlocals);
2639 int pos;
2640 object *key, *value;
2641 if (localmap == NULL) { /* XXX mask error */
2642 err_clear();
2643 continue;
2644 }
2645 pos = 0;
2646 while (mappinggetnext(locals, &pos, &key, &value)) {
2647 int j;
2648 if (!is_intobject(value))
2649 continue;
2650 j = getintvalue(value);
2651 if (0 <= j && j < nlocals) {
2652 INCREF(key);
2653 settupleitem(localmap, j, key);
2654 }
2655 }
2656 i = com_addconst(c, localmap);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002657 cur_instr[1] = i & 0xff;
2658 cur_instr[2] = (i>>8) & 0xff;
2659 fast_reserved = 1;
Guido van Rossum3952cb01995-01-20 16:56:41 +00002660 DECREF(localmap);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002661 continue;
2662 }
2663 if (!fast_reserved)
2664 continue;
2665 if (opcode == LOAD_NAME ||
2666 opcode == STORE_NAME ||
2667 opcode == DELETE_NAME) {
2668 object *v;
2669 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00002670 name = GETNAMEOBJ(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002671 v = dict2lookup(locals, name);
2672 if (v == NULL) {
Guido van Rossum83163251991-08-16 08:58:43 +00002673 err_clear();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002674 if (opcode == LOAD_NAME)
2675 cur_instr[0] = LOAD_GLOBAL;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002676 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00002677 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002678 i = getintvalue(v);
2679 switch (opcode) {
2680 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
2681 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
2682 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
2683 }
2684 cur_instr[1] = i & 0xff;
2685 cur_instr[2] = (i>>8) & 0xff;
Guido van Rossum282914b1991-04-04 10:42:56 +00002686 }
2687 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002688
2689 end:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002690 err_restore(error_type, error_value, error_traceback);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002691 err:
Guido van Rossum282914b1991-04-04 10:42:56 +00002692 DECREF(locals);
2693}
2694
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002695codeobject *
Guido van Rossum590baa41993-11-30 13:40:46 +00002696compile(n, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002697 node *n;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002698 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002699{
2700 struct compiling sc;
2701 codeobject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00002702 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002703 return NULL;
2704 compile_node(&sc, n);
2705 com_done(&sc);
Guido van Rossum590baa41993-11-30 13:40:46 +00002706 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0)
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002707 optimize(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00002708 co = NULL;
2709 if (sc.c_errors == 0) {
2710 object *v, *w;
2711 v = newstringobject(sc.c_filename);
Guido van Rossum363ac7d1994-11-10 22:40:34 +00002712 w = newstringobject(sc.c_name);
Guido van Rossum9bfef441993-03-29 10:43:31 +00002713 if (v != NULL && w != NULL)
2714 co = newcodeobject(sc.c_code, sc.c_consts,
2715 sc.c_names, v, w);
2716 XDECREF(v);
2717 XDECREF(w);
Guido van Rossuma082ce41991-06-04 19:41:56 +00002718 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002719 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002720 return co;
2721}