blob: 9f15254aab0b2990413edf9396caaed961fbe9a1 [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:
Guido van Rossum681d79a1995-07-18 14:51:37 +000028 XXX Compute maximum needed stack sizes while compiling;
29 XXX then frame object can be one malloc and no stack checks are needed
30 XXX add __doc__ attribute == co_doc to code object attributes
31 XXX don't execute doc string
Guido van Rossum3f5da241990-12-20 15:06:42 +000032 XXX Generate simple jump for break/return outside 'try...finally'
Guido van Rossum681d79a1995-07-18 14:51:37 +000033 XXX get rid of SET_LINENO instructions, use JAR's table trick
34 XXX (need an option to put them back in, for debugger!)
35 XXX other JAR tricks?
Guido van Rossum3f5da241990-12-20 15:06:42 +000036*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +000037
Guido van Rossum3f5da241990-12-20 15:06:42 +000038#include "allobjects.h"
39
Guido van Rossum10dc2e81990-11-18 17:27:39 +000040#include "node.h"
41#include "token.h"
42#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000043#include "compile.h"
44#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000045#include "structmember.h"
46
47#include <ctype.h>
Guido van Rossumf1dc5661993-07-05 10:31:29 +000048#include <errno.h>
Guido van Rossum282914b1991-04-04 10:42:56 +000049
Guido van Rossum3f5da241990-12-20 15:06:42 +000050#define OFF(x) offsetof(codeobject, x)
51
52static struct memberlist code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000053 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
54 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
55 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000056 {"co_code", T_OBJECT, OFF(co_code), READONLY},
57 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
58 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000059 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000060 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000061 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000062 {NULL} /* Sentinel */
63};
64
65static object *
66code_getattr(co, name)
67 codeobject *co;
68 char *name;
69{
70 return getmember((char *)co, code_memberlist, name);
71}
Guido van Rossum10dc2e81990-11-18 17:27:39 +000072
73static void
Guido van Rossum3f5da241990-12-20 15:06:42 +000074code_dealloc(co)
75 codeobject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +000076{
Guido van Rossum3f5da241990-12-20 15:06:42 +000077 XDECREF(co->co_code);
78 XDECREF(co->co_consts);
79 XDECREF(co->co_names);
80 XDECREF(co->co_filename);
Guido van Rossum9bfef441993-03-29 10:43:31 +000081 XDECREF(co->co_name);
Guido van Rossum681d79a1995-07-18 14:51:37 +000082 XDECREF(co->co_varnames);
Guido van Rossum3f5da241990-12-20 15:06:42 +000083 DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +000084}
85
Guido van Rossum2dff9911992-09-03 20:50:59 +000086static object *
87code_repr(co)
88 codeobject *co;
89{
90 char buf[500];
91 int lineno = -1;
92 char *p = GETSTRINGVALUE(co->co_code);
93 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +000094 char *name = "???";
Guido van Rossum2dff9911992-09-03 20:50:59 +000095 if (*p == SET_LINENO)
96 lineno = (p[1] & 0xff) | ((p[2] & 0xff) << 8);
97 if (co->co_filename && is_stringobject(co->co_filename))
98 filename = getstringvalue(co->co_filename);
Guido van Rossum9bfef441993-03-29 10:43:31 +000099 if (co->co_name && is_stringobject(co->co_name))
100 name = getstringvalue(co->co_name);
101 sprintf(buf, "<code object %.100s at %lx, file \"%.300s\", line %d>",
102 name, (long)co, filename, lineno);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000103 return newstringobject(buf);
104}
105
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000106static int
107code_compare(co, cp)
108 codeobject *co, *cp;
109{
110 int cmp;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000111 cmp = cp->co_argcount - cp->co_argcount;
112 if (cmp) return cmp;
113 cmp = cp->co_nlocals - cp->co_nlocals;
114 if (cmp) return cmp;
115 cmp = cp->co_flags - cp->co_flags;
116 if (cmp) return cmp;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000117 cmp = cmpobject((object *)co->co_code, (object *)cp->co_code);
118 if (cmp) return cmp;
119 cmp = cmpobject(co->co_consts, cp->co_consts);
120 if (cmp) return cmp;
121 cmp = cmpobject(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000122 if (cmp) return cmp;
123 cmp = cmpobject(co->co_varnames, cp->co_varnames);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000124 return cmp;
125}
126
127static long
128code_hash(co)
129 codeobject *co;
130{
Guido van Rossum681d79a1995-07-18 14:51:37 +0000131 long h, h1, h2, h3, h4;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000132 h1 = hashobject((object *)co->co_code);
133 if (h1 == -1) return -1;
134 h2 = hashobject(co->co_consts);
135 if (h2 == -1) return -1;
136 h3 = hashobject(co->co_names);
137 if (h3 == -1) return -1;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000138 h4 = hashobject(co->co_varnames);
139 if (h4 == -1) return -1;
140 h = h1 ^ h2 ^ h3 ^ h4 ^
141 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000142 if (h == -1) h = -2;
143 return h;
144}
145
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000146typeobject Codetype = {
147 OB_HEAD_INIT(&Typetype)
148 0,
149 "code",
150 sizeof(codeobject),
151 0,
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000152 (destructor)code_dealloc, /*tp_dealloc*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000153 0, /*tp_print*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000154 (getattrfunc)code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000155 0, /*tp_setattr*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000156 (cmpfunc)code_compare, /*tp_compare*/
157 (reprfunc)code_repr, /*tp_repr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000158 0, /*tp_as_number*/
159 0, /*tp_as_sequence*/
160 0, /*tp_as_mapping*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000161 (hashfunc)code_hash, /*tp_hash*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000162};
163
Guido van Rossuma082ce41991-06-04 19:41:56 +0000164codeobject *
Guido van Rossum681d79a1995-07-18 14:51:37 +0000165newcodeobject(argcount, nlocals, flags,
166 code, consts, names, varnames, filename, name)
167 int argcount;
168 int nlocals;
169 int flags;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000170 object *code;
171 object *consts;
172 object *names;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000173 object *varnames;
Guido van Rossuma082ce41991-06-04 19:41:56 +0000174 object *filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000175 object *name;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000176{
177 codeobject *co;
178 int i;
179 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000180 if (argcount < 0 || nlocals < 0 ||
181 code == NULL || !is_stringobject(code) ||
182 consts == NULL || !is_tupleobject(consts) ||
183 names == NULL || !is_tupleobject(names) ||
184 varnames == NULL || !is_tupleobject(varnames) ||
185 name == NULL || !is_stringobject(name) ||
186 filename == NULL || !is_stringobject(filename)) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000187 err_badcall();
188 return NULL;
189 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000190 /* Make sure names and varnames are all strings */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000191 for (i = gettuplesize(names); --i >= 0; ) {
192 object *v = gettupleitem(names, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000193 if (v == NULL || !is_stringobject(v)) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000194 err_badcall();
195 return NULL;
196 }
197 }
198 for (i = gettuplesize(varnames); --i >= 0; ) {
199 object *v = gettupleitem(varnames, i);
200 if (v == NULL || !is_stringobject(v)) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000201 err_badcall();
202 return NULL;
203 }
204 }
205 co = NEWOBJ(codeobject, &Codetype);
206 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000207 co->co_argcount = argcount;
208 co->co_nlocals = nlocals;
209 co->co_flags = flags;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000210 INCREF(code);
211 co->co_code = (stringobject *)code;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000212 INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000213 co->co_consts = consts;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000214 INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000215 co->co_names = names;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000216 INCREF(varnames);
217 co->co_varnames = varnames;
Guido van Rossuma082ce41991-06-04 19:41:56 +0000218 INCREF(filename);
219 co->co_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000220 INCREF(name);
221 co->co_name = name;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000222 }
223 return co;
224}
225
226
227/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000228
229#define MAXBLOCKS 20 /* Max static block nesting within a function */
230
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000231struct compiling {
232 object *c_code; /* string */
233 object *c_consts; /* list of objects */
234 object *c_names; /* list of strings (names) */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000235 object *c_globals; /* dictionary (value=None) */
236 object *c_locals; /* dictionary (value=localID) */
237 object *c_varnames; /* list (inverse of c_locals) */
238 int c_nlocals; /* index of next local */
239 int c_argcount; /* number of top-level arguments */
240 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000241 int c_nexti; /* index into c_code */
242 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000243 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000244 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000245 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000246 int c_begin; /* begin of current loop, for 'continue' */
247 int c_block[MAXBLOCKS]; /* stack of block types */
248 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000249 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000250 char *c_name; /* name of object (e.g. function) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000251};
252
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000253
254/* Interface to the block stack */
255
256static void
257block_push(c, type)
258 struct compiling *c;
259 int type;
260{
261 if (c->c_nblocks >= MAXBLOCKS) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +0000262 err_setstr(SystemError, "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000263 c->c_errors++;
264 }
265 else {
266 c->c_block[c->c_nblocks++] = type;
267 }
268}
269
270static void
271block_pop(c, type)
272 struct compiling *c;
273 int type;
274{
275 if (c->c_nblocks > 0)
276 c->c_nblocks--;
277 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
278 err_setstr(SystemError, "bad block pop");
279 c->c_errors++;
280 }
281}
282
283
Guido van Rossum681d79a1995-07-18 14:51:37 +0000284/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000285
Guido van Rossum590baa41993-11-30 13:40:46 +0000286static int com_init PROTO((struct compiling *, char *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000287static void com_free PROTO((struct compiling *));
288static void com_done PROTO((struct compiling *));
289static void com_node PROTO((struct compiling *, struct _node *));
290static void com_addbyte PROTO((struct compiling *, int));
291static void com_addint PROTO((struct compiling *, int));
292static void com_addoparg PROTO((struct compiling *, int, int));
293static void com_addfwref PROTO((struct compiling *, int, int *));
294static void com_backpatch PROTO((struct compiling *, int));
295static int com_add PROTO((struct compiling *, object *, object *));
296static int com_addconst PROTO((struct compiling *, object *));
297static int com_addname PROTO((struct compiling *, object *));
298static void com_addopname PROTO((struct compiling *, int, node *));
Guido van Rossum288a60f1991-12-16 13:05:10 +0000299static void com_list PROTO((struct compiling *, node *, int));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000300static int com_argdefs PROTO((struct compiling *, node *));
301static int com_newlocal PROTO((struct compiling *, char *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000302
303static int
Guido van Rossum590baa41993-11-30 13:40:46 +0000304com_init(c, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000305 struct compiling *c;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000306 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000307{
Guido van Rossum62d46241991-04-03 19:00:23 +0000308 if ((c->c_code = newsizedstringobject((char *)NULL, 1000)) == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000309 goto fail_3;
310 if ((c->c_consts = newlistobject(0)) == NULL)
311 goto fail_2;
312 if ((c->c_names = newlistobject(0)) == NULL)
313 goto fail_1;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000314 if ((c->c_globals = newdictobject()) == NULL)
315 goto fail_0;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000316 if ((c->c_locals = newdictobject()) == NULL)
317 goto fail_00;
318 if ((c->c_varnames = newlistobject(0)) == NULL)
319 goto fail_000;
320 c->c_nlocals = 0;
321 c->c_argcount = 0;
322 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000323 c->c_nexti = 0;
324 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000325 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000326 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000327 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000328 c->c_begin = 0;
329 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000330 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000331 c->c_name = "?";
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000332 return 1;
333
Guido van Rossum681d79a1995-07-18 14:51:37 +0000334 fail_000:
335 DECREF(c->c_locals);
336 fail_00:
337 DECREF(c->c_globals);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000338 fail_0:
339 DECREF(c->c_names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000340 fail_1:
341 DECREF(c->c_consts);
342 fail_2:
343 DECREF(c->c_code);
344 fail_3:
345 return 0;
346}
347
348static void
349com_free(c)
350 struct compiling *c;
351{
352 XDECREF(c->c_code);
353 XDECREF(c->c_consts);
354 XDECREF(c->c_names);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000355 XDECREF(c->c_globals);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000356 XDECREF(c->c_locals);
357 XDECREF(c->c_varnames);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000358}
359
360static void
361com_done(c)
362 struct compiling *c;
363{
364 if (c->c_code != NULL)
365 resizestring(&c->c_code, c->c_nexti);
366}
367
368static void
369com_addbyte(c, byte)
370 struct compiling *c;
371 int byte;
372{
373 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000374 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000375 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000376 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000377 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000378 fatal("com_addbyte: byte out of range");
Guido van Rossum01cfd441991-10-20 20:12:38 +0000379 */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000380 err_setstr(SystemError, "com_addbyte: byte out of range");
381 c->c_errors++;
382 }
383 if (c->c_code == NULL)
384 return;
385 len = getstringsize(c->c_code);
386 if (c->c_nexti >= len) {
387 if (resizestring(&c->c_code, len+1000) != 0) {
388 c->c_errors++;
389 return;
390 }
391 }
392 getstringvalue(c->c_code)[c->c_nexti++] = byte;
393}
394
395static void
396com_addint(c, x)
397 struct compiling *c;
398 int x;
399{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000400 com_addbyte(c, x & 0xff);
401 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000402}
403
404static void
405com_addoparg(c, op, arg)
406 struct compiling *c;
407 int op;
408 int arg;
409{
410 com_addbyte(c, op);
411 com_addint(c, arg);
412}
413
414static void
415com_addfwref(c, op, p_anchor)
416 struct compiling *c;
417 int op;
418 int *p_anchor;
419{
420 /* Compile a forward reference for backpatching */
421 int here;
422 int anchor;
423 com_addbyte(c, op);
424 here = c->c_nexti;
425 anchor = *p_anchor;
426 *p_anchor = here;
427 com_addint(c, anchor == 0 ? 0 : here - anchor);
428}
429
430static void
431com_backpatch(c, anchor)
432 struct compiling *c;
433 int anchor; /* Must be nonzero */
434{
435 unsigned char *code = (unsigned char *) getstringvalue(c->c_code);
436 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000437 int dist;
438 int prev;
439 for (;;) {
440 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000441 prev = code[anchor] + (code[anchor+1] << 8);
442 dist = target - (anchor+2);
443 code[anchor] = dist & 0xff;
444 code[anchor+1] = dist >> 8;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000445 if (!prev)
446 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000447 anchor -= prev;
448 }
449}
450
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000451/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000452
453static int
454com_add(c, list, v)
455 struct compiling *c;
456 object *list;
457 object *v;
458{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000459 int n = getlistsize(list);
460 int i;
461 for (i = n; --i >= 0; ) {
462 object *w = getlistitem(list, i);
Guido van Rossumefc0bd01991-07-01 18:44:20 +0000463 if (v->ob_type == w->ob_type && cmpobject(v, w) == 0)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000464 return i;
465 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000466 if (addlistitem(list, v) != 0)
467 c->c_errors++;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000468 return n;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000469}
470
471static int
472com_addconst(c, v)
473 struct compiling *c;
474 object *v;
475{
476 return com_add(c, c->c_consts, v);
477}
478
479static int
480com_addname(c, v)
481 struct compiling *c;
482 object *v;
483{
484 return com_add(c, c->c_names, v);
485}
486
487static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000488com_addopnamestr(c, op, name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000489 struct compiling *c;
490 int op;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000491 char *name;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000492{
493 object *v;
494 int i;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000495 if (name == NULL || (v = newstringobject(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000496 c->c_errors++;
497 i = 255;
498 }
499 else {
500 i = com_addname(c, v);
501 DECREF(v);
502 }
Guido van Rossumc5e96291991-12-10 13:53:51 +0000503 /* Hack to replace *_NAME opcodes by *_GLOBAL if necessary */
504 switch (op) {
505 case LOAD_NAME:
506 case STORE_NAME:
507 case DELETE_NAME:
508 if (dictlookup(c->c_globals, name) != NULL) {
509 switch (op) {
510 case LOAD_NAME: op = LOAD_GLOBAL; break;
511 case STORE_NAME: op = STORE_GLOBAL; break;
512 case DELETE_NAME: op = DELETE_GLOBAL; break;
513 }
514 }
515 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000516 com_addoparg(c, op, i);
517}
518
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000519static void
520com_addopname(c, op, n)
521 struct compiling *c;
522 int op;
523 node *n;
524{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000525 char *name;
526 char buffer[1000];
527 /* XXX it is possible to write this code without the 1000
528 chars on the total length of dotted names, I just can't be
529 bothered right now */
530 if (TYPE(n) == STAR)
531 name = "*";
532 else if (TYPE(n) == dotted_name) {
533 char *p = buffer;
534 int i;
535 name = buffer;
536 for (i = 0; i < NCH(n); i += 2) {
537 char *s = STR(CHILD(n, i));
538 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
539 err_setstr(MemoryError,
540 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +0000541 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000542 break;
543 }
544 if (p != buffer)
545 *p++ = '.';
546 strcpy(p, s);
547 p = strchr(p, '\0');
548 }
549 }
550 else {
551 REQ(n, NAME);
552 name = STR(n);
553 }
554 com_addopnamestr(c, op, name);
555}
556
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000557static object *
558parsenumber(s)
559 char *s;
560{
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000561 extern long mystrtol PROTO((const char *, char **, int));
562 extern unsigned long mystrtoul PROTO((const char *, char **, int));
563 extern double atof PROTO((const char *));
Guido van Rossumc5e96291991-12-10 13:53:51 +0000564 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000565 long x;
Guido van Rossum282914b1991-04-04 10:42:56 +0000566 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000567 end = s + strlen(s) - 1;
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000568 if (*end == 'l' || *end == 'L')
Guido van Rossumc5e96291991-12-10 13:53:51 +0000569 return long_scan(s, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000570 if (s[0] == '0')
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000571 x = (long) mystrtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000572 else
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000573 x = mystrtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +0000574 if (*end == '\0') {
575 if (errno != 0) {
Guido van Rossumefb087b1991-12-16 15:41:41 +0000576 err_setstr(OverflowError,
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000577 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000578 return NULL;
579 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000580 return newintobject(x);
Guido van Rossum282914b1991-04-04 10:42:56 +0000581 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000582 /* XXX Huge floats may silently fail */
583 return newfloatobject(atof(s));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000584}
585
586static object *
587parsestr(s)
588 char *s;
589{
590 object *v;
591 int len;
592 char *buf;
593 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000594 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000595 int c;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000596 int quote = *s;
597 if (quote != '\'' && quote != '\"') {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000598 err_badcall();
599 return NULL;
600 }
601 s++;
602 len = strlen(s);
Guido van Rossum8054fad1993-10-26 15:19:44 +0000603 if (s[--len] != quote) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000604 err_badcall();
605 return NULL;
606 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000607 if (len >= 4 && s[0] == quote && s[1] == quote) {
608 s += 2;
609 len -= 2;
610 if (s[--len] != quote || s[--len] != quote) {
611 err_badcall();
612 return NULL;
613 }
614 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000615 if (strchr(s, '\\') == NULL)
616 return newsizedstringobject(s, len);
617 v = newsizedstringobject((char *)NULL, len);
618 p = buf = getstringvalue(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000619 end = s + len;
620 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000621 if (*s != '\\') {
622 *p++ = *s++;
623 continue;
624 }
625 s++;
626 switch (*s++) {
627 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000628 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000629 case '\\': *p++ = '\\'; break;
630 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000631 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000632 case 'b': *p++ = '\b'; break;
633 case 'f': *p++ = '\014'; break; /* FF */
634 case 't': *p++ = '\t'; break;
635 case 'n': *p++ = '\n'; break;
636 case 'r': *p++ = '\r'; break;
637 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000638 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
639 case '0': case '1': case '2': case '3':
640 case '4': case '5': case '6': case '7':
641 c = s[-1] - '0';
642 if ('0' <= *s && *s <= '7') {
643 c = (c<<3) + *s++ - '0';
644 if ('0' <= *s && *s <= '7')
645 c = (c<<3) + *s++ - '0';
646 }
647 *p++ = c;
648 break;
649 case 'x':
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000650 if (isxdigit(Py_CHARMASK(*s))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000651 sscanf(s, "%x", &c);
652 *p++ = c;
653 do {
654 s++;
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000655 } while (isxdigit(Py_CHARMASK(*s)));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000656 break;
657 }
658 /* FALLTHROUGH */
659 default: *p++ = '\\'; *p++ = s[-1]; break;
660 }
661 }
662 resizestring(&v, (int)(p - buf));
663 return v;
664}
665
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000666static object *
667parsestrplus(n)
668 node *n;
669{
670 object *v;
671 int i;
672 REQ(CHILD(n, 0), STRING);
673 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
674 /* String literal concatenation */
675 for (i = 1; i < NCH(n) && v != NULL; i++) {
676 joinstring_decref(&v, parsestr(STR(CHILD(n, i))));
677 }
678 }
679 return v;
680}
681
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000682static void
683com_list_constructor(c, n)
684 struct compiling *c;
685 node *n;
686{
687 int len;
688 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000689 if (TYPE(n) != testlist)
690 REQ(n, exprlist);
691 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
692 len = (NCH(n) + 1) / 2;
693 for (i = 0; i < NCH(n); i += 2)
694 com_node(c, CHILD(n, i));
695 com_addoparg(c, BUILD_LIST, len);
696}
697
698static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000699com_dictmaker(c, n)
700 struct compiling *c;
701 node *n;
702{
703 int i;
704 /* dictmaker: test ':' test (',' test ':' value)* [','] */
705 for (i = 0; i+2 < NCH(n); i += 4) {
706 /* We must arrange things just right for STORE_SUBSCR.
707 It wants the stack to look like (value) (dict) (key) */
708 com_addbyte(c, DUP_TOP);
709 com_node(c, CHILD(n, i+2)); /* value */
710 com_addbyte(c, ROT_TWO);
711 com_node(c, CHILD(n, i)); /* key */
712 com_addbyte(c, STORE_SUBSCR);
713 }
714}
715
716static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000717com_atom(c, n)
718 struct compiling *c;
719 node *n;
720{
721 node *ch;
722 object *v;
723 int i;
724 REQ(n, atom);
725 ch = CHILD(n, 0);
726 switch (TYPE(ch)) {
727 case LPAR:
728 if (TYPE(CHILD(n, 1)) == RPAR)
729 com_addoparg(c, BUILD_TUPLE, 0);
730 else
731 com_node(c, CHILD(n, 1));
732 break;
733 case LSQB:
734 if (TYPE(CHILD(n, 1)) == RSQB)
735 com_addoparg(c, BUILD_LIST, 0);
736 else
737 com_list_constructor(c, CHILD(n, 1));
738 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000739 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000740 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000741 if (TYPE(CHILD(n, 1)) != RBRACE)
742 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000743 break;
744 case BACKQUOTE:
745 com_node(c, CHILD(n, 1));
746 com_addbyte(c, UNARY_CONVERT);
747 break;
748 case NUMBER:
749 if ((v = parsenumber(STR(ch))) == NULL) {
750 c->c_errors++;
751 i = 255;
752 }
753 else {
754 i = com_addconst(c, v);
755 DECREF(v);
756 }
757 com_addoparg(c, LOAD_CONST, i);
758 break;
759 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000760 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000761 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000762 c->c_errors++;
763 i = 255;
764 }
765 else {
766 i = com_addconst(c, v);
767 DECREF(v);
768 }
769 com_addoparg(c, LOAD_CONST, i);
770 break;
771 case NAME:
772 com_addopname(c, LOAD_NAME, ch);
773 break;
774 default:
775 fprintf(stderr, "node type %d\n", TYPE(ch));
776 err_setstr(SystemError, "com_atom: unexpected node type");
777 c->c_errors++;
778 }
779}
780
781static void
782com_slice(c, n, op)
783 struct compiling *c;
784 node *n;
785 int op;
786{
787 if (NCH(n) == 1) {
788 com_addbyte(c, op);
789 }
790 else if (NCH(n) == 2) {
791 if (TYPE(CHILD(n, 0)) != COLON) {
792 com_node(c, CHILD(n, 0));
793 com_addbyte(c, op+1);
794 }
795 else {
796 com_node(c, CHILD(n, 1));
797 com_addbyte(c, op+2);
798 }
799 }
800 else {
801 com_node(c, CHILD(n, 0));
802 com_node(c, CHILD(n, 2));
803 com_addbyte(c, op+3);
804 }
805}
806
807static void
808com_apply_subscript(c, n)
809 struct compiling *c;
810 node *n;
811{
812 REQ(n, subscript);
813 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) != COLON) {
814 /* It's a single subscript */
815 com_node(c, CHILD(n, 0));
816 com_addbyte(c, BINARY_SUBSCR);
817 }
818 else {
819 /* It's a slice: [expr] ':' [expr] */
820 com_slice(c, n, SLICE);
821 }
822}
823
Guido van Rossumf10570b1995-07-07 22:53:21 +0000824static int
825com_argument(c, n, inkeywords)
826 struct compiling *c;
827 node *n; /* argument */
828 int inkeywords;
829{
830 node *m;
831 REQ(n, argument); /* [test '='] test; really [ keyword '='] keyword */
832 if (NCH(n) == 1) {
833 if (inkeywords) {
834 err_setstr(SyntaxError,
835 "non-keyword arg after keyword arg");
836 c->c_errors++;
837 }
838 else {
839 com_node(c, CHILD(n, 0));
840 }
841 return 0;
842 }
843 m = n;
844 do {
845 m = CHILD(m, 0);
846 } while (NCH(m) == 1);
847 if (TYPE(m) != NAME) {
848 err_setstr(SyntaxError, "keyword can't be an expression");
849 c->c_errors++;
850 }
851 else {
852 object *v = newstringobject(STR(m));
853 if (v == NULL)
854 c->c_errors++;
855 else {
856 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
857 DECREF(v);
858 }
859 }
860 com_node(c, CHILD(n, 2));
861 return 1;
862}
863
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000864static void
865com_call_function(c, n)
866 struct compiling *c;
Guido van Rossumf10570b1995-07-07 22:53:21 +0000867 node *n; /* EITHER arglist OR ')' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000868{
869 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +0000870 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000871 }
872 else {
Guido van Rossumf10570b1995-07-07 22:53:21 +0000873 int inkeywords, i, na, nk;
874 REQ(n, arglist);
875 inkeywords = 0;
876 na = 0;
877 nk = 0;
878 for (i = 0; i < NCH(n); i += 2) {
879 inkeywords = com_argument(c, CHILD(n, i), inkeywords);
880 if (!inkeywords)
881 na++;
882 else
883 nk++;
884 }
885 if (na > 255 || nk > 255) {
886 err_setstr(SyntaxError, "more than 255 arguments");
887 c->c_errors++;
888 }
889 com_addoparg(c, CALL_FUNCTION, na | (nk << 8));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000890 }
891}
892
893static void
894com_select_member(c, n)
895 struct compiling *c;
896 node *n;
897{
898 com_addopname(c, LOAD_ATTR, n);
899}
900
901static void
902com_apply_trailer(c, n)
903 struct compiling *c;
904 node *n;
905{
906 REQ(n, trailer);
907 switch (TYPE(CHILD(n, 0))) {
908 case LPAR:
909 com_call_function(c, CHILD(n, 1));
910 break;
911 case DOT:
912 com_select_member(c, CHILD(n, 1));
913 break;
914 case LSQB:
915 com_apply_subscript(c, CHILD(n, 1));
916 break;
917 default:
918 err_setstr(SystemError,
919 "com_apply_trailer: unknown trailer type");
920 c->c_errors++;
921 }
922}
923
924static void
925com_factor(c, n)
926 struct compiling *c;
927 node *n;
928{
929 int i;
930 REQ(n, factor);
931 if (TYPE(CHILD(n, 0)) == PLUS) {
932 com_factor(c, CHILD(n, 1));
933 com_addbyte(c, UNARY_POSITIVE);
934 }
935 else if (TYPE(CHILD(n, 0)) == MINUS) {
936 com_factor(c, CHILD(n, 1));
937 com_addbyte(c, UNARY_NEGATIVE);
938 }
Guido van Rossum7928cd71991-10-24 14:59:31 +0000939 else if (TYPE(CHILD(n, 0)) == TILDE) {
940 com_factor(c, CHILD(n, 1));
941 com_addbyte(c, UNARY_INVERT);
942 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000943 else {
944 com_atom(c, CHILD(n, 0));
945 for (i = 1; i < NCH(n); i++)
946 com_apply_trailer(c, CHILD(n, i));
947 }
948}
949
950static void
951com_term(c, n)
952 struct compiling *c;
953 node *n;
954{
955 int i;
956 int op;
957 REQ(n, term);
958 com_factor(c, CHILD(n, 0));
959 for (i = 2; i < NCH(n); i += 2) {
960 com_factor(c, CHILD(n, i));
961 switch (TYPE(CHILD(n, i-1))) {
962 case STAR:
963 op = BINARY_MULTIPLY;
964 break;
965 case SLASH:
966 op = BINARY_DIVIDE;
967 break;
968 case PERCENT:
969 op = BINARY_MODULO;
970 break;
971 default:
972 err_setstr(SystemError,
Guido van Rossum7928cd71991-10-24 14:59:31 +0000973 "com_term: operator not *, / or %");
974 c->c_errors++;
975 op = 255;
976 }
977 com_addbyte(c, op);
978 }
979}
980
981static void
982com_arith_expr(c, n)
983 struct compiling *c;
984 node *n;
985{
986 int i;
987 int op;
988 REQ(n, arith_expr);
989 com_term(c, CHILD(n, 0));
990 for (i = 2; i < NCH(n); i += 2) {
991 com_term(c, CHILD(n, i));
992 switch (TYPE(CHILD(n, i-1))) {
993 case PLUS:
994 op = BINARY_ADD;
995 break;
996 case MINUS:
997 op = BINARY_SUBTRACT;
998 break;
999 default:
1000 err_setstr(SystemError,
1001 "com_arith_expr: operator not + or -");
1002 c->c_errors++;
1003 op = 255;
1004 }
1005 com_addbyte(c, op);
1006 }
1007}
1008
1009static void
1010com_shift_expr(c, n)
1011 struct compiling *c;
1012 node *n;
1013{
1014 int i;
1015 int op;
1016 REQ(n, shift_expr);
1017 com_arith_expr(c, CHILD(n, 0));
1018 for (i = 2; i < NCH(n); i += 2) {
1019 com_arith_expr(c, CHILD(n, i));
1020 switch (TYPE(CHILD(n, i-1))) {
1021 case LEFTSHIFT:
1022 op = BINARY_LSHIFT;
1023 break;
1024 case RIGHTSHIFT:
1025 op = BINARY_RSHIFT;
1026 break;
1027 default:
1028 err_setstr(SystemError,
1029 "com_shift_expr: operator not << or >>");
1030 c->c_errors++;
1031 op = 255;
1032 }
1033 com_addbyte(c, op);
1034 }
1035}
1036
1037static void
1038com_and_expr(c, n)
1039 struct compiling *c;
1040 node *n;
1041{
1042 int i;
1043 int op;
1044 REQ(n, and_expr);
1045 com_shift_expr(c, CHILD(n, 0));
1046 for (i = 2; i < NCH(n); i += 2) {
1047 com_shift_expr(c, CHILD(n, i));
1048 if (TYPE(CHILD(n, i-1)) == AMPER) {
1049 op = BINARY_AND;
1050 }
1051 else {
1052 err_setstr(SystemError,
1053 "com_and_expr: operator not &");
1054 c->c_errors++;
1055 op = 255;
1056 }
1057 com_addbyte(c, op);
1058 }
1059}
1060
1061static void
1062com_xor_expr(c, n)
1063 struct compiling *c;
1064 node *n;
1065{
1066 int i;
1067 int op;
1068 REQ(n, xor_expr);
1069 com_and_expr(c, CHILD(n, 0));
1070 for (i = 2; i < NCH(n); i += 2) {
1071 com_and_expr(c, CHILD(n, i));
1072 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1073 op = BINARY_XOR;
1074 }
1075 else {
1076 err_setstr(SystemError,
1077 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001078 c->c_errors++;
1079 op = 255;
1080 }
1081 com_addbyte(c, op);
1082 }
1083}
1084
1085static void
1086com_expr(c, n)
1087 struct compiling *c;
1088 node *n;
1089{
1090 int i;
1091 int op;
1092 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001093 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001094 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001095 com_xor_expr(c, CHILD(n, i));
1096 if (TYPE(CHILD(n, i-1)) == VBAR) {
1097 op = BINARY_OR;
1098 }
1099 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001100 err_setstr(SystemError,
Guido van Rossum7928cd71991-10-24 14:59:31 +00001101 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001102 c->c_errors++;
1103 op = 255;
1104 }
1105 com_addbyte(c, op);
1106 }
1107}
1108
1109static enum cmp_op
1110cmp_type(n)
1111 node *n;
1112{
1113 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001114 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001115 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1116 if (NCH(n) == 1) {
1117 n = CHILD(n, 0);
1118 switch (TYPE(n)) {
1119 case LESS: return LT;
1120 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001121 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001122 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001123 case LESSEQUAL: return LE;
1124 case GREATEREQUAL: return GE;
1125 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001126 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1127 if (strcmp(STR(n), "is") == 0) return IS;
1128 }
1129 }
1130 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001131 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001132 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1133 return NOT_IN;
1134 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1135 return IS_NOT;
1136 }
1137 }
1138 return BAD;
1139}
1140
1141static void
1142com_comparison(c, n)
1143 struct compiling *c;
1144 node *n;
1145{
1146 int i;
1147 enum cmp_op op;
1148 int anchor;
1149 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
1150 com_expr(c, CHILD(n, 0));
1151 if (NCH(n) == 1)
1152 return;
1153
1154 /****************************************************************
1155 The following code is generated for all but the last
1156 comparison in a chain:
1157
1158 label: on stack: opcode: jump to:
1159
1160 a <code to load b>
1161 a, b DUP_TOP
1162 a, b, b ROT_THREE
1163 b, a, b COMPARE_OP
1164 b, 0-or-1 JUMP_IF_FALSE L1
1165 b, 1 POP_TOP
1166 b
1167
1168 We are now ready to repeat this sequence for the next
1169 comparison in the chain.
1170
1171 For the last we generate:
1172
1173 b <code to load c>
1174 b, c COMPARE_OP
1175 0-or-1
1176
1177 If there were any jumps to L1 (i.e., there was more than one
1178 comparison), we generate:
1179
1180 0-or-1 JUMP_FORWARD L2
1181 L1: b, 0 ROT_TWO
1182 0, b POP_TOP
1183 0
1184 L2:
1185 ****************************************************************/
1186
1187 anchor = 0;
1188
1189 for (i = 2; i < NCH(n); i += 2) {
1190 com_expr(c, CHILD(n, i));
1191 if (i+2 < NCH(n)) {
1192 com_addbyte(c, DUP_TOP);
1193 com_addbyte(c, ROT_THREE);
1194 }
1195 op = cmp_type(CHILD(n, i-1));
1196 if (op == BAD) {
1197 err_setstr(SystemError,
1198 "com_comparison: unknown comparison op");
1199 c->c_errors++;
1200 }
1201 com_addoparg(c, COMPARE_OP, op);
1202 if (i+2 < NCH(n)) {
1203 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1204 com_addbyte(c, POP_TOP);
1205 }
1206 }
1207
1208 if (anchor) {
1209 int anchor2 = 0;
1210 com_addfwref(c, JUMP_FORWARD, &anchor2);
1211 com_backpatch(c, anchor);
1212 com_addbyte(c, ROT_TWO);
1213 com_addbyte(c, POP_TOP);
1214 com_backpatch(c, anchor2);
1215 }
1216}
1217
1218static void
1219com_not_test(c, n)
1220 struct compiling *c;
1221 node *n;
1222{
1223 REQ(n, not_test); /* 'not' not_test | comparison */
1224 if (NCH(n) == 1) {
1225 com_comparison(c, CHILD(n, 0));
1226 }
1227 else {
1228 com_not_test(c, CHILD(n, 1));
1229 com_addbyte(c, UNARY_NOT);
1230 }
1231}
1232
1233static void
1234com_and_test(c, n)
1235 struct compiling *c;
1236 node *n;
1237{
1238 int i;
1239 int anchor;
1240 REQ(n, and_test); /* not_test ('and' not_test)* */
1241 anchor = 0;
1242 i = 0;
1243 for (;;) {
1244 com_not_test(c, CHILD(n, i));
1245 if ((i += 2) >= NCH(n))
1246 break;
1247 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1248 com_addbyte(c, POP_TOP);
1249 }
1250 if (anchor)
1251 com_backpatch(c, anchor);
1252}
1253
1254static void
1255com_test(c, n)
1256 struct compiling *c;
1257 node *n;
1258{
Guido van Rossum57531fe1993-11-30 14:57:42 +00001259 REQ(n, test); /* and_test ('and' and_test)* | lambdef */
1260 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
1261 object *v;
1262 int i;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001263 int ndefs = com_argdefs(c, CHILD(n, 0));
Guido van Rossum57531fe1993-11-30 14:57:42 +00001264 v = (object *) compile(CHILD(n, 0), c->c_filename);
1265 if (v == NULL) {
1266 c->c_errors++;
1267 i = 255;
1268 }
1269 else {
1270 i = com_addconst(c, v);
1271 DECREF(v);
1272 }
1273 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001274 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001275 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00001276 else {
1277 int anchor = 0;
1278 int i = 0;
1279 for (;;) {
1280 com_and_test(c, CHILD(n, i));
1281 if ((i += 2) >= NCH(n))
1282 break;
1283 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1284 com_addbyte(c, POP_TOP);
1285 }
1286 if (anchor)
1287 com_backpatch(c, anchor);
1288 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001289}
1290
1291static void
Guido van Rossum288a60f1991-12-16 13:05:10 +00001292com_list(c, n, toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001293 struct compiling *c;
1294 node *n;
Guido van Rossum288a60f1991-12-16 13:05:10 +00001295 int toplevel; /* If nonzero, *always* build a tuple */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001296{
1297 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001298 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001299 com_node(c, CHILD(n, 0));
1300 }
1301 else {
1302 int i;
1303 int len;
1304 len = (NCH(n) + 1) / 2;
1305 for (i = 0; i < NCH(n); i += 2)
1306 com_node(c, CHILD(n, i));
1307 com_addoparg(c, BUILD_TUPLE, len);
1308 }
1309}
1310
1311
1312/* Begin of assignment compilation */
1313
1314static void com_assign_name PROTO((struct compiling *, node *, int));
1315static void com_assign PROTO((struct compiling *, node *, int));
1316
1317static void
1318com_assign_attr(c, n, assigning)
1319 struct compiling *c;
1320 node *n;
1321 int assigning;
1322{
1323 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
1324}
1325
1326static void
1327com_assign_slice(c, n, assigning)
1328 struct compiling *c;
1329 node *n;
1330 int assigning;
1331{
1332 com_slice(c, n, assigning ? STORE_SLICE : DELETE_SLICE);
1333}
1334
1335static void
1336com_assign_subscript(c, n, assigning)
1337 struct compiling *c;
1338 node *n;
1339 int assigning;
1340{
1341 com_node(c, n);
1342 com_addbyte(c, assigning ? STORE_SUBSCR : DELETE_SUBSCR);
1343}
1344
1345static void
1346com_assign_trailer(c, n, assigning)
1347 struct compiling *c;
1348 node *n;
1349 int assigning;
1350{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001351 REQ(n, trailer);
1352 switch (TYPE(CHILD(n, 0))) {
1353 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001354 err_setstr(SyntaxError, "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001355 c->c_errors++;
1356 break;
1357 case DOT: /* '.' NAME */
1358 com_assign_attr(c, CHILD(n, 1), assigning);
1359 break;
1360 case LSQB: /* '[' subscript ']' */
1361 n = CHILD(n, 1);
1362 REQ(n, subscript); /* subscript: expr | [expr] ':' [expr] */
1363 if (NCH(n) > 1 || TYPE(CHILD(n, 0)) == COLON)
1364 com_assign_slice(c, n, assigning);
1365 else
1366 com_assign_subscript(c, CHILD(n, 0), assigning);
1367 break;
1368 default:
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001369 err_setstr(SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001370 c->c_errors++;
1371 }
1372}
1373
1374static void
1375com_assign_tuple(c, n, assigning)
1376 struct compiling *c;
1377 node *n;
1378 int assigning;
1379{
1380 int i;
1381 if (TYPE(n) != testlist)
1382 REQ(n, exprlist);
1383 if (assigning)
1384 com_addoparg(c, UNPACK_TUPLE, (NCH(n)+1)/2);
1385 for (i = 0; i < NCH(n); i += 2)
1386 com_assign(c, CHILD(n, i), assigning);
1387}
1388
1389static void
1390com_assign_list(c, n, assigning)
1391 struct compiling *c;
1392 node *n;
1393 int assigning;
1394{
1395 int i;
1396 if (assigning)
1397 com_addoparg(c, UNPACK_LIST, (NCH(n)+1)/2);
1398 for (i = 0; i < NCH(n); i += 2)
1399 com_assign(c, CHILD(n, i), assigning);
1400}
1401
1402static void
1403com_assign_name(c, n, assigning)
1404 struct compiling *c;
1405 node *n;
1406 int assigning;
1407{
1408 REQ(n, NAME);
1409 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
1410}
1411
1412static void
1413com_assign(c, n, assigning)
1414 struct compiling *c;
1415 node *n;
1416 int assigning;
1417{
1418 /* Loop to avoid trivial recursion */
1419 for (;;) {
1420 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001421
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001422 case exprlist:
1423 case testlist:
1424 if (NCH(n) > 1) {
1425 com_assign_tuple(c, n, assigning);
1426 return;
1427 }
1428 n = CHILD(n, 0);
1429 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001430
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001431 case test:
1432 case and_test:
1433 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001434 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001435 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001436 case xor_expr:
1437 case and_expr:
1438 case shift_expr:
1439 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001440 case term:
1441 if (NCH(n) > 1) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001442 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001443 "can't assign to operator");
1444 c->c_errors++;
1445 return;
1446 }
1447 n = CHILD(n, 0);
1448 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001449
Guido van Rossum7928cd71991-10-24 14:59:31 +00001450 case factor: /* ('+'|'-'|'~') factor | atom trailer* */
1451 if (TYPE(CHILD(n, 0)) != atom) { /* '+'|'-'|'~' */
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001452 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001453 "can't assign to operator");
1454 c->c_errors++;
1455 return;
1456 }
1457 if (NCH(n) > 1) { /* trailer present */
1458 int i;
1459 com_node(c, CHILD(n, 0));
1460 for (i = 1; i+1 < NCH(n); i++) {
1461 com_apply_trailer(c, CHILD(n, i));
1462 } /* NB i is still alive */
1463 com_assign_trailer(c,
1464 CHILD(n, i), assigning);
1465 return;
1466 }
1467 n = CHILD(n, 0);
1468 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001469
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001470 case atom:
1471 switch (TYPE(CHILD(n, 0))) {
1472 case LPAR:
1473 n = CHILD(n, 1);
1474 if (TYPE(n) == RPAR) {
1475 /* XXX Should allow () = () ??? */
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001476 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001477 "can't assign to ()");
1478 c->c_errors++;
1479 return;
1480 }
1481 break;
1482 case LSQB:
1483 n = CHILD(n, 1);
1484 if (TYPE(n) == RSQB) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001485 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001486 "can't assign to []");
1487 c->c_errors++;
1488 return;
1489 }
1490 com_assign_list(c, n, assigning);
1491 return;
1492 case NAME:
1493 com_assign_name(c, CHILD(n, 0), assigning);
1494 return;
1495 default:
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001496 err_setstr(SyntaxError,
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001497 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001498 c->c_errors++;
1499 return;
1500 }
1501 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001502
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001503 default:
1504 fprintf(stderr, "node type %d\n", TYPE(n));
1505 err_setstr(SystemError, "com_assign: bad node");
1506 c->c_errors++;
1507 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001508
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001509 }
1510 }
1511}
1512
1513static void
1514com_expr_stmt(c, n)
1515 struct compiling *c;
1516 node *n;
1517{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001518 REQ(n, expr_stmt); /* testlist ('=' testlist)* */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001519 com_node(c, CHILD(n, NCH(n)-1));
1520 if (NCH(n) == 1) {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001521 if (c->c_interactive)
1522 com_addbyte(c, PRINT_EXPR);
1523 else
1524 com_addbyte(c, POP_TOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001525 }
1526 else {
1527 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001528 for (i = 0; i < NCH(n)-2; i+=2) {
1529 if (i+2 < NCH(n)-2)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001530 com_addbyte(c, DUP_TOP);
1531 com_assign(c, CHILD(n, i), 1/*assign*/);
1532 }
1533 }
1534}
1535
1536static void
1537com_print_stmt(c, n)
1538 struct compiling *c;
1539 node *n;
1540{
1541 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001542 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
1543 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001544 com_node(c, CHILD(n, i));
1545 com_addbyte(c, PRINT_ITEM);
1546 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001547 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001548 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001549 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001550}
1551
1552static void
1553com_return_stmt(c, n)
1554 struct compiling *c;
1555 node *n;
1556{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001557 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001558 if (!c->c_infunction) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001559 err_setstr(SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001560 c->c_errors++;
1561 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001562 if (NCH(n) < 2)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001563 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1564 else
1565 com_node(c, CHILD(n, 1));
1566 com_addbyte(c, RETURN_VALUE);
1567}
1568
1569static void
1570com_raise_stmt(c, n)
1571 struct compiling *c;
1572 node *n;
1573{
Guido van Rossumf10570b1995-07-07 22:53:21 +00001574 REQ(n, raise_stmt); /* 'raise' test [',' test [',' test]] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001575 com_node(c, CHILD(n, 1));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001576 if (NCH(n) > 3) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001577 com_node(c, CHILD(n, 3));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001578 if (NCH(n) > 5)
1579 com_node(c, CHILD(n, 5));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001580 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001581 com_addoparg(c, RAISE_VARARGS, NCH(n)/2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001582}
1583
1584static void
1585com_import_stmt(c, n)
1586 struct compiling *c;
1587 node *n;
1588{
1589 int i;
1590 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001591 /* 'import' dotted_name (',' dotted_name)* |
1592 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001593 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001594 /* 'from' dotted_name 'import' ... */
1595 REQ(CHILD(n, 1), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001596 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
1597 for (i = 3; i < NCH(n); i += 2)
1598 com_addopname(c, IMPORT_FROM, CHILD(n, i));
1599 com_addbyte(c, POP_TOP);
1600 }
1601 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001602 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001603 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001604 REQ(CHILD(n, i), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001605 com_addopname(c, IMPORT_NAME, CHILD(n, i));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001606 com_addopname(c, STORE_NAME, CHILD(CHILD(n, i), 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001607 }
1608 }
1609}
1610
1611static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00001612com_global_stmt(c, n)
1613 struct compiling *c;
1614 node *n;
1615{
1616 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001617 REQ(n, global_stmt);
1618 /* 'global' NAME (',' NAME)* */
1619 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001620 char *s = STR(CHILD(n, i));
1621 if (dictlookup(c->c_locals, s) != NULL) {
1622 err_setstr(SyntaxError, "name is local and global");
1623 c->c_errors++;
1624 }
1625 else if (dictinsert(c->c_globals, s, None) != 0)
Guido van Rossumc5e96291991-12-10 13:53:51 +00001626 c->c_errors++;
1627 }
1628}
1629
Guido van Rossum681d79a1995-07-18 14:51:37 +00001630static int
1631com_newlocal_o(c, nameval)
1632 struct compiling *c;
1633 object *nameval;
1634{
1635 int i;
1636 object *ival;
1637 if (getlistsize(c->c_varnames) != c->c_nlocals) {
1638 /* This is usually caused by an error on a previous call */
1639 if (c->c_errors == 0) {
1640 err_setstr(SystemError, "mixed up var name/index");
1641 c->c_errors++;
1642 }
1643 return 0;
1644 }
1645 ival = newintobject(i = c->c_nlocals++);
1646 if (ival == NULL)
1647 c->c_errors++;
1648 else if (mappinginsert(c->c_locals, nameval, ival) != 0)
1649 c->c_errors++;
1650 else if (addlistitem(c->c_varnames, nameval) != 0)
1651 c->c_errors++;
1652 XDECREF(ival);
1653 return i;
1654}
1655
1656static int
1657com_addlocal_o(c, nameval)
1658 struct compiling *c;
1659 object *nameval;
1660{
1661 object *ival = mappinglookup(c->c_locals, nameval);
1662 if (ival != NULL)
1663 return getintvalue(ival);
1664 return com_newlocal_o(c, nameval);
1665}
1666
1667static int
1668com_newlocal(c, name)
1669 struct compiling *c;
1670 char *name;
1671{
1672 object *nameval = newstringobject(name);
1673 int i;
1674 if (nameval == NULL) {
1675 c->c_errors++;
1676 return 0;
1677 }
1678 i = com_newlocal_o(c, nameval);
1679 DECREF(nameval);
1680 return i;
1681}
1682
Guido van Rossum25831651993-05-19 14:50:45 +00001683#define strequ(a, b) (strcmp((a), (b)) == 0)
1684
1685static void
1686com_access_stmt(c, n)
1687 struct compiling *c;
1688 node *n;
1689{
1690 int i, j, k, mode, imode;
1691 object *vmode;
1692 REQ(n, access_stmt);
1693 /* 'access' NAME (',' NAME)* ':' accesstype (',' accesstype)*
1694 accesstype: NAME+ */
1695
1696 /* Find where the colon is */
1697 i = 1;
1698 while (TYPE(CHILD(n,i-1)) != COLON)
1699 i += 1;
1700
1701 /* Calculate the mode mask */
1702 mode = 0;
1703 for (j = i; j < NCH(n); j += 2) {
Guido van Rossum81daa321993-05-20 14:24:46 +00001704 int r = 0, w = 0, p = 0;
1705 for (k = 0; k < NCH(CHILD(n,j)); k++) {
Guido van Rossum25831651993-05-19 14:50:45 +00001706 if (strequ(STR(CHILD(CHILD(n,j),k)), "public"))
1707 p = 0;
1708 else if (strequ(STR(CHILD(CHILD(n,j),k)), "protected"))
1709 p = 1;
1710 else if (strequ(STR(CHILD(CHILD(n,j),k)), "private"))
1711 p = 2;
1712 else if (strequ(STR(CHILD(CHILD(n,j),k)), "read"))
1713 r = 1;
1714 else if (strequ(STR(CHILD(CHILD(n,j),k)), "write"))
1715 w = 1;
1716 else /* XXX should make this an exception */
1717 fprintf(stderr, "bad access type %s\n",
1718 STR(CHILD(CHILD(n,j),k)));
1719 }
1720 if (r == 0 && w == 0)
Guido van Rossum81daa321993-05-20 14:24:46 +00001721 r = w = 1;
Guido van Rossum25831651993-05-19 14:50:45 +00001722 if (p == 0) {
1723 if (r == 1) mode |= AC_R_PUBLIC;
1724 if (w == 1) mode |= AC_W_PUBLIC;
1725 } else if (p == 1) {
1726 if (r == 1) mode |= AC_R_PROTECTED;
1727 if (w == 1) mode |= AC_W_PROTECTED;
1728 } else {
1729 if (r == 1) mode |= AC_R_PRIVATE;
1730 if (w == 1) mode |= AC_W_PRIVATE;
1731 }
1732 }
1733 vmode = newintobject((long)mode);
1734 imode = com_addconst(c, vmode);
1735 XDECREF(vmode);
1736 for (i = 1; TYPE(CHILD(n,i-1)) != COLON; i+=2) {
1737 com_addoparg(c, LOAD_CONST, imode);
1738 com_addopname(c, ACCESS_MODE, CHILD(n, i));
1739 }
1740}
1741
Guido van Rossumc5e96291991-12-10 13:53:51 +00001742static void
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001743com_exec_stmt(c, n)
1744 struct compiling *c;
1745 node *n;
1746{
1747 REQ(n, exec_stmt);
1748 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
1749 com_node(c, CHILD(n, 1));
1750 if (NCH(n) >= 4)
1751 com_node(c, CHILD(n, 3));
1752 else
1753 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1754 if (NCH(n) >= 6)
1755 com_node(c, CHILD(n, 5));
1756 else
1757 com_addbyte(c, DUP_TOP);
1758 com_addbyte(c, EXEC_STMT);
1759}
1760
1761static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001762com_if_stmt(c, n)
1763 struct compiling *c;
1764 node *n;
1765{
1766 int i;
1767 int anchor = 0;
1768 REQ(n, if_stmt);
1769 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
1770 for (i = 0; i+3 < NCH(n); i+=4) {
1771 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001772 node *ch = CHILD(n, i+1);
1773 if (i > 0)
1774 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001775 com_node(c, CHILD(n, i+1));
1776 com_addfwref(c, JUMP_IF_FALSE, &a);
1777 com_addbyte(c, POP_TOP);
1778 com_node(c, CHILD(n, i+3));
1779 com_addfwref(c, JUMP_FORWARD, &anchor);
1780 com_backpatch(c, a);
1781 com_addbyte(c, POP_TOP);
1782 }
1783 if (i+2 < NCH(n))
1784 com_node(c, CHILD(n, i+2));
1785 com_backpatch(c, anchor);
1786}
1787
1788static void
1789com_while_stmt(c, n)
1790 struct compiling *c;
1791 node *n;
1792{
1793 int break_anchor = 0;
1794 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001795 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001796 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
1797 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001798 block_push(c, SETUP_LOOP);
1799 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001800 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001801 com_node(c, CHILD(n, 1));
1802 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1803 com_addbyte(c, POP_TOP);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001804 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001805 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001806 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001807 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1808 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001809 com_backpatch(c, anchor);
1810 com_addbyte(c, POP_TOP);
1811 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001812 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001813 if (NCH(n) > 4)
1814 com_node(c, CHILD(n, 6));
1815 com_backpatch(c, break_anchor);
1816}
1817
1818static void
1819com_for_stmt(c, n)
1820 struct compiling *c;
1821 node *n;
1822{
1823 object *v;
1824 int break_anchor = 0;
1825 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001826 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001827 REQ(n, for_stmt);
1828 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
1829 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001830 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001831 com_node(c, CHILD(n, 3));
1832 v = newintobject(0L);
1833 if (v == NULL)
1834 c->c_errors++;
1835 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
1836 XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001837 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001838 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001839 com_addfwref(c, FOR_LOOP, &anchor);
1840 com_assign(c, CHILD(n, 1), 1/*assigning*/);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001841 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001842 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001843 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001844 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1845 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001846 com_backpatch(c, anchor);
1847 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001848 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001849 if (NCH(n) > 8)
1850 com_node(c, CHILD(n, 8));
1851 com_backpatch(c, break_anchor);
1852}
1853
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001854/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001855
1856 SETUP_FINALLY L
1857 <code for S>
1858 POP_BLOCK
1859 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001860 L: <code for Sf>
1861 END_FINALLY
1862
1863 The special instructions use the block stack. Each block
1864 stack entry contains the instruction that created it (here
1865 SETUP_FINALLY), the level of the value stack at the time the
1866 block stack entry was created, and a label (here L).
1867
1868 SETUP_FINALLY:
1869 Pushes the current value stack level and the label
1870 onto the block stack.
1871 POP_BLOCK:
1872 Pops en entry from the block stack, and pops the value
1873 stack until its level is the same as indicated on the
1874 block stack. (The label is ignored.)
1875 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001876 Pops a variable number of entries from the *value* stack
1877 and re-raises the exception they specify. The number of
1878 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001879
1880 The block stack is unwound when an exception is raised:
1881 when a SETUP_FINALLY entry is found, the exception is pushed
1882 onto the value stack (and the exception condition is cleared),
1883 and the interpreter jumps to the label gotten from the block
1884 stack.
1885
1886 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00001887 (The contents of the value stack is shown in [], with the top
1888 at the right; 'tb' is trace-back info, 'val' the exception's
1889 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001890
1891 Value stack Label Instruction Argument
1892 [] SETUP_EXCEPT L1
1893 [] <code for S>
1894 [] POP_BLOCK
1895 [] JUMP_FORWARD L0
1896
Guido van Rossum3f5da241990-12-20 15:06:42 +00001897 [tb, val, exc] L1: DUP )
1898 [tb, val, exc, exc] <evaluate E1> )
1899 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
1900 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
1901 [tb, val, exc, 1] POP )
1902 [tb, val, exc] POP
1903 [tb, val] <assign to V1> (or POP if no V1)
1904 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001905 [] <code for S1>
1906 JUMP_FORWARD L0
1907
Guido van Rossum3f5da241990-12-20 15:06:42 +00001908 [tb, val, exc, 0] L2: POP
1909 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001910 .............................etc.......................
1911
Guido van Rossum3f5da241990-12-20 15:06:42 +00001912 [tb, val, exc, 0] Ln+1: POP
1913 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001914
1915 [] L0: <next statement>
1916
1917 Of course, parts are not generated if Vi or Ei is not present.
1918*/
1919
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001920static void
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001921com_try_except(c, n)
1922 struct compiling *c;
1923 node *n;
1924{
1925 int except_anchor = 0;
1926 int end_anchor = 0;
1927 int else_anchor = 0;
1928 int i;
1929 node *ch;
1930
1931 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
1932 block_push(c, SETUP_EXCEPT);
1933 com_node(c, CHILD(n, 2));
1934 com_addbyte(c, POP_BLOCK);
1935 block_pop(c, SETUP_EXCEPT);
1936 com_addfwref(c, JUMP_FORWARD, &else_anchor);
1937 com_backpatch(c, except_anchor);
1938 for (i = 3;
1939 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
1940 i += 3) {
1941 /* except_clause: 'except' [expr [',' expr]] */
1942 if (except_anchor == 0) {
1943 err_setstr(SyntaxError,
1944 "default 'except:' must be last");
1945 c->c_errors++;
1946 break;
1947 }
1948 except_anchor = 0;
1949 com_addoparg(c, SET_LINENO, ch->n_lineno);
1950 if (NCH(ch) > 1) {
1951 com_addbyte(c, DUP_TOP);
1952 com_node(c, CHILD(ch, 1));
1953 com_addoparg(c, COMPARE_OP, EXC_MATCH);
1954 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
1955 com_addbyte(c, POP_TOP);
1956 }
1957 com_addbyte(c, POP_TOP);
1958 if (NCH(ch) > 3)
1959 com_assign(c, CHILD(ch, 3), 1/*assigning*/);
1960 else
1961 com_addbyte(c, POP_TOP);
1962 com_addbyte(c, POP_TOP);
1963 com_node(c, CHILD(n, i+2));
1964 com_addfwref(c, JUMP_FORWARD, &end_anchor);
1965 if (except_anchor) {
1966 com_backpatch(c, except_anchor);
1967 com_addbyte(c, POP_TOP);
1968 }
1969 }
1970 com_addbyte(c, END_FINALLY);
1971 com_backpatch(c, else_anchor);
1972 if (i < NCH(n))
1973 com_node(c, CHILD(n, i+2));
1974 com_backpatch(c, end_anchor);
1975}
1976
1977static void
1978com_try_finally(c, n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001979 struct compiling *c;
1980 node *n;
1981{
1982 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001983 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00001984
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001985 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
1986 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001987 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001988 com_addbyte(c, POP_BLOCK);
1989 block_pop(c, SETUP_FINALLY);
1990 block_push(c, END_FINALLY);
1991 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1992 com_backpatch(c, finally_anchor);
1993 ch = CHILD(n, NCH(n)-1);
1994 com_addoparg(c, SET_LINENO, ch->n_lineno);
1995 com_node(c, ch);
1996 com_addbyte(c, END_FINALLY);
1997 block_pop(c, END_FINALLY);
1998}
1999
2000static void
2001com_try_stmt(c, n)
2002 struct compiling *c;
2003 node *n;
2004{
2005 REQ(n, try_stmt);
2006 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
2007 | 'try' ':' suite 'finally' ':' suite */
2008 if (TYPE(CHILD(n, 3)) != except_clause)
2009 com_try_finally(c, n);
2010 else
2011 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002012}
2013
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002014static object *
2015get_docstring(n)
2016 node *n;
2017{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002018 int i;
2019
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002020 switch (TYPE(n)) {
2021
2022 case suite:
2023 if (NCH(n) == 1)
2024 return get_docstring(CHILD(n, 0));
2025 else {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002026 for (i = 0; i < NCH(n); i++) {
2027 node *ch = CHILD(n, i);
2028 if (TYPE(ch) == stmt)
2029 return get_docstring(ch);
2030 }
2031 }
2032 break;
2033
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002034 case file_input:
2035 for (i = 0; i < NCH(n); i++) {
2036 node *ch = CHILD(n, i);
2037 if (TYPE(ch) == stmt)
2038 return get_docstring(ch);
2039 }
2040 break;
2041
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002042 case stmt:
2043 case simple_stmt:
2044 case small_stmt:
2045 return get_docstring(CHILD(n, 0));
2046
2047 case expr_stmt:
2048 case testlist:
2049 case test:
2050 case and_test:
2051 case not_test:
2052 case comparison:
2053 case expr:
2054 case xor_expr:
2055 case and_expr:
2056 case shift_expr:
2057 case arith_expr:
2058 case term:
2059 case factor:
2060 if (NCH(n) == 1)
2061 return get_docstring(CHILD(n, 0));
2062 break;
2063
2064 case atom:
2065 if (TYPE(CHILD(n, 0)) == STRING)
2066 return parsestrplus(n);
2067 break;
2068
2069 }
2070 return NULL;
2071}
2072
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002073static void
2074com_suite(c, n)
2075 struct compiling *c;
2076 node *n;
2077{
2078 REQ(n, suite);
2079 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
2080 if (NCH(n) == 1) {
2081 com_node(c, CHILD(n, 0));
2082 }
2083 else {
2084 int i;
2085 for (i = 0; i < NCH(n); i++) {
2086 node *ch = CHILD(n, i);
2087 if (TYPE(ch) == stmt)
2088 com_node(c, ch);
2089 }
2090 }
2091}
2092
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002093/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002094static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002095com_continue_stmt(c, n)
2096 struct compiling *c;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002097 node *n; /* Not used, but passed for consistency */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002098{
2099 int i = c->c_nblocks;
2100 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
2101 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2102 }
2103 else {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00002104 err_setstr(SyntaxError, "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002105 c->c_errors++;
2106 }
2107 /* XXX Could allow it inside a 'finally' clause
2108 XXX if we could pop the exception still on the stack */
2109}
2110
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002111static int
Guido van Rossum681d79a1995-07-18 14:51:37 +00002112com_argdefs(c, n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002113 struct compiling *c;
2114 node *n;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002115{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002116 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002117 if (TYPE(n) == lambdef) {
2118 /* lambdef: 'lambda' [varargslist] ':' test */
2119 n = CHILD(n, 1);
2120 }
2121 else {
2122 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
2123 n = CHILD(n, 2);
2124 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
2125 n = CHILD(n, 1);
2126 }
2127 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002128 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002129 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002130 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002131 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
2132 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002133 nargs = 0;
2134 ndefs = 0;
2135 for (i = 0; i < nch; i++) {
2136 int t;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002137 if (TYPE(CHILD(n, i)) == STAR)
2138 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002139 nargs++;
2140 i++;
2141 if (i >= nch)
2142 break;
2143 t = TYPE(CHILD(n, i));
2144 if (t == EQUAL) {
2145 i++;
2146 ndefs++;
2147 com_node(c, CHILD(n, i));
2148 i++;
2149 if (i >= nch)
2150 break;
2151 t = TYPE(CHILD(n, i));
2152 }
2153 else {
2154 /* Treat "(a=1, b)" as "(a=1, b=None)" */
2155 if (ndefs) {
2156 com_addoparg(c, LOAD_CONST,
2157 com_addconst(c, None));
2158 ndefs++;
2159 }
2160 }
2161 if (t != COMMA)
2162 break;
2163 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002164 return ndefs;
2165}
2166
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002167static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002168com_funcdef(c, n)
2169 struct compiling *c;
2170 node *n;
2171{
2172 object *v;
2173 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum590baa41993-11-30 13:40:46 +00002174 v = (object *)compile(n, c->c_filename);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002175 if (v == NULL)
2176 c->c_errors++;
2177 else {
2178 int i = com_addconst(c, v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002179 int ndefs = com_argdefs(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002180 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002181 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002182 com_addopname(c, STORE_NAME, CHILD(n, 1));
2183 DECREF(v);
2184 }
2185}
2186
2187static void
Guido van Rossum25831651993-05-19 14:50:45 +00002188com_bases(c, n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002189 struct compiling *c;
2190 node *n;
2191{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002192 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002193 REQ(n, testlist);
2194 /* testlist: test (',' test)* [','] */
2195 for (i = 0; i < NCH(n); i += 2)
2196 com_node(c, CHILD(n, i));
2197 com_addoparg(c, BUILD_TUPLE, (NCH(n)+1) / 2);
2198}
2199
2200static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002201com_classdef(c, n)
2202 struct compiling *c;
2203 node *n;
2204{
Guido van Rossum25831651993-05-19 14:50:45 +00002205 int i;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002206 object *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002207 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00002208 /* classdef: class NAME ['(' testlist ')'] ':' suite */
2209 if ((v = newstringobject(STR(CHILD(n, 1)))) == NULL) {
2210 c->c_errors++;
2211 return;
2212 }
2213 /* Push the class name on the stack */
2214 i = com_addconst(c, v);
2215 com_addoparg(c, LOAD_CONST, i);
2216 DECREF(v);
2217 /* Push the tuple of base classes on the stack */
2218 if (TYPE(CHILD(n, 2)) != LPAR)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002219 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum25831651993-05-19 14:50:45 +00002220 else
2221 com_bases(c, CHILD(n, 3));
Guido van Rossum590baa41993-11-30 13:40:46 +00002222 v = (object *)compile(n, c->c_filename);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002223 if (v == NULL)
2224 c->c_errors++;
2225 else {
Guido van Rossum25831651993-05-19 14:50:45 +00002226 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002227 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002228 com_addoparg(c, MAKE_FUNCTION, 0);
2229 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002230 com_addbyte(c, BUILD_CLASS);
2231 com_addopname(c, STORE_NAME, CHILD(n, 1));
2232 DECREF(v);
2233 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002234}
2235
2236static void
2237com_node(c, n)
2238 struct compiling *c;
2239 node *n;
2240{
2241 switch (TYPE(n)) {
2242
2243 /* Definition nodes */
2244
2245 case funcdef:
2246 com_funcdef(c, n);
2247 break;
2248 case classdef:
2249 com_classdef(c, n);
2250 break;
2251
2252 /* Trivial parse tree nodes */
2253
2254 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002255 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002256 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002257 com_node(c, CHILD(n, 0));
2258 break;
2259
2260 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002261 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
2262 com_addoparg(c, SET_LINENO, n->n_lineno);
2263 {
2264 int i;
2265 for (i = 0; i < NCH(n)-1; i += 2)
2266 com_node(c, CHILD(n, i));
2267 }
2268 break;
2269
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002270 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002271 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002272 com_node(c, CHILD(n, 0));
2273 break;
2274
2275 /* Statement nodes */
2276
2277 case expr_stmt:
2278 com_expr_stmt(c, n);
2279 break;
2280 case print_stmt:
2281 com_print_stmt(c, n);
2282 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002283 case del_stmt: /* 'del' exprlist */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002284 com_assign(c, CHILD(n, 1), 0/*delete*/);
2285 break;
2286 case pass_stmt:
2287 break;
2288 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002289 if (c->c_loops == 0) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00002290 err_setstr(SyntaxError, "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002291 c->c_errors++;
2292 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002293 com_addbyte(c, BREAK_LOOP);
2294 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002295 case continue_stmt:
2296 com_continue_stmt(c, n);
2297 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002298 case return_stmt:
2299 com_return_stmt(c, n);
2300 break;
2301 case raise_stmt:
2302 com_raise_stmt(c, n);
2303 break;
2304 case import_stmt:
2305 com_import_stmt(c, n);
2306 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002307 case global_stmt:
2308 com_global_stmt(c, n);
2309 break;
Guido van Rossum25831651993-05-19 14:50:45 +00002310 case access_stmt:
2311 com_access_stmt(c, n);
2312 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002313 case exec_stmt:
2314 com_exec_stmt(c, n);
2315 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002316 case if_stmt:
2317 com_if_stmt(c, n);
2318 break;
2319 case while_stmt:
2320 com_while_stmt(c, n);
2321 break;
2322 case for_stmt:
2323 com_for_stmt(c, n);
2324 break;
2325 case try_stmt:
2326 com_try_stmt(c, n);
2327 break;
2328 case suite:
2329 com_suite(c, n);
2330 break;
2331
2332 /* Expression nodes */
2333
2334 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002335 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002336 break;
2337 case test:
2338 com_test(c, n);
2339 break;
2340 case and_test:
2341 com_and_test(c, n);
2342 break;
2343 case not_test:
2344 com_not_test(c, n);
2345 break;
2346 case comparison:
2347 com_comparison(c, n);
2348 break;
2349 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002350 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002351 break;
2352 case expr:
2353 com_expr(c, n);
2354 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002355 case xor_expr:
2356 com_xor_expr(c, n);
2357 break;
2358 case and_expr:
2359 com_and_expr(c, n);
2360 break;
2361 case shift_expr:
2362 com_shift_expr(c, n);
2363 break;
2364 case arith_expr:
2365 com_arith_expr(c, n);
2366 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002367 case term:
2368 com_term(c, n);
2369 break;
2370 case factor:
2371 com_factor(c, n);
2372 break;
2373 case atom:
2374 com_atom(c, n);
2375 break;
2376
2377 default:
2378 fprintf(stderr, "node type %d\n", TYPE(n));
2379 err_setstr(SystemError, "com_node: unexpected node type");
2380 c->c_errors++;
2381 }
2382}
2383
2384static void com_fplist PROTO((struct compiling *, node *));
2385
2386static void
2387com_fpdef(c, n)
2388 struct compiling *c;
2389 node *n;
2390{
2391 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
2392 if (TYPE(CHILD(n, 0)) == LPAR)
2393 com_fplist(c, CHILD(n, 1));
2394 else
Guido van Rossum681d79a1995-07-18 14:51:37 +00002395 com_addoparg(c, STORE_FAST, com_newlocal(c, STR(CHILD(n, 0))));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002396}
2397
2398static void
2399com_fplist(c, n)
2400 struct compiling *c;
2401 node *n;
2402{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00002403 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002404 if (NCH(n) == 1) {
2405 com_fpdef(c, CHILD(n, 0));
2406 }
2407 else {
2408 int i;
2409 com_addoparg(c, UNPACK_TUPLE, (NCH(n)+1)/2);
2410 for (i = 0; i < NCH(n); i += 2)
2411 com_fpdef(c, CHILD(n, i));
2412 }
2413}
2414
2415static void
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002416com_arglist(c, n)
2417 struct compiling *c;
2418 node *n;
2419{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002420 int nch, i;
2421 int complex = 0;
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002422 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00002423 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002424 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002425 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002426 /* Enter all arguments in table of locals */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002427 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002428 node *ch = CHILD(n, i);
2429 node *fp;
2430 char *name;
2431 if (TYPE(ch) == STAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002432 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002433 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
2434 fp = CHILD(ch, 0);
2435 if (TYPE(fp) == NAME)
2436 name = STR(fp);
2437 else {
2438 name = "";
2439 complex= 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002440 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002441 com_newlocal(c, name);
2442 c->c_argcount++;
2443 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002444 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002445 ch = CHILD(n, i);
2446 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002447 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002448 else
2449 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002450 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002451 /* Handle *arguments */
2452 if (i < nch) {
2453 node *ch;
2454 ch = CHILD(n, i);
2455 REQ(ch, STAR);
2456 ch = CHILD(n, i+1);
2457 if (TYPE(ch) == NAME) {
2458 c->c_flags |= CO_VARARGS;
2459 i += 3;
2460 com_newlocal(c, STR(ch));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002461 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002462 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002463 /* Handle **keywords */
2464 if (i < nch) {
2465 node *ch;
2466 ch = CHILD(n, i);
2467 REQ(ch, STAR);
2468 ch = CHILD(n, i+1);
2469 REQ(ch, STAR);
2470 ch = CHILD(n, i+2);
2471 REQ(ch, NAME);
2472 c->c_flags |= CO_VARKEYWORDS;
2473 com_newlocal(c, STR(ch));
2474 }
2475 if (complex) {
2476 /* Generate code for complex arguments only after
2477 having counted the simple arguments */
2478 int ilocal = 0;
2479 for (i = 0; i < nch; i++) {
2480 node *ch = CHILD(n, i);
2481 node *fp;
2482 char *name;
2483 if (TYPE(ch) == STAR)
2484 break;
2485 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
2486 fp = CHILD(ch, 0);
2487 if (TYPE(fp) != NAME) {
2488 com_addoparg(c, LOAD_FAST, ilocal);
2489 com_fpdef(c, ch);
2490 }
2491 ilocal++;
2492 if (++i >= nch)
2493 break;
2494 ch = CHILD(n, i);
2495 if (TYPE(ch) == EQUAL)
2496 i += 2;
2497 else
2498 REQ(ch, COMMA);
2499 }
2500 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002501}
2502
2503static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002504com_file_input(c, n)
2505 struct compiling *c;
2506 node *n;
2507{
2508 int i;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002509 object *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002510 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002511 doc = get_docstring(n);
2512 if (doc != NULL) {
2513 int i = com_addconst(c, doc);
2514 DECREF(doc);
2515 com_addoparg(c, LOAD_CONST, i);
2516 com_addopnamestr(c, STORE_NAME, "__doc__");
2517 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002518 for (i = 0; i < NCH(n); i++) {
2519 node *ch = CHILD(n, i);
2520 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
2521 com_node(c, ch);
2522 }
2523}
2524
2525/* Top-level compile-node interface */
2526
2527static void
2528compile_funcdef(c, n)
2529 struct compiling *c;
2530 node *n;
2531{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002532 object *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002533 node *ch;
2534 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00002535 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002536 doc = get_docstring(CHILD(n, 4));
2537 if (doc != NULL) {
2538 (void) com_addconst(c, doc);
2539 DECREF(doc);
2540 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002541 else
2542 (void) com_addconst(c, None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002543 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
2544 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00002545 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002546 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002547 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002548 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002549 c->c_infunction = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002550 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2551 com_addbyte(c, RETURN_VALUE);
2552}
2553
2554static void
Guido van Rossum590baa41993-11-30 13:40:46 +00002555compile_lambdef(c, n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002556 struct compiling *c;
2557 node *n;
2558{
Guido van Rossum590baa41993-11-30 13:40:46 +00002559 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002560 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00002561 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00002562
2563 ch = CHILD(n, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002564 (void) com_addconst(c, None); /* No docstring */
2565 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00002566 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002567 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00002568 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002569 else
2570 ch = CHILD(n, 2);
2571 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002572 com_addbyte(c, RETURN_VALUE);
2573}
2574
2575static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002576compile_classdef(c, n)
2577 struct compiling *c;
2578 node *n;
2579{
2580 node *ch;
2581 object *doc;
2582 REQ(n, classdef);
2583 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
2584 c->c_name = STR(CHILD(n, 1));
2585 ch = CHILD(n, NCH(n)-1); /* The suite */
2586 doc = get_docstring(ch);
2587 if (doc != NULL) {
2588 int i = com_addconst(c, doc);
2589 DECREF(doc);
2590 com_addoparg(c, LOAD_CONST, i);
2591 com_addopnamestr(c, STORE_NAME, "__doc__");
2592 }
2593 else
2594 (void) com_addconst(c, None);
2595 com_node(c, ch);
2596 com_addbyte(c, LOAD_LOCALS);
2597 com_addbyte(c, RETURN_VALUE);
2598}
2599
2600static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002601compile_node(c, n)
2602 struct compiling *c;
2603 node *n;
2604{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002605 com_addoparg(c, SET_LINENO, n->n_lineno);
2606
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002607 switch (TYPE(n)) {
2608
Guido van Rossum4c417781991-01-21 16:09:22 +00002609 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002610 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002611 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002612 n = CHILD(n, 0);
2613 if (TYPE(n) != NEWLINE)
2614 com_node(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002615 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2616 com_addbyte(c, RETURN_VALUE);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002617 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002618 break;
2619
Guido van Rossum4c417781991-01-21 16:09:22 +00002620 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002621 com_file_input(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002622 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2623 com_addbyte(c, RETURN_VALUE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002624 break;
2625
Guido van Rossum590baa41993-11-30 13:40:46 +00002626 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00002627 com_node(c, CHILD(n, 0));
2628 com_addbyte(c, RETURN_VALUE);
2629 break;
2630
Guido van Rossum590baa41993-11-30 13:40:46 +00002631 case lambdef: /* anonymous function definition */
2632 compile_lambdef(c, n);
2633 break;
2634
Guido van Rossum4c417781991-01-21 16:09:22 +00002635 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002636 compile_funcdef(c, n);
2637 break;
2638
Guido van Rossum4c417781991-01-21 16:09:22 +00002639 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002640 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002641 break;
2642
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002643 default:
2644 fprintf(stderr, "node type %d\n", TYPE(n));
2645 err_setstr(SystemError, "compile_node: unexpected node type");
2646 c->c_errors++;
2647 }
2648}
2649
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002650/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00002651
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002652 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
2653 instructions that refer to local variables with LOAD_FAST etc.
2654 The latter instructions are much faster because they don't need to
2655 look up the variable name in a dictionary.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002656
Guido van Rossum681d79a1995-07-18 14:51:37 +00002657 To find all local variables, we check all STORE_NAME, IMPORT_FROM
2658 and DELETE_NAME instructions. This yields all local variables,
2659 function definitions, class definitions and import statements.
2660 Argument names have already been entered into the list by the
2661 special processing for the argument list.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002662
2663 All remaining LOAD_NAME instructions must refer to non-local (global
2664 or builtin) variables, so are replaced by LOAD_GLOBAL.
2665
2666 There are two problems: 'from foo import *' and 'exec' may introduce
2667 local variables that we can't know while compiling. If this is the
Guido van Rossum681d79a1995-07-18 14:51:37 +00002668 case, we can still optimize bona fide locals (since those
2669 statements will be surrounded by fast_2_locals() and
2670 locals_2_fast()), but we can't change LOAD_NAME to LOAD_GLOBAL.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002671
Guido van Rossum681d79a1995-07-18 14:51:37 +00002672 NB: this modifies the string object c->c_code! */
Guido van Rossum282914b1991-04-04 10:42:56 +00002673
2674static void
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002675optimize(c)
2676 struct compiling *c;
Guido van Rossum282914b1991-04-04 10:42:56 +00002677{
Guido van Rossum0a697f61991-04-16 08:39:12 +00002678 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00002679 int opcode;
2680 int oparg;
2681 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002682 object *error_type, *error_value, *error_traceback;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002683
Guido van Rossum282914b1991-04-04 10:42:56 +00002684#define NEXTOP() (*next_instr++)
2685#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
2686#define GETITEM(v, i) (getlistitem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002687#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
2688
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002689 err_fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002690
2691 c->c_flags |= CO_OPTIMIZED;
Guido van Rossum282914b1991-04-04 10:42:56 +00002692
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002693 next_instr = (unsigned char *) getstringvalue(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00002694 for (;;) {
2695 opcode = NEXTOP();
2696 if (opcode == STOP_CODE)
2697 break;
2698 if (HAS_ARG(opcode))
2699 oparg = NEXTARG();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002700 switch (opcode) {
2701 case STORE_NAME:
2702 case DELETE_NAME:
2703 case IMPORT_FROM:
2704 com_addlocal_o(c, GETNAMEOBJ(oparg));
2705 break;
2706 case EXEC_STMT:
2707 c->c_flags &= ~CO_OPTIMIZED;
2708 break;
Guido van Rossum282914b1991-04-04 10:42:56 +00002709 }
2710 }
2711
Guido van Rossum681d79a1995-07-18 14:51:37 +00002712 if (dictlookup(c->c_locals, "*") != NULL)
2713 c->c_flags &= ~CO_OPTIMIZED;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002714
2715 next_instr = (unsigned char *) getstringvalue(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00002716 for (;;) {
2717 cur_instr = next_instr;
2718 opcode = NEXTOP();
2719 if (opcode == STOP_CODE)
2720 break;
2721 if (HAS_ARG(opcode))
2722 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002723 if (opcode == LOAD_NAME ||
2724 opcode == STORE_NAME ||
2725 opcode == DELETE_NAME) {
2726 object *v;
2727 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00002728 name = GETNAMEOBJ(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002729 v = dict2lookup(c->c_locals, name);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002730 if (v == NULL) {
Guido van Rossum83163251991-08-16 08:58:43 +00002731 err_clear();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002732 if (opcode == LOAD_NAME &&
2733 (c->c_flags&CO_OPTIMIZED))
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002734 cur_instr[0] = LOAD_GLOBAL;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002735 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00002736 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002737 i = getintvalue(v);
2738 switch (opcode) {
2739 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
2740 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
2741 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
2742 }
2743 cur_instr[1] = i & 0xff;
2744 cur_instr[2] = (i>>8) & 0xff;
Guido van Rossum282914b1991-04-04 10:42:56 +00002745 }
2746 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002747
Guido van Rossum681d79a1995-07-18 14:51:37 +00002748 if (c->c_errors == 0)
2749 err_restore(error_type, error_value, error_traceback);
Guido van Rossum282914b1991-04-04 10:42:56 +00002750}
2751
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002752codeobject *
Guido van Rossum590baa41993-11-30 13:40:46 +00002753compile(n, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002754 node *n;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002755 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002756{
2757 struct compiling sc;
2758 codeobject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00002759 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002760 return NULL;
2761 compile_node(&sc, n);
2762 com_done(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002763 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002764 optimize(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002765 sc.c_flags |= CO_NEWLOCALS;
2766 }
2767 else if (TYPE(n) == classdef)
2768 sc.c_flags |= CO_NEWLOCALS;
Guido van Rossum9bfef441993-03-29 10:43:31 +00002769 co = NULL;
2770 if (sc.c_errors == 0) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002771 object *consts, *names, *varnames, *filename, *name;
2772 consts = listtuple(sc.c_consts);
2773 names = listtuple(sc.c_names);
2774 varnames = listtuple(sc.c_varnames);
2775 filename = newstringobject(sc.c_filename);
2776 name = newstringobject(sc.c_name);
2777 if (!err_occurred())
2778 co = newcodeobject(sc.c_argcount,
2779 sc.c_nlocals,
2780 sc.c_flags,
2781 sc.c_code,
2782 consts,
2783 names,
2784 varnames,
2785 filename,
2786 name);
2787 XDECREF(consts);
2788 XDECREF(names);
2789 XDECREF(varnames);
2790 XDECREF(filename);
2791 XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00002792 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002793 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002794 return co;
2795}