blob: 07c514ccf12648d468948ae2d85aee197eb3ea41 [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{
486 object *v;
487 char *name;
488 char buffer[1000];
489 /* XXX it is possible to write this code without the 1000
490 chars on the total length of dotted names, I just can't be
491 bothered right now */
492 if (TYPE(n) == STAR)
493 name = "*";
494 else if (TYPE(n) == dotted_name) {
495 char *p = buffer;
496 int i;
497 name = buffer;
498 for (i = 0; i < NCH(n); i += 2) {
499 char *s = STR(CHILD(n, i));
500 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
501 err_setstr(MemoryError,
502 "dotted_name too long");
503 name == NULL;
504 break;
505 }
506 if (p != buffer)
507 *p++ = '.';
508 strcpy(p, s);
509 p = strchr(p, '\0');
510 }
511 }
512 else {
513 REQ(n, NAME);
514 name = STR(n);
515 }
516 com_addopnamestr(c, op, name);
517}
518
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000519static object *
520parsenumber(s)
521 char *s;
522{
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000523 extern long mystrtol PROTO((const char *, char **, int));
524 extern unsigned long mystrtoul PROTO((const char *, char **, int));
525 extern double atof PROTO((const char *));
Guido van Rossumc5e96291991-12-10 13:53:51 +0000526 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000527 long x;
Guido van Rossum282914b1991-04-04 10:42:56 +0000528 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000529 end = s + strlen(s) - 1;
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000530 if (*end == 'l' || *end == 'L')
Guido van Rossumc5e96291991-12-10 13:53:51 +0000531 return long_scan(s, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000532 if (s[0] == '0')
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000533 x = (long) mystrtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000534 else
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000535 x = mystrtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +0000536 if (*end == '\0') {
537 if (errno != 0) {
Guido van Rossumefb087b1991-12-16 15:41:41 +0000538 err_setstr(OverflowError,
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000539 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000540 return NULL;
541 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000542 return newintobject(x);
Guido van Rossum282914b1991-04-04 10:42:56 +0000543 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000544 /* XXX Huge floats may silently fail */
545 return newfloatobject(atof(s));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000546}
547
548static object *
549parsestr(s)
550 char *s;
551{
552 object *v;
553 int len;
554 char *buf;
555 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000556 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000557 int c;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000558 int quote = *s;
559 if (quote != '\'' && quote != '\"') {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000560 err_badcall();
561 return NULL;
562 }
563 s++;
564 len = strlen(s);
Guido van Rossum8054fad1993-10-26 15:19:44 +0000565 if (s[--len] != quote) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000566 err_badcall();
567 return NULL;
568 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000569 if (len >= 4 && s[0] == quote && s[1] == quote) {
570 s += 2;
571 len -= 2;
572 if (s[--len] != quote || s[--len] != quote) {
573 err_badcall();
574 return NULL;
575 }
576 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000577 if (strchr(s, '\\') == NULL)
578 return newsizedstringobject(s, len);
579 v = newsizedstringobject((char *)NULL, len);
580 p = buf = getstringvalue(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000581 end = s + len;
582 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000583 if (*s != '\\') {
584 *p++ = *s++;
585 continue;
586 }
587 s++;
588 switch (*s++) {
589 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000590 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000591 case '\\': *p++ = '\\'; break;
592 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000593 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000594 case 'b': *p++ = '\b'; break;
595 case 'f': *p++ = '\014'; break; /* FF */
596 case 't': *p++ = '\t'; break;
597 case 'n': *p++ = '\n'; break;
598 case 'r': *p++ = '\r'; break;
599 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000600 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
601 case '0': case '1': case '2': case '3':
602 case '4': case '5': case '6': case '7':
603 c = s[-1] - '0';
604 if ('0' <= *s && *s <= '7') {
605 c = (c<<3) + *s++ - '0';
606 if ('0' <= *s && *s <= '7')
607 c = (c<<3) + *s++ - '0';
608 }
609 *p++ = c;
610 break;
611 case 'x':
612 if (isxdigit(*s)) {
613 sscanf(s, "%x", &c);
614 *p++ = c;
615 do {
616 s++;
617 } while (isxdigit(*s));
618 break;
619 }
620 /* FALLTHROUGH */
621 default: *p++ = '\\'; *p++ = s[-1]; break;
622 }
623 }
624 resizestring(&v, (int)(p - buf));
625 return v;
626}
627
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000628static object *
629parsestrplus(n)
630 node *n;
631{
632 object *v;
633 int i;
634 REQ(CHILD(n, 0), STRING);
635 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
636 /* String literal concatenation */
637 for (i = 1; i < NCH(n) && v != NULL; i++) {
638 joinstring_decref(&v, parsestr(STR(CHILD(n, i))));
639 }
640 }
641 return v;
642}
643
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000644static void
645com_list_constructor(c, n)
646 struct compiling *c;
647 node *n;
648{
649 int len;
650 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000651 if (TYPE(n) != testlist)
652 REQ(n, exprlist);
653 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
654 len = (NCH(n) + 1) / 2;
655 for (i = 0; i < NCH(n); i += 2)
656 com_node(c, CHILD(n, i));
657 com_addoparg(c, BUILD_LIST, len);
658}
659
660static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000661com_dictmaker(c, n)
662 struct compiling *c;
663 node *n;
664{
665 int i;
666 /* dictmaker: test ':' test (',' test ':' value)* [','] */
667 for (i = 0; i+2 < NCH(n); i += 4) {
668 /* We must arrange things just right for STORE_SUBSCR.
669 It wants the stack to look like (value) (dict) (key) */
670 com_addbyte(c, DUP_TOP);
671 com_node(c, CHILD(n, i+2)); /* value */
672 com_addbyte(c, ROT_TWO);
673 com_node(c, CHILD(n, i)); /* key */
674 com_addbyte(c, STORE_SUBSCR);
675 }
676}
677
678static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000679com_atom(c, n)
680 struct compiling *c;
681 node *n;
682{
683 node *ch;
684 object *v;
685 int i;
686 REQ(n, atom);
687 ch = CHILD(n, 0);
688 switch (TYPE(ch)) {
689 case LPAR:
690 if (TYPE(CHILD(n, 1)) == RPAR)
691 com_addoparg(c, BUILD_TUPLE, 0);
692 else
693 com_node(c, CHILD(n, 1));
694 break;
695 case LSQB:
696 if (TYPE(CHILD(n, 1)) == RSQB)
697 com_addoparg(c, BUILD_LIST, 0);
698 else
699 com_list_constructor(c, CHILD(n, 1));
700 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000701 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000702 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000703 if (TYPE(CHILD(n, 1)) != RBRACE)
704 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000705 break;
706 case BACKQUOTE:
707 com_node(c, CHILD(n, 1));
708 com_addbyte(c, UNARY_CONVERT);
709 break;
710 case NUMBER:
711 if ((v = parsenumber(STR(ch))) == NULL) {
712 c->c_errors++;
713 i = 255;
714 }
715 else {
716 i = com_addconst(c, v);
717 DECREF(v);
718 }
719 com_addoparg(c, LOAD_CONST, i);
720 break;
721 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000722 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000723 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000724 c->c_errors++;
725 i = 255;
726 }
727 else {
728 i = com_addconst(c, v);
729 DECREF(v);
730 }
731 com_addoparg(c, LOAD_CONST, i);
732 break;
733 case NAME:
734 com_addopname(c, LOAD_NAME, ch);
735 break;
736 default:
737 fprintf(stderr, "node type %d\n", TYPE(ch));
738 err_setstr(SystemError, "com_atom: unexpected node type");
739 c->c_errors++;
740 }
741}
742
743static void
744com_slice(c, n, op)
745 struct compiling *c;
746 node *n;
747 int op;
748{
749 if (NCH(n) == 1) {
750 com_addbyte(c, op);
751 }
752 else if (NCH(n) == 2) {
753 if (TYPE(CHILD(n, 0)) != COLON) {
754 com_node(c, CHILD(n, 0));
755 com_addbyte(c, op+1);
756 }
757 else {
758 com_node(c, CHILD(n, 1));
759 com_addbyte(c, op+2);
760 }
761 }
762 else {
763 com_node(c, CHILD(n, 0));
764 com_node(c, CHILD(n, 2));
765 com_addbyte(c, op+3);
766 }
767}
768
769static void
770com_apply_subscript(c, n)
771 struct compiling *c;
772 node *n;
773{
774 REQ(n, subscript);
775 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) != COLON) {
776 /* It's a single subscript */
777 com_node(c, CHILD(n, 0));
778 com_addbyte(c, BINARY_SUBSCR);
779 }
780 else {
781 /* It's a slice: [expr] ':' [expr] */
782 com_slice(c, n, SLICE);
783 }
784}
785
786static void
787com_call_function(c, n)
788 struct compiling *c;
789 node *n; /* EITHER testlist OR ')' */
790{
791 if (TYPE(n) == RPAR) {
Guido van Rossum288a60f1991-12-16 13:05:10 +0000792 com_addoparg(c, BUILD_TUPLE, 0);
793 com_addbyte(c, BINARY_CALL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000794 }
795 else {
Guido van Rossum288a60f1991-12-16 13:05:10 +0000796 REQ(n, testlist);
797 com_list(c, n, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000798 com_addbyte(c, BINARY_CALL);
799 }
800}
801
802static void
803com_select_member(c, n)
804 struct compiling *c;
805 node *n;
806{
807 com_addopname(c, LOAD_ATTR, n);
808}
809
810static void
811com_apply_trailer(c, n)
812 struct compiling *c;
813 node *n;
814{
815 REQ(n, trailer);
816 switch (TYPE(CHILD(n, 0))) {
817 case LPAR:
818 com_call_function(c, CHILD(n, 1));
819 break;
820 case DOT:
821 com_select_member(c, CHILD(n, 1));
822 break;
823 case LSQB:
824 com_apply_subscript(c, CHILD(n, 1));
825 break;
826 default:
827 err_setstr(SystemError,
828 "com_apply_trailer: unknown trailer type");
829 c->c_errors++;
830 }
831}
832
833static void
834com_factor(c, n)
835 struct compiling *c;
836 node *n;
837{
838 int i;
839 REQ(n, factor);
840 if (TYPE(CHILD(n, 0)) == PLUS) {
841 com_factor(c, CHILD(n, 1));
842 com_addbyte(c, UNARY_POSITIVE);
843 }
844 else if (TYPE(CHILD(n, 0)) == MINUS) {
845 com_factor(c, CHILD(n, 1));
846 com_addbyte(c, UNARY_NEGATIVE);
847 }
Guido van Rossum7928cd71991-10-24 14:59:31 +0000848 else if (TYPE(CHILD(n, 0)) == TILDE) {
849 com_factor(c, CHILD(n, 1));
850 com_addbyte(c, UNARY_INVERT);
851 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000852 else {
853 com_atom(c, CHILD(n, 0));
854 for (i = 1; i < NCH(n); i++)
855 com_apply_trailer(c, CHILD(n, i));
856 }
857}
858
859static void
860com_term(c, n)
861 struct compiling *c;
862 node *n;
863{
864 int i;
865 int op;
866 REQ(n, term);
867 com_factor(c, CHILD(n, 0));
868 for (i = 2; i < NCH(n); i += 2) {
869 com_factor(c, CHILD(n, i));
870 switch (TYPE(CHILD(n, i-1))) {
871 case STAR:
872 op = BINARY_MULTIPLY;
873 break;
874 case SLASH:
875 op = BINARY_DIVIDE;
876 break;
877 case PERCENT:
878 op = BINARY_MODULO;
879 break;
880 default:
881 err_setstr(SystemError,
Guido van Rossum7928cd71991-10-24 14:59:31 +0000882 "com_term: operator not *, / or %");
883 c->c_errors++;
884 op = 255;
885 }
886 com_addbyte(c, op);
887 }
888}
889
890static void
891com_arith_expr(c, n)
892 struct compiling *c;
893 node *n;
894{
895 int i;
896 int op;
897 REQ(n, arith_expr);
898 com_term(c, CHILD(n, 0));
899 for (i = 2; i < NCH(n); i += 2) {
900 com_term(c, CHILD(n, i));
901 switch (TYPE(CHILD(n, i-1))) {
902 case PLUS:
903 op = BINARY_ADD;
904 break;
905 case MINUS:
906 op = BINARY_SUBTRACT;
907 break;
908 default:
909 err_setstr(SystemError,
910 "com_arith_expr: operator not + or -");
911 c->c_errors++;
912 op = 255;
913 }
914 com_addbyte(c, op);
915 }
916}
917
918static void
919com_shift_expr(c, n)
920 struct compiling *c;
921 node *n;
922{
923 int i;
924 int op;
925 REQ(n, shift_expr);
926 com_arith_expr(c, CHILD(n, 0));
927 for (i = 2; i < NCH(n); i += 2) {
928 com_arith_expr(c, CHILD(n, i));
929 switch (TYPE(CHILD(n, i-1))) {
930 case LEFTSHIFT:
931 op = BINARY_LSHIFT;
932 break;
933 case RIGHTSHIFT:
934 op = BINARY_RSHIFT;
935 break;
936 default:
937 err_setstr(SystemError,
938 "com_shift_expr: operator not << or >>");
939 c->c_errors++;
940 op = 255;
941 }
942 com_addbyte(c, op);
943 }
944}
945
946static void
947com_and_expr(c, n)
948 struct compiling *c;
949 node *n;
950{
951 int i;
952 int op;
953 REQ(n, and_expr);
954 com_shift_expr(c, CHILD(n, 0));
955 for (i = 2; i < NCH(n); i += 2) {
956 com_shift_expr(c, CHILD(n, i));
957 if (TYPE(CHILD(n, i-1)) == AMPER) {
958 op = BINARY_AND;
959 }
960 else {
961 err_setstr(SystemError,
962 "com_and_expr: operator not &");
963 c->c_errors++;
964 op = 255;
965 }
966 com_addbyte(c, op);
967 }
968}
969
970static void
971com_xor_expr(c, n)
972 struct compiling *c;
973 node *n;
974{
975 int i;
976 int op;
977 REQ(n, xor_expr);
978 com_and_expr(c, CHILD(n, 0));
979 for (i = 2; i < NCH(n); i += 2) {
980 com_and_expr(c, CHILD(n, i));
981 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
982 op = BINARY_XOR;
983 }
984 else {
985 err_setstr(SystemError,
986 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000987 c->c_errors++;
988 op = 255;
989 }
990 com_addbyte(c, op);
991 }
992}
993
994static void
995com_expr(c, n)
996 struct compiling *c;
997 node *n;
998{
999 int i;
1000 int op;
1001 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001002 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001003 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001004 com_xor_expr(c, CHILD(n, i));
1005 if (TYPE(CHILD(n, i-1)) == VBAR) {
1006 op = BINARY_OR;
1007 }
1008 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001009 err_setstr(SystemError,
Guido van Rossum7928cd71991-10-24 14:59:31 +00001010 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001011 c->c_errors++;
1012 op = 255;
1013 }
1014 com_addbyte(c, op);
1015 }
1016}
1017
1018static enum cmp_op
1019cmp_type(n)
1020 node *n;
1021{
1022 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001023 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001024 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1025 if (NCH(n) == 1) {
1026 n = CHILD(n, 0);
1027 switch (TYPE(n)) {
1028 case LESS: return LT;
1029 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001030 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001031 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001032 case LESSEQUAL: return LE;
1033 case GREATEREQUAL: return GE;
1034 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001035 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1036 if (strcmp(STR(n), "is") == 0) return IS;
1037 }
1038 }
1039 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001040 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001041 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1042 return NOT_IN;
1043 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1044 return IS_NOT;
1045 }
1046 }
1047 return BAD;
1048}
1049
1050static void
1051com_comparison(c, n)
1052 struct compiling *c;
1053 node *n;
1054{
1055 int i;
1056 enum cmp_op op;
1057 int anchor;
1058 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
1059 com_expr(c, CHILD(n, 0));
1060 if (NCH(n) == 1)
1061 return;
1062
1063 /****************************************************************
1064 The following code is generated for all but the last
1065 comparison in a chain:
1066
1067 label: on stack: opcode: jump to:
1068
1069 a <code to load b>
1070 a, b DUP_TOP
1071 a, b, b ROT_THREE
1072 b, a, b COMPARE_OP
1073 b, 0-or-1 JUMP_IF_FALSE L1
1074 b, 1 POP_TOP
1075 b
1076
1077 We are now ready to repeat this sequence for the next
1078 comparison in the chain.
1079
1080 For the last we generate:
1081
1082 b <code to load c>
1083 b, c COMPARE_OP
1084 0-or-1
1085
1086 If there were any jumps to L1 (i.e., there was more than one
1087 comparison), we generate:
1088
1089 0-or-1 JUMP_FORWARD L2
1090 L1: b, 0 ROT_TWO
1091 0, b POP_TOP
1092 0
1093 L2:
1094 ****************************************************************/
1095
1096 anchor = 0;
1097
1098 for (i = 2; i < NCH(n); i += 2) {
1099 com_expr(c, CHILD(n, i));
1100 if (i+2 < NCH(n)) {
1101 com_addbyte(c, DUP_TOP);
1102 com_addbyte(c, ROT_THREE);
1103 }
1104 op = cmp_type(CHILD(n, i-1));
1105 if (op == BAD) {
1106 err_setstr(SystemError,
1107 "com_comparison: unknown comparison op");
1108 c->c_errors++;
1109 }
1110 com_addoparg(c, COMPARE_OP, op);
1111 if (i+2 < NCH(n)) {
1112 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1113 com_addbyte(c, POP_TOP);
1114 }
1115 }
1116
1117 if (anchor) {
1118 int anchor2 = 0;
1119 com_addfwref(c, JUMP_FORWARD, &anchor2);
1120 com_backpatch(c, anchor);
1121 com_addbyte(c, ROT_TWO);
1122 com_addbyte(c, POP_TOP);
1123 com_backpatch(c, anchor2);
1124 }
1125}
1126
1127static void
1128com_not_test(c, n)
1129 struct compiling *c;
1130 node *n;
1131{
1132 REQ(n, not_test); /* 'not' not_test | comparison */
1133 if (NCH(n) == 1) {
1134 com_comparison(c, CHILD(n, 0));
1135 }
1136 else {
1137 com_not_test(c, CHILD(n, 1));
1138 com_addbyte(c, UNARY_NOT);
1139 }
1140}
1141
1142static void
1143com_and_test(c, n)
1144 struct compiling *c;
1145 node *n;
1146{
1147 int i;
1148 int anchor;
1149 REQ(n, and_test); /* not_test ('and' not_test)* */
1150 anchor = 0;
1151 i = 0;
1152 for (;;) {
1153 com_not_test(c, CHILD(n, i));
1154 if ((i += 2) >= NCH(n))
1155 break;
1156 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1157 com_addbyte(c, POP_TOP);
1158 }
1159 if (anchor)
1160 com_backpatch(c, anchor);
1161}
1162
1163static void
1164com_test(c, n)
1165 struct compiling *c;
1166 node *n;
1167{
Guido van Rossum57531fe1993-11-30 14:57:42 +00001168 REQ(n, test); /* and_test ('and' and_test)* | lambdef */
1169 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
1170 object *v;
1171 int i;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001172 int argcount;
1173 int ndefs = com_argdefs(c, CHILD(n, 0), &argcount);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001174 v = (object *) compile(CHILD(n, 0), c->c_filename);
1175 if (v == NULL) {
1176 c->c_errors++;
1177 i = 255;
1178 }
1179 else {
1180 i = com_addconst(c, v);
1181 DECREF(v);
1182 }
1183 com_addoparg(c, LOAD_CONST, i);
1184 com_addbyte(c, BUILD_FUNCTION);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001185 if (ndefs > 0)
1186 com_addoparg(c, SET_FUNC_ARGS, argcount);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001187 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00001188 else {
1189 int anchor = 0;
1190 int i = 0;
1191 for (;;) {
1192 com_and_test(c, CHILD(n, i));
1193 if ((i += 2) >= NCH(n))
1194 break;
1195 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1196 com_addbyte(c, POP_TOP);
1197 }
1198 if (anchor)
1199 com_backpatch(c, anchor);
1200 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001201}
1202
1203static void
Guido van Rossum288a60f1991-12-16 13:05:10 +00001204com_list(c, n, toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001205 struct compiling *c;
1206 node *n;
Guido van Rossum288a60f1991-12-16 13:05:10 +00001207 int toplevel; /* If nonzero, *always* build a tuple */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001208{
1209 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001210 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001211 com_node(c, CHILD(n, 0));
1212 }
1213 else {
1214 int i;
1215 int len;
1216 len = (NCH(n) + 1) / 2;
1217 for (i = 0; i < NCH(n); i += 2)
1218 com_node(c, CHILD(n, i));
1219 com_addoparg(c, BUILD_TUPLE, len);
1220 }
1221}
1222
1223
1224/* Begin of assignment compilation */
1225
1226static void com_assign_name PROTO((struct compiling *, node *, int));
1227static void com_assign PROTO((struct compiling *, node *, int));
1228
1229static void
1230com_assign_attr(c, n, assigning)
1231 struct compiling *c;
1232 node *n;
1233 int assigning;
1234{
1235 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
1236}
1237
1238static void
1239com_assign_slice(c, n, assigning)
1240 struct compiling *c;
1241 node *n;
1242 int assigning;
1243{
1244 com_slice(c, n, assigning ? STORE_SLICE : DELETE_SLICE);
1245}
1246
1247static void
1248com_assign_subscript(c, n, assigning)
1249 struct compiling *c;
1250 node *n;
1251 int assigning;
1252{
1253 com_node(c, n);
1254 com_addbyte(c, assigning ? STORE_SUBSCR : DELETE_SUBSCR);
1255}
1256
1257static void
1258com_assign_trailer(c, n, assigning)
1259 struct compiling *c;
1260 node *n;
1261 int assigning;
1262{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001263 REQ(n, trailer);
1264 switch (TYPE(CHILD(n, 0))) {
1265 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001266 err_setstr(SyntaxError, "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001267 c->c_errors++;
1268 break;
1269 case DOT: /* '.' NAME */
1270 com_assign_attr(c, CHILD(n, 1), assigning);
1271 break;
1272 case LSQB: /* '[' subscript ']' */
1273 n = CHILD(n, 1);
1274 REQ(n, subscript); /* subscript: expr | [expr] ':' [expr] */
1275 if (NCH(n) > 1 || TYPE(CHILD(n, 0)) == COLON)
1276 com_assign_slice(c, n, assigning);
1277 else
1278 com_assign_subscript(c, CHILD(n, 0), assigning);
1279 break;
1280 default:
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001281 err_setstr(SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001282 c->c_errors++;
1283 }
1284}
1285
1286static void
1287com_assign_tuple(c, n, assigning)
1288 struct compiling *c;
1289 node *n;
1290 int assigning;
1291{
1292 int i;
1293 if (TYPE(n) != testlist)
1294 REQ(n, exprlist);
1295 if (assigning)
1296 com_addoparg(c, UNPACK_TUPLE, (NCH(n)+1)/2);
1297 for (i = 0; i < NCH(n); i += 2)
1298 com_assign(c, CHILD(n, i), assigning);
1299}
1300
1301static void
1302com_assign_list(c, n, assigning)
1303 struct compiling *c;
1304 node *n;
1305 int assigning;
1306{
1307 int i;
1308 if (assigning)
1309 com_addoparg(c, UNPACK_LIST, (NCH(n)+1)/2);
1310 for (i = 0; i < NCH(n); i += 2)
1311 com_assign(c, CHILD(n, i), assigning);
1312}
1313
1314static void
1315com_assign_name(c, n, assigning)
1316 struct compiling *c;
1317 node *n;
1318 int assigning;
1319{
1320 REQ(n, NAME);
1321 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
1322}
1323
1324static void
1325com_assign(c, n, assigning)
1326 struct compiling *c;
1327 node *n;
1328 int assigning;
1329{
1330 /* Loop to avoid trivial recursion */
1331 for (;;) {
1332 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001333
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001334 case exprlist:
1335 case testlist:
1336 if (NCH(n) > 1) {
1337 com_assign_tuple(c, n, assigning);
1338 return;
1339 }
1340 n = CHILD(n, 0);
1341 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001342
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001343 case test:
1344 case and_test:
1345 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001346 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001347 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001348 case xor_expr:
1349 case and_expr:
1350 case shift_expr:
1351 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001352 case term:
1353 if (NCH(n) > 1) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001354 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001355 "can't assign to operator");
1356 c->c_errors++;
1357 return;
1358 }
1359 n = CHILD(n, 0);
1360 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001361
Guido van Rossum7928cd71991-10-24 14:59:31 +00001362 case factor: /* ('+'|'-'|'~') factor | atom trailer* */
1363 if (TYPE(CHILD(n, 0)) != atom) { /* '+'|'-'|'~' */
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001364 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001365 "can't assign to operator");
1366 c->c_errors++;
1367 return;
1368 }
1369 if (NCH(n) > 1) { /* trailer present */
1370 int i;
1371 com_node(c, CHILD(n, 0));
1372 for (i = 1; i+1 < NCH(n); i++) {
1373 com_apply_trailer(c, CHILD(n, i));
1374 } /* NB i is still alive */
1375 com_assign_trailer(c,
1376 CHILD(n, i), assigning);
1377 return;
1378 }
1379 n = CHILD(n, 0);
1380 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001381
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001382 case atom:
1383 switch (TYPE(CHILD(n, 0))) {
1384 case LPAR:
1385 n = CHILD(n, 1);
1386 if (TYPE(n) == RPAR) {
1387 /* XXX Should allow () = () ??? */
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001388 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001389 "can't assign to ()");
1390 c->c_errors++;
1391 return;
1392 }
1393 break;
1394 case LSQB:
1395 n = CHILD(n, 1);
1396 if (TYPE(n) == RSQB) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001397 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001398 "can't assign to []");
1399 c->c_errors++;
1400 return;
1401 }
1402 com_assign_list(c, n, assigning);
1403 return;
1404 case NAME:
1405 com_assign_name(c, CHILD(n, 0), assigning);
1406 return;
1407 default:
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001408 err_setstr(SyntaxError,
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001409 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001410 c->c_errors++;
1411 return;
1412 }
1413 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001414
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001415 default:
1416 fprintf(stderr, "node type %d\n", TYPE(n));
1417 err_setstr(SystemError, "com_assign: bad node");
1418 c->c_errors++;
1419 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001420
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001421 }
1422 }
1423}
1424
1425static void
1426com_expr_stmt(c, n)
1427 struct compiling *c;
1428 node *n;
1429{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001430 REQ(n, expr_stmt); /* testlist ('=' testlist)* */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001431 com_node(c, CHILD(n, NCH(n)-1));
1432 if (NCH(n) == 1) {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001433 if (c->c_interactive)
1434 com_addbyte(c, PRINT_EXPR);
1435 else
1436 com_addbyte(c, POP_TOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001437 }
1438 else {
1439 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001440 for (i = 0; i < NCH(n)-2; i+=2) {
1441 if (i+2 < NCH(n)-2)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001442 com_addbyte(c, DUP_TOP);
1443 com_assign(c, CHILD(n, i), 1/*assign*/);
1444 }
1445 }
1446}
1447
1448static void
1449com_print_stmt(c, n)
1450 struct compiling *c;
1451 node *n;
1452{
1453 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001454 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
1455 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001456 com_node(c, CHILD(n, i));
1457 com_addbyte(c, PRINT_ITEM);
1458 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001459 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001460 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001461 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001462}
1463
1464static void
1465com_return_stmt(c, n)
1466 struct compiling *c;
1467 node *n;
1468{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001469 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001470 if (!c->c_infunction) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001471 err_setstr(SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001472 c->c_errors++;
1473 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001474 if (NCH(n) < 2)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001475 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1476 else
1477 com_node(c, CHILD(n, 1));
1478 com_addbyte(c, RETURN_VALUE);
1479}
1480
1481static void
1482com_raise_stmt(c, n)
1483 struct compiling *c;
1484 node *n;
1485{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001486 REQ(n, raise_stmt); /* 'raise' test [',' test] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001487 com_node(c, CHILD(n, 1));
1488 if (NCH(n) > 3)
1489 com_node(c, CHILD(n, 3));
1490 else
1491 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1492 com_addbyte(c, RAISE_EXCEPTION);
1493}
1494
1495static void
1496com_import_stmt(c, n)
1497 struct compiling *c;
1498 node *n;
1499{
1500 int i;
1501 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001502 /* 'import' dotted_name (',' dotted_name)* |
1503 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001504 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001505 /* 'from' dotted_name 'import' ... */
1506 REQ(CHILD(n, 1), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001507 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
1508 for (i = 3; i < NCH(n); i += 2)
1509 com_addopname(c, IMPORT_FROM, CHILD(n, i));
1510 com_addbyte(c, POP_TOP);
1511 }
1512 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001513 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001514 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001515 REQ(CHILD(n, i), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001516 com_addopname(c, IMPORT_NAME, CHILD(n, i));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001517 com_addopname(c, STORE_NAME, CHILD(CHILD(n, i), 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001518 }
1519 }
1520}
1521
1522static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00001523com_global_stmt(c, n)
1524 struct compiling *c;
1525 node *n;
1526{
1527 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001528 REQ(n, global_stmt);
1529 /* 'global' NAME (',' NAME)* */
1530 for (i = 1; i < NCH(n); i += 2) {
1531 if (dictinsert(c->c_globals, STR(CHILD(n, i)), None) != 0)
1532 c->c_errors++;
1533 }
1534}
1535
Guido van Rossum25831651993-05-19 14:50:45 +00001536#define strequ(a, b) (strcmp((a), (b)) == 0)
1537
1538static void
1539com_access_stmt(c, n)
1540 struct compiling *c;
1541 node *n;
1542{
1543 int i, j, k, mode, imode;
1544 object *vmode;
1545 REQ(n, access_stmt);
1546 /* 'access' NAME (',' NAME)* ':' accesstype (',' accesstype)*
1547 accesstype: NAME+ */
1548
1549 /* Find where the colon is */
1550 i = 1;
1551 while (TYPE(CHILD(n,i-1)) != COLON)
1552 i += 1;
1553
1554 /* Calculate the mode mask */
1555 mode = 0;
1556 for (j = i; j < NCH(n); j += 2) {
Guido van Rossum81daa321993-05-20 14:24:46 +00001557 int r = 0, w = 0, p = 0;
1558 for (k = 0; k < NCH(CHILD(n,j)); k++) {
Guido van Rossum25831651993-05-19 14:50:45 +00001559 if (strequ(STR(CHILD(CHILD(n,j),k)), "public"))
1560 p = 0;
1561 else if (strequ(STR(CHILD(CHILD(n,j),k)), "protected"))
1562 p = 1;
1563 else if (strequ(STR(CHILD(CHILD(n,j),k)), "private"))
1564 p = 2;
1565 else if (strequ(STR(CHILD(CHILD(n,j),k)), "read"))
1566 r = 1;
1567 else if (strequ(STR(CHILD(CHILD(n,j),k)), "write"))
1568 w = 1;
1569 else /* XXX should make this an exception */
1570 fprintf(stderr, "bad access type %s\n",
1571 STR(CHILD(CHILD(n,j),k)));
1572 }
1573 if (r == 0 && w == 0)
Guido van Rossum81daa321993-05-20 14:24:46 +00001574 r = w = 1;
Guido van Rossum25831651993-05-19 14:50:45 +00001575 if (p == 0) {
1576 if (r == 1) mode |= AC_R_PUBLIC;
1577 if (w == 1) mode |= AC_W_PUBLIC;
1578 } else if (p == 1) {
1579 if (r == 1) mode |= AC_R_PROTECTED;
1580 if (w == 1) mode |= AC_W_PROTECTED;
1581 } else {
1582 if (r == 1) mode |= AC_R_PRIVATE;
1583 if (w == 1) mode |= AC_W_PRIVATE;
1584 }
1585 }
1586 vmode = newintobject((long)mode);
1587 imode = com_addconst(c, vmode);
1588 XDECREF(vmode);
1589 for (i = 1; TYPE(CHILD(n,i-1)) != COLON; i+=2) {
1590 com_addoparg(c, LOAD_CONST, imode);
1591 com_addopname(c, ACCESS_MODE, CHILD(n, i));
1592 }
1593}
1594
Guido van Rossumc5e96291991-12-10 13:53:51 +00001595static void
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001596com_exec_stmt(c, n)
1597 struct compiling *c;
1598 node *n;
1599{
1600 REQ(n, exec_stmt);
1601 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
1602 com_node(c, CHILD(n, 1));
1603 if (NCH(n) >= 4)
1604 com_node(c, CHILD(n, 3));
1605 else
1606 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1607 if (NCH(n) >= 6)
1608 com_node(c, CHILD(n, 5));
1609 else
1610 com_addbyte(c, DUP_TOP);
1611 com_addbyte(c, EXEC_STMT);
1612}
1613
1614static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001615com_if_stmt(c, n)
1616 struct compiling *c;
1617 node *n;
1618{
1619 int i;
1620 int anchor = 0;
1621 REQ(n, if_stmt);
1622 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
1623 for (i = 0; i+3 < NCH(n); i+=4) {
1624 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001625 node *ch = CHILD(n, i+1);
1626 if (i > 0)
1627 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001628 com_node(c, CHILD(n, i+1));
1629 com_addfwref(c, JUMP_IF_FALSE, &a);
1630 com_addbyte(c, POP_TOP);
1631 com_node(c, CHILD(n, i+3));
1632 com_addfwref(c, JUMP_FORWARD, &anchor);
1633 com_backpatch(c, a);
1634 com_addbyte(c, POP_TOP);
1635 }
1636 if (i+2 < NCH(n))
1637 com_node(c, CHILD(n, i+2));
1638 com_backpatch(c, anchor);
1639}
1640
1641static void
1642com_while_stmt(c, n)
1643 struct compiling *c;
1644 node *n;
1645{
1646 int break_anchor = 0;
1647 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001648 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001649 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
1650 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001651 block_push(c, SETUP_LOOP);
1652 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001653 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001654 com_node(c, CHILD(n, 1));
1655 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1656 com_addbyte(c, POP_TOP);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001657 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001658 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001659 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001660 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1661 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001662 com_backpatch(c, anchor);
1663 com_addbyte(c, POP_TOP);
1664 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001665 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001666 if (NCH(n) > 4)
1667 com_node(c, CHILD(n, 6));
1668 com_backpatch(c, break_anchor);
1669}
1670
1671static void
1672com_for_stmt(c, n)
1673 struct compiling *c;
1674 node *n;
1675{
1676 object *v;
1677 int break_anchor = 0;
1678 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001679 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001680 REQ(n, for_stmt);
1681 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
1682 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001683 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001684 com_node(c, CHILD(n, 3));
1685 v = newintobject(0L);
1686 if (v == NULL)
1687 c->c_errors++;
1688 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
1689 XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001690 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001691 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001692 com_addfwref(c, FOR_LOOP, &anchor);
1693 com_assign(c, CHILD(n, 1), 1/*assigning*/);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001694 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001695 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001696 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001697 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1698 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001699 com_backpatch(c, anchor);
1700 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001701 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001702 if (NCH(n) > 8)
1703 com_node(c, CHILD(n, 8));
1704 com_backpatch(c, break_anchor);
1705}
1706
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001707/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001708
1709 SETUP_FINALLY L
1710 <code for S>
1711 POP_BLOCK
1712 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001713 L: <code for Sf>
1714 END_FINALLY
1715
1716 The special instructions use the block stack. Each block
1717 stack entry contains the instruction that created it (here
1718 SETUP_FINALLY), the level of the value stack at the time the
1719 block stack entry was created, and a label (here L).
1720
1721 SETUP_FINALLY:
1722 Pushes the current value stack level and the label
1723 onto the block stack.
1724 POP_BLOCK:
1725 Pops en entry from the block stack, and pops the value
1726 stack until its level is the same as indicated on the
1727 block stack. (The label is ignored.)
1728 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001729 Pops a variable number of entries from the *value* stack
1730 and re-raises the exception they specify. The number of
1731 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001732
1733 The block stack is unwound when an exception is raised:
1734 when a SETUP_FINALLY entry is found, the exception is pushed
1735 onto the value stack (and the exception condition is cleared),
1736 and the interpreter jumps to the label gotten from the block
1737 stack.
1738
1739 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00001740 (The contents of the value stack is shown in [], with the top
1741 at the right; 'tb' is trace-back info, 'val' the exception's
1742 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001743
1744 Value stack Label Instruction Argument
1745 [] SETUP_EXCEPT L1
1746 [] <code for S>
1747 [] POP_BLOCK
1748 [] JUMP_FORWARD L0
1749
Guido van Rossum3f5da241990-12-20 15:06:42 +00001750 [tb, val, exc] L1: DUP )
1751 [tb, val, exc, exc] <evaluate E1> )
1752 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
1753 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
1754 [tb, val, exc, 1] POP )
1755 [tb, val, exc] POP
1756 [tb, val] <assign to V1> (or POP if no V1)
1757 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001758 [] <code for S1>
1759 JUMP_FORWARD L0
1760
Guido van Rossum3f5da241990-12-20 15:06:42 +00001761 [tb, val, exc, 0] L2: POP
1762 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001763 .............................etc.......................
1764
Guido van Rossum3f5da241990-12-20 15:06:42 +00001765 [tb, val, exc, 0] Ln+1: POP
1766 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001767
1768 [] L0: <next statement>
1769
1770 Of course, parts are not generated if Vi or Ei is not present.
1771*/
1772
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001773static void
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001774com_try_except(c, n)
1775 struct compiling *c;
1776 node *n;
1777{
1778 int except_anchor = 0;
1779 int end_anchor = 0;
1780 int else_anchor = 0;
1781 int i;
1782 node *ch;
1783
1784 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
1785 block_push(c, SETUP_EXCEPT);
1786 com_node(c, CHILD(n, 2));
1787 com_addbyte(c, POP_BLOCK);
1788 block_pop(c, SETUP_EXCEPT);
1789 com_addfwref(c, JUMP_FORWARD, &else_anchor);
1790 com_backpatch(c, except_anchor);
1791 for (i = 3;
1792 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
1793 i += 3) {
1794 /* except_clause: 'except' [expr [',' expr]] */
1795 if (except_anchor == 0) {
1796 err_setstr(SyntaxError,
1797 "default 'except:' must be last");
1798 c->c_errors++;
1799 break;
1800 }
1801 except_anchor = 0;
1802 com_addoparg(c, SET_LINENO, ch->n_lineno);
1803 if (NCH(ch) > 1) {
1804 com_addbyte(c, DUP_TOP);
1805 com_node(c, CHILD(ch, 1));
1806 com_addoparg(c, COMPARE_OP, EXC_MATCH);
1807 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
1808 com_addbyte(c, POP_TOP);
1809 }
1810 com_addbyte(c, POP_TOP);
1811 if (NCH(ch) > 3)
1812 com_assign(c, CHILD(ch, 3), 1/*assigning*/);
1813 else
1814 com_addbyte(c, POP_TOP);
1815 com_addbyte(c, POP_TOP);
1816 com_node(c, CHILD(n, i+2));
1817 com_addfwref(c, JUMP_FORWARD, &end_anchor);
1818 if (except_anchor) {
1819 com_backpatch(c, except_anchor);
1820 com_addbyte(c, POP_TOP);
1821 }
1822 }
1823 com_addbyte(c, END_FINALLY);
1824 com_backpatch(c, else_anchor);
1825 if (i < NCH(n))
1826 com_node(c, CHILD(n, i+2));
1827 com_backpatch(c, end_anchor);
1828}
1829
1830static void
1831com_try_finally(c, n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001832 struct compiling *c;
1833 node *n;
1834{
1835 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001836 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00001837
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001838 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
1839 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001840 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001841 com_addbyte(c, POP_BLOCK);
1842 block_pop(c, SETUP_FINALLY);
1843 block_push(c, END_FINALLY);
1844 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1845 com_backpatch(c, finally_anchor);
1846 ch = CHILD(n, NCH(n)-1);
1847 com_addoparg(c, SET_LINENO, ch->n_lineno);
1848 com_node(c, ch);
1849 com_addbyte(c, END_FINALLY);
1850 block_pop(c, END_FINALLY);
1851}
1852
1853static void
1854com_try_stmt(c, n)
1855 struct compiling *c;
1856 node *n;
1857{
1858 REQ(n, try_stmt);
1859 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
1860 | 'try' ':' suite 'finally' ':' suite */
1861 if (TYPE(CHILD(n, 3)) != except_clause)
1862 com_try_finally(c, n);
1863 else
1864 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001865}
1866
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001867static object *
1868get_docstring(n)
1869 node *n;
1870{
1871 switch (TYPE(n)) {
1872
1873 case suite:
1874 if (NCH(n) == 1)
1875 return get_docstring(CHILD(n, 0));
1876 else {
1877 int i;
1878 for (i = 0; i < NCH(n); i++) {
1879 node *ch = CHILD(n, i);
1880 if (TYPE(ch) == stmt)
1881 return get_docstring(ch);
1882 }
1883 }
1884 break;
1885
1886 case stmt:
1887 case simple_stmt:
1888 case small_stmt:
1889 return get_docstring(CHILD(n, 0));
1890
1891 case expr_stmt:
1892 case testlist:
1893 case test:
1894 case and_test:
1895 case not_test:
1896 case comparison:
1897 case expr:
1898 case xor_expr:
1899 case and_expr:
1900 case shift_expr:
1901 case arith_expr:
1902 case term:
1903 case factor:
1904 if (NCH(n) == 1)
1905 return get_docstring(CHILD(n, 0));
1906 break;
1907
1908 case atom:
1909 if (TYPE(CHILD(n, 0)) == STRING)
1910 return parsestrplus(n);
1911 break;
1912
1913 }
1914 return NULL;
1915}
1916
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001917static void
1918com_suite(c, n)
1919 struct compiling *c;
1920 node *n;
1921{
1922 REQ(n, suite);
1923 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
1924 if (NCH(n) == 1) {
1925 com_node(c, CHILD(n, 0));
1926 }
1927 else {
1928 int i;
1929 for (i = 0; i < NCH(n); i++) {
1930 node *ch = CHILD(n, i);
1931 if (TYPE(ch) == stmt)
1932 com_node(c, ch);
1933 }
1934 }
1935}
1936
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001937/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001938static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001939com_continue_stmt(c, n)
1940 struct compiling *c;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001941 node *n; /* Not used, but passed for consistency */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001942{
1943 int i = c->c_nblocks;
1944 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
1945 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1946 }
1947 else {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001948 err_setstr(SyntaxError, "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001949 c->c_errors++;
1950 }
1951 /* XXX Could allow it inside a 'finally' clause
1952 XXX if we could pop the exception still on the stack */
1953}
1954
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001955static int
1956com_argdefs(c, n, argcount_return)
1957 struct compiling *c;
1958 node *n;
1959 int *argcount_return;
1960{
1961 int i, nch, nargs, ndefs, star;
1962 if (TYPE(n) == lambdef) {
1963 /* lambdef: 'lambda' [varargslist] ':' test */
1964 n = CHILD(n, 1);
1965 }
1966 else {
1967 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
1968 n = CHILD(n, 2);
1969 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
1970 n = CHILD(n, 1);
1971 }
1972 if (TYPE(n) != varargslist)
1973 return -1;
1974 /* varargslist:
1975 (fpdef ['=' test] ',')* '*' NAME |
1976 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
1977 nch = NCH(n);
1978 if (nch >= 2 && TYPE(CHILD(n, nch-2)) == STAR) {
1979 star = 1;
1980 nch -= 2;
1981 }
1982 else
1983 star = 0;
1984 nargs = 0;
1985 ndefs = 0;
1986 for (i = 0; i < nch; i++) {
1987 int t;
1988 nargs++;
1989 i++;
1990 if (i >= nch)
1991 break;
1992 t = TYPE(CHILD(n, i));
1993 if (t == EQUAL) {
1994 i++;
1995 ndefs++;
1996 com_node(c, CHILD(n, i));
1997 i++;
1998 if (i >= nch)
1999 break;
2000 t = TYPE(CHILD(n, i));
2001 }
2002 else {
2003 /* Treat "(a=1, b)" as "(a=1, b=None)" */
2004 if (ndefs) {
2005 com_addoparg(c, LOAD_CONST,
2006 com_addconst(c, None));
2007 ndefs++;
2008 }
2009 }
2010 if (t != COMMA)
2011 break;
2012 }
2013 if (star)
2014 nargs ^= 0x4000;
2015 *argcount_return = nargs;
2016 if (ndefs > 0)
2017 com_addoparg(c, BUILD_TUPLE, ndefs);
2018 return ndefs;
2019}
2020
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002021static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002022com_funcdef(c, n)
2023 struct compiling *c;
2024 node *n;
2025{
2026 object *v;
2027 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum590baa41993-11-30 13:40:46 +00002028 v = (object *)compile(n, c->c_filename);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002029 if (v == NULL)
2030 c->c_errors++;
2031 else {
2032 int i = com_addconst(c, v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002033 int argcount;
2034 int ndefs = com_argdefs(c, n, &argcount);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002035 com_addoparg(c, LOAD_CONST, i);
2036 com_addbyte(c, BUILD_FUNCTION);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002037 if (ndefs > 0)
2038 com_addoparg(c, SET_FUNC_ARGS, argcount);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002039 com_addopname(c, STORE_NAME, CHILD(n, 1));
2040 DECREF(v);
2041 }
2042}
2043
2044static void
Guido van Rossum25831651993-05-19 14:50:45 +00002045com_bases(c, n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002046 struct compiling *c;
2047 node *n;
2048{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002049 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002050 REQ(n, testlist);
2051 /* testlist: test (',' test)* [','] */
2052 for (i = 0; i < NCH(n); i += 2)
2053 com_node(c, CHILD(n, i));
2054 com_addoparg(c, BUILD_TUPLE, (NCH(n)+1) / 2);
2055}
2056
2057static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002058com_classdef(c, n)
2059 struct compiling *c;
2060 node *n;
2061{
Guido van Rossum25831651993-05-19 14:50:45 +00002062 int i;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002063 object *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002064 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00002065 /* classdef: class NAME ['(' testlist ')'] ':' suite */
2066 if ((v = newstringobject(STR(CHILD(n, 1)))) == NULL) {
2067 c->c_errors++;
2068 return;
2069 }
2070 /* Push the class name on the stack */
2071 i = com_addconst(c, v);
2072 com_addoparg(c, LOAD_CONST, i);
2073 DECREF(v);
2074 /* Push the tuple of base classes on the stack */
2075 if (TYPE(CHILD(n, 2)) != LPAR)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002076 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum25831651993-05-19 14:50:45 +00002077 else
2078 com_bases(c, CHILD(n, 3));
Guido van Rossum590baa41993-11-30 13:40:46 +00002079 v = (object *)compile(n, c->c_filename);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002080 if (v == NULL)
2081 c->c_errors++;
2082 else {
Guido van Rossum25831651993-05-19 14:50:45 +00002083 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002084 com_addoparg(c, LOAD_CONST, i);
2085 com_addbyte(c, BUILD_FUNCTION);
2086 com_addbyte(c, UNARY_CALL);
2087 com_addbyte(c, BUILD_CLASS);
2088 com_addopname(c, STORE_NAME, CHILD(n, 1));
2089 DECREF(v);
2090 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002091}
2092
2093static void
2094com_node(c, n)
2095 struct compiling *c;
2096 node *n;
2097{
2098 switch (TYPE(n)) {
2099
2100 /* Definition nodes */
2101
2102 case funcdef:
2103 com_funcdef(c, n);
2104 break;
2105 case classdef:
2106 com_classdef(c, n);
2107 break;
2108
2109 /* Trivial parse tree nodes */
2110
2111 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002112 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002113 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002114 com_node(c, CHILD(n, 0));
2115 break;
2116
2117 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002118 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
2119 com_addoparg(c, SET_LINENO, n->n_lineno);
2120 {
2121 int i;
2122 for (i = 0; i < NCH(n)-1; i += 2)
2123 com_node(c, CHILD(n, i));
2124 }
2125 break;
2126
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002127 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002128 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002129 com_node(c, CHILD(n, 0));
2130 break;
2131
2132 /* Statement nodes */
2133
2134 case expr_stmt:
2135 com_expr_stmt(c, n);
2136 break;
2137 case print_stmt:
2138 com_print_stmt(c, n);
2139 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002140 case del_stmt: /* 'del' exprlist */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002141 com_assign(c, CHILD(n, 1), 0/*delete*/);
2142 break;
2143 case pass_stmt:
2144 break;
2145 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002146 if (c->c_loops == 0) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00002147 err_setstr(SyntaxError, "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002148 c->c_errors++;
2149 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002150 com_addbyte(c, BREAK_LOOP);
2151 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002152 case continue_stmt:
2153 com_continue_stmt(c, n);
2154 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002155 case return_stmt:
2156 com_return_stmt(c, n);
2157 break;
2158 case raise_stmt:
2159 com_raise_stmt(c, n);
2160 break;
2161 case import_stmt:
2162 com_import_stmt(c, n);
2163 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002164 case global_stmt:
2165 com_global_stmt(c, n);
2166 break;
Guido van Rossum25831651993-05-19 14:50:45 +00002167 case access_stmt:
2168 com_access_stmt(c, n);
2169 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002170 case exec_stmt:
2171 com_exec_stmt(c, n);
2172 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002173 case if_stmt:
2174 com_if_stmt(c, n);
2175 break;
2176 case while_stmt:
2177 com_while_stmt(c, n);
2178 break;
2179 case for_stmt:
2180 com_for_stmt(c, n);
2181 break;
2182 case try_stmt:
2183 com_try_stmt(c, n);
2184 break;
2185 case suite:
2186 com_suite(c, n);
2187 break;
2188
2189 /* Expression nodes */
2190
2191 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002192 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002193 break;
2194 case test:
2195 com_test(c, n);
2196 break;
2197 case and_test:
2198 com_and_test(c, n);
2199 break;
2200 case not_test:
2201 com_not_test(c, n);
2202 break;
2203 case comparison:
2204 com_comparison(c, n);
2205 break;
2206 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002207 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002208 break;
2209 case expr:
2210 com_expr(c, n);
2211 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002212 case xor_expr:
2213 com_xor_expr(c, n);
2214 break;
2215 case and_expr:
2216 com_and_expr(c, n);
2217 break;
2218 case shift_expr:
2219 com_shift_expr(c, n);
2220 break;
2221 case arith_expr:
2222 com_arith_expr(c, n);
2223 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002224 case term:
2225 com_term(c, n);
2226 break;
2227 case factor:
2228 com_factor(c, n);
2229 break;
2230 case atom:
2231 com_atom(c, n);
2232 break;
2233
2234 default:
2235 fprintf(stderr, "node type %d\n", TYPE(n));
2236 err_setstr(SystemError, "com_node: unexpected node type");
2237 c->c_errors++;
2238 }
2239}
2240
2241static void com_fplist PROTO((struct compiling *, node *));
2242
2243static void
2244com_fpdef(c, n)
2245 struct compiling *c;
2246 node *n;
2247{
2248 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
2249 if (TYPE(CHILD(n, 0)) == LPAR)
2250 com_fplist(c, CHILD(n, 1));
2251 else
2252 com_addopname(c, STORE_NAME, CHILD(n, 0));
2253}
2254
2255static void
2256com_fplist(c, n)
2257 struct compiling *c;
2258 node *n;
2259{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00002260 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002261 if (NCH(n) == 1) {
2262 com_fpdef(c, CHILD(n, 0));
2263 }
2264 else {
2265 int i;
2266 com_addoparg(c, UNPACK_TUPLE, (NCH(n)+1)/2);
2267 for (i = 0; i < NCH(n); i += 2)
2268 com_fpdef(c, CHILD(n, i));
2269 }
2270}
2271
2272static void
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002273com_arglist(c, n)
2274 struct compiling *c;
2275 node *n;
2276{
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002277 int nch, op, nargs, i, t;
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002278 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00002279 /* varargslist:
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002280 (fpdef ['=' test] ',')* '*' NAME |
2281 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
2282 nch = NCH(n);
2283 if (nch >= 2 && TYPE(CHILD(n, nch-2)) == STAR) {
2284 op = UNPACK_VARARG;
2285 nch -= 2;
2286 }
2287 else
2288 op = UNPACK_ARG;
2289 nargs = 0;
2290 for (i = 0; i < nch; i++) {
2291 nargs++;
2292 i++;
2293 if (i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002294 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002295 t = TYPE(CHILD(n, i));
2296 if (t == EQUAL) {
2297 i += 2;
2298 if (i >= nch)
2299 break;
2300 t = TYPE(CHILD(n, i));
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002301 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002302 if (t != COMMA)
2303 break;
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002304 }
2305 com_addoparg(c, op, nargs);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002306 for (i = 0; i < nch; i++) {
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002307 com_fpdef(c, CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002308 i++;
2309 if (i >= nch)
2310 break;
2311 t = TYPE(CHILD(n, i));
2312 if (t == EQUAL) {
2313 i += 2;
2314 if (i >= nch)
2315 break;
2316 t = TYPE(CHILD(n, i));
2317 }
2318 if (t != COMMA)
2319 break;
2320 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002321 if (op == UNPACK_VARARG)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002322 com_addopname(c, STORE_NAME, CHILD(n, nch+1));
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002323}
2324
2325static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002326com_file_input(c, n)
2327 struct compiling *c;
2328 node *n;
2329{
2330 int i;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002331 object *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002332 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002333 doc = get_docstring(n);
2334 if (doc != NULL) {
2335 int i = com_addconst(c, doc);
2336 DECREF(doc);
2337 com_addoparg(c, LOAD_CONST, i);
2338 com_addopnamestr(c, STORE_NAME, "__doc__");
2339 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002340 for (i = 0; i < NCH(n); i++) {
2341 node *ch = CHILD(n, i);
2342 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
2343 com_node(c, ch);
2344 }
2345}
2346
2347/* Top-level compile-node interface */
2348
2349static void
2350compile_funcdef(c, n)
2351 struct compiling *c;
2352 node *n;
2353{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002354 object *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002355 node *ch;
2356 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00002357 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002358 doc = get_docstring(CHILD(n, 4));
2359 if (doc != NULL) {
2360 (void) com_addconst(c, doc);
2361 DECREF(doc);
2362 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002363 com_addoparg(c, RESERVE_FAST, com_addconst(c, None)); /* Patched! */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002364 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
2365 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002366 if (TYPE(ch) == RPAR)
Guido van Rossum288a60f1991-12-16 13:05:10 +00002367 com_addoparg(c, UNPACK_ARG, 0);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002368 else
2369 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002370 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002371 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002372 c->c_infunction = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002373 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2374 com_addbyte(c, RETURN_VALUE);
2375}
2376
2377static void
Guido van Rossum590baa41993-11-30 13:40:46 +00002378compile_lambdef(c, n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002379 struct compiling *c;
2380 node *n;
2381{
Guido van Rossum590baa41993-11-30 13:40:46 +00002382 node *ch;
2383 REQ(n, lambdef); /* lambdef: 'lambda' [parameters] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00002384 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00002385
2386 ch = CHILD(n, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002387 (void) com_addconst(c, None);
Guido van Rossum590baa41993-11-30 13:40:46 +00002388 if (TYPE(ch) == COLON) {
2389 com_addoparg(c, UNPACK_ARG, 0);
2390 com_node(c, CHILD(n, 2));
2391 }
2392 else {
2393 com_addoparg(c, RESERVE_FAST, com_addconst(c, None));
2394 com_arglist(c, ch);
2395 com_node(c, CHILD(n, 3));
2396 }
2397
Guido van Rossum12d12c51993-10-26 17:58:25 +00002398 com_addbyte(c, RETURN_VALUE);
2399}
2400
2401static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002402compile_classdef(c, n)
2403 struct compiling *c;
2404 node *n;
2405{
2406 node *ch;
2407 object *doc;
2408 REQ(n, classdef);
2409 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
2410 c->c_name = STR(CHILD(n, 1));
2411 ch = CHILD(n, NCH(n)-1); /* The suite */
2412 doc = get_docstring(ch);
2413 if (doc != NULL) {
2414 int i = com_addconst(c, doc);
2415 DECREF(doc);
2416 com_addoparg(c, LOAD_CONST, i);
2417 com_addopnamestr(c, STORE_NAME, "__doc__");
2418 }
2419 else
2420 (void) com_addconst(c, None);
2421 com_node(c, ch);
2422 com_addbyte(c, LOAD_LOCALS);
2423 com_addbyte(c, RETURN_VALUE);
2424}
2425
2426static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002427compile_node(c, n)
2428 struct compiling *c;
2429 node *n;
2430{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002431 com_addoparg(c, SET_LINENO, n->n_lineno);
2432
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002433 switch (TYPE(n)) {
2434
Guido van Rossum4c417781991-01-21 16:09:22 +00002435 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002436 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002437 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002438 n = CHILD(n, 0);
2439 if (TYPE(n) != NEWLINE)
2440 com_node(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002441 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2442 com_addbyte(c, RETURN_VALUE);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002443 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002444 break;
2445
Guido van Rossum4c417781991-01-21 16:09:22 +00002446 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002447 com_file_input(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002448 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2449 com_addbyte(c, RETURN_VALUE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002450 break;
2451
Guido van Rossum590baa41993-11-30 13:40:46 +00002452 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00002453 com_node(c, CHILD(n, 0));
2454 com_addbyte(c, RETURN_VALUE);
2455 break;
2456
Guido van Rossum590baa41993-11-30 13:40:46 +00002457 case lambdef: /* anonymous function definition */
2458 compile_lambdef(c, n);
2459 break;
2460
Guido van Rossum4c417781991-01-21 16:09:22 +00002461 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002462 compile_funcdef(c, n);
2463 break;
2464
Guido van Rossum4c417781991-01-21 16:09:22 +00002465 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002466 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002467 break;
2468
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002469 default:
2470 fprintf(stderr, "node type %d\n", TYPE(n));
2471 err_setstr(SystemError, "compile_node: unexpected node type");
2472 c->c_errors++;
2473 }
2474}
2475
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002476/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00002477
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002478 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
2479 instructions that refer to local variables with LOAD_FAST etc.
2480 The latter instructions are much faster because they don't need to
2481 look up the variable name in a dictionary.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002482
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002483 To find all local variables, we check all STORE_NAME, IMPORT_FROM and
2484 DELETE_NAME instructions. This yields all local variables, including
2485 arguments, function definitions, class definitions and import
2486 statements.
2487
2488 All remaining LOAD_NAME instructions must refer to non-local (global
2489 or builtin) variables, so are replaced by LOAD_GLOBAL.
2490
2491 There are two problems: 'from foo import *' and 'exec' may introduce
2492 local variables that we can't know while compiling. If this is the
2493 case, we don't optimize at all (this rarely happens, since exec is
2494 rare, & this form of import statement is mostly used at the module
2495 level).
2496
Guido van Rossum282914b1991-04-04 10:42:56 +00002497 NB: this modifies the string object co->co_code!
2498*/
2499
2500static void
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002501optimize(c)
2502 struct compiling *c;
Guido van Rossum282914b1991-04-04 10:42:56 +00002503{
Guido van Rossum0a697f61991-04-16 08:39:12 +00002504 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00002505 object *locals;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002506 int nlocals;
Guido van Rossum282914b1991-04-04 10:42:56 +00002507 int opcode;
2508 int oparg;
2509 object *name;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002510 int fast_reserved;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002511 object *error_type, *error_value, *error_traceback;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002512
Guido van Rossum282914b1991-04-04 10:42:56 +00002513#define NEXTOP() (*next_instr++)
2514#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
2515#define GETITEM(v, i) (getlistitem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002516#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
2517
Guido van Rossum282914b1991-04-04 10:42:56 +00002518 locals = newdictobject();
2519 if (locals == NULL) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002520 c->c_errors++;
2521 return;
Guido van Rossum282914b1991-04-04 10:42:56 +00002522 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002523 nlocals = 0;
2524
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002525 err_fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum282914b1991-04-04 10:42:56 +00002526
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002527 next_instr = (unsigned char *) getstringvalue(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00002528 for (;;) {
2529 opcode = NEXTOP();
2530 if (opcode == STOP_CODE)
2531 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002532 if (opcode == EXEC_STMT)
2533 goto end; /* Don't optimize if exec present */
Guido van Rossum282914b1991-04-04 10:42:56 +00002534 if (HAS_ARG(opcode))
2535 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002536 if (opcode == STORE_NAME || opcode == DELETE_NAME ||
2537 opcode == IMPORT_FROM) {
2538 object *v;
Guido van Rossum282914b1991-04-04 10:42:56 +00002539 name = GETNAMEOBJ(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002540 if (dict2lookup(locals, name) != NULL)
2541 continue;
2542 err_clear();
2543 v = newintobject(nlocals);
2544 if (v == NULL) {
2545 c->c_errors++;
2546 goto err;
Guido van Rossum282914b1991-04-04 10:42:56 +00002547 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002548 nlocals++;
2549 if (dict2insert(locals, name, v) != 0) {
2550 DECREF(v);
2551 c->c_errors++;
2552 goto err;
2553 }
2554 DECREF(v);
Guido van Rossum282914b1991-04-04 10:42:56 +00002555 }
2556 }
2557
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002558 if (dictlookup(locals, "*") != NULL) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002559 /* Don't optimize anything */
2560 goto end;
2561 }
2562
2563 next_instr = (unsigned char *) getstringvalue(c->c_code);
2564 fast_reserved = 0;
Guido van Rossum282914b1991-04-04 10:42:56 +00002565 for (;;) {
2566 cur_instr = next_instr;
2567 opcode = NEXTOP();
2568 if (opcode == STOP_CODE)
2569 break;
2570 if (HAS_ARG(opcode))
2571 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002572 if (opcode == RESERVE_FAST) {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002573 int i;
2574 object *localmap = newtupleobject(nlocals);
2575 int pos;
2576 object *key, *value;
2577 if (localmap == NULL) { /* XXX mask error */
2578 err_clear();
2579 continue;
2580 }
2581 pos = 0;
2582 while (mappinggetnext(locals, &pos, &key, &value)) {
2583 int j;
2584 if (!is_intobject(value))
2585 continue;
2586 j = getintvalue(value);
2587 if (0 <= j && j < nlocals) {
2588 INCREF(key);
2589 settupleitem(localmap, j, key);
2590 }
2591 }
2592 i = com_addconst(c, localmap);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002593 cur_instr[1] = i & 0xff;
2594 cur_instr[2] = (i>>8) & 0xff;
2595 fast_reserved = 1;
2596 continue;
2597 }
2598 if (!fast_reserved)
2599 continue;
2600 if (opcode == LOAD_NAME ||
2601 opcode == STORE_NAME ||
2602 opcode == DELETE_NAME) {
2603 object *v;
2604 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00002605 name = GETNAMEOBJ(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002606 v = dict2lookup(locals, name);
2607 if (v == NULL) {
Guido van Rossum83163251991-08-16 08:58:43 +00002608 err_clear();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002609 if (opcode == LOAD_NAME)
2610 cur_instr[0] = LOAD_GLOBAL;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002611 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00002612 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002613 i = getintvalue(v);
2614 switch (opcode) {
2615 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
2616 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
2617 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
2618 }
2619 cur_instr[1] = i & 0xff;
2620 cur_instr[2] = (i>>8) & 0xff;
Guido van Rossum282914b1991-04-04 10:42:56 +00002621 }
2622 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002623
2624 end:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002625 err_restore(error_type, error_value, error_traceback);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002626 err:
Guido van Rossum282914b1991-04-04 10:42:56 +00002627 DECREF(locals);
2628}
2629
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002630codeobject *
Guido van Rossum590baa41993-11-30 13:40:46 +00002631compile(n, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002632 node *n;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002633 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002634{
2635 struct compiling sc;
2636 codeobject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00002637 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002638 return NULL;
2639 compile_node(&sc, n);
2640 com_done(&sc);
Guido van Rossum590baa41993-11-30 13:40:46 +00002641 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0)
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002642 optimize(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00002643 co = NULL;
2644 if (sc.c_errors == 0) {
2645 object *v, *w;
2646 v = newstringobject(sc.c_filename);
Guido van Rossum363ac7d1994-11-10 22:40:34 +00002647 w = newstringobject(sc.c_name);
Guido van Rossum9bfef441993-03-29 10:43:31 +00002648 if (v != NULL && w != NULL)
2649 co = newcodeobject(sc.c_code, sc.c_consts,
2650 sc.c_names, v, w);
2651 XDECREF(v);
2652 XDECREF(w);
Guido van Rossuma082ce41991-06-04 19:41:56 +00002653 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002654 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002655 return co;
2656}