blob: a9d597b2dec522caac25b978b9a61ab84468129a [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 Rossum8ff077b1996-08-24 06:21:31 +000038#ifndef NO_PRIVATE_NAME_MANGLING
39#define PRIVATE_NAME_MANGLING
40#endif
41
Guido van Rossum3f5da241990-12-20 15:06:42 +000042#include "allobjects.h"
43
Guido van Rossum10dc2e81990-11-18 17:27:39 +000044#include "node.h"
45#include "token.h"
46#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000047#include "compile.h"
48#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000049#include "structmember.h"
50
51#include <ctype.h>
Guido van Rossumf1dc5661993-07-05 10:31:29 +000052#include <errno.h>
Guido van Rossum282914b1991-04-04 10:42:56 +000053
Guido van Rossum8861b741996-07-30 16:49:37 +000054#define OP_DELETE 0
55#define OP_ASSIGN 1
56#define OP_APPLY 2
57
Guido van Rossum3f5da241990-12-20 15:06:42 +000058#define OFF(x) offsetof(codeobject, x)
59
60static struct memberlist code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000061 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
62 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
63 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000064 {"co_code", T_OBJECT, OFF(co_code), READONLY},
65 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
66 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000067 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000068 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000069 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000070 {NULL} /* Sentinel */
71};
72
73static object *
74code_getattr(co, name)
75 codeobject *co;
76 char *name;
77{
78 return getmember((char *)co, code_memberlist, name);
79}
Guido van Rossum10dc2e81990-11-18 17:27:39 +000080
81static void
Guido van Rossum3f5da241990-12-20 15:06:42 +000082code_dealloc(co)
83 codeobject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +000084{
Guido van Rossum3f5da241990-12-20 15:06:42 +000085 XDECREF(co->co_code);
86 XDECREF(co->co_consts);
87 XDECREF(co->co_names);
88 XDECREF(co->co_filename);
Guido van Rossum9bfef441993-03-29 10:43:31 +000089 XDECREF(co->co_name);
Guido van Rossum681d79a1995-07-18 14:51:37 +000090 XDECREF(co->co_varnames);
Guido van Rossum3f5da241990-12-20 15:06:42 +000091 DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +000092}
93
Guido van Rossum2dff9911992-09-03 20:50:59 +000094static object *
95code_repr(co)
96 codeobject *co;
97{
98 char buf[500];
99 int lineno = -1;
100 char *p = GETSTRINGVALUE(co->co_code);
101 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000102 char *name = "???";
Guido van Rossum2dff9911992-09-03 20:50:59 +0000103 if (*p == SET_LINENO)
104 lineno = (p[1] & 0xff) | ((p[2] & 0xff) << 8);
105 if (co->co_filename && is_stringobject(co->co_filename))
106 filename = getstringvalue(co->co_filename);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000107 if (co->co_name && is_stringobject(co->co_name))
108 name = getstringvalue(co->co_name);
109 sprintf(buf, "<code object %.100s at %lx, file \"%.300s\", line %d>",
110 name, (long)co, filename, lineno);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000111 return newstringobject(buf);
112}
113
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000114static int
115code_compare(co, cp)
116 codeobject *co, *cp;
117{
118 int cmp;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000119 cmp = cp->co_argcount - cp->co_argcount;
120 if (cmp) return cmp;
121 cmp = cp->co_nlocals - cp->co_nlocals;
122 if (cmp) return cmp;
123 cmp = cp->co_flags - cp->co_flags;
124 if (cmp) return cmp;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000125 cmp = cmpobject((object *)co->co_code, (object *)cp->co_code);
126 if (cmp) return cmp;
127 cmp = cmpobject(co->co_consts, cp->co_consts);
128 if (cmp) return cmp;
129 cmp = cmpobject(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000130 if (cmp) return cmp;
131 cmp = cmpobject(co->co_varnames, cp->co_varnames);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000132 return cmp;
133}
134
135static long
136code_hash(co)
137 codeobject *co;
138{
Guido van Rossum681d79a1995-07-18 14:51:37 +0000139 long h, h1, h2, h3, h4;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000140 h1 = hashobject((object *)co->co_code);
141 if (h1 == -1) return -1;
142 h2 = hashobject(co->co_consts);
143 if (h2 == -1) return -1;
144 h3 = hashobject(co->co_names);
145 if (h3 == -1) return -1;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000146 h4 = hashobject(co->co_varnames);
147 if (h4 == -1) return -1;
148 h = h1 ^ h2 ^ h3 ^ h4 ^
149 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000150 if (h == -1) h = -2;
151 return h;
152}
153
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000154typeobject Codetype = {
155 OB_HEAD_INIT(&Typetype)
156 0,
157 "code",
158 sizeof(codeobject),
159 0,
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000160 (destructor)code_dealloc, /*tp_dealloc*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000161 0, /*tp_print*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000162 (getattrfunc)code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000163 0, /*tp_setattr*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000164 (cmpfunc)code_compare, /*tp_compare*/
165 (reprfunc)code_repr, /*tp_repr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000166 0, /*tp_as_number*/
167 0, /*tp_as_sequence*/
168 0, /*tp_as_mapping*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000169 (hashfunc)code_hash, /*tp_hash*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000170};
171
Guido van Rossuma082ce41991-06-04 19:41:56 +0000172codeobject *
Guido van Rossum681d79a1995-07-18 14:51:37 +0000173newcodeobject(argcount, nlocals, flags,
174 code, consts, names, varnames, filename, name)
175 int argcount;
176 int nlocals;
177 int flags;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000178 object *code;
179 object *consts;
180 object *names;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000181 object *varnames;
Guido van Rossuma082ce41991-06-04 19:41:56 +0000182 object *filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000183 object *name;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000184{
185 codeobject *co;
186 int i;
187 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000188 if (argcount < 0 || nlocals < 0 ||
189 code == NULL || !is_stringobject(code) ||
190 consts == NULL || !is_tupleobject(consts) ||
191 names == NULL || !is_tupleobject(names) ||
192 varnames == NULL || !is_tupleobject(varnames) ||
193 name == NULL || !is_stringobject(name) ||
194 filename == NULL || !is_stringobject(filename)) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000195 err_badcall();
196 return NULL;
197 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000198 /* Make sure names and varnames are all strings */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000199 for (i = gettuplesize(names); --i >= 0; ) {
200 object *v = gettupleitem(names, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000201 if (v == NULL || !is_stringobject(v)) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000202 err_badcall();
203 return NULL;
204 }
205 }
206 for (i = gettuplesize(varnames); --i >= 0; ) {
207 object *v = gettupleitem(varnames, i);
208 if (v == NULL || !is_stringobject(v)) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000209 err_badcall();
210 return NULL;
211 }
212 }
213 co = NEWOBJ(codeobject, &Codetype);
214 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000215 co->co_argcount = argcount;
216 co->co_nlocals = nlocals;
217 co->co_flags = flags;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000218 INCREF(code);
219 co->co_code = (stringobject *)code;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000220 INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000221 co->co_consts = consts;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000222 INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000223 co->co_names = names;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000224 INCREF(varnames);
225 co->co_varnames = varnames;
Guido van Rossuma082ce41991-06-04 19:41:56 +0000226 INCREF(filename);
227 co->co_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000228 INCREF(name);
229 co->co_name = name;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000230 }
231 return co;
232}
233
234
235/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000236
237#define MAXBLOCKS 20 /* Max static block nesting within a function */
238
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000239struct compiling {
240 object *c_code; /* string */
241 object *c_consts; /* list of objects */
242 object *c_names; /* list of strings (names) */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000243 object *c_globals; /* dictionary (value=None) */
244 object *c_locals; /* dictionary (value=localID) */
245 object *c_varnames; /* list (inverse of c_locals) */
246 int c_nlocals; /* index of next local */
247 int c_argcount; /* number of top-level arguments */
248 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000249 int c_nexti; /* index into c_code */
250 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000251 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000252 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000253 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000254 int c_begin; /* begin of current loop, for 'continue' */
255 int c_block[MAXBLOCKS]; /* stack of block types */
256 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000257 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000258 char *c_name; /* name of object (e.g. function) */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000259#ifdef PRIVATE_NAME_MANGLING
260 char *c_private; /* for private name mangling */
261#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000262};
263
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000264
265/* Interface to the block stack */
266
267static void
268block_push(c, type)
269 struct compiling *c;
270 int type;
271{
272 if (c->c_nblocks >= MAXBLOCKS) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +0000273 err_setstr(SystemError, "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000274 c->c_errors++;
275 }
276 else {
277 c->c_block[c->c_nblocks++] = type;
278 }
279}
280
281static void
282block_pop(c, type)
283 struct compiling *c;
284 int type;
285{
286 if (c->c_nblocks > 0)
287 c->c_nblocks--;
288 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
289 err_setstr(SystemError, "bad block pop");
290 c->c_errors++;
291 }
292}
293
294
Guido van Rossum681d79a1995-07-18 14:51:37 +0000295/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000296
Guido van Rossum590baa41993-11-30 13:40:46 +0000297static int com_init PROTO((struct compiling *, char *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000298static void com_free PROTO((struct compiling *));
299static void com_done PROTO((struct compiling *));
300static void com_node PROTO((struct compiling *, struct _node *));
Guido van Rossum50564e81996-01-12 01:13:16 +0000301static void com_factor PROTO((struct compiling *, struct _node *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000302static void com_addbyte PROTO((struct compiling *, int));
303static void com_addint PROTO((struct compiling *, int));
304static void com_addoparg PROTO((struct compiling *, int, int));
305static void com_addfwref PROTO((struct compiling *, int, int *));
306static void com_backpatch PROTO((struct compiling *, int));
307static int com_add PROTO((struct compiling *, object *, object *));
308static int com_addconst PROTO((struct compiling *, object *));
309static int com_addname PROTO((struct compiling *, object *));
310static void com_addopname PROTO((struct compiling *, int, node *));
Guido van Rossum288a60f1991-12-16 13:05:10 +0000311static void com_list PROTO((struct compiling *, node *, int));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000312static int com_argdefs PROTO((struct compiling *, node *));
313static int com_newlocal PROTO((struct compiling *, char *));
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000314static codeobject *icompile PROTO((struct _node *, struct compiling *));
315static codeobject *jcompile PROTO((struct _node *, char *, struct compiling *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000316
317static int
Guido van Rossum590baa41993-11-30 13:40:46 +0000318com_init(c, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000319 struct compiling *c;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000320 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000321{
Guido van Rossum62d46241991-04-03 19:00:23 +0000322 if ((c->c_code = newsizedstringobject((char *)NULL, 1000)) == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000323 goto fail_3;
324 if ((c->c_consts = newlistobject(0)) == NULL)
325 goto fail_2;
326 if ((c->c_names = newlistobject(0)) == NULL)
327 goto fail_1;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000328 if ((c->c_globals = newdictobject()) == NULL)
329 goto fail_0;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000330 if ((c->c_locals = newdictobject()) == NULL)
331 goto fail_00;
332 if ((c->c_varnames = newlistobject(0)) == NULL)
333 goto fail_000;
334 c->c_nlocals = 0;
335 c->c_argcount = 0;
336 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000337 c->c_nexti = 0;
338 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000339 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000340 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000341 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000342 c->c_begin = 0;
343 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000344 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000345 c->c_name = "?";
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000346 return 1;
347
Guido van Rossum681d79a1995-07-18 14:51:37 +0000348 fail_000:
349 DECREF(c->c_locals);
350 fail_00:
351 DECREF(c->c_globals);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000352 fail_0:
353 DECREF(c->c_names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000354 fail_1:
355 DECREF(c->c_consts);
356 fail_2:
357 DECREF(c->c_code);
358 fail_3:
359 return 0;
360}
361
362static void
363com_free(c)
364 struct compiling *c;
365{
366 XDECREF(c->c_code);
367 XDECREF(c->c_consts);
368 XDECREF(c->c_names);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000369 XDECREF(c->c_globals);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000370 XDECREF(c->c_locals);
371 XDECREF(c->c_varnames);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000372}
373
374static void
375com_done(c)
376 struct compiling *c;
377{
378 if (c->c_code != NULL)
379 resizestring(&c->c_code, c->c_nexti);
380}
381
382static void
383com_addbyte(c, byte)
384 struct compiling *c;
385 int byte;
386{
387 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000388 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000389 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000390 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000391 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000392 fatal("com_addbyte: byte out of range");
Guido van Rossum01cfd441991-10-20 20:12:38 +0000393 */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000394 err_setstr(SystemError, "com_addbyte: byte out of range");
395 c->c_errors++;
396 }
397 if (c->c_code == NULL)
398 return;
399 len = getstringsize(c->c_code);
400 if (c->c_nexti >= len) {
401 if (resizestring(&c->c_code, len+1000) != 0) {
402 c->c_errors++;
403 return;
404 }
405 }
406 getstringvalue(c->c_code)[c->c_nexti++] = byte;
407}
408
409static void
410com_addint(c, x)
411 struct compiling *c;
412 int x;
413{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000414 com_addbyte(c, x & 0xff);
415 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000416}
417
418static void
419com_addoparg(c, op, arg)
420 struct compiling *c;
421 int op;
422 int arg;
423{
424 com_addbyte(c, op);
425 com_addint(c, arg);
426}
427
428static void
429com_addfwref(c, op, p_anchor)
430 struct compiling *c;
431 int op;
432 int *p_anchor;
433{
434 /* Compile a forward reference for backpatching */
435 int here;
436 int anchor;
437 com_addbyte(c, op);
438 here = c->c_nexti;
439 anchor = *p_anchor;
440 *p_anchor = here;
441 com_addint(c, anchor == 0 ? 0 : here - anchor);
442}
443
444static void
445com_backpatch(c, anchor)
446 struct compiling *c;
447 int anchor; /* Must be nonzero */
448{
449 unsigned char *code = (unsigned char *) getstringvalue(c->c_code);
450 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000451 int dist;
452 int prev;
453 for (;;) {
454 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000455 prev = code[anchor] + (code[anchor+1] << 8);
456 dist = target - (anchor+2);
457 code[anchor] = dist & 0xff;
458 code[anchor+1] = dist >> 8;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000459 if (!prev)
460 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000461 anchor -= prev;
462 }
463}
464
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000465/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000466
467static int
468com_add(c, list, v)
469 struct compiling *c;
470 object *list;
471 object *v;
472{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000473 int n = getlistsize(list);
474 int i;
475 for (i = n; --i >= 0; ) {
476 object *w = getlistitem(list, i);
Guido van Rossumefc0bd01991-07-01 18:44:20 +0000477 if (v->ob_type == w->ob_type && cmpobject(v, w) == 0)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000478 return i;
479 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000480 if (addlistitem(list, v) != 0)
481 c->c_errors++;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000482 return n;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000483}
484
485static int
486com_addconst(c, v)
487 struct compiling *c;
488 object *v;
489{
490 return com_add(c, c->c_consts, v);
491}
492
493static int
494com_addname(c, v)
495 struct compiling *c;
496 object *v;
497{
498 return com_add(c, c->c_names, v);
499}
500
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000501#ifdef PRIVATE_NAME_MANGLING
502static int
503com_mangle(c, name, buffer, maxlen)
504 struct compiling *c;
505 char *name;
506 char *buffer;
507 int maxlen;
508{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000509 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000510 This is independent from how the name is used. */
511 char *p;
512 int nlen, plen;
513 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000514 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000515 return 0; /* Don't mangle __extremely_long_names */
516 if (name[nlen-1] == '_' && name[nlen-2] == '_')
517 return 0; /* Don't mangle __whatever__ */
518 p = c->c_private;
519 /* Strip leading underscores from class name */
520 while (*p == '_')
521 p++;
522 if (*p == '\0')
523 return 0; /* Don't mangle if class is just underscores */
524 plen = strlen(p);
525 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000526 plen = maxlen-nlen-2; /* Truncate class name if too long */
527 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000528 buffer[0] = '_';
529 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000530 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000531 /* fprintf(stderr, "mangle %s -> %s\n", name, buffer); */
532 return 1;
533}
534#endif
535
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000536static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000537com_addopnamestr(c, op, name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000538 struct compiling *c;
539 int op;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000540 char *name;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000541{
542 object *v;
543 int i;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000544#ifdef PRIVATE_NAME_MANGLING
545 char buffer[256];
546 if (name != NULL && name[0] == '_' && name[1] == '_' &&
547 c->c_private != NULL &&
548 com_mangle(c, name, buffer, (int)sizeof(buffer)))
549 name = buffer;
550#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000551 if (name == NULL || (v = newstringobject(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000552 c->c_errors++;
553 i = 255;
554 }
555 else {
556 i = com_addname(c, v);
557 DECREF(v);
558 }
Guido van Rossumc5e96291991-12-10 13:53:51 +0000559 /* Hack to replace *_NAME opcodes by *_GLOBAL if necessary */
560 switch (op) {
561 case LOAD_NAME:
562 case STORE_NAME:
563 case DELETE_NAME:
564 if (dictlookup(c->c_globals, name) != NULL) {
565 switch (op) {
566 case LOAD_NAME: op = LOAD_GLOBAL; break;
567 case STORE_NAME: op = STORE_GLOBAL; break;
568 case DELETE_NAME: op = DELETE_GLOBAL; break;
569 }
570 }
571 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000572 com_addoparg(c, op, i);
573}
574
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000575static void
576com_addopname(c, op, n)
577 struct compiling *c;
578 int op;
579 node *n;
580{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000581 char *name;
582 char buffer[1000];
583 /* XXX it is possible to write this code without the 1000
584 chars on the total length of dotted names, I just can't be
585 bothered right now */
586 if (TYPE(n) == STAR)
587 name = "*";
588 else if (TYPE(n) == dotted_name) {
589 char *p = buffer;
590 int i;
591 name = buffer;
592 for (i = 0; i < NCH(n); i += 2) {
593 char *s = STR(CHILD(n, i));
594 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
595 err_setstr(MemoryError,
596 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +0000597 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000598 break;
599 }
600 if (p != buffer)
601 *p++ = '.';
602 strcpy(p, s);
603 p = strchr(p, '\0');
604 }
605 }
606 else {
607 REQ(n, NAME);
608 name = STR(n);
609 }
610 com_addopnamestr(c, op, name);
611}
612
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000613static object *
614parsenumber(s)
615 char *s;
616{
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000617 extern long mystrtol PROTO((const char *, char **, int));
618 extern unsigned long mystrtoul PROTO((const char *, char **, int));
619 extern double atof PROTO((const char *));
Guido van Rossumc5e96291991-12-10 13:53:51 +0000620 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000621 long x;
Guido van Rossum50564e81996-01-12 01:13:16 +0000622#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +0000623 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +0000624 int imflag;
625#endif
626
Guido van Rossum282914b1991-04-04 10:42:56 +0000627 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000628 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +0000629#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +0000630 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +0000631#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000632 if (*end == 'l' || *end == 'L')
Guido van Rossumc5e96291991-12-10 13:53:51 +0000633 return long_scan(s, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000634 if (s[0] == '0')
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000635 x = (long) mystrtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000636 else
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000637 x = mystrtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +0000638 if (*end == '\0') {
639 if (errno != 0) {
Guido van Rossumefb087b1991-12-16 15:41:41 +0000640 err_setstr(OverflowError,
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000641 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000642 return NULL;
643 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000644 return newintobject(x);
Guido van Rossum282914b1991-04-04 10:42:56 +0000645 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000646 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +0000647#ifndef WITHOUT_COMPLEX
648 if (imflag) {
649 c.real = 0.;
650 c.imag = atof(s);
651 return newcomplexobject(c);
652 }
653 else
654#endif
655 return newfloatobject(atof(s));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000656}
657
658static object *
659parsestr(s)
660 char *s;
661{
662 object *v;
663 int len;
664 char *buf;
665 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000666 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000667 int c;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000668 int quote = *s;
669 if (quote != '\'' && quote != '\"') {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000670 err_badcall();
671 return NULL;
672 }
673 s++;
674 len = strlen(s);
Guido van Rossum8054fad1993-10-26 15:19:44 +0000675 if (s[--len] != quote) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000676 err_badcall();
677 return NULL;
678 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000679 if (len >= 4 && s[0] == quote && s[1] == quote) {
680 s += 2;
681 len -= 2;
682 if (s[--len] != quote || s[--len] != quote) {
683 err_badcall();
684 return NULL;
685 }
686 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000687 if (strchr(s, '\\') == NULL)
688 return newsizedstringobject(s, len);
689 v = newsizedstringobject((char *)NULL, len);
690 p = buf = getstringvalue(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000691 end = s + len;
692 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000693 if (*s != '\\') {
694 *p++ = *s++;
695 continue;
696 }
697 s++;
698 switch (*s++) {
699 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000700 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000701 case '\\': *p++ = '\\'; break;
702 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000703 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000704 case 'b': *p++ = '\b'; break;
705 case 'f': *p++ = '\014'; break; /* FF */
706 case 't': *p++ = '\t'; break;
707 case 'n': *p++ = '\n'; break;
708 case 'r': *p++ = '\r'; break;
709 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000710 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
711 case '0': case '1': case '2': case '3':
712 case '4': case '5': case '6': case '7':
713 c = s[-1] - '0';
714 if ('0' <= *s && *s <= '7') {
715 c = (c<<3) + *s++ - '0';
716 if ('0' <= *s && *s <= '7')
717 c = (c<<3) + *s++ - '0';
718 }
719 *p++ = c;
720 break;
721 case 'x':
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000722 if (isxdigit(Py_CHARMASK(*s))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000723 sscanf(s, "%x", &c);
724 *p++ = c;
725 do {
726 s++;
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000727 } while (isxdigit(Py_CHARMASK(*s)));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000728 break;
729 }
730 /* FALLTHROUGH */
731 default: *p++ = '\\'; *p++ = s[-1]; break;
732 }
733 }
734 resizestring(&v, (int)(p - buf));
735 return v;
736}
737
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000738static object *
739parsestrplus(n)
740 node *n;
741{
742 object *v;
743 int i;
744 REQ(CHILD(n, 0), STRING);
745 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
746 /* String literal concatenation */
747 for (i = 1; i < NCH(n) && v != NULL; i++) {
748 joinstring_decref(&v, parsestr(STR(CHILD(n, i))));
749 }
750 }
751 return v;
752}
753
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000754static void
755com_list_constructor(c, n)
756 struct compiling *c;
757 node *n;
758{
759 int len;
760 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000761 if (TYPE(n) != testlist)
762 REQ(n, exprlist);
763 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
764 len = (NCH(n) + 1) / 2;
765 for (i = 0; i < NCH(n); i += 2)
766 com_node(c, CHILD(n, i));
767 com_addoparg(c, BUILD_LIST, len);
768}
769
770static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000771com_dictmaker(c, n)
772 struct compiling *c;
773 node *n;
774{
775 int i;
776 /* dictmaker: test ':' test (',' test ':' value)* [','] */
777 for (i = 0; i+2 < NCH(n); i += 4) {
778 /* We must arrange things just right for STORE_SUBSCR.
779 It wants the stack to look like (value) (dict) (key) */
780 com_addbyte(c, DUP_TOP);
781 com_node(c, CHILD(n, i+2)); /* value */
782 com_addbyte(c, ROT_TWO);
783 com_node(c, CHILD(n, i)); /* key */
784 com_addbyte(c, STORE_SUBSCR);
785 }
786}
787
788static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000789com_atom(c, n)
790 struct compiling *c;
791 node *n;
792{
793 node *ch;
794 object *v;
795 int i;
796 REQ(n, atom);
797 ch = CHILD(n, 0);
798 switch (TYPE(ch)) {
799 case LPAR:
800 if (TYPE(CHILD(n, 1)) == RPAR)
801 com_addoparg(c, BUILD_TUPLE, 0);
802 else
803 com_node(c, CHILD(n, 1));
804 break;
805 case LSQB:
806 if (TYPE(CHILD(n, 1)) == RSQB)
807 com_addoparg(c, BUILD_LIST, 0);
808 else
809 com_list_constructor(c, CHILD(n, 1));
810 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000811 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000812 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000813 if (TYPE(CHILD(n, 1)) != RBRACE)
814 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000815 break;
816 case BACKQUOTE:
817 com_node(c, CHILD(n, 1));
818 com_addbyte(c, UNARY_CONVERT);
819 break;
820 case NUMBER:
821 if ((v = parsenumber(STR(ch))) == NULL) {
822 c->c_errors++;
823 i = 255;
824 }
825 else {
826 i = com_addconst(c, v);
827 DECREF(v);
828 }
829 com_addoparg(c, LOAD_CONST, i);
830 break;
831 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000832 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000833 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000834 c->c_errors++;
835 i = 255;
836 }
837 else {
838 i = com_addconst(c, v);
839 DECREF(v);
840 }
841 com_addoparg(c, LOAD_CONST, i);
842 break;
843 case NAME:
844 com_addopname(c, LOAD_NAME, ch);
845 break;
846 default:
847 fprintf(stderr, "node type %d\n", TYPE(ch));
848 err_setstr(SystemError, "com_atom: unexpected node type");
849 c->c_errors++;
850 }
851}
852
853static void
854com_slice(c, n, op)
855 struct compiling *c;
856 node *n;
857 int op;
858{
859 if (NCH(n) == 1) {
860 com_addbyte(c, op);
861 }
862 else if (NCH(n) == 2) {
863 if (TYPE(CHILD(n, 0)) != COLON) {
864 com_node(c, CHILD(n, 0));
865 com_addbyte(c, op+1);
866 }
867 else {
868 com_node(c, CHILD(n, 1));
869 com_addbyte(c, op+2);
870 }
871 }
872 else {
873 com_node(c, CHILD(n, 0));
874 com_node(c, CHILD(n, 2));
875 com_addbyte(c, op+3);
876 }
877}
878
Guido van Rossumf10570b1995-07-07 22:53:21 +0000879static int
880com_argument(c, n, inkeywords)
881 struct compiling *c;
882 node *n; /* argument */
883 int inkeywords;
884{
885 node *m;
886 REQ(n, argument); /* [test '='] test; really [ keyword '='] keyword */
887 if (NCH(n) == 1) {
888 if (inkeywords) {
889 err_setstr(SyntaxError,
890 "non-keyword arg after keyword arg");
891 c->c_errors++;
892 }
893 else {
894 com_node(c, CHILD(n, 0));
895 }
896 return 0;
897 }
898 m = n;
899 do {
900 m = CHILD(m, 0);
901 } while (NCH(m) == 1);
902 if (TYPE(m) != NAME) {
903 err_setstr(SyntaxError, "keyword can't be an expression");
904 c->c_errors++;
905 }
906 else {
907 object *v = newstringobject(STR(m));
908 if (v == NULL)
909 c->c_errors++;
910 else {
911 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
912 DECREF(v);
913 }
914 }
915 com_node(c, CHILD(n, 2));
916 return 1;
917}
918
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000919static void
920com_call_function(c, n)
921 struct compiling *c;
Guido van Rossumf10570b1995-07-07 22:53:21 +0000922 node *n; /* EITHER arglist OR ')' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000923{
924 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +0000925 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000926 }
927 else {
Guido van Rossumf10570b1995-07-07 22:53:21 +0000928 int inkeywords, i, na, nk;
929 REQ(n, arglist);
930 inkeywords = 0;
931 na = 0;
932 nk = 0;
933 for (i = 0; i < NCH(n); i += 2) {
934 inkeywords = com_argument(c, CHILD(n, i), inkeywords);
935 if (!inkeywords)
936 na++;
937 else
938 nk++;
939 }
940 if (na > 255 || nk > 255) {
941 err_setstr(SyntaxError, "more than 255 arguments");
942 c->c_errors++;
943 }
944 com_addoparg(c, CALL_FUNCTION, na | (nk << 8));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000945 }
946}
947
948static void
949com_select_member(c, n)
950 struct compiling *c;
951 node *n;
952{
953 com_addopname(c, LOAD_ATTR, n);
954}
955
956static void
Guido van Rossum8861b741996-07-30 16:49:37 +0000957com_sliceobj(c, n)
958 struct compiling *c;
959 node *n;
960{
961 int i=0;
962 int ns=2; /* number of slice arguments */
963 int first_missing=0;
964 node *ch;
965
966 /* first argument */
967 if (TYPE(CHILD(n,i)) == COLON) {
968 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
969 i++;
970 }
971 else {
972 com_node(c, CHILD(n,i));
973 i++;
974 REQ(CHILD(n,i),COLON);
975 i++;
976 }
977 /* second argument */
978 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
979 com_node(c, CHILD(n,i));
980 i++;
981 }
982 else com_addoparg(c, LOAD_CONST, com_addconst(c, None));
983 /* remaining arguments */
984 for (; i < NCH(n); i++) {
985 ns++;
986 ch=CHILD(n,i);
987 REQ(ch, sliceop);
988 if (NCH(ch) == 1) {
989 /* right argument of ':' missing */
990 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
991 }
992 else
993 com_node(c, CHILD(ch,1));
994 }
995 com_addoparg(c, BUILD_SLICE, ns);
996}
997
998static void
999com_subscript(c, n)
1000 struct compiling *c;
1001 node *n;
1002{
1003 node *ch;
1004 REQ(n, subscript);
1005 ch = CHILD(n,0);
1006 /* check for rubber index */
1007 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT)
1008 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipses));
1009 else {
1010 /* check for slice */
1011 if ((TYPE(ch) == COLON || NCH(n) > 1))
1012 com_sliceobj(c, n);
1013 else {
1014 REQ(ch, test);
1015 com_node(c, ch);
1016 }
1017 }
1018}
1019
1020static void
1021com_subscriptlist(c, n, assigning)
1022 struct compiling *c;
1023 node *n;
1024 int assigning;
1025{
1026 int i, op;
1027 REQ(n, subscriptlist);
1028 /* Check to make backward compatible slice behavior for '[i:j]' */
1029 if (NCH(n) == 1) {
1030 node *sub = CHILD(n, 0); /* subscript */
1031 /* Make it is a simple slice.
1032 should have exactly one colon. */
1033 if ((TYPE(CHILD(sub, 0)) == COLON
1034 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1035 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop)) {
1036 if (assigning == OP_APPLY)
1037 op = SLICE;
1038 else
1039 op = ((assigning == OP_ASSIGN) ? STORE_SLICE : DELETE_SLICE);
1040 com_slice(c, sub, op);
1041 return;
1042 }
1043 }
1044 /* Else normal subscriptlist. Compile each subscript. */
1045 for (i = 0; i < NCH(n); i += 2)
1046 com_subscript(c, CHILD(n, i));
1047 /* Put multiple subscripts into a tuple */
1048 if (NCH(n) > 1)
1049 com_addoparg(c, BUILD_TUPLE, (NCH(n)+1) / 2);
1050 if (assigning == OP_APPLY)
1051 op = BINARY_SUBSCR;
1052 else
1053 op = ((assigning == OP_ASSIGN) ? STORE_SUBSCR : DELETE_SUBSCR);
1054 com_addbyte(c, op);
1055}
1056
1057static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001058com_apply_trailer(c, n)
1059 struct compiling *c;
1060 node *n;
1061{
1062 REQ(n, trailer);
1063 switch (TYPE(CHILD(n, 0))) {
1064 case LPAR:
1065 com_call_function(c, CHILD(n, 1));
1066 break;
1067 case DOT:
1068 com_select_member(c, CHILD(n, 1));
1069 break;
1070 case LSQB:
Guido van Rossum8861b741996-07-30 16:49:37 +00001071 com_subscriptlist(c, CHILD(n, 1), OP_APPLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001072 break;
1073 default:
1074 err_setstr(SystemError,
1075 "com_apply_trailer: unknown trailer type");
1076 c->c_errors++;
1077 }
1078}
1079
1080static void
Guido van Rossum50564e81996-01-12 01:13:16 +00001081com_power(c, n)
1082 struct compiling *c;
1083 node *n;
1084{
1085 int i;
1086 REQ(n, power);
1087 com_atom(c, CHILD(n, 0));
1088 for (i = 1; i < NCH(n); i++) {
1089 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1090 com_factor(c, CHILD(n, i+1));
1091 com_addbyte(c, BINARY_POWER);
1092 break;
1093 }
1094 else
1095 com_apply_trailer(c, CHILD(n, i));
1096 }
1097}
1098
1099static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001100com_factor(c, n)
1101 struct compiling *c;
1102 node *n;
1103{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001104 REQ(n, factor);
1105 if (TYPE(CHILD(n, 0)) == PLUS) {
1106 com_factor(c, CHILD(n, 1));
1107 com_addbyte(c, UNARY_POSITIVE);
1108 }
1109 else if (TYPE(CHILD(n, 0)) == MINUS) {
1110 com_factor(c, CHILD(n, 1));
1111 com_addbyte(c, UNARY_NEGATIVE);
1112 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001113 else if (TYPE(CHILD(n, 0)) == TILDE) {
1114 com_factor(c, CHILD(n, 1));
1115 com_addbyte(c, UNARY_INVERT);
1116 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001117 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001118 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001119 }
1120}
1121
1122static void
1123com_term(c, n)
1124 struct compiling *c;
1125 node *n;
1126{
1127 int i;
1128 int op;
1129 REQ(n, term);
1130 com_factor(c, CHILD(n, 0));
1131 for (i = 2; i < NCH(n); i += 2) {
1132 com_factor(c, CHILD(n, i));
1133 switch (TYPE(CHILD(n, i-1))) {
1134 case STAR:
1135 op = BINARY_MULTIPLY;
1136 break;
1137 case SLASH:
1138 op = BINARY_DIVIDE;
1139 break;
1140 case PERCENT:
1141 op = BINARY_MODULO;
1142 break;
1143 default:
1144 err_setstr(SystemError,
Guido van Rossum7928cd71991-10-24 14:59:31 +00001145 "com_term: operator not *, / or %");
1146 c->c_errors++;
1147 op = 255;
1148 }
1149 com_addbyte(c, op);
1150 }
1151}
1152
1153static void
1154com_arith_expr(c, n)
1155 struct compiling *c;
1156 node *n;
1157{
1158 int i;
1159 int op;
1160 REQ(n, arith_expr);
1161 com_term(c, CHILD(n, 0));
1162 for (i = 2; i < NCH(n); i += 2) {
1163 com_term(c, CHILD(n, i));
1164 switch (TYPE(CHILD(n, i-1))) {
1165 case PLUS:
1166 op = BINARY_ADD;
1167 break;
1168 case MINUS:
1169 op = BINARY_SUBTRACT;
1170 break;
1171 default:
1172 err_setstr(SystemError,
1173 "com_arith_expr: operator not + or -");
1174 c->c_errors++;
1175 op = 255;
1176 }
1177 com_addbyte(c, op);
1178 }
1179}
1180
1181static void
1182com_shift_expr(c, n)
1183 struct compiling *c;
1184 node *n;
1185{
1186 int i;
1187 int op;
1188 REQ(n, shift_expr);
1189 com_arith_expr(c, CHILD(n, 0));
1190 for (i = 2; i < NCH(n); i += 2) {
1191 com_arith_expr(c, CHILD(n, i));
1192 switch (TYPE(CHILD(n, i-1))) {
1193 case LEFTSHIFT:
1194 op = BINARY_LSHIFT;
1195 break;
1196 case RIGHTSHIFT:
1197 op = BINARY_RSHIFT;
1198 break;
1199 default:
1200 err_setstr(SystemError,
1201 "com_shift_expr: operator not << or >>");
1202 c->c_errors++;
1203 op = 255;
1204 }
1205 com_addbyte(c, op);
1206 }
1207}
1208
1209static void
1210com_and_expr(c, n)
1211 struct compiling *c;
1212 node *n;
1213{
1214 int i;
1215 int op;
1216 REQ(n, and_expr);
1217 com_shift_expr(c, CHILD(n, 0));
1218 for (i = 2; i < NCH(n); i += 2) {
1219 com_shift_expr(c, CHILD(n, i));
1220 if (TYPE(CHILD(n, i-1)) == AMPER) {
1221 op = BINARY_AND;
1222 }
1223 else {
1224 err_setstr(SystemError,
1225 "com_and_expr: operator not &");
1226 c->c_errors++;
1227 op = 255;
1228 }
1229 com_addbyte(c, op);
1230 }
1231}
1232
1233static void
1234com_xor_expr(c, n)
1235 struct compiling *c;
1236 node *n;
1237{
1238 int i;
1239 int op;
1240 REQ(n, xor_expr);
1241 com_and_expr(c, CHILD(n, 0));
1242 for (i = 2; i < NCH(n); i += 2) {
1243 com_and_expr(c, CHILD(n, i));
1244 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1245 op = BINARY_XOR;
1246 }
1247 else {
1248 err_setstr(SystemError,
1249 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001250 c->c_errors++;
1251 op = 255;
1252 }
1253 com_addbyte(c, op);
1254 }
1255}
1256
1257static void
1258com_expr(c, n)
1259 struct compiling *c;
1260 node *n;
1261{
1262 int i;
1263 int op;
1264 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001265 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001266 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001267 com_xor_expr(c, CHILD(n, i));
1268 if (TYPE(CHILD(n, i-1)) == VBAR) {
1269 op = BINARY_OR;
1270 }
1271 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001272 err_setstr(SystemError,
Guido van Rossum7928cd71991-10-24 14:59:31 +00001273 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001274 c->c_errors++;
1275 op = 255;
1276 }
1277 com_addbyte(c, op);
1278 }
1279}
1280
1281static enum cmp_op
1282cmp_type(n)
1283 node *n;
1284{
1285 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001286 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001287 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1288 if (NCH(n) == 1) {
1289 n = CHILD(n, 0);
1290 switch (TYPE(n)) {
1291 case LESS: return LT;
1292 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001293 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001294 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001295 case LESSEQUAL: return LE;
1296 case GREATEREQUAL: return GE;
1297 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001298 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1299 if (strcmp(STR(n), "is") == 0) return IS;
1300 }
1301 }
1302 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001303 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001304 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1305 return NOT_IN;
1306 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1307 return IS_NOT;
1308 }
1309 }
1310 return BAD;
1311}
1312
1313static void
1314com_comparison(c, n)
1315 struct compiling *c;
1316 node *n;
1317{
1318 int i;
1319 enum cmp_op op;
1320 int anchor;
1321 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
1322 com_expr(c, CHILD(n, 0));
1323 if (NCH(n) == 1)
1324 return;
1325
1326 /****************************************************************
1327 The following code is generated for all but the last
1328 comparison in a chain:
1329
1330 label: on stack: opcode: jump to:
1331
1332 a <code to load b>
1333 a, b DUP_TOP
1334 a, b, b ROT_THREE
1335 b, a, b COMPARE_OP
1336 b, 0-or-1 JUMP_IF_FALSE L1
1337 b, 1 POP_TOP
1338 b
1339
1340 We are now ready to repeat this sequence for the next
1341 comparison in the chain.
1342
1343 For the last we generate:
1344
1345 b <code to load c>
1346 b, c COMPARE_OP
1347 0-or-1
1348
1349 If there were any jumps to L1 (i.e., there was more than one
1350 comparison), we generate:
1351
1352 0-or-1 JUMP_FORWARD L2
1353 L1: b, 0 ROT_TWO
1354 0, b POP_TOP
1355 0
1356 L2:
1357 ****************************************************************/
1358
1359 anchor = 0;
1360
1361 for (i = 2; i < NCH(n); i += 2) {
1362 com_expr(c, CHILD(n, i));
1363 if (i+2 < NCH(n)) {
1364 com_addbyte(c, DUP_TOP);
1365 com_addbyte(c, ROT_THREE);
1366 }
1367 op = cmp_type(CHILD(n, i-1));
1368 if (op == BAD) {
1369 err_setstr(SystemError,
1370 "com_comparison: unknown comparison op");
1371 c->c_errors++;
1372 }
1373 com_addoparg(c, COMPARE_OP, op);
1374 if (i+2 < NCH(n)) {
1375 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1376 com_addbyte(c, POP_TOP);
1377 }
1378 }
1379
1380 if (anchor) {
1381 int anchor2 = 0;
1382 com_addfwref(c, JUMP_FORWARD, &anchor2);
1383 com_backpatch(c, anchor);
1384 com_addbyte(c, ROT_TWO);
1385 com_addbyte(c, POP_TOP);
1386 com_backpatch(c, anchor2);
1387 }
1388}
1389
1390static void
1391com_not_test(c, n)
1392 struct compiling *c;
1393 node *n;
1394{
1395 REQ(n, not_test); /* 'not' not_test | comparison */
1396 if (NCH(n) == 1) {
1397 com_comparison(c, CHILD(n, 0));
1398 }
1399 else {
1400 com_not_test(c, CHILD(n, 1));
1401 com_addbyte(c, UNARY_NOT);
1402 }
1403}
1404
1405static void
1406com_and_test(c, n)
1407 struct compiling *c;
1408 node *n;
1409{
1410 int i;
1411 int anchor;
1412 REQ(n, and_test); /* not_test ('and' not_test)* */
1413 anchor = 0;
1414 i = 0;
1415 for (;;) {
1416 com_not_test(c, CHILD(n, i));
1417 if ((i += 2) >= NCH(n))
1418 break;
1419 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1420 com_addbyte(c, POP_TOP);
1421 }
1422 if (anchor)
1423 com_backpatch(c, anchor);
1424}
1425
1426static void
1427com_test(c, n)
1428 struct compiling *c;
1429 node *n;
1430{
Guido van Rossum57531fe1993-11-30 14:57:42 +00001431 REQ(n, test); /* and_test ('and' and_test)* | lambdef */
1432 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
1433 object *v;
1434 int i;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001435 int ndefs = com_argdefs(c, CHILD(n, 0));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001436 v = (object *) icompile(CHILD(n, 0), c);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001437 if (v == NULL) {
1438 c->c_errors++;
1439 i = 255;
1440 }
1441 else {
1442 i = com_addconst(c, v);
1443 DECREF(v);
1444 }
1445 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001446 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001447 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00001448 else {
1449 int anchor = 0;
1450 int i = 0;
1451 for (;;) {
1452 com_and_test(c, CHILD(n, i));
1453 if ((i += 2) >= NCH(n))
1454 break;
1455 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1456 com_addbyte(c, POP_TOP);
1457 }
1458 if (anchor)
1459 com_backpatch(c, anchor);
1460 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001461}
1462
1463static void
Guido van Rossum288a60f1991-12-16 13:05:10 +00001464com_list(c, n, toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001465 struct compiling *c;
1466 node *n;
Guido van Rossum288a60f1991-12-16 13:05:10 +00001467 int toplevel; /* If nonzero, *always* build a tuple */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001468{
1469 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001470 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001471 com_node(c, CHILD(n, 0));
1472 }
1473 else {
1474 int i;
1475 int len;
1476 len = (NCH(n) + 1) / 2;
1477 for (i = 0; i < NCH(n); i += 2)
1478 com_node(c, CHILD(n, i));
1479 com_addoparg(c, BUILD_TUPLE, len);
1480 }
1481}
1482
1483
1484/* Begin of assignment compilation */
1485
1486static void com_assign_name PROTO((struct compiling *, node *, int));
1487static void com_assign PROTO((struct compiling *, node *, int));
1488
1489static void
1490com_assign_attr(c, n, assigning)
1491 struct compiling *c;
1492 node *n;
1493 int assigning;
1494{
1495 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
1496}
1497
1498static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001499com_assign_trailer(c, n, assigning)
1500 struct compiling *c;
1501 node *n;
1502 int assigning;
1503{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001504 REQ(n, trailer);
1505 switch (TYPE(CHILD(n, 0))) {
1506 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001507 err_setstr(SyntaxError, "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001508 c->c_errors++;
1509 break;
1510 case DOT: /* '.' NAME */
1511 com_assign_attr(c, CHILD(n, 1), assigning);
1512 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001513 case LSQB: /* '[' subscriptlist ']' */
1514 com_subscriptlist(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001515 break;
1516 default:
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001517 err_setstr(SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001518 c->c_errors++;
1519 }
1520}
1521
1522static void
1523com_assign_tuple(c, n, assigning)
1524 struct compiling *c;
1525 node *n;
1526 int assigning;
1527{
1528 int i;
1529 if (TYPE(n) != testlist)
1530 REQ(n, exprlist);
1531 if (assigning)
1532 com_addoparg(c, UNPACK_TUPLE, (NCH(n)+1)/2);
1533 for (i = 0; i < NCH(n); i += 2)
1534 com_assign(c, CHILD(n, i), assigning);
1535}
1536
1537static void
1538com_assign_list(c, n, assigning)
1539 struct compiling *c;
1540 node *n;
1541 int assigning;
1542{
1543 int i;
1544 if (assigning)
1545 com_addoparg(c, UNPACK_LIST, (NCH(n)+1)/2);
1546 for (i = 0; i < NCH(n); i += 2)
1547 com_assign(c, CHILD(n, i), assigning);
1548}
1549
1550static void
1551com_assign_name(c, n, assigning)
1552 struct compiling *c;
1553 node *n;
1554 int assigning;
1555{
1556 REQ(n, NAME);
1557 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
1558}
1559
1560static void
1561com_assign(c, n, assigning)
1562 struct compiling *c;
1563 node *n;
1564 int assigning;
1565{
1566 /* Loop to avoid trivial recursion */
1567 for (;;) {
1568 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001569
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001570 case exprlist:
1571 case testlist:
1572 if (NCH(n) > 1) {
1573 com_assign_tuple(c, n, assigning);
1574 return;
1575 }
1576 n = CHILD(n, 0);
1577 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001578
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001579 case test:
1580 case and_test:
1581 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001582 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001583 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001584 case xor_expr:
1585 case and_expr:
1586 case shift_expr:
1587 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001588 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00001589 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001590 if (NCH(n) > 1) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001591 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001592 "can't assign to operator");
1593 c->c_errors++;
1594 return;
1595 }
1596 n = CHILD(n, 0);
1597 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001598
Guido van Rossum50564e81996-01-12 01:13:16 +00001599 case power: /* atom trailer* ('**' power)* */
1600/* ('+'|'-'|'~') factor | atom trailer* */
1601 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001602 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001603 "can't assign to operator");
1604 c->c_errors++;
1605 return;
1606 }
Guido van Rossum50564e81996-01-12 01:13:16 +00001607 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001608 int i;
1609 com_node(c, CHILD(n, 0));
1610 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00001611 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1612 err_setstr(SyntaxError,
1613 "can't assign to operator");
1614 c->c_errors++;
1615 return;
1616 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001617 com_apply_trailer(c, CHILD(n, i));
1618 } /* NB i is still alive */
1619 com_assign_trailer(c,
1620 CHILD(n, i), assigning);
1621 return;
1622 }
1623 n = CHILD(n, 0);
1624 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001625
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001626 case atom:
1627 switch (TYPE(CHILD(n, 0))) {
1628 case LPAR:
1629 n = CHILD(n, 1);
1630 if (TYPE(n) == RPAR) {
1631 /* XXX Should allow () = () ??? */
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001632 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001633 "can't assign to ()");
1634 c->c_errors++;
1635 return;
1636 }
1637 break;
1638 case LSQB:
1639 n = CHILD(n, 1);
1640 if (TYPE(n) == RSQB) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001641 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001642 "can't assign to []");
1643 c->c_errors++;
1644 return;
1645 }
1646 com_assign_list(c, n, assigning);
1647 return;
1648 case NAME:
1649 com_assign_name(c, CHILD(n, 0), assigning);
1650 return;
1651 default:
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001652 err_setstr(SyntaxError,
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001653 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001654 c->c_errors++;
1655 return;
1656 }
1657 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001658
1659 case lambdef:
1660 err_setstr(SyntaxError, "can't assign to lambda");
1661 c->c_errors++;
1662 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001663
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001664 default:
1665 fprintf(stderr, "node type %d\n", TYPE(n));
1666 err_setstr(SystemError, "com_assign: bad node");
1667 c->c_errors++;
1668 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001669
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001670 }
1671 }
1672}
1673
1674static void
1675com_expr_stmt(c, n)
1676 struct compiling *c;
1677 node *n;
1678{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001679 REQ(n, expr_stmt); /* testlist ('=' testlist)* */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001680 com_node(c, CHILD(n, NCH(n)-1));
1681 if (NCH(n) == 1) {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001682 if (c->c_interactive)
1683 com_addbyte(c, PRINT_EXPR);
1684 else
1685 com_addbyte(c, POP_TOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001686 }
1687 else {
1688 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001689 for (i = 0; i < NCH(n)-2; i+=2) {
1690 if (i+2 < NCH(n)-2)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001691 com_addbyte(c, DUP_TOP);
Guido van Rossum8861b741996-07-30 16:49:37 +00001692 com_assign(c, CHILD(n, i), OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001693 }
1694 }
1695}
1696
1697static void
1698com_print_stmt(c, n)
1699 struct compiling *c;
1700 node *n;
1701{
1702 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001703 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
1704 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001705 com_node(c, CHILD(n, i));
1706 com_addbyte(c, PRINT_ITEM);
1707 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001708 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001709 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001710 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001711}
1712
1713static void
1714com_return_stmt(c, n)
1715 struct compiling *c;
1716 node *n;
1717{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001718 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001719 if (!c->c_infunction) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001720 err_setstr(SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001721 c->c_errors++;
1722 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001723 if (NCH(n) < 2)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001724 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1725 else
1726 com_node(c, CHILD(n, 1));
1727 com_addbyte(c, RETURN_VALUE);
1728}
1729
1730static void
1731com_raise_stmt(c, n)
1732 struct compiling *c;
1733 node *n;
1734{
Guido van Rossumf10570b1995-07-07 22:53:21 +00001735 REQ(n, raise_stmt); /* 'raise' test [',' test [',' test]] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001736 com_node(c, CHILD(n, 1));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001737 if (NCH(n) > 3) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001738 com_node(c, CHILD(n, 3));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001739 if (NCH(n) > 5)
1740 com_node(c, CHILD(n, 5));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001741 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001742 com_addoparg(c, RAISE_VARARGS, NCH(n)/2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001743}
1744
1745static void
1746com_import_stmt(c, n)
1747 struct compiling *c;
1748 node *n;
1749{
1750 int i;
1751 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001752 /* 'import' dotted_name (',' dotted_name)* |
1753 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001754 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001755 /* 'from' dotted_name 'import' ... */
1756 REQ(CHILD(n, 1), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001757 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
1758 for (i = 3; i < NCH(n); i += 2)
1759 com_addopname(c, IMPORT_FROM, CHILD(n, i));
1760 com_addbyte(c, POP_TOP);
1761 }
1762 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001763 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001764 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001765 REQ(CHILD(n, i), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001766 com_addopname(c, IMPORT_NAME, CHILD(n, i));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001767 com_addopname(c, STORE_NAME, CHILD(CHILD(n, i), 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001768 }
1769 }
1770}
1771
1772static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00001773com_global_stmt(c, n)
1774 struct compiling *c;
1775 node *n;
1776{
1777 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001778 REQ(n, global_stmt);
1779 /* 'global' NAME (',' NAME)* */
1780 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001781 char *s = STR(CHILD(n, i));
Guido van Rossumfe2236f1996-08-24 07:29:04 +00001782#ifdef PRIVATE_NAME_MANGLING
1783 char buffer[256];
1784 if (s != NULL && s[0] == '_' && s[1] == '_' &&
1785 c->c_private != NULL &&
1786 com_mangle(c, s, buffer, (int)sizeof(buffer)))
1787 s = buffer;
1788#endif
Guido van Rossum681d79a1995-07-18 14:51:37 +00001789 if (dictlookup(c->c_locals, s) != NULL) {
1790 err_setstr(SyntaxError, "name is local and global");
1791 c->c_errors++;
1792 }
1793 else if (dictinsert(c->c_globals, s, None) != 0)
Guido van Rossumc5e96291991-12-10 13:53:51 +00001794 c->c_errors++;
1795 }
1796}
1797
Guido van Rossum681d79a1995-07-18 14:51:37 +00001798static int
1799com_newlocal_o(c, nameval)
1800 struct compiling *c;
1801 object *nameval;
1802{
1803 int i;
1804 object *ival;
1805 if (getlistsize(c->c_varnames) != c->c_nlocals) {
1806 /* This is usually caused by an error on a previous call */
1807 if (c->c_errors == 0) {
1808 err_setstr(SystemError, "mixed up var name/index");
1809 c->c_errors++;
1810 }
1811 return 0;
1812 }
1813 ival = newintobject(i = c->c_nlocals++);
1814 if (ival == NULL)
1815 c->c_errors++;
1816 else if (mappinginsert(c->c_locals, nameval, ival) != 0)
1817 c->c_errors++;
1818 else if (addlistitem(c->c_varnames, nameval) != 0)
1819 c->c_errors++;
1820 XDECREF(ival);
1821 return i;
1822}
1823
1824static int
1825com_addlocal_o(c, nameval)
1826 struct compiling *c;
1827 object *nameval;
1828{
1829 object *ival = mappinglookup(c->c_locals, nameval);
1830 if (ival != NULL)
1831 return getintvalue(ival);
1832 return com_newlocal_o(c, nameval);
1833}
1834
1835static int
1836com_newlocal(c, name)
1837 struct compiling *c;
1838 char *name;
1839{
1840 object *nameval = newstringobject(name);
1841 int i;
1842 if (nameval == NULL) {
1843 c->c_errors++;
1844 return 0;
1845 }
1846 i = com_newlocal_o(c, nameval);
1847 DECREF(nameval);
1848 return i;
1849}
1850
Guido van Rossum25831651993-05-19 14:50:45 +00001851#define strequ(a, b) (strcmp((a), (b)) == 0)
1852
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001853#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum25831651993-05-19 14:50:45 +00001854static void
1855com_access_stmt(c, n)
1856 struct compiling *c;
1857 node *n;
1858{
1859 int i, j, k, mode, imode;
1860 object *vmode;
1861 REQ(n, access_stmt);
1862 /* 'access' NAME (',' NAME)* ':' accesstype (',' accesstype)*
1863 accesstype: NAME+ */
1864
1865 /* Find where the colon is */
1866 i = 1;
1867 while (TYPE(CHILD(n,i-1)) != COLON)
1868 i += 1;
1869
1870 /* Calculate the mode mask */
1871 mode = 0;
1872 for (j = i; j < NCH(n); j += 2) {
Guido van Rossum81daa321993-05-20 14:24:46 +00001873 int r = 0, w = 0, p = 0;
1874 for (k = 0; k < NCH(CHILD(n,j)); k++) {
Guido van Rossum25831651993-05-19 14:50:45 +00001875 if (strequ(STR(CHILD(CHILD(n,j),k)), "public"))
1876 p = 0;
1877 else if (strequ(STR(CHILD(CHILD(n,j),k)), "protected"))
1878 p = 1;
1879 else if (strequ(STR(CHILD(CHILD(n,j),k)), "private"))
1880 p = 2;
1881 else if (strequ(STR(CHILD(CHILD(n,j),k)), "read"))
1882 r = 1;
1883 else if (strequ(STR(CHILD(CHILD(n,j),k)), "write"))
1884 w = 1;
1885 else /* XXX should make this an exception */
1886 fprintf(stderr, "bad access type %s\n",
1887 STR(CHILD(CHILD(n,j),k)));
1888 }
1889 if (r == 0 && w == 0)
Guido van Rossum81daa321993-05-20 14:24:46 +00001890 r = w = 1;
Guido van Rossum25831651993-05-19 14:50:45 +00001891 if (p == 0) {
1892 if (r == 1) mode |= AC_R_PUBLIC;
1893 if (w == 1) mode |= AC_W_PUBLIC;
1894 } else if (p == 1) {
1895 if (r == 1) mode |= AC_R_PROTECTED;
1896 if (w == 1) mode |= AC_W_PROTECTED;
1897 } else {
1898 if (r == 1) mode |= AC_R_PRIVATE;
1899 if (w == 1) mode |= AC_W_PRIVATE;
1900 }
1901 }
1902 vmode = newintobject((long)mode);
1903 imode = com_addconst(c, vmode);
1904 XDECREF(vmode);
1905 for (i = 1; TYPE(CHILD(n,i-1)) != COLON; i+=2) {
1906 com_addoparg(c, LOAD_CONST, imode);
1907 com_addopname(c, ACCESS_MODE, CHILD(n, i));
1908 }
1909}
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001910#endif
Guido van Rossum25831651993-05-19 14:50:45 +00001911
Guido van Rossumc5e96291991-12-10 13:53:51 +00001912static void
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001913com_exec_stmt(c, n)
1914 struct compiling *c;
1915 node *n;
1916{
1917 REQ(n, exec_stmt);
1918 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
1919 com_node(c, CHILD(n, 1));
1920 if (NCH(n) >= 4)
1921 com_node(c, CHILD(n, 3));
1922 else
1923 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1924 if (NCH(n) >= 6)
1925 com_node(c, CHILD(n, 5));
1926 else
1927 com_addbyte(c, DUP_TOP);
1928 com_addbyte(c, EXEC_STMT);
1929}
1930
1931static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001932com_if_stmt(c, n)
1933 struct compiling *c;
1934 node *n;
1935{
1936 int i;
1937 int anchor = 0;
1938 REQ(n, if_stmt);
1939 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
1940 for (i = 0; i+3 < NCH(n); i+=4) {
1941 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001942 node *ch = CHILD(n, i+1);
1943 if (i > 0)
1944 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001945 com_node(c, CHILD(n, i+1));
1946 com_addfwref(c, JUMP_IF_FALSE, &a);
1947 com_addbyte(c, POP_TOP);
1948 com_node(c, CHILD(n, i+3));
1949 com_addfwref(c, JUMP_FORWARD, &anchor);
1950 com_backpatch(c, a);
1951 com_addbyte(c, POP_TOP);
1952 }
1953 if (i+2 < NCH(n))
1954 com_node(c, CHILD(n, i+2));
1955 com_backpatch(c, anchor);
1956}
1957
1958static void
1959com_while_stmt(c, n)
1960 struct compiling *c;
1961 node *n;
1962{
1963 int break_anchor = 0;
1964 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001965 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001966 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
1967 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001968 block_push(c, SETUP_LOOP);
1969 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001970 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001971 com_node(c, CHILD(n, 1));
1972 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1973 com_addbyte(c, POP_TOP);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001974 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001975 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001976 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001977 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1978 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001979 com_backpatch(c, anchor);
1980 com_addbyte(c, POP_TOP);
1981 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001982 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001983 if (NCH(n) > 4)
1984 com_node(c, CHILD(n, 6));
1985 com_backpatch(c, break_anchor);
1986}
1987
1988static void
1989com_for_stmt(c, n)
1990 struct compiling *c;
1991 node *n;
1992{
1993 object *v;
1994 int break_anchor = 0;
1995 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001996 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001997 REQ(n, for_stmt);
1998 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
1999 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002000 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002001 com_node(c, CHILD(n, 3));
2002 v = newintobject(0L);
2003 if (v == NULL)
2004 c->c_errors++;
2005 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
2006 XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002007 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002008 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002009 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8861b741996-07-30 16:49:37 +00002010 com_assign(c, CHILD(n, 1), OP_ASSIGN);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002011 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002012 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002013 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002014 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2015 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002016 com_backpatch(c, anchor);
2017 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002018 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002019 if (NCH(n) > 8)
2020 com_node(c, CHILD(n, 8));
2021 com_backpatch(c, break_anchor);
2022}
2023
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002024/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002025
2026 SETUP_FINALLY L
2027 <code for S>
2028 POP_BLOCK
2029 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002030 L: <code for Sf>
2031 END_FINALLY
2032
2033 The special instructions use the block stack. Each block
2034 stack entry contains the instruction that created it (here
2035 SETUP_FINALLY), the level of the value stack at the time the
2036 block stack entry was created, and a label (here L).
2037
2038 SETUP_FINALLY:
2039 Pushes the current value stack level and the label
2040 onto the block stack.
2041 POP_BLOCK:
2042 Pops en entry from the block stack, and pops the value
2043 stack until its level is the same as indicated on the
2044 block stack. (The label is ignored.)
2045 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002046 Pops a variable number of entries from the *value* stack
2047 and re-raises the exception they specify. The number of
2048 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002049
2050 The block stack is unwound when an exception is raised:
2051 when a SETUP_FINALLY entry is found, the exception is pushed
2052 onto the value stack (and the exception condition is cleared),
2053 and the interpreter jumps to the label gotten from the block
2054 stack.
2055
2056 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002057 (The contents of the value stack is shown in [], with the top
2058 at the right; 'tb' is trace-back info, 'val' the exception's
2059 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002060
2061 Value stack Label Instruction Argument
2062 [] SETUP_EXCEPT L1
2063 [] <code for S>
2064 [] POP_BLOCK
2065 [] JUMP_FORWARD L0
2066
Guido van Rossum3f5da241990-12-20 15:06:42 +00002067 [tb, val, exc] L1: DUP )
2068 [tb, val, exc, exc] <evaluate E1> )
2069 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2070 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2071 [tb, val, exc, 1] POP )
2072 [tb, val, exc] POP
2073 [tb, val] <assign to V1> (or POP if no V1)
2074 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002075 [] <code for S1>
2076 JUMP_FORWARD L0
2077
Guido van Rossum3f5da241990-12-20 15:06:42 +00002078 [tb, val, exc, 0] L2: POP
2079 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002080 .............................etc.......................
2081
Guido van Rossum3f5da241990-12-20 15:06:42 +00002082 [tb, val, exc, 0] Ln+1: POP
2083 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002084
2085 [] L0: <next statement>
2086
2087 Of course, parts are not generated if Vi or Ei is not present.
2088*/
2089
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002090static void
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002091com_try_except(c, n)
2092 struct compiling *c;
2093 node *n;
2094{
2095 int except_anchor = 0;
2096 int end_anchor = 0;
2097 int else_anchor = 0;
2098 int i;
2099 node *ch;
2100
2101 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2102 block_push(c, SETUP_EXCEPT);
2103 com_node(c, CHILD(n, 2));
2104 com_addbyte(c, POP_BLOCK);
2105 block_pop(c, SETUP_EXCEPT);
2106 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2107 com_backpatch(c, except_anchor);
2108 for (i = 3;
2109 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2110 i += 3) {
2111 /* except_clause: 'except' [expr [',' expr]] */
2112 if (except_anchor == 0) {
2113 err_setstr(SyntaxError,
2114 "default 'except:' must be last");
2115 c->c_errors++;
2116 break;
2117 }
2118 except_anchor = 0;
2119 com_addoparg(c, SET_LINENO, ch->n_lineno);
2120 if (NCH(ch) > 1) {
2121 com_addbyte(c, DUP_TOP);
2122 com_node(c, CHILD(ch, 1));
2123 com_addoparg(c, COMPARE_OP, EXC_MATCH);
2124 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
2125 com_addbyte(c, POP_TOP);
2126 }
2127 com_addbyte(c, POP_TOP);
2128 if (NCH(ch) > 3)
Guido van Rossum8861b741996-07-30 16:49:37 +00002129 com_assign(c, CHILD(ch, 3), OP_ASSIGN);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002130 else
2131 com_addbyte(c, POP_TOP);
2132 com_addbyte(c, POP_TOP);
2133 com_node(c, CHILD(n, i+2));
2134 com_addfwref(c, JUMP_FORWARD, &end_anchor);
2135 if (except_anchor) {
2136 com_backpatch(c, except_anchor);
2137 com_addbyte(c, POP_TOP);
2138 }
2139 }
2140 com_addbyte(c, END_FINALLY);
2141 com_backpatch(c, else_anchor);
2142 if (i < NCH(n))
2143 com_node(c, CHILD(n, i+2));
2144 com_backpatch(c, end_anchor);
2145}
2146
2147static void
2148com_try_finally(c, n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002149 struct compiling *c;
2150 node *n;
2151{
2152 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002153 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002154
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002155 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
2156 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002157 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002158 com_addbyte(c, POP_BLOCK);
2159 block_pop(c, SETUP_FINALLY);
2160 block_push(c, END_FINALLY);
2161 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2162 com_backpatch(c, finally_anchor);
2163 ch = CHILD(n, NCH(n)-1);
2164 com_addoparg(c, SET_LINENO, ch->n_lineno);
2165 com_node(c, ch);
2166 com_addbyte(c, END_FINALLY);
2167 block_pop(c, END_FINALLY);
2168}
2169
2170static void
2171com_try_stmt(c, n)
2172 struct compiling *c;
2173 node *n;
2174{
2175 REQ(n, try_stmt);
2176 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
2177 | 'try' ':' suite 'finally' ':' suite */
2178 if (TYPE(CHILD(n, 3)) != except_clause)
2179 com_try_finally(c, n);
2180 else
2181 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002182}
2183
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002184static object *
2185get_docstring(n)
2186 node *n;
2187{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002188 int i;
2189
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002190 switch (TYPE(n)) {
2191
2192 case suite:
2193 if (NCH(n) == 1)
2194 return get_docstring(CHILD(n, 0));
2195 else {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002196 for (i = 0; i < NCH(n); i++) {
2197 node *ch = CHILD(n, i);
2198 if (TYPE(ch) == stmt)
2199 return get_docstring(ch);
2200 }
2201 }
2202 break;
2203
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002204 case file_input:
2205 for (i = 0; i < NCH(n); i++) {
2206 node *ch = CHILD(n, i);
2207 if (TYPE(ch) == stmt)
2208 return get_docstring(ch);
2209 }
2210 break;
2211
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002212 case stmt:
2213 case simple_stmt:
2214 case small_stmt:
2215 return get_docstring(CHILD(n, 0));
2216
2217 case expr_stmt:
2218 case testlist:
2219 case test:
2220 case and_test:
2221 case not_test:
2222 case comparison:
2223 case expr:
2224 case xor_expr:
2225 case and_expr:
2226 case shift_expr:
2227 case arith_expr:
2228 case term:
2229 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00002230 case power:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002231 if (NCH(n) == 1)
2232 return get_docstring(CHILD(n, 0));
2233 break;
2234
2235 case atom:
2236 if (TYPE(CHILD(n, 0)) == STRING)
2237 return parsestrplus(n);
2238 break;
2239
2240 }
2241 return NULL;
2242}
2243
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002244static void
2245com_suite(c, n)
2246 struct compiling *c;
2247 node *n;
2248{
2249 REQ(n, suite);
2250 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
2251 if (NCH(n) == 1) {
2252 com_node(c, CHILD(n, 0));
2253 }
2254 else {
2255 int i;
2256 for (i = 0; i < NCH(n); i++) {
2257 node *ch = CHILD(n, i);
2258 if (TYPE(ch) == stmt)
2259 com_node(c, ch);
2260 }
2261 }
2262}
2263
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002264/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002265static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002266com_continue_stmt(c, n)
2267 struct compiling *c;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002268 node *n; /* Not used, but passed for consistency */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002269{
2270 int i = c->c_nblocks;
2271 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
2272 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2273 }
2274 else {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00002275 err_setstr(SyntaxError, "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002276 c->c_errors++;
2277 }
2278 /* XXX Could allow it inside a 'finally' clause
2279 XXX if we could pop the exception still on the stack */
2280}
2281
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002282static int
Guido van Rossum681d79a1995-07-18 14:51:37 +00002283com_argdefs(c, n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002284 struct compiling *c;
2285 node *n;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002286{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002287 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002288 if (TYPE(n) == lambdef) {
2289 /* lambdef: 'lambda' [varargslist] ':' test */
2290 n = CHILD(n, 1);
2291 }
2292 else {
2293 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
2294 n = CHILD(n, 2);
2295 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
2296 n = CHILD(n, 1);
2297 }
2298 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002299 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002300 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002301 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002302 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
2303 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002304 nargs = 0;
2305 ndefs = 0;
2306 for (i = 0; i < nch; i++) {
2307 int t;
Guido van Rossum50564e81996-01-12 01:13:16 +00002308 if (TYPE(CHILD(n, i)) == STAR || TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002309 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002310 nargs++;
2311 i++;
2312 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00002313 t = RPAR; /* Anything except EQUAL or COMMA */
2314 else
2315 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002316 if (t == EQUAL) {
2317 i++;
2318 ndefs++;
2319 com_node(c, CHILD(n, i));
2320 i++;
2321 if (i >= nch)
2322 break;
2323 t = TYPE(CHILD(n, i));
2324 }
2325 else {
2326 /* Treat "(a=1, b)" as "(a=1, b=None)" */
2327 if (ndefs) {
2328 com_addoparg(c, LOAD_CONST,
2329 com_addconst(c, None));
2330 ndefs++;
2331 }
2332 }
2333 if (t != COMMA)
2334 break;
2335 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002336 return ndefs;
2337}
2338
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002339static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002340com_funcdef(c, n)
2341 struct compiling *c;
2342 node *n;
2343{
2344 object *v;
2345 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00002346 v = (object *)icompile(n, c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002347 if (v == NULL)
2348 c->c_errors++;
2349 else {
2350 int i = com_addconst(c, v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002351 int ndefs = com_argdefs(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002352 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002353 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002354 com_addopname(c, STORE_NAME, CHILD(n, 1));
2355 DECREF(v);
2356 }
2357}
2358
2359static void
Guido van Rossum25831651993-05-19 14:50:45 +00002360com_bases(c, n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002361 struct compiling *c;
2362 node *n;
2363{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002364 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002365 REQ(n, testlist);
2366 /* testlist: test (',' test)* [','] */
2367 for (i = 0; i < NCH(n); i += 2)
2368 com_node(c, CHILD(n, i));
2369 com_addoparg(c, BUILD_TUPLE, (NCH(n)+1) / 2);
2370}
2371
2372static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002373com_classdef(c, n)
2374 struct compiling *c;
2375 node *n;
2376{
Guido van Rossum25831651993-05-19 14:50:45 +00002377 int i;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002378 object *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002379 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00002380 /* classdef: class NAME ['(' testlist ')'] ':' suite */
2381 if ((v = newstringobject(STR(CHILD(n, 1)))) == NULL) {
2382 c->c_errors++;
2383 return;
2384 }
2385 /* Push the class name on the stack */
2386 i = com_addconst(c, v);
2387 com_addoparg(c, LOAD_CONST, i);
2388 DECREF(v);
2389 /* Push the tuple of base classes on the stack */
2390 if (TYPE(CHILD(n, 2)) != LPAR)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002391 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum25831651993-05-19 14:50:45 +00002392 else
2393 com_bases(c, CHILD(n, 3));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00002394 v = (object *)icompile(n, c);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002395 if (v == NULL)
2396 c->c_errors++;
2397 else {
Guido van Rossum25831651993-05-19 14:50:45 +00002398 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002399 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002400 com_addoparg(c, MAKE_FUNCTION, 0);
2401 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002402 com_addbyte(c, BUILD_CLASS);
2403 com_addopname(c, STORE_NAME, CHILD(n, 1));
2404 DECREF(v);
2405 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002406}
2407
2408static void
2409com_node(c, n)
2410 struct compiling *c;
2411 node *n;
2412{
2413 switch (TYPE(n)) {
2414
2415 /* Definition nodes */
2416
2417 case funcdef:
2418 com_funcdef(c, n);
2419 break;
2420 case classdef:
2421 com_classdef(c, n);
2422 break;
2423
2424 /* Trivial parse tree nodes */
2425
2426 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002427 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002428 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002429 com_node(c, CHILD(n, 0));
2430 break;
2431
2432 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002433 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
2434 com_addoparg(c, SET_LINENO, n->n_lineno);
2435 {
2436 int i;
2437 for (i = 0; i < NCH(n)-1; i += 2)
2438 com_node(c, CHILD(n, i));
2439 }
2440 break;
2441
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002442 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002443 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002444 com_node(c, CHILD(n, 0));
2445 break;
2446
2447 /* Statement nodes */
2448
2449 case expr_stmt:
2450 com_expr_stmt(c, n);
2451 break;
2452 case print_stmt:
2453 com_print_stmt(c, n);
2454 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002455 case del_stmt: /* 'del' exprlist */
Guido van Rossum8861b741996-07-30 16:49:37 +00002456 com_assign(c, CHILD(n, 1), OP_DELETE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002457 break;
2458 case pass_stmt:
2459 break;
2460 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002461 if (c->c_loops == 0) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00002462 err_setstr(SyntaxError, "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002463 c->c_errors++;
2464 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002465 com_addbyte(c, BREAK_LOOP);
2466 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002467 case continue_stmt:
2468 com_continue_stmt(c, n);
2469 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002470 case return_stmt:
2471 com_return_stmt(c, n);
2472 break;
2473 case raise_stmt:
2474 com_raise_stmt(c, n);
2475 break;
2476 case import_stmt:
2477 com_import_stmt(c, n);
2478 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002479 case global_stmt:
2480 com_global_stmt(c, n);
2481 break;
Guido van Rossum0dfcf751996-08-12 22:00:53 +00002482#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum25831651993-05-19 14:50:45 +00002483 case access_stmt:
2484 com_access_stmt(c, n);
2485 break;
Guido van Rossum0dfcf751996-08-12 22:00:53 +00002486#endif
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002487 case exec_stmt:
2488 com_exec_stmt(c, n);
2489 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002490 case if_stmt:
2491 com_if_stmt(c, n);
2492 break;
2493 case while_stmt:
2494 com_while_stmt(c, n);
2495 break;
2496 case for_stmt:
2497 com_for_stmt(c, n);
2498 break;
2499 case try_stmt:
2500 com_try_stmt(c, n);
2501 break;
2502 case suite:
2503 com_suite(c, n);
2504 break;
2505
2506 /* Expression nodes */
2507
2508 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002509 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002510 break;
2511 case test:
2512 com_test(c, n);
2513 break;
2514 case and_test:
2515 com_and_test(c, n);
2516 break;
2517 case not_test:
2518 com_not_test(c, n);
2519 break;
2520 case comparison:
2521 com_comparison(c, n);
2522 break;
2523 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002524 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002525 break;
2526 case expr:
2527 com_expr(c, n);
2528 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002529 case xor_expr:
2530 com_xor_expr(c, n);
2531 break;
2532 case and_expr:
2533 com_and_expr(c, n);
2534 break;
2535 case shift_expr:
2536 com_shift_expr(c, n);
2537 break;
2538 case arith_expr:
2539 com_arith_expr(c, n);
2540 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002541 case term:
2542 com_term(c, n);
2543 break;
2544 case factor:
2545 com_factor(c, n);
2546 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00002547 case power:
2548 com_power(c, n);
2549 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002550 case atom:
2551 com_atom(c, n);
2552 break;
2553
2554 default:
2555 fprintf(stderr, "node type %d\n", TYPE(n));
2556 err_setstr(SystemError, "com_node: unexpected node type");
2557 c->c_errors++;
2558 }
2559}
2560
2561static void com_fplist PROTO((struct compiling *, node *));
2562
2563static void
2564com_fpdef(c, n)
2565 struct compiling *c;
2566 node *n;
2567{
2568 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
2569 if (TYPE(CHILD(n, 0)) == LPAR)
2570 com_fplist(c, CHILD(n, 1));
2571 else
Guido van Rossum681d79a1995-07-18 14:51:37 +00002572 com_addoparg(c, STORE_FAST, com_newlocal(c, STR(CHILD(n, 0))));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002573}
2574
2575static void
2576com_fplist(c, n)
2577 struct compiling *c;
2578 node *n;
2579{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00002580 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002581 if (NCH(n) == 1) {
2582 com_fpdef(c, CHILD(n, 0));
2583 }
2584 else {
2585 int i;
2586 com_addoparg(c, UNPACK_TUPLE, (NCH(n)+1)/2);
2587 for (i = 0; i < NCH(n); i += 2)
2588 com_fpdef(c, CHILD(n, i));
2589 }
2590}
2591
2592static void
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002593com_arglist(c, n)
2594 struct compiling *c;
2595 node *n;
2596{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002597 int nch, i;
2598 int complex = 0;
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002599 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00002600 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002601 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002602 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002603 /* Enter all arguments in table of locals */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002604 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002605 node *ch = CHILD(n, i);
2606 node *fp;
2607 char *name;
Guido van Rossum50564e81996-01-12 01:13:16 +00002608 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002609 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002610 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
2611 fp = CHILD(ch, 0);
2612 if (TYPE(fp) == NAME)
2613 name = STR(fp);
2614 else {
2615 name = "";
Guido van Rossum530956d1996-07-21 02:27:43 +00002616 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002617 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002618 com_newlocal(c, name);
2619 c->c_argcount++;
2620 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002621 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002622 ch = CHILD(n, i);
2623 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002624 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002625 else
2626 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002627 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002628 /* Handle *arguments */
2629 if (i < nch) {
2630 node *ch;
2631 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00002632 if (TYPE(ch) != DOUBLESTAR) {
2633 REQ(ch, STAR);
2634 ch = CHILD(n, i+1);
2635 if (TYPE(ch) == NAME) {
2636 c->c_flags |= CO_VARARGS;
2637 i += 3;
2638 com_newlocal(c, STR(ch));
2639 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002640 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002641 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002642 /* Handle **keywords */
2643 if (i < nch) {
2644 node *ch;
2645 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00002646 if (TYPE(ch) != DOUBLESTAR) {
2647 REQ(ch, STAR);
2648 ch = CHILD(n, i+1);
2649 REQ(ch, STAR);
2650 ch = CHILD(n, i+2);
2651 }
2652 else
2653 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002654 REQ(ch, NAME);
2655 c->c_flags |= CO_VARKEYWORDS;
2656 com_newlocal(c, STR(ch));
2657 }
2658 if (complex) {
2659 /* Generate code for complex arguments only after
2660 having counted the simple arguments */
2661 int ilocal = 0;
2662 for (i = 0; i < nch; i++) {
2663 node *ch = CHILD(n, i);
2664 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00002665 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002666 break;
2667 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
2668 fp = CHILD(ch, 0);
2669 if (TYPE(fp) != NAME) {
2670 com_addoparg(c, LOAD_FAST, ilocal);
2671 com_fpdef(c, ch);
2672 }
2673 ilocal++;
2674 if (++i >= nch)
2675 break;
2676 ch = CHILD(n, i);
2677 if (TYPE(ch) == EQUAL)
2678 i += 2;
2679 else
2680 REQ(ch, COMMA);
2681 }
2682 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002683}
2684
2685static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002686com_file_input(c, n)
2687 struct compiling *c;
2688 node *n;
2689{
2690 int i;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002691 object *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002692 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002693 doc = get_docstring(n);
2694 if (doc != NULL) {
2695 int i = com_addconst(c, doc);
2696 DECREF(doc);
2697 com_addoparg(c, LOAD_CONST, i);
2698 com_addopnamestr(c, STORE_NAME, "__doc__");
2699 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002700 for (i = 0; i < NCH(n); i++) {
2701 node *ch = CHILD(n, i);
2702 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
2703 com_node(c, ch);
2704 }
2705}
2706
2707/* Top-level compile-node interface */
2708
2709static void
2710compile_funcdef(c, n)
2711 struct compiling *c;
2712 node *n;
2713{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002714 object *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002715 node *ch;
2716 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00002717 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002718 doc = get_docstring(CHILD(n, 4));
2719 if (doc != NULL) {
2720 (void) com_addconst(c, doc);
2721 DECREF(doc);
2722 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002723 else
2724 (void) com_addconst(c, None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002725 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
2726 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00002727 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002728 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002729 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002730 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002731 c->c_infunction = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002732 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2733 com_addbyte(c, RETURN_VALUE);
2734}
2735
2736static void
Guido van Rossum590baa41993-11-30 13:40:46 +00002737compile_lambdef(c, n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002738 struct compiling *c;
2739 node *n;
2740{
Guido van Rossum590baa41993-11-30 13:40:46 +00002741 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002742 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00002743 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00002744
2745 ch = CHILD(n, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002746 (void) com_addconst(c, None); /* No docstring */
2747 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00002748 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002749 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00002750 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002751 else
2752 ch = CHILD(n, 2);
2753 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002754 com_addbyte(c, RETURN_VALUE);
2755}
2756
2757static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002758compile_classdef(c, n)
2759 struct compiling *c;
2760 node *n;
2761{
2762 node *ch;
2763 object *doc;
2764 REQ(n, classdef);
2765 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
2766 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00002767#ifdef PRIVATE_NAME_MANGLING
2768 c->c_private = c->c_name;
2769#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002770 ch = CHILD(n, NCH(n)-1); /* The suite */
2771 doc = get_docstring(ch);
2772 if (doc != NULL) {
2773 int i = com_addconst(c, doc);
2774 DECREF(doc);
2775 com_addoparg(c, LOAD_CONST, i);
2776 com_addopnamestr(c, STORE_NAME, "__doc__");
2777 }
2778 else
2779 (void) com_addconst(c, None);
2780 com_node(c, ch);
2781 com_addbyte(c, LOAD_LOCALS);
2782 com_addbyte(c, RETURN_VALUE);
2783}
2784
2785static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002786compile_node(c, n)
2787 struct compiling *c;
2788 node *n;
2789{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002790 com_addoparg(c, SET_LINENO, n->n_lineno);
2791
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002792 switch (TYPE(n)) {
2793
Guido van Rossum4c417781991-01-21 16:09:22 +00002794 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002795 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002796 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002797 n = CHILD(n, 0);
2798 if (TYPE(n) != NEWLINE)
2799 com_node(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002800 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2801 com_addbyte(c, RETURN_VALUE);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002802 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002803 break;
2804
Guido van Rossum4c417781991-01-21 16:09:22 +00002805 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002806 com_file_input(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002807 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2808 com_addbyte(c, RETURN_VALUE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002809 break;
2810
Guido van Rossum590baa41993-11-30 13:40:46 +00002811 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00002812 com_node(c, CHILD(n, 0));
2813 com_addbyte(c, RETURN_VALUE);
2814 break;
2815
Guido van Rossum590baa41993-11-30 13:40:46 +00002816 case lambdef: /* anonymous function definition */
2817 compile_lambdef(c, n);
2818 break;
2819
Guido van Rossum4c417781991-01-21 16:09:22 +00002820 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002821 compile_funcdef(c, n);
2822 break;
2823
Guido van Rossum4c417781991-01-21 16:09:22 +00002824 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002825 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002826 break;
2827
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002828 default:
2829 fprintf(stderr, "node type %d\n", TYPE(n));
2830 err_setstr(SystemError, "compile_node: unexpected node type");
2831 c->c_errors++;
2832 }
2833}
2834
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002835/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00002836
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002837 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
2838 instructions that refer to local variables with LOAD_FAST etc.
2839 The latter instructions are much faster because they don't need to
2840 look up the variable name in a dictionary.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002841
Guido van Rossum681d79a1995-07-18 14:51:37 +00002842 To find all local variables, we check all STORE_NAME, IMPORT_FROM
2843 and DELETE_NAME instructions. This yields all local variables,
2844 function definitions, class definitions and import statements.
2845 Argument names have already been entered into the list by the
2846 special processing for the argument list.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002847
2848 All remaining LOAD_NAME instructions must refer to non-local (global
2849 or builtin) variables, so are replaced by LOAD_GLOBAL.
2850
2851 There are two problems: 'from foo import *' and 'exec' may introduce
2852 local variables that we can't know while compiling. If this is the
Guido van Rossum681d79a1995-07-18 14:51:37 +00002853 case, we can still optimize bona fide locals (since those
2854 statements will be surrounded by fast_2_locals() and
2855 locals_2_fast()), but we can't change LOAD_NAME to LOAD_GLOBAL.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002856
Guido van Rossum681d79a1995-07-18 14:51:37 +00002857 NB: this modifies the string object c->c_code! */
Guido van Rossum282914b1991-04-04 10:42:56 +00002858
2859static void
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002860optimize(c)
2861 struct compiling *c;
Guido van Rossum282914b1991-04-04 10:42:56 +00002862{
Guido van Rossum0a697f61991-04-16 08:39:12 +00002863 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00002864 int opcode;
2865 int oparg;
2866 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002867 object *error_type, *error_value, *error_traceback;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002868
Guido van Rossum282914b1991-04-04 10:42:56 +00002869#define NEXTOP() (*next_instr++)
2870#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
2871#define GETITEM(v, i) (getlistitem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002872#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
2873
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002874 err_fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002875
2876 c->c_flags |= CO_OPTIMIZED;
Guido van Rossum282914b1991-04-04 10:42:56 +00002877
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002878 next_instr = (unsigned char *) getstringvalue(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00002879 for (;;) {
2880 opcode = NEXTOP();
2881 if (opcode == STOP_CODE)
2882 break;
2883 if (HAS_ARG(opcode))
2884 oparg = NEXTARG();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002885 switch (opcode) {
2886 case STORE_NAME:
2887 case DELETE_NAME:
2888 case IMPORT_FROM:
2889 com_addlocal_o(c, GETNAMEOBJ(oparg));
2890 break;
2891 case EXEC_STMT:
2892 c->c_flags &= ~CO_OPTIMIZED;
2893 break;
Guido van Rossum282914b1991-04-04 10:42:56 +00002894 }
2895 }
2896
Guido van Rossum681d79a1995-07-18 14:51:37 +00002897 if (dictlookup(c->c_locals, "*") != NULL)
2898 c->c_flags &= ~CO_OPTIMIZED;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002899
2900 next_instr = (unsigned char *) getstringvalue(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00002901 for (;;) {
2902 cur_instr = next_instr;
2903 opcode = NEXTOP();
2904 if (opcode == STOP_CODE)
2905 break;
2906 if (HAS_ARG(opcode))
2907 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002908 if (opcode == LOAD_NAME ||
2909 opcode == STORE_NAME ||
2910 opcode == DELETE_NAME) {
2911 object *v;
2912 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00002913 name = GETNAMEOBJ(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002914 v = dict2lookup(c->c_locals, name);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002915 if (v == NULL) {
Guido van Rossum83163251991-08-16 08:58:43 +00002916 err_clear();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002917 if (opcode == LOAD_NAME &&
2918 (c->c_flags&CO_OPTIMIZED))
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002919 cur_instr[0] = LOAD_GLOBAL;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002920 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00002921 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002922 i = getintvalue(v);
2923 switch (opcode) {
2924 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
2925 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
2926 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
2927 }
2928 cur_instr[1] = i & 0xff;
2929 cur_instr[2] = (i>>8) & 0xff;
Guido van Rossum282914b1991-04-04 10:42:56 +00002930 }
2931 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002932
Guido van Rossum681d79a1995-07-18 14:51:37 +00002933 if (c->c_errors == 0)
2934 err_restore(error_type, error_value, error_traceback);
Guido van Rossum282914b1991-04-04 10:42:56 +00002935}
2936
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002937codeobject *
Guido van Rossum590baa41993-11-30 13:40:46 +00002938compile(n, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002939 node *n;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002940 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002941{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00002942 return jcompile(n, filename, NULL);
2943}
2944
2945static codeobject *
2946icompile(n, base)
2947 node *n;
2948 struct compiling *base;
2949{
2950 return jcompile(n, base->c_filename, base);
2951}
2952
2953static codeobject *
2954jcompile(n, filename, base)
2955 node *n;
2956 char *filename;
2957 struct compiling *base;
2958{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002959 struct compiling sc;
2960 codeobject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00002961 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002962 return NULL;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00002963#ifdef PRIVATE_NAME_MANGLING
2964 if (base)
2965 sc.c_private = base->c_private;
2966 else
2967 sc.c_private = NULL;
2968#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002969 compile_node(&sc, n);
2970 com_done(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002971 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002972 optimize(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002973 sc.c_flags |= CO_NEWLOCALS;
2974 }
2975 else if (TYPE(n) == classdef)
2976 sc.c_flags |= CO_NEWLOCALS;
Guido van Rossum9bfef441993-03-29 10:43:31 +00002977 co = NULL;
2978 if (sc.c_errors == 0) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002979 object *consts, *names, *varnames, *filename, *name;
2980 consts = listtuple(sc.c_consts);
2981 names = listtuple(sc.c_names);
2982 varnames = listtuple(sc.c_varnames);
2983 filename = newstringobject(sc.c_filename);
2984 name = newstringobject(sc.c_name);
2985 if (!err_occurred())
2986 co = newcodeobject(sc.c_argcount,
2987 sc.c_nlocals,
2988 sc.c_flags,
2989 sc.c_code,
2990 consts,
2991 names,
2992 varnames,
2993 filename,
2994 name);
2995 XDECREF(consts);
2996 XDECREF(names);
2997 XDECREF(varnames);
2998 XDECREF(filename);
2999 XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003000 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003001 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003002 return co;
3003}