blob: adb0d090577664615797b3706dee09e705cb7267 [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
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum10dc2e81990-11-18 17:27:39 +000032/* Compile an expression node to intermediate code */
33
Guido van Rossum3f5da241990-12-20 15:06:42 +000034/* XXX TO DO:
Guido van Rossum681d79a1995-07-18 14:51:37 +000035 XXX Compute maximum needed stack sizes while compiling;
36 XXX then frame object can be one malloc and no stack checks are needed
37 XXX add __doc__ attribute == co_doc to code object attributes
38 XXX don't execute doc string
Guido van Rossum3f5da241990-12-20 15:06:42 +000039 XXX Generate simple jump for break/return outside 'try...finally'
Guido van Rossum681d79a1995-07-18 14:51:37 +000040 XXX get rid of SET_LINENO instructions, use JAR's table trick
41 XXX (need an option to put them back in, for debugger!)
42 XXX other JAR tricks?
Guido van Rossum3f5da241990-12-20 15:06:42 +000043*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +000044
Guido van Rossum8ff077b1996-08-24 06:21:31 +000045#ifndef NO_PRIVATE_NAME_MANGLING
46#define PRIVATE_NAME_MANGLING
47#endif
48
Guido van Rossum3f5da241990-12-20 15:06:42 +000049#include "allobjects.h"
50
Guido van Rossum10dc2e81990-11-18 17:27:39 +000051#include "node.h"
52#include "token.h"
53#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000054#include "compile.h"
55#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000056#include "structmember.h"
57
58#include <ctype.h>
Guido van Rossumf1dc5661993-07-05 10:31:29 +000059#include <errno.h>
Guido van Rossum282914b1991-04-04 10:42:56 +000060
Guido van Rossum8861b741996-07-30 16:49:37 +000061#define OP_DELETE 0
62#define OP_ASSIGN 1
63#define OP_APPLY 2
64
Guido van Rossum3f5da241990-12-20 15:06:42 +000065#define OFF(x) offsetof(codeobject, x)
66
67static struct memberlist code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000068 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
69 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
70 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000071 {"co_code", T_OBJECT, OFF(co_code), READONLY},
72 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
73 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000074 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000075 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000076 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000077 {NULL} /* Sentinel */
78};
79
80static object *
81code_getattr(co, name)
82 codeobject *co;
83 char *name;
84{
85 return getmember((char *)co, code_memberlist, name);
86}
Guido van Rossum10dc2e81990-11-18 17:27:39 +000087
88static void
Guido van Rossum3f5da241990-12-20 15:06:42 +000089code_dealloc(co)
90 codeobject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +000091{
Guido van Rossum3f5da241990-12-20 15:06:42 +000092 XDECREF(co->co_code);
93 XDECREF(co->co_consts);
94 XDECREF(co->co_names);
95 XDECREF(co->co_filename);
Guido van Rossum9bfef441993-03-29 10:43:31 +000096 XDECREF(co->co_name);
Guido van Rossum681d79a1995-07-18 14:51:37 +000097 XDECREF(co->co_varnames);
Guido van Rossum3f5da241990-12-20 15:06:42 +000098 DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +000099}
100
Guido van Rossum2dff9911992-09-03 20:50:59 +0000101static object *
102code_repr(co)
103 codeobject *co;
104{
105 char buf[500];
106 int lineno = -1;
107 char *p = GETSTRINGVALUE(co->co_code);
108 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000109 char *name = "???";
Guido van Rossum2dff9911992-09-03 20:50:59 +0000110 if (*p == SET_LINENO)
111 lineno = (p[1] & 0xff) | ((p[2] & 0xff) << 8);
112 if (co->co_filename && is_stringobject(co->co_filename))
113 filename = getstringvalue(co->co_filename);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000114 if (co->co_name && is_stringobject(co->co_name))
115 name = getstringvalue(co->co_name);
116 sprintf(buf, "<code object %.100s at %lx, file \"%.300s\", line %d>",
117 name, (long)co, filename, lineno);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000118 return newstringobject(buf);
119}
120
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000121static int
122code_compare(co, cp)
123 codeobject *co, *cp;
124{
125 int cmp;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000126 cmp = cp->co_argcount - cp->co_argcount;
127 if (cmp) return cmp;
128 cmp = cp->co_nlocals - cp->co_nlocals;
129 if (cmp) return cmp;
130 cmp = cp->co_flags - cp->co_flags;
131 if (cmp) return cmp;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000132 cmp = cmpobject((object *)co->co_code, (object *)cp->co_code);
133 if (cmp) return cmp;
134 cmp = cmpobject(co->co_consts, cp->co_consts);
135 if (cmp) return cmp;
136 cmp = cmpobject(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000137 if (cmp) return cmp;
138 cmp = cmpobject(co->co_varnames, cp->co_varnames);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000139 return cmp;
140}
141
142static long
143code_hash(co)
144 codeobject *co;
145{
Guido van Rossum681d79a1995-07-18 14:51:37 +0000146 long h, h1, h2, h3, h4;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000147 h1 = hashobject((object *)co->co_code);
148 if (h1 == -1) return -1;
149 h2 = hashobject(co->co_consts);
150 if (h2 == -1) return -1;
151 h3 = hashobject(co->co_names);
152 if (h3 == -1) return -1;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000153 h4 = hashobject(co->co_varnames);
154 if (h4 == -1) return -1;
155 h = h1 ^ h2 ^ h3 ^ h4 ^
156 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000157 if (h == -1) h = -2;
158 return h;
159}
160
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000161typeobject Codetype = {
162 OB_HEAD_INIT(&Typetype)
163 0,
164 "code",
165 sizeof(codeobject),
166 0,
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000167 (destructor)code_dealloc, /*tp_dealloc*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000168 0, /*tp_print*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000169 (getattrfunc)code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000170 0, /*tp_setattr*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000171 (cmpfunc)code_compare, /*tp_compare*/
172 (reprfunc)code_repr, /*tp_repr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000173 0, /*tp_as_number*/
174 0, /*tp_as_sequence*/
175 0, /*tp_as_mapping*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000176 (hashfunc)code_hash, /*tp_hash*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000177};
178
Guido van Rossuma082ce41991-06-04 19:41:56 +0000179codeobject *
Guido van Rossum681d79a1995-07-18 14:51:37 +0000180newcodeobject(argcount, nlocals, flags,
181 code, consts, names, varnames, filename, name)
182 int argcount;
183 int nlocals;
184 int flags;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000185 object *code;
186 object *consts;
187 object *names;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000188 object *varnames;
Guido van Rossuma082ce41991-06-04 19:41:56 +0000189 object *filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000190 object *name;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000191{
192 codeobject *co;
193 int i;
194 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000195 if (argcount < 0 || nlocals < 0 ||
196 code == NULL || !is_stringobject(code) ||
197 consts == NULL || !is_tupleobject(consts) ||
198 names == NULL || !is_tupleobject(names) ||
199 varnames == NULL || !is_tupleobject(varnames) ||
200 name == NULL || !is_stringobject(name) ||
201 filename == NULL || !is_stringobject(filename)) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000202 err_badcall();
203 return NULL;
204 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000205 /* Make sure names and varnames are all strings */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000206 for (i = gettuplesize(names); --i >= 0; ) {
207 object *v = gettupleitem(names, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000208 if (v == NULL || !is_stringobject(v)) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000209 err_badcall();
210 return NULL;
211 }
212 }
213 for (i = gettuplesize(varnames); --i >= 0; ) {
214 object *v = gettupleitem(varnames, i);
215 if (v == NULL || !is_stringobject(v)) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000216 err_badcall();
217 return NULL;
218 }
219 }
220 co = NEWOBJ(codeobject, &Codetype);
221 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000222 co->co_argcount = argcount;
223 co->co_nlocals = nlocals;
224 co->co_flags = flags;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000225 INCREF(code);
226 co->co_code = (stringobject *)code;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000227 INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000228 co->co_consts = consts;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000229 INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000230 co->co_names = names;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000231 INCREF(varnames);
232 co->co_varnames = varnames;
Guido van Rossuma082ce41991-06-04 19:41:56 +0000233 INCREF(filename);
234 co->co_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000235 INCREF(name);
236 co->co_name = name;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000237 }
238 return co;
239}
240
241
242/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000243
244#define MAXBLOCKS 20 /* Max static block nesting within a function */
245
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000246struct compiling {
247 object *c_code; /* string */
248 object *c_consts; /* list of objects */
249 object *c_names; /* list of strings (names) */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000250 object *c_globals; /* dictionary (value=None) */
251 object *c_locals; /* dictionary (value=localID) */
252 object *c_varnames; /* list (inverse of c_locals) */
253 int c_nlocals; /* index of next local */
254 int c_argcount; /* number of top-level arguments */
255 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000256 int c_nexti; /* index into c_code */
257 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000258 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000259 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000260 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000261 int c_begin; /* begin of current loop, for 'continue' */
262 int c_block[MAXBLOCKS]; /* stack of block types */
263 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000264 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000265 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000266 int c_lineno; /* Current line number */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000267#ifdef PRIVATE_NAME_MANGLING
268 char *c_private; /* for private name mangling */
269#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000270};
271
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000272
Guido van Rossum452a9831996-09-17 14:32:04 +0000273/* Error message including line number */
274
275static void
276com_error(c, exc, msg)
277 struct compiling *c;
278 object *exc;
279 char *msg;
280{
281 int n = strlen(msg);
282 object *v;
283 char buffer[30];
284 char *s;
285 if (c->c_lineno <= 1) {
286 /* Unknown line number or single interactive command */
287 err_setstr(exc, msg);
288 return;
289 }
290 sprintf(buffer, " (line %d)", c->c_lineno);
291 v = newsizedstringobject((char *)NULL, n + strlen(buffer));
292 if (v == NULL)
293 return; /* MemoryError, too bad */
294 s = GETSTRINGVALUE((stringobject *)v);
295 strcpy(s, msg);
296 strcat(s, buffer);
297 err_setval(exc, v);
298 DECREF(v);
299 c->c_errors++;
300}
301
302
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000303/* Interface to the block stack */
304
305static void
306block_push(c, type)
307 struct compiling *c;
308 int type;
309{
310 if (c->c_nblocks >= MAXBLOCKS) {
Guido van Rossum452a9831996-09-17 14:32:04 +0000311 com_error(c, SystemError, "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000312 }
313 else {
314 c->c_block[c->c_nblocks++] = type;
315 }
316}
317
318static void
319block_pop(c, type)
320 struct compiling *c;
321 int type;
322{
323 if (c->c_nblocks > 0)
324 c->c_nblocks--;
325 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum452a9831996-09-17 14:32:04 +0000326 com_error(c, SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000327 }
328}
329
330
Guido van Rossum681d79a1995-07-18 14:51:37 +0000331/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000332
Guido van Rossum590baa41993-11-30 13:40:46 +0000333static int com_init PROTO((struct compiling *, char *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000334static void com_free PROTO((struct compiling *));
335static void com_done PROTO((struct compiling *));
336static void com_node PROTO((struct compiling *, struct _node *));
Guido van Rossum50564e81996-01-12 01:13:16 +0000337static void com_factor PROTO((struct compiling *, struct _node *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000338static void com_addbyte PROTO((struct compiling *, int));
339static void com_addint PROTO((struct compiling *, int));
340static void com_addoparg PROTO((struct compiling *, int, int));
341static void com_addfwref PROTO((struct compiling *, int, int *));
342static void com_backpatch PROTO((struct compiling *, int));
343static int com_add PROTO((struct compiling *, object *, object *));
344static int com_addconst PROTO((struct compiling *, object *));
345static int com_addname PROTO((struct compiling *, object *));
346static void com_addopname PROTO((struct compiling *, int, node *));
Guido van Rossum288a60f1991-12-16 13:05:10 +0000347static void com_list PROTO((struct compiling *, node *, int));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000348static int com_argdefs PROTO((struct compiling *, node *));
349static int com_newlocal PROTO((struct compiling *, char *));
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000350static codeobject *icompile PROTO((struct _node *, struct compiling *));
351static codeobject *jcompile PROTO((struct _node *, char *, struct compiling *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000352
353static int
Guido van Rossum590baa41993-11-30 13:40:46 +0000354com_init(c, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000355 struct compiling *c;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000356 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000357{
Guido van Rossum62d46241991-04-03 19:00:23 +0000358 if ((c->c_code = newsizedstringobject((char *)NULL, 1000)) == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000359 goto fail_3;
360 if ((c->c_consts = newlistobject(0)) == NULL)
361 goto fail_2;
362 if ((c->c_names = newlistobject(0)) == NULL)
363 goto fail_1;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000364 if ((c->c_globals = newdictobject()) == NULL)
365 goto fail_0;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000366 if ((c->c_locals = newdictobject()) == NULL)
367 goto fail_00;
368 if ((c->c_varnames = newlistobject(0)) == NULL)
369 goto fail_000;
370 c->c_nlocals = 0;
371 c->c_argcount = 0;
372 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000373 c->c_nexti = 0;
374 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000375 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000376 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000377 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000378 c->c_begin = 0;
379 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000380 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000381 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000382 c->c_lineno = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000383 return 1;
384
Guido van Rossum681d79a1995-07-18 14:51:37 +0000385 fail_000:
386 DECREF(c->c_locals);
387 fail_00:
388 DECREF(c->c_globals);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000389 fail_0:
390 DECREF(c->c_names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000391 fail_1:
392 DECREF(c->c_consts);
393 fail_2:
394 DECREF(c->c_code);
395 fail_3:
396 return 0;
397}
398
399static void
400com_free(c)
401 struct compiling *c;
402{
403 XDECREF(c->c_code);
404 XDECREF(c->c_consts);
405 XDECREF(c->c_names);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000406 XDECREF(c->c_globals);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000407 XDECREF(c->c_locals);
408 XDECREF(c->c_varnames);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000409}
410
411static void
412com_done(c)
413 struct compiling *c;
414{
415 if (c->c_code != NULL)
416 resizestring(&c->c_code, c->c_nexti);
417}
418
419static void
420com_addbyte(c, byte)
421 struct compiling *c;
422 int byte;
423{
424 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000425 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000426 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000427 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000428 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000429 fatal("com_addbyte: byte out of range");
Guido van Rossum01cfd441991-10-20 20:12:38 +0000430 */
Guido van Rossum452a9831996-09-17 14:32:04 +0000431 com_error(c, SystemError, "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000432 }
433 if (c->c_code == NULL)
434 return;
435 len = getstringsize(c->c_code);
436 if (c->c_nexti >= len) {
437 if (resizestring(&c->c_code, len+1000) != 0) {
438 c->c_errors++;
439 return;
440 }
441 }
442 getstringvalue(c->c_code)[c->c_nexti++] = byte;
443}
444
445static void
446com_addint(c, x)
447 struct compiling *c;
448 int x;
449{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000450 com_addbyte(c, x & 0xff);
451 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000452}
453
454static void
455com_addoparg(c, op, arg)
456 struct compiling *c;
457 int op;
458 int arg;
459{
Guido van Rossum452a9831996-09-17 14:32:04 +0000460 if (op == SET_LINENO)
461 c->c_lineno = arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000462 com_addbyte(c, op);
463 com_addint(c, arg);
464}
465
466static void
467com_addfwref(c, op, p_anchor)
468 struct compiling *c;
469 int op;
470 int *p_anchor;
471{
472 /* Compile a forward reference for backpatching */
473 int here;
474 int anchor;
475 com_addbyte(c, op);
476 here = c->c_nexti;
477 anchor = *p_anchor;
478 *p_anchor = here;
479 com_addint(c, anchor == 0 ? 0 : here - anchor);
480}
481
482static void
483com_backpatch(c, anchor)
484 struct compiling *c;
485 int anchor; /* Must be nonzero */
486{
487 unsigned char *code = (unsigned char *) getstringvalue(c->c_code);
488 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000489 int dist;
490 int prev;
491 for (;;) {
492 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000493 prev = code[anchor] + (code[anchor+1] << 8);
494 dist = target - (anchor+2);
495 code[anchor] = dist & 0xff;
496 code[anchor+1] = dist >> 8;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000497 if (!prev)
498 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000499 anchor -= prev;
500 }
501}
502
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000503/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000504
505static int
506com_add(c, list, v)
507 struct compiling *c;
508 object *list;
509 object *v;
510{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000511 int n = getlistsize(list);
512 int i;
513 for (i = n; --i >= 0; ) {
514 object *w = getlistitem(list, i);
Guido van Rossumefc0bd01991-07-01 18:44:20 +0000515 if (v->ob_type == w->ob_type && cmpobject(v, w) == 0)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000516 return i;
517 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000518 if (addlistitem(list, v) != 0)
519 c->c_errors++;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000520 return n;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000521}
522
523static int
524com_addconst(c, v)
525 struct compiling *c;
526 object *v;
527{
528 return com_add(c, c->c_consts, v);
529}
530
531static int
532com_addname(c, v)
533 struct compiling *c;
534 object *v;
535{
536 return com_add(c, c->c_names, v);
537}
538
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000539#ifdef PRIVATE_NAME_MANGLING
540static int
541com_mangle(c, name, buffer, maxlen)
542 struct compiling *c;
543 char *name;
544 char *buffer;
545 int maxlen;
546{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000547 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000548 This is independent from how the name is used. */
549 char *p;
550 int nlen, plen;
551 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000552 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000553 return 0; /* Don't mangle __extremely_long_names */
554 if (name[nlen-1] == '_' && name[nlen-2] == '_')
555 return 0; /* Don't mangle __whatever__ */
556 p = c->c_private;
557 /* Strip leading underscores from class name */
558 while (*p == '_')
559 p++;
560 if (*p == '\0')
561 return 0; /* Don't mangle if class is just underscores */
562 plen = strlen(p);
563 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000564 plen = maxlen-nlen-2; /* Truncate class name if too long */
565 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000566 buffer[0] = '_';
567 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000568 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000569 /* fprintf(stderr, "mangle %s -> %s\n", name, buffer); */
570 return 1;
571}
572#endif
573
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000574static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000575com_addopnamestr(c, op, name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000576 struct compiling *c;
577 int op;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000578 char *name;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000579{
580 object *v;
581 int i;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000582#ifdef PRIVATE_NAME_MANGLING
583 char buffer[256];
584 if (name != NULL && name[0] == '_' && name[1] == '_' &&
585 c->c_private != NULL &&
586 com_mangle(c, name, buffer, (int)sizeof(buffer)))
587 name = buffer;
588#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000589 if (name == NULL || (v = newstringobject(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000590 c->c_errors++;
591 i = 255;
592 }
593 else {
594 i = com_addname(c, v);
595 DECREF(v);
596 }
Guido van Rossumc5e96291991-12-10 13:53:51 +0000597 /* Hack to replace *_NAME opcodes by *_GLOBAL if necessary */
598 switch (op) {
599 case LOAD_NAME:
600 case STORE_NAME:
601 case DELETE_NAME:
602 if (dictlookup(c->c_globals, name) != NULL) {
603 switch (op) {
604 case LOAD_NAME: op = LOAD_GLOBAL; break;
605 case STORE_NAME: op = STORE_GLOBAL; break;
606 case DELETE_NAME: op = DELETE_GLOBAL; break;
607 }
608 }
609 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000610 com_addoparg(c, op, i);
611}
612
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000613static void
614com_addopname(c, op, n)
615 struct compiling *c;
616 int op;
617 node *n;
618{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000619 char *name;
620 char buffer[1000];
621 /* XXX it is possible to write this code without the 1000
622 chars on the total length of dotted names, I just can't be
623 bothered right now */
624 if (TYPE(n) == STAR)
625 name = "*";
626 else if (TYPE(n) == dotted_name) {
627 char *p = buffer;
628 int i;
629 name = buffer;
630 for (i = 0; i < NCH(n); i += 2) {
631 char *s = STR(CHILD(n, i));
632 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum452a9831996-09-17 14:32:04 +0000633 com_error(c, MemoryError,
634 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +0000635 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000636 break;
637 }
638 if (p != buffer)
639 *p++ = '.';
640 strcpy(p, s);
641 p = strchr(p, '\0');
642 }
643 }
644 else {
645 REQ(n, NAME);
646 name = STR(n);
647 }
648 com_addopnamestr(c, op, name);
649}
650
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000651static object *
Guido van Rossum452a9831996-09-17 14:32:04 +0000652parsenumber(co, s)
653 struct compiling *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000654 char *s;
655{
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000656 extern long mystrtol PROTO((const char *, char **, int));
657 extern unsigned long mystrtoul PROTO((const char *, char **, int));
658 extern double atof PROTO((const char *));
Guido van Rossumc5e96291991-12-10 13:53:51 +0000659 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000660 long x;
Guido van Rossum50564e81996-01-12 01:13:16 +0000661#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +0000662 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +0000663 int imflag;
664#endif
665
Guido van Rossum282914b1991-04-04 10:42:56 +0000666 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000667 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +0000668#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +0000669 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +0000670#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000671 if (*end == 'l' || *end == 'L')
Guido van Rossumc5e96291991-12-10 13:53:51 +0000672 return long_scan(s, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000673 if (s[0] == '0')
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000674 x = (long) mystrtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000675 else
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000676 x = mystrtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +0000677 if (*end == '\0') {
678 if (errno != 0) {
Guido van Rossum452a9831996-09-17 14:32:04 +0000679 com_error(co, OverflowError,
680 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000681 return NULL;
682 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000683 return newintobject(x);
Guido van Rossum282914b1991-04-04 10:42:56 +0000684 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000685 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +0000686#ifndef WITHOUT_COMPLEX
687 if (imflag) {
688 c.real = 0.;
689 c.imag = atof(s);
690 return newcomplexobject(c);
691 }
692 else
693#endif
694 return newfloatobject(atof(s));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000695}
696
697static object *
698parsestr(s)
699 char *s;
700{
701 object *v;
702 int len;
703 char *buf;
704 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000705 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000706 int c;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000707 int quote = *s;
708 if (quote != '\'' && quote != '\"') {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000709 err_badcall();
710 return NULL;
711 }
712 s++;
713 len = strlen(s);
Guido van Rossum8054fad1993-10-26 15:19:44 +0000714 if (s[--len] != quote) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000715 err_badcall();
716 return NULL;
717 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000718 if (len >= 4 && s[0] == quote && s[1] == quote) {
719 s += 2;
720 len -= 2;
721 if (s[--len] != quote || s[--len] != quote) {
722 err_badcall();
723 return NULL;
724 }
725 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000726 if (strchr(s, '\\') == NULL)
727 return newsizedstringobject(s, len);
728 v = newsizedstringobject((char *)NULL, len);
729 p = buf = getstringvalue(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000730 end = s + len;
731 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000732 if (*s != '\\') {
733 *p++ = *s++;
734 continue;
735 }
736 s++;
737 switch (*s++) {
738 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000739 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000740 case '\\': *p++ = '\\'; break;
741 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000742 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000743 case 'b': *p++ = '\b'; break;
744 case 'f': *p++ = '\014'; break; /* FF */
745 case 't': *p++ = '\t'; break;
746 case 'n': *p++ = '\n'; break;
747 case 'r': *p++ = '\r'; break;
748 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000749 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
750 case '0': case '1': case '2': case '3':
751 case '4': case '5': case '6': case '7':
752 c = s[-1] - '0';
753 if ('0' <= *s && *s <= '7') {
754 c = (c<<3) + *s++ - '0';
755 if ('0' <= *s && *s <= '7')
756 c = (c<<3) + *s++ - '0';
757 }
758 *p++ = c;
759 break;
760 case 'x':
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000761 if (isxdigit(Py_CHARMASK(*s))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000762 sscanf(s, "%x", &c);
763 *p++ = c;
764 do {
765 s++;
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000766 } while (isxdigit(Py_CHARMASK(*s)));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000767 break;
768 }
769 /* FALLTHROUGH */
770 default: *p++ = '\\'; *p++ = s[-1]; break;
771 }
772 }
773 resizestring(&v, (int)(p - buf));
774 return v;
775}
776
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000777static object *
778parsestrplus(n)
779 node *n;
780{
781 object *v;
782 int i;
783 REQ(CHILD(n, 0), STRING);
784 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
785 /* String literal concatenation */
786 for (i = 1; i < NCH(n) && v != NULL; i++) {
787 joinstring_decref(&v, parsestr(STR(CHILD(n, i))));
788 }
789 }
790 return v;
791}
792
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000793static void
794com_list_constructor(c, n)
795 struct compiling *c;
796 node *n;
797{
798 int len;
799 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000800 if (TYPE(n) != testlist)
801 REQ(n, exprlist);
802 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
803 len = (NCH(n) + 1) / 2;
804 for (i = 0; i < NCH(n); i += 2)
805 com_node(c, CHILD(n, i));
806 com_addoparg(c, BUILD_LIST, len);
807}
808
809static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000810com_dictmaker(c, n)
811 struct compiling *c;
812 node *n;
813{
814 int i;
815 /* dictmaker: test ':' test (',' test ':' value)* [','] */
816 for (i = 0; i+2 < NCH(n); i += 4) {
817 /* We must arrange things just right for STORE_SUBSCR.
818 It wants the stack to look like (value) (dict) (key) */
819 com_addbyte(c, DUP_TOP);
820 com_node(c, CHILD(n, i+2)); /* value */
821 com_addbyte(c, ROT_TWO);
822 com_node(c, CHILD(n, i)); /* key */
823 com_addbyte(c, STORE_SUBSCR);
824 }
825}
826
827static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000828com_atom(c, n)
829 struct compiling *c;
830 node *n;
831{
832 node *ch;
833 object *v;
834 int i;
835 REQ(n, atom);
836 ch = CHILD(n, 0);
837 switch (TYPE(ch)) {
838 case LPAR:
839 if (TYPE(CHILD(n, 1)) == RPAR)
840 com_addoparg(c, BUILD_TUPLE, 0);
841 else
842 com_node(c, CHILD(n, 1));
843 break;
844 case LSQB:
845 if (TYPE(CHILD(n, 1)) == RSQB)
846 com_addoparg(c, BUILD_LIST, 0);
847 else
848 com_list_constructor(c, CHILD(n, 1));
849 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000850 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000851 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000852 if (TYPE(CHILD(n, 1)) != RBRACE)
853 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000854 break;
855 case BACKQUOTE:
856 com_node(c, CHILD(n, 1));
857 com_addbyte(c, UNARY_CONVERT);
858 break;
859 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +0000860 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000861 i = 255;
862 }
863 else {
864 i = com_addconst(c, v);
865 DECREF(v);
866 }
867 com_addoparg(c, LOAD_CONST, i);
868 break;
869 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000870 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000871 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000872 c->c_errors++;
873 i = 255;
874 }
875 else {
876 i = com_addconst(c, v);
877 DECREF(v);
878 }
879 com_addoparg(c, LOAD_CONST, i);
880 break;
881 case NAME:
882 com_addopname(c, LOAD_NAME, ch);
883 break;
884 default:
885 fprintf(stderr, "node type %d\n", TYPE(ch));
Guido van Rossum452a9831996-09-17 14:32:04 +0000886 com_error(c, SystemError, "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000887 }
888}
889
890static void
891com_slice(c, n, op)
892 struct compiling *c;
893 node *n;
894 int op;
895{
896 if (NCH(n) == 1) {
897 com_addbyte(c, op);
898 }
899 else if (NCH(n) == 2) {
900 if (TYPE(CHILD(n, 0)) != COLON) {
901 com_node(c, CHILD(n, 0));
902 com_addbyte(c, op+1);
903 }
904 else {
905 com_node(c, CHILD(n, 1));
906 com_addbyte(c, op+2);
907 }
908 }
909 else {
910 com_node(c, CHILD(n, 0));
911 com_node(c, CHILD(n, 2));
912 com_addbyte(c, op+3);
913 }
914}
915
Guido van Rossumf10570b1995-07-07 22:53:21 +0000916static int
917com_argument(c, n, inkeywords)
918 struct compiling *c;
919 node *n; /* argument */
920 int inkeywords;
921{
922 node *m;
923 REQ(n, argument); /* [test '='] test; really [ keyword '='] keyword */
924 if (NCH(n) == 1) {
925 if (inkeywords) {
Guido van Rossum452a9831996-09-17 14:32:04 +0000926 com_error(c, SyntaxError,
Guido van Rossumf10570b1995-07-07 22:53:21 +0000927 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +0000928 }
929 else {
930 com_node(c, CHILD(n, 0));
931 }
932 return 0;
933 }
934 m = n;
935 do {
936 m = CHILD(m, 0);
937 } while (NCH(m) == 1);
938 if (TYPE(m) != NAME) {
Guido van Rossum452a9831996-09-17 14:32:04 +0000939 com_error(c, SyntaxError, "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +0000940 }
941 else {
942 object *v = newstringobject(STR(m));
943 if (v == NULL)
944 c->c_errors++;
945 else {
946 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
947 DECREF(v);
948 }
949 }
950 com_node(c, CHILD(n, 2));
951 return 1;
952}
953
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000954static void
955com_call_function(c, n)
956 struct compiling *c;
Guido van Rossumf10570b1995-07-07 22:53:21 +0000957 node *n; /* EITHER arglist OR ')' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000958{
959 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +0000960 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000961 }
962 else {
Guido van Rossumf10570b1995-07-07 22:53:21 +0000963 int inkeywords, i, na, nk;
964 REQ(n, arglist);
965 inkeywords = 0;
966 na = 0;
967 nk = 0;
968 for (i = 0; i < NCH(n); i += 2) {
969 inkeywords = com_argument(c, CHILD(n, i), inkeywords);
970 if (!inkeywords)
971 na++;
972 else
973 nk++;
974 }
975 if (na > 255 || nk > 255) {
Guido van Rossum452a9831996-09-17 14:32:04 +0000976 com_error(c, SyntaxError, "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +0000977 }
978 com_addoparg(c, CALL_FUNCTION, na | (nk << 8));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000979 }
980}
981
982static void
983com_select_member(c, n)
984 struct compiling *c;
985 node *n;
986{
987 com_addopname(c, LOAD_ATTR, n);
988}
989
990static void
Guido van Rossum8861b741996-07-30 16:49:37 +0000991com_sliceobj(c, n)
992 struct compiling *c;
993 node *n;
994{
995 int i=0;
996 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +0000997 node *ch;
998
999 /* first argument */
1000 if (TYPE(CHILD(n,i)) == COLON) {
1001 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1002 i++;
1003 }
1004 else {
1005 com_node(c, CHILD(n,i));
1006 i++;
1007 REQ(CHILD(n,i),COLON);
1008 i++;
1009 }
1010 /* second argument */
1011 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1012 com_node(c, CHILD(n,i));
1013 i++;
1014 }
1015 else com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1016 /* remaining arguments */
1017 for (; i < NCH(n); i++) {
1018 ns++;
1019 ch=CHILD(n,i);
1020 REQ(ch, sliceop);
1021 if (NCH(ch) == 1) {
1022 /* right argument of ':' missing */
1023 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1024 }
1025 else
1026 com_node(c, CHILD(ch,1));
1027 }
1028 com_addoparg(c, BUILD_SLICE, ns);
1029}
1030
1031static void
1032com_subscript(c, n)
1033 struct compiling *c;
1034 node *n;
1035{
1036 node *ch;
1037 REQ(n, subscript);
1038 ch = CHILD(n,0);
1039 /* check for rubber index */
1040 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT)
Guido van Rossume449af71996-10-11 16:25:41 +00001041 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8861b741996-07-30 16:49:37 +00001042 else {
1043 /* check for slice */
1044 if ((TYPE(ch) == COLON || NCH(n) > 1))
1045 com_sliceobj(c, n);
1046 else {
1047 REQ(ch, test);
1048 com_node(c, ch);
1049 }
1050 }
1051}
1052
1053static void
1054com_subscriptlist(c, n, assigning)
1055 struct compiling *c;
1056 node *n;
1057 int assigning;
1058{
1059 int i, op;
1060 REQ(n, subscriptlist);
1061 /* Check to make backward compatible slice behavior for '[i:j]' */
1062 if (NCH(n) == 1) {
1063 node *sub = CHILD(n, 0); /* subscript */
1064 /* Make it is a simple slice.
1065 should have exactly one colon. */
1066 if ((TYPE(CHILD(sub, 0)) == COLON
1067 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1068 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop)) {
1069 if (assigning == OP_APPLY)
1070 op = SLICE;
1071 else
1072 op = ((assigning == OP_ASSIGN) ? STORE_SLICE : DELETE_SLICE);
1073 com_slice(c, sub, op);
1074 return;
1075 }
1076 }
1077 /* Else normal subscriptlist. Compile each subscript. */
1078 for (i = 0; i < NCH(n); i += 2)
1079 com_subscript(c, CHILD(n, i));
1080 /* Put multiple subscripts into a tuple */
1081 if (NCH(n) > 1)
1082 com_addoparg(c, BUILD_TUPLE, (NCH(n)+1) / 2);
1083 if (assigning == OP_APPLY)
1084 op = BINARY_SUBSCR;
1085 else
1086 op = ((assigning == OP_ASSIGN) ? STORE_SUBSCR : DELETE_SUBSCR);
1087 com_addbyte(c, op);
1088}
1089
1090static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001091com_apply_trailer(c, n)
1092 struct compiling *c;
1093 node *n;
1094{
1095 REQ(n, trailer);
1096 switch (TYPE(CHILD(n, 0))) {
1097 case LPAR:
1098 com_call_function(c, CHILD(n, 1));
1099 break;
1100 case DOT:
1101 com_select_member(c, CHILD(n, 1));
1102 break;
1103 case LSQB:
Guido van Rossum8861b741996-07-30 16:49:37 +00001104 com_subscriptlist(c, CHILD(n, 1), OP_APPLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001105 break;
1106 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001107 com_error(c, SystemError,
1108 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001109 }
1110}
1111
1112static void
Guido van Rossum50564e81996-01-12 01:13:16 +00001113com_power(c, n)
1114 struct compiling *c;
1115 node *n;
1116{
1117 int i;
1118 REQ(n, power);
1119 com_atom(c, CHILD(n, 0));
1120 for (i = 1; i < NCH(n); i++) {
1121 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1122 com_factor(c, CHILD(n, i+1));
1123 com_addbyte(c, BINARY_POWER);
1124 break;
1125 }
1126 else
1127 com_apply_trailer(c, CHILD(n, i));
1128 }
1129}
1130
1131static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001132com_factor(c, n)
1133 struct compiling *c;
1134 node *n;
1135{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001136 REQ(n, factor);
1137 if (TYPE(CHILD(n, 0)) == PLUS) {
1138 com_factor(c, CHILD(n, 1));
1139 com_addbyte(c, UNARY_POSITIVE);
1140 }
1141 else if (TYPE(CHILD(n, 0)) == MINUS) {
1142 com_factor(c, CHILD(n, 1));
1143 com_addbyte(c, UNARY_NEGATIVE);
1144 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001145 else if (TYPE(CHILD(n, 0)) == TILDE) {
1146 com_factor(c, CHILD(n, 1));
1147 com_addbyte(c, UNARY_INVERT);
1148 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001149 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001150 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001151 }
1152}
1153
1154static void
1155com_term(c, n)
1156 struct compiling *c;
1157 node *n;
1158{
1159 int i;
1160 int op;
1161 REQ(n, term);
1162 com_factor(c, CHILD(n, 0));
1163 for (i = 2; i < NCH(n); i += 2) {
1164 com_factor(c, CHILD(n, i));
1165 switch (TYPE(CHILD(n, i-1))) {
1166 case STAR:
1167 op = BINARY_MULTIPLY;
1168 break;
1169 case SLASH:
1170 op = BINARY_DIVIDE;
1171 break;
1172 case PERCENT:
1173 op = BINARY_MODULO;
1174 break;
1175 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001176 com_error(c, SystemError,
1177 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001178 op = 255;
1179 }
1180 com_addbyte(c, op);
1181 }
1182}
1183
1184static void
1185com_arith_expr(c, n)
1186 struct compiling *c;
1187 node *n;
1188{
1189 int i;
1190 int op;
1191 REQ(n, arith_expr);
1192 com_term(c, CHILD(n, 0));
1193 for (i = 2; i < NCH(n); i += 2) {
1194 com_term(c, CHILD(n, i));
1195 switch (TYPE(CHILD(n, i-1))) {
1196 case PLUS:
1197 op = BINARY_ADD;
1198 break;
1199 case MINUS:
1200 op = BINARY_SUBTRACT;
1201 break;
1202 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001203 com_error(c, SystemError,
1204 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001205 op = 255;
1206 }
1207 com_addbyte(c, op);
1208 }
1209}
1210
1211static void
1212com_shift_expr(c, n)
1213 struct compiling *c;
1214 node *n;
1215{
1216 int i;
1217 int op;
1218 REQ(n, shift_expr);
1219 com_arith_expr(c, CHILD(n, 0));
1220 for (i = 2; i < NCH(n); i += 2) {
1221 com_arith_expr(c, CHILD(n, i));
1222 switch (TYPE(CHILD(n, i-1))) {
1223 case LEFTSHIFT:
1224 op = BINARY_LSHIFT;
1225 break;
1226 case RIGHTSHIFT:
1227 op = BINARY_RSHIFT;
1228 break;
1229 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001230 com_error(c, SystemError,
1231 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001232 op = 255;
1233 }
1234 com_addbyte(c, op);
1235 }
1236}
1237
1238static void
1239com_and_expr(c, n)
1240 struct compiling *c;
1241 node *n;
1242{
1243 int i;
1244 int op;
1245 REQ(n, and_expr);
1246 com_shift_expr(c, CHILD(n, 0));
1247 for (i = 2; i < NCH(n); i += 2) {
1248 com_shift_expr(c, CHILD(n, i));
1249 if (TYPE(CHILD(n, i-1)) == AMPER) {
1250 op = BINARY_AND;
1251 }
1252 else {
Guido van Rossum452a9831996-09-17 14:32:04 +00001253 com_error(c, SystemError,
1254 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001255 op = 255;
1256 }
1257 com_addbyte(c, op);
1258 }
1259}
1260
1261static void
1262com_xor_expr(c, n)
1263 struct compiling *c;
1264 node *n;
1265{
1266 int i;
1267 int op;
1268 REQ(n, xor_expr);
1269 com_and_expr(c, CHILD(n, 0));
1270 for (i = 2; i < NCH(n); i += 2) {
1271 com_and_expr(c, CHILD(n, i));
1272 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1273 op = BINARY_XOR;
1274 }
1275 else {
Guido van Rossum452a9831996-09-17 14:32:04 +00001276 com_error(c, SystemError,
1277 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001278 op = 255;
1279 }
1280 com_addbyte(c, op);
1281 }
1282}
1283
1284static void
1285com_expr(c, n)
1286 struct compiling *c;
1287 node *n;
1288{
1289 int i;
1290 int op;
1291 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001292 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001293 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001294 com_xor_expr(c, CHILD(n, i));
1295 if (TYPE(CHILD(n, i-1)) == VBAR) {
1296 op = BINARY_OR;
1297 }
1298 else {
Guido van Rossum452a9831996-09-17 14:32:04 +00001299 com_error(c, SystemError,
1300 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001301 op = 255;
1302 }
1303 com_addbyte(c, op);
1304 }
1305}
1306
1307static enum cmp_op
1308cmp_type(n)
1309 node *n;
1310{
1311 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001312 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001313 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1314 if (NCH(n) == 1) {
1315 n = CHILD(n, 0);
1316 switch (TYPE(n)) {
1317 case LESS: return LT;
1318 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001319 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001320 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001321 case LESSEQUAL: return LE;
1322 case GREATEREQUAL: return GE;
1323 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001324 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1325 if (strcmp(STR(n), "is") == 0) return IS;
1326 }
1327 }
1328 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001329 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001330 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1331 return NOT_IN;
1332 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1333 return IS_NOT;
1334 }
1335 }
1336 return BAD;
1337}
1338
1339static void
1340com_comparison(c, n)
1341 struct compiling *c;
1342 node *n;
1343{
1344 int i;
1345 enum cmp_op op;
1346 int anchor;
1347 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
1348 com_expr(c, CHILD(n, 0));
1349 if (NCH(n) == 1)
1350 return;
1351
1352 /****************************************************************
1353 The following code is generated for all but the last
1354 comparison in a chain:
1355
1356 label: on stack: opcode: jump to:
1357
1358 a <code to load b>
1359 a, b DUP_TOP
1360 a, b, b ROT_THREE
1361 b, a, b COMPARE_OP
1362 b, 0-or-1 JUMP_IF_FALSE L1
1363 b, 1 POP_TOP
1364 b
1365
1366 We are now ready to repeat this sequence for the next
1367 comparison in the chain.
1368
1369 For the last we generate:
1370
1371 b <code to load c>
1372 b, c COMPARE_OP
1373 0-or-1
1374
1375 If there were any jumps to L1 (i.e., there was more than one
1376 comparison), we generate:
1377
1378 0-or-1 JUMP_FORWARD L2
1379 L1: b, 0 ROT_TWO
1380 0, b POP_TOP
1381 0
1382 L2:
1383 ****************************************************************/
1384
1385 anchor = 0;
1386
1387 for (i = 2; i < NCH(n); i += 2) {
1388 com_expr(c, CHILD(n, i));
1389 if (i+2 < NCH(n)) {
1390 com_addbyte(c, DUP_TOP);
1391 com_addbyte(c, ROT_THREE);
1392 }
1393 op = cmp_type(CHILD(n, i-1));
1394 if (op == BAD) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001395 com_error(c, SystemError,
1396 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001397 }
1398 com_addoparg(c, COMPARE_OP, op);
1399 if (i+2 < NCH(n)) {
1400 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1401 com_addbyte(c, POP_TOP);
1402 }
1403 }
1404
1405 if (anchor) {
1406 int anchor2 = 0;
1407 com_addfwref(c, JUMP_FORWARD, &anchor2);
1408 com_backpatch(c, anchor);
1409 com_addbyte(c, ROT_TWO);
1410 com_addbyte(c, POP_TOP);
1411 com_backpatch(c, anchor2);
1412 }
1413}
1414
1415static void
1416com_not_test(c, n)
1417 struct compiling *c;
1418 node *n;
1419{
1420 REQ(n, not_test); /* 'not' not_test | comparison */
1421 if (NCH(n) == 1) {
1422 com_comparison(c, CHILD(n, 0));
1423 }
1424 else {
1425 com_not_test(c, CHILD(n, 1));
1426 com_addbyte(c, UNARY_NOT);
1427 }
1428}
1429
1430static void
1431com_and_test(c, n)
1432 struct compiling *c;
1433 node *n;
1434{
1435 int i;
1436 int anchor;
1437 REQ(n, and_test); /* not_test ('and' not_test)* */
1438 anchor = 0;
1439 i = 0;
1440 for (;;) {
1441 com_not_test(c, CHILD(n, i));
1442 if ((i += 2) >= NCH(n))
1443 break;
1444 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1445 com_addbyte(c, POP_TOP);
1446 }
1447 if (anchor)
1448 com_backpatch(c, anchor);
1449}
1450
1451static void
1452com_test(c, n)
1453 struct compiling *c;
1454 node *n;
1455{
Guido van Rossum57531fe1993-11-30 14:57:42 +00001456 REQ(n, test); /* and_test ('and' and_test)* | lambdef */
1457 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
1458 object *v;
1459 int i;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001460 int ndefs = com_argdefs(c, CHILD(n, 0));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001461 v = (object *) icompile(CHILD(n, 0), c);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001462 if (v == NULL) {
1463 c->c_errors++;
1464 i = 255;
1465 }
1466 else {
1467 i = com_addconst(c, v);
1468 DECREF(v);
1469 }
1470 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001471 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001472 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00001473 else {
1474 int anchor = 0;
1475 int i = 0;
1476 for (;;) {
1477 com_and_test(c, CHILD(n, i));
1478 if ((i += 2) >= NCH(n))
1479 break;
1480 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1481 com_addbyte(c, POP_TOP);
1482 }
1483 if (anchor)
1484 com_backpatch(c, anchor);
1485 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001486}
1487
1488static void
Guido van Rossum288a60f1991-12-16 13:05:10 +00001489com_list(c, n, toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001490 struct compiling *c;
1491 node *n;
Guido van Rossum288a60f1991-12-16 13:05:10 +00001492 int toplevel; /* If nonzero, *always* build a tuple */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001493{
1494 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001495 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001496 com_node(c, CHILD(n, 0));
1497 }
1498 else {
1499 int i;
1500 int len;
1501 len = (NCH(n) + 1) / 2;
1502 for (i = 0; i < NCH(n); i += 2)
1503 com_node(c, CHILD(n, i));
1504 com_addoparg(c, BUILD_TUPLE, len);
1505 }
1506}
1507
1508
1509/* Begin of assignment compilation */
1510
1511static void com_assign_name PROTO((struct compiling *, node *, int));
1512static void com_assign PROTO((struct compiling *, node *, int));
1513
1514static void
1515com_assign_attr(c, n, assigning)
1516 struct compiling *c;
1517 node *n;
1518 int assigning;
1519{
1520 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
1521}
1522
1523static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001524com_assign_trailer(c, n, assigning)
1525 struct compiling *c;
1526 node *n;
1527 int assigning;
1528{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001529 REQ(n, trailer);
1530 switch (TYPE(CHILD(n, 0))) {
1531 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum452a9831996-09-17 14:32:04 +00001532 com_error(c, SyntaxError, "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001533 break;
1534 case DOT: /* '.' NAME */
1535 com_assign_attr(c, CHILD(n, 1), assigning);
1536 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001537 case LSQB: /* '[' subscriptlist ']' */
1538 com_subscriptlist(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001539 break;
1540 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001541 com_error(c, SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001542 }
1543}
1544
1545static void
1546com_assign_tuple(c, n, assigning)
1547 struct compiling *c;
1548 node *n;
1549 int assigning;
1550{
1551 int i;
1552 if (TYPE(n) != testlist)
1553 REQ(n, exprlist);
1554 if (assigning)
1555 com_addoparg(c, UNPACK_TUPLE, (NCH(n)+1)/2);
1556 for (i = 0; i < NCH(n); i += 2)
1557 com_assign(c, CHILD(n, i), assigning);
1558}
1559
1560static void
1561com_assign_list(c, n, assigning)
1562 struct compiling *c;
1563 node *n;
1564 int assigning;
1565{
1566 int i;
1567 if (assigning)
1568 com_addoparg(c, UNPACK_LIST, (NCH(n)+1)/2);
1569 for (i = 0; i < NCH(n); i += 2)
1570 com_assign(c, CHILD(n, i), assigning);
1571}
1572
1573static void
1574com_assign_name(c, n, assigning)
1575 struct compiling *c;
1576 node *n;
1577 int assigning;
1578{
1579 REQ(n, NAME);
1580 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
1581}
1582
1583static void
1584com_assign(c, n, assigning)
1585 struct compiling *c;
1586 node *n;
1587 int assigning;
1588{
1589 /* Loop to avoid trivial recursion */
1590 for (;;) {
1591 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001592
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001593 case exprlist:
1594 case testlist:
1595 if (NCH(n) > 1) {
1596 com_assign_tuple(c, n, assigning);
1597 return;
1598 }
1599 n = CHILD(n, 0);
1600 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001601
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001602 case test:
1603 case and_test:
1604 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001605 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001606 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001607 case xor_expr:
1608 case and_expr:
1609 case shift_expr:
1610 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001611 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00001612 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001613 if (NCH(n) > 1) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001614 com_error(c, SyntaxError,
1615 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001616 return;
1617 }
1618 n = CHILD(n, 0);
1619 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001620
Guido van Rossum50564e81996-01-12 01:13:16 +00001621 case power: /* atom trailer* ('**' power)* */
1622/* ('+'|'-'|'~') factor | atom trailer* */
1623 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001624 com_error(c, SyntaxError,
1625 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001626 return;
1627 }
Guido van Rossum50564e81996-01-12 01:13:16 +00001628 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001629 int i;
1630 com_node(c, CHILD(n, 0));
1631 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00001632 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001633 com_error(c, SyntaxError,
1634 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00001635 return;
1636 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001637 com_apply_trailer(c, CHILD(n, i));
1638 } /* NB i is still alive */
1639 com_assign_trailer(c,
1640 CHILD(n, i), assigning);
1641 return;
1642 }
1643 n = CHILD(n, 0);
1644 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001645
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001646 case atom:
1647 switch (TYPE(CHILD(n, 0))) {
1648 case LPAR:
1649 n = CHILD(n, 1);
1650 if (TYPE(n) == RPAR) {
1651 /* XXX Should allow () = () ??? */
Guido van Rossum452a9831996-09-17 14:32:04 +00001652 com_error(c, SyntaxError,
1653 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001654 return;
1655 }
1656 break;
1657 case LSQB:
1658 n = CHILD(n, 1);
1659 if (TYPE(n) == RSQB) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001660 com_error(c, SyntaxError,
1661 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001662 return;
1663 }
1664 com_assign_list(c, n, assigning);
1665 return;
1666 case NAME:
1667 com_assign_name(c, CHILD(n, 0), assigning);
1668 return;
1669 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001670 com_error(c, SyntaxError,
1671 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001672 return;
1673 }
1674 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001675
1676 case lambdef:
Guido van Rossum452a9831996-09-17 14:32:04 +00001677 com_error(c, SyntaxError, "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001678 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001679
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001680 default:
1681 fprintf(stderr, "node type %d\n", TYPE(n));
Guido van Rossum452a9831996-09-17 14:32:04 +00001682 com_error(c, SystemError, "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001683 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001684
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001685 }
1686 }
1687}
1688
1689static void
1690com_expr_stmt(c, n)
1691 struct compiling *c;
1692 node *n;
1693{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001694 REQ(n, expr_stmt); /* testlist ('=' testlist)* */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001695 com_node(c, CHILD(n, NCH(n)-1));
1696 if (NCH(n) == 1) {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001697 if (c->c_interactive)
1698 com_addbyte(c, PRINT_EXPR);
1699 else
1700 com_addbyte(c, POP_TOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001701 }
1702 else {
1703 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001704 for (i = 0; i < NCH(n)-2; i+=2) {
1705 if (i+2 < NCH(n)-2)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001706 com_addbyte(c, DUP_TOP);
Guido van Rossum8861b741996-07-30 16:49:37 +00001707 com_assign(c, CHILD(n, i), OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001708 }
1709 }
1710}
1711
1712static void
1713com_print_stmt(c, n)
1714 struct compiling *c;
1715 node *n;
1716{
1717 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001718 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
1719 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001720 com_node(c, CHILD(n, i));
1721 com_addbyte(c, PRINT_ITEM);
1722 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001723 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001724 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001725 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001726}
1727
1728static void
1729com_return_stmt(c, n)
1730 struct compiling *c;
1731 node *n;
1732{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001733 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001734 if (!c->c_infunction) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001735 com_error(c, SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001736 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001737 if (NCH(n) < 2)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001738 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1739 else
1740 com_node(c, CHILD(n, 1));
1741 com_addbyte(c, RETURN_VALUE);
1742}
1743
1744static void
1745com_raise_stmt(c, n)
1746 struct compiling *c;
1747 node *n;
1748{
Guido van Rossumf10570b1995-07-07 22:53:21 +00001749 REQ(n, raise_stmt); /* 'raise' test [',' test [',' test]] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001750 com_node(c, CHILD(n, 1));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001751 if (NCH(n) > 3) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001752 com_node(c, CHILD(n, 3));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001753 if (NCH(n) > 5)
1754 com_node(c, CHILD(n, 5));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001755 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001756 com_addoparg(c, RAISE_VARARGS, NCH(n)/2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001757}
1758
1759static void
1760com_import_stmt(c, n)
1761 struct compiling *c;
1762 node *n;
1763{
1764 int i;
1765 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001766 /* 'import' dotted_name (',' dotted_name)* |
1767 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001768 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001769 /* 'from' dotted_name 'import' ... */
1770 REQ(CHILD(n, 1), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001771 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
1772 for (i = 3; i < NCH(n); i += 2)
1773 com_addopname(c, IMPORT_FROM, CHILD(n, i));
1774 com_addbyte(c, POP_TOP);
1775 }
1776 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001777 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001778 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001779 REQ(CHILD(n, i), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001780 com_addopname(c, IMPORT_NAME, CHILD(n, i));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001781 com_addopname(c, STORE_NAME, CHILD(CHILD(n, i), 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001782 }
1783 }
1784}
1785
1786static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00001787com_global_stmt(c, n)
1788 struct compiling *c;
1789 node *n;
1790{
1791 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001792 REQ(n, global_stmt);
1793 /* 'global' NAME (',' NAME)* */
1794 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001795 char *s = STR(CHILD(n, i));
Guido van Rossumfe2236f1996-08-24 07:29:04 +00001796#ifdef PRIVATE_NAME_MANGLING
1797 char buffer[256];
1798 if (s != NULL && s[0] == '_' && s[1] == '_' &&
1799 c->c_private != NULL &&
1800 com_mangle(c, s, buffer, (int)sizeof(buffer)))
1801 s = buffer;
1802#endif
Guido van Rossum681d79a1995-07-18 14:51:37 +00001803 if (dictlookup(c->c_locals, s) != NULL) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001804 com_error(c, SyntaxError, "name is local and global");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001805 }
1806 else if (dictinsert(c->c_globals, s, None) != 0)
Guido van Rossumc5e96291991-12-10 13:53:51 +00001807 c->c_errors++;
1808 }
1809}
1810
Guido van Rossum681d79a1995-07-18 14:51:37 +00001811static int
1812com_newlocal_o(c, nameval)
1813 struct compiling *c;
1814 object *nameval;
1815{
1816 int i;
1817 object *ival;
1818 if (getlistsize(c->c_varnames) != c->c_nlocals) {
1819 /* This is usually caused by an error on a previous call */
1820 if (c->c_errors == 0) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001821 com_error(c, SystemError, "mixed up var name/index");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001822 }
1823 return 0;
1824 }
1825 ival = newintobject(i = c->c_nlocals++);
1826 if (ival == NULL)
1827 c->c_errors++;
1828 else if (mappinginsert(c->c_locals, nameval, ival) != 0)
1829 c->c_errors++;
1830 else if (addlistitem(c->c_varnames, nameval) != 0)
1831 c->c_errors++;
1832 XDECREF(ival);
1833 return i;
1834}
1835
1836static int
1837com_addlocal_o(c, nameval)
1838 struct compiling *c;
1839 object *nameval;
1840{
1841 object *ival = mappinglookup(c->c_locals, nameval);
1842 if (ival != NULL)
1843 return getintvalue(ival);
1844 return com_newlocal_o(c, nameval);
1845}
1846
1847static int
1848com_newlocal(c, name)
1849 struct compiling *c;
1850 char *name;
1851{
1852 object *nameval = newstringobject(name);
1853 int i;
1854 if (nameval == NULL) {
1855 c->c_errors++;
1856 return 0;
1857 }
1858 i = com_newlocal_o(c, nameval);
1859 DECREF(nameval);
1860 return i;
1861}
1862
Guido van Rossum25831651993-05-19 14:50:45 +00001863#define strequ(a, b) (strcmp((a), (b)) == 0)
1864
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001865#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum25831651993-05-19 14:50:45 +00001866static void
1867com_access_stmt(c, n)
1868 struct compiling *c;
1869 node *n;
1870{
1871 int i, j, k, mode, imode;
1872 object *vmode;
1873 REQ(n, access_stmt);
1874 /* 'access' NAME (',' NAME)* ':' accesstype (',' accesstype)*
1875 accesstype: NAME+ */
1876
1877 /* Find where the colon is */
1878 i = 1;
1879 while (TYPE(CHILD(n,i-1)) != COLON)
1880 i += 1;
1881
1882 /* Calculate the mode mask */
1883 mode = 0;
1884 for (j = i; j < NCH(n); j += 2) {
Guido van Rossum81daa321993-05-20 14:24:46 +00001885 int r = 0, w = 0, p = 0;
1886 for (k = 0; k < NCH(CHILD(n,j)); k++) {
Guido van Rossum25831651993-05-19 14:50:45 +00001887 if (strequ(STR(CHILD(CHILD(n,j),k)), "public"))
1888 p = 0;
1889 else if (strequ(STR(CHILD(CHILD(n,j),k)), "protected"))
1890 p = 1;
1891 else if (strequ(STR(CHILD(CHILD(n,j),k)), "private"))
1892 p = 2;
1893 else if (strequ(STR(CHILD(CHILD(n,j),k)), "read"))
1894 r = 1;
1895 else if (strequ(STR(CHILD(CHILD(n,j),k)), "write"))
1896 w = 1;
1897 else /* XXX should make this an exception */
1898 fprintf(stderr, "bad access type %s\n",
1899 STR(CHILD(CHILD(n,j),k)));
1900 }
1901 if (r == 0 && w == 0)
Guido van Rossum81daa321993-05-20 14:24:46 +00001902 r = w = 1;
Guido van Rossum25831651993-05-19 14:50:45 +00001903 if (p == 0) {
1904 if (r == 1) mode |= AC_R_PUBLIC;
1905 if (w == 1) mode |= AC_W_PUBLIC;
1906 } else if (p == 1) {
1907 if (r == 1) mode |= AC_R_PROTECTED;
1908 if (w == 1) mode |= AC_W_PROTECTED;
1909 } else {
1910 if (r == 1) mode |= AC_R_PRIVATE;
1911 if (w == 1) mode |= AC_W_PRIVATE;
1912 }
1913 }
1914 vmode = newintobject((long)mode);
1915 imode = com_addconst(c, vmode);
1916 XDECREF(vmode);
1917 for (i = 1; TYPE(CHILD(n,i-1)) != COLON; i+=2) {
1918 com_addoparg(c, LOAD_CONST, imode);
1919 com_addopname(c, ACCESS_MODE, CHILD(n, i));
1920 }
1921}
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001922#endif
Guido van Rossum25831651993-05-19 14:50:45 +00001923
Guido van Rossumc5e96291991-12-10 13:53:51 +00001924static void
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001925com_exec_stmt(c, n)
1926 struct compiling *c;
1927 node *n;
1928{
1929 REQ(n, exec_stmt);
1930 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
1931 com_node(c, CHILD(n, 1));
1932 if (NCH(n) >= 4)
1933 com_node(c, CHILD(n, 3));
1934 else
1935 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1936 if (NCH(n) >= 6)
1937 com_node(c, CHILD(n, 5));
1938 else
1939 com_addbyte(c, DUP_TOP);
1940 com_addbyte(c, EXEC_STMT);
1941}
1942
1943static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001944com_if_stmt(c, n)
1945 struct compiling *c;
1946 node *n;
1947{
1948 int i;
1949 int anchor = 0;
1950 REQ(n, if_stmt);
1951 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
1952 for (i = 0; i+3 < NCH(n); i+=4) {
1953 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001954 node *ch = CHILD(n, i+1);
1955 if (i > 0)
1956 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001957 com_node(c, CHILD(n, i+1));
1958 com_addfwref(c, JUMP_IF_FALSE, &a);
1959 com_addbyte(c, POP_TOP);
1960 com_node(c, CHILD(n, i+3));
1961 com_addfwref(c, JUMP_FORWARD, &anchor);
1962 com_backpatch(c, a);
1963 com_addbyte(c, POP_TOP);
1964 }
1965 if (i+2 < NCH(n))
1966 com_node(c, CHILD(n, i+2));
1967 com_backpatch(c, anchor);
1968}
1969
1970static void
1971com_while_stmt(c, n)
1972 struct compiling *c;
1973 node *n;
1974{
1975 int break_anchor = 0;
1976 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001977 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001978 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
1979 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001980 block_push(c, SETUP_LOOP);
1981 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001982 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001983 com_node(c, CHILD(n, 1));
1984 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1985 com_addbyte(c, POP_TOP);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001986 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001987 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001988 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001989 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1990 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001991 com_backpatch(c, anchor);
1992 com_addbyte(c, POP_TOP);
1993 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001994 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001995 if (NCH(n) > 4)
1996 com_node(c, CHILD(n, 6));
1997 com_backpatch(c, break_anchor);
1998}
1999
2000static void
2001com_for_stmt(c, n)
2002 struct compiling *c;
2003 node *n;
2004{
2005 object *v;
2006 int break_anchor = 0;
2007 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002008 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002009 REQ(n, for_stmt);
2010 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2011 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002012 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002013 com_node(c, CHILD(n, 3));
2014 v = newintobject(0L);
2015 if (v == NULL)
2016 c->c_errors++;
2017 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
2018 XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002019 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002020 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002021 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8861b741996-07-30 16:49:37 +00002022 com_assign(c, CHILD(n, 1), OP_ASSIGN);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002023 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002024 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002025 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002026 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2027 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002028 com_backpatch(c, anchor);
2029 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002030 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002031 if (NCH(n) > 8)
2032 com_node(c, CHILD(n, 8));
2033 com_backpatch(c, break_anchor);
2034}
2035
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002036/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002037
2038 SETUP_FINALLY L
2039 <code for S>
2040 POP_BLOCK
2041 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002042 L: <code for Sf>
2043 END_FINALLY
2044
2045 The special instructions use the block stack. Each block
2046 stack entry contains the instruction that created it (here
2047 SETUP_FINALLY), the level of the value stack at the time the
2048 block stack entry was created, and a label (here L).
2049
2050 SETUP_FINALLY:
2051 Pushes the current value stack level and the label
2052 onto the block stack.
2053 POP_BLOCK:
2054 Pops en entry from the block stack, and pops the value
2055 stack until its level is the same as indicated on the
2056 block stack. (The label is ignored.)
2057 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002058 Pops a variable number of entries from the *value* stack
2059 and re-raises the exception they specify. The number of
2060 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002061
2062 The block stack is unwound when an exception is raised:
2063 when a SETUP_FINALLY entry is found, the exception is pushed
2064 onto the value stack (and the exception condition is cleared),
2065 and the interpreter jumps to the label gotten from the block
2066 stack.
2067
2068 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002069 (The contents of the value stack is shown in [], with the top
2070 at the right; 'tb' is trace-back info, 'val' the exception's
2071 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002072
2073 Value stack Label Instruction Argument
2074 [] SETUP_EXCEPT L1
2075 [] <code for S>
2076 [] POP_BLOCK
2077 [] JUMP_FORWARD L0
2078
Guido van Rossum3f5da241990-12-20 15:06:42 +00002079 [tb, val, exc] L1: DUP )
2080 [tb, val, exc, exc] <evaluate E1> )
2081 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2082 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2083 [tb, val, exc, 1] POP )
2084 [tb, val, exc] POP
2085 [tb, val] <assign to V1> (or POP if no V1)
2086 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002087 [] <code for S1>
2088 JUMP_FORWARD L0
2089
Guido van Rossum3f5da241990-12-20 15:06:42 +00002090 [tb, val, exc, 0] L2: POP
2091 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002092 .............................etc.......................
2093
Guido van Rossum3f5da241990-12-20 15:06:42 +00002094 [tb, val, exc, 0] Ln+1: POP
2095 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002096
2097 [] L0: <next statement>
2098
2099 Of course, parts are not generated if Vi or Ei is not present.
2100*/
2101
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002102static void
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002103com_try_except(c, n)
2104 struct compiling *c;
2105 node *n;
2106{
2107 int except_anchor = 0;
2108 int end_anchor = 0;
2109 int else_anchor = 0;
2110 int i;
2111 node *ch;
2112
2113 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2114 block_push(c, SETUP_EXCEPT);
2115 com_node(c, CHILD(n, 2));
2116 com_addbyte(c, POP_BLOCK);
2117 block_pop(c, SETUP_EXCEPT);
2118 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2119 com_backpatch(c, except_anchor);
2120 for (i = 3;
2121 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2122 i += 3) {
2123 /* except_clause: 'except' [expr [',' expr]] */
2124 if (except_anchor == 0) {
Guido van Rossum452a9831996-09-17 14:32:04 +00002125 com_error(c, SyntaxError,
2126 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002127 break;
2128 }
2129 except_anchor = 0;
2130 com_addoparg(c, SET_LINENO, ch->n_lineno);
2131 if (NCH(ch) > 1) {
2132 com_addbyte(c, DUP_TOP);
2133 com_node(c, CHILD(ch, 1));
2134 com_addoparg(c, COMPARE_OP, EXC_MATCH);
2135 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
2136 com_addbyte(c, POP_TOP);
2137 }
2138 com_addbyte(c, POP_TOP);
2139 if (NCH(ch) > 3)
Guido van Rossum8861b741996-07-30 16:49:37 +00002140 com_assign(c, CHILD(ch, 3), OP_ASSIGN);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002141 else
2142 com_addbyte(c, POP_TOP);
2143 com_addbyte(c, POP_TOP);
2144 com_node(c, CHILD(n, i+2));
2145 com_addfwref(c, JUMP_FORWARD, &end_anchor);
2146 if (except_anchor) {
2147 com_backpatch(c, except_anchor);
2148 com_addbyte(c, POP_TOP);
2149 }
2150 }
2151 com_addbyte(c, END_FINALLY);
2152 com_backpatch(c, else_anchor);
2153 if (i < NCH(n))
2154 com_node(c, CHILD(n, i+2));
2155 com_backpatch(c, end_anchor);
2156}
2157
2158static void
2159com_try_finally(c, n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002160 struct compiling *c;
2161 node *n;
2162{
2163 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002164 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002165
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002166 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
2167 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002168 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002169 com_addbyte(c, POP_BLOCK);
2170 block_pop(c, SETUP_FINALLY);
2171 block_push(c, END_FINALLY);
2172 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2173 com_backpatch(c, finally_anchor);
2174 ch = CHILD(n, NCH(n)-1);
2175 com_addoparg(c, SET_LINENO, ch->n_lineno);
2176 com_node(c, ch);
2177 com_addbyte(c, END_FINALLY);
2178 block_pop(c, END_FINALLY);
2179}
2180
2181static void
2182com_try_stmt(c, n)
2183 struct compiling *c;
2184 node *n;
2185{
2186 REQ(n, try_stmt);
2187 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
2188 | 'try' ':' suite 'finally' ':' suite */
2189 if (TYPE(CHILD(n, 3)) != except_clause)
2190 com_try_finally(c, n);
2191 else
2192 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002193}
2194
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002195static object *
2196get_docstring(n)
2197 node *n;
2198{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002199 int i;
2200
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002201 switch (TYPE(n)) {
2202
2203 case suite:
2204 if (NCH(n) == 1)
2205 return get_docstring(CHILD(n, 0));
2206 else {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002207 for (i = 0; i < NCH(n); i++) {
2208 node *ch = CHILD(n, i);
2209 if (TYPE(ch) == stmt)
2210 return get_docstring(ch);
2211 }
2212 }
2213 break;
2214
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002215 case file_input:
2216 for (i = 0; i < NCH(n); i++) {
2217 node *ch = CHILD(n, i);
2218 if (TYPE(ch) == stmt)
2219 return get_docstring(ch);
2220 }
2221 break;
2222
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002223 case stmt:
2224 case simple_stmt:
2225 case small_stmt:
2226 return get_docstring(CHILD(n, 0));
2227
2228 case expr_stmt:
2229 case testlist:
2230 case test:
2231 case and_test:
2232 case not_test:
2233 case comparison:
2234 case expr:
2235 case xor_expr:
2236 case and_expr:
2237 case shift_expr:
2238 case arith_expr:
2239 case term:
2240 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00002241 case power:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002242 if (NCH(n) == 1)
2243 return get_docstring(CHILD(n, 0));
2244 break;
2245
2246 case atom:
2247 if (TYPE(CHILD(n, 0)) == STRING)
2248 return parsestrplus(n);
2249 break;
2250
2251 }
2252 return NULL;
2253}
2254
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002255static void
2256com_suite(c, n)
2257 struct compiling *c;
2258 node *n;
2259{
2260 REQ(n, suite);
2261 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
2262 if (NCH(n) == 1) {
2263 com_node(c, CHILD(n, 0));
2264 }
2265 else {
2266 int i;
2267 for (i = 0; i < NCH(n); i++) {
2268 node *ch = CHILD(n, i);
2269 if (TYPE(ch) == stmt)
2270 com_node(c, ch);
2271 }
2272 }
2273}
2274
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002275/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002276static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002277com_continue_stmt(c, n)
2278 struct compiling *c;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002279 node *n; /* Not used, but passed for consistency */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002280{
2281 int i = c->c_nblocks;
2282 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
2283 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2284 }
2285 else {
Guido van Rossum452a9831996-09-17 14:32:04 +00002286 com_error(c, SyntaxError, "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002287 }
2288 /* XXX Could allow it inside a 'finally' clause
2289 XXX if we could pop the exception still on the stack */
2290}
2291
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002292static int
Guido van Rossum681d79a1995-07-18 14:51:37 +00002293com_argdefs(c, n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002294 struct compiling *c;
2295 node *n;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002296{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002297 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002298 if (TYPE(n) == lambdef) {
2299 /* lambdef: 'lambda' [varargslist] ':' test */
2300 n = CHILD(n, 1);
2301 }
2302 else {
2303 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
2304 n = CHILD(n, 2);
2305 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
2306 n = CHILD(n, 1);
2307 }
2308 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002309 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002310 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002311 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002312 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
2313 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002314 nargs = 0;
2315 ndefs = 0;
2316 for (i = 0; i < nch; i++) {
2317 int t;
Guido van Rossum50564e81996-01-12 01:13:16 +00002318 if (TYPE(CHILD(n, i)) == STAR || TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002319 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002320 nargs++;
2321 i++;
2322 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00002323 t = RPAR; /* Anything except EQUAL or COMMA */
2324 else
2325 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002326 if (t == EQUAL) {
2327 i++;
2328 ndefs++;
2329 com_node(c, CHILD(n, i));
2330 i++;
2331 if (i >= nch)
2332 break;
2333 t = TYPE(CHILD(n, i));
2334 }
2335 else {
2336 /* Treat "(a=1, b)" as "(a=1, b=None)" */
2337 if (ndefs) {
2338 com_addoparg(c, LOAD_CONST,
2339 com_addconst(c, None));
2340 ndefs++;
2341 }
2342 }
2343 if (t != COMMA)
2344 break;
2345 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002346 return ndefs;
2347}
2348
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002349static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002350com_funcdef(c, n)
2351 struct compiling *c;
2352 node *n;
2353{
2354 object *v;
2355 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00002356 v = (object *)icompile(n, c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002357 if (v == NULL)
2358 c->c_errors++;
2359 else {
2360 int i = com_addconst(c, v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002361 int ndefs = com_argdefs(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002362 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002363 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002364 com_addopname(c, STORE_NAME, CHILD(n, 1));
2365 DECREF(v);
2366 }
2367}
2368
2369static void
Guido van Rossum25831651993-05-19 14:50:45 +00002370com_bases(c, n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002371 struct compiling *c;
2372 node *n;
2373{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002374 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002375 REQ(n, testlist);
2376 /* testlist: test (',' test)* [','] */
2377 for (i = 0; i < NCH(n); i += 2)
2378 com_node(c, CHILD(n, i));
2379 com_addoparg(c, BUILD_TUPLE, (NCH(n)+1) / 2);
2380}
2381
2382static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002383com_classdef(c, n)
2384 struct compiling *c;
2385 node *n;
2386{
Guido van Rossum25831651993-05-19 14:50:45 +00002387 int i;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002388 object *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002389 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00002390 /* classdef: class NAME ['(' testlist ')'] ':' suite */
2391 if ((v = newstringobject(STR(CHILD(n, 1)))) == NULL) {
2392 c->c_errors++;
2393 return;
2394 }
2395 /* Push the class name on the stack */
2396 i = com_addconst(c, v);
2397 com_addoparg(c, LOAD_CONST, i);
2398 DECREF(v);
2399 /* Push the tuple of base classes on the stack */
2400 if (TYPE(CHILD(n, 2)) != LPAR)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002401 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum25831651993-05-19 14:50:45 +00002402 else
2403 com_bases(c, CHILD(n, 3));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00002404 v = (object *)icompile(n, c);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002405 if (v == NULL)
2406 c->c_errors++;
2407 else {
Guido van Rossum25831651993-05-19 14:50:45 +00002408 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002409 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002410 com_addoparg(c, MAKE_FUNCTION, 0);
2411 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002412 com_addbyte(c, BUILD_CLASS);
2413 com_addopname(c, STORE_NAME, CHILD(n, 1));
2414 DECREF(v);
2415 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002416}
2417
2418static void
2419com_node(c, n)
2420 struct compiling *c;
2421 node *n;
2422{
2423 switch (TYPE(n)) {
2424
2425 /* Definition nodes */
2426
2427 case funcdef:
2428 com_funcdef(c, n);
2429 break;
2430 case classdef:
2431 com_classdef(c, n);
2432 break;
2433
2434 /* Trivial parse tree nodes */
2435
2436 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002437 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002438 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002439 com_node(c, CHILD(n, 0));
2440 break;
2441
2442 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002443 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
2444 com_addoparg(c, SET_LINENO, n->n_lineno);
2445 {
2446 int i;
2447 for (i = 0; i < NCH(n)-1; i += 2)
2448 com_node(c, CHILD(n, i));
2449 }
2450 break;
2451
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002452 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002453 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002454 com_node(c, CHILD(n, 0));
2455 break;
2456
2457 /* Statement nodes */
2458
2459 case expr_stmt:
2460 com_expr_stmt(c, n);
2461 break;
2462 case print_stmt:
2463 com_print_stmt(c, n);
2464 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002465 case del_stmt: /* 'del' exprlist */
Guido van Rossum8861b741996-07-30 16:49:37 +00002466 com_assign(c, CHILD(n, 1), OP_DELETE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002467 break;
2468 case pass_stmt:
2469 break;
2470 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002471 if (c->c_loops == 0) {
Guido van Rossum452a9831996-09-17 14:32:04 +00002472 com_error(c, SyntaxError, "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002473 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002474 com_addbyte(c, BREAK_LOOP);
2475 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002476 case continue_stmt:
2477 com_continue_stmt(c, n);
2478 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002479 case return_stmt:
2480 com_return_stmt(c, n);
2481 break;
2482 case raise_stmt:
2483 com_raise_stmt(c, n);
2484 break;
2485 case import_stmt:
2486 com_import_stmt(c, n);
2487 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002488 case global_stmt:
2489 com_global_stmt(c, n);
2490 break;
Guido van Rossum0dfcf751996-08-12 22:00:53 +00002491#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum25831651993-05-19 14:50:45 +00002492 case access_stmt:
2493 com_access_stmt(c, n);
2494 break;
Guido van Rossum0dfcf751996-08-12 22:00:53 +00002495#endif
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002496 case exec_stmt:
2497 com_exec_stmt(c, n);
2498 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002499 case if_stmt:
2500 com_if_stmt(c, n);
2501 break;
2502 case while_stmt:
2503 com_while_stmt(c, n);
2504 break;
2505 case for_stmt:
2506 com_for_stmt(c, n);
2507 break;
2508 case try_stmt:
2509 com_try_stmt(c, n);
2510 break;
2511 case suite:
2512 com_suite(c, n);
2513 break;
2514
2515 /* Expression nodes */
2516
2517 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002518 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002519 break;
2520 case test:
2521 com_test(c, n);
2522 break;
2523 case and_test:
2524 com_and_test(c, n);
2525 break;
2526 case not_test:
2527 com_not_test(c, n);
2528 break;
2529 case comparison:
2530 com_comparison(c, n);
2531 break;
2532 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002533 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002534 break;
2535 case expr:
2536 com_expr(c, n);
2537 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002538 case xor_expr:
2539 com_xor_expr(c, n);
2540 break;
2541 case and_expr:
2542 com_and_expr(c, n);
2543 break;
2544 case shift_expr:
2545 com_shift_expr(c, n);
2546 break;
2547 case arith_expr:
2548 com_arith_expr(c, n);
2549 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002550 case term:
2551 com_term(c, n);
2552 break;
2553 case factor:
2554 com_factor(c, n);
2555 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00002556 case power:
2557 com_power(c, n);
2558 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002559 case atom:
2560 com_atom(c, n);
2561 break;
2562
2563 default:
2564 fprintf(stderr, "node type %d\n", TYPE(n));
Guido van Rossum452a9831996-09-17 14:32:04 +00002565 com_error(c, SystemError, "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002566 }
2567}
2568
2569static void com_fplist PROTO((struct compiling *, node *));
2570
2571static void
2572com_fpdef(c, n)
2573 struct compiling *c;
2574 node *n;
2575{
2576 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
2577 if (TYPE(CHILD(n, 0)) == LPAR)
2578 com_fplist(c, CHILD(n, 1));
2579 else
Guido van Rossum681d79a1995-07-18 14:51:37 +00002580 com_addoparg(c, STORE_FAST, com_newlocal(c, STR(CHILD(n, 0))));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002581}
2582
2583static void
2584com_fplist(c, n)
2585 struct compiling *c;
2586 node *n;
2587{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00002588 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002589 if (NCH(n) == 1) {
2590 com_fpdef(c, CHILD(n, 0));
2591 }
2592 else {
2593 int i;
2594 com_addoparg(c, UNPACK_TUPLE, (NCH(n)+1)/2);
2595 for (i = 0; i < NCH(n); i += 2)
2596 com_fpdef(c, CHILD(n, i));
2597 }
2598}
2599
2600static void
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002601com_arglist(c, n)
2602 struct compiling *c;
2603 node *n;
2604{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002605 int nch, i;
2606 int complex = 0;
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002607 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00002608 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002609 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002610 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002611 /* Enter all arguments in table of locals */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002612 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002613 node *ch = CHILD(n, i);
2614 node *fp;
2615 char *name;
Guido van Rossum50564e81996-01-12 01:13:16 +00002616 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002617 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002618 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
2619 fp = CHILD(ch, 0);
2620 if (TYPE(fp) == NAME)
2621 name = STR(fp);
2622 else {
2623 name = "";
Guido van Rossum530956d1996-07-21 02:27:43 +00002624 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002625 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002626 com_newlocal(c, name);
2627 c->c_argcount++;
2628 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002629 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002630 ch = CHILD(n, i);
2631 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002632 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002633 else
2634 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002635 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002636 /* Handle *arguments */
2637 if (i < nch) {
2638 node *ch;
2639 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00002640 if (TYPE(ch) != DOUBLESTAR) {
2641 REQ(ch, STAR);
2642 ch = CHILD(n, i+1);
2643 if (TYPE(ch) == NAME) {
2644 c->c_flags |= CO_VARARGS;
2645 i += 3;
2646 com_newlocal(c, STR(ch));
2647 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002648 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002649 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002650 /* Handle **keywords */
2651 if (i < nch) {
2652 node *ch;
2653 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00002654 if (TYPE(ch) != DOUBLESTAR) {
2655 REQ(ch, STAR);
2656 ch = CHILD(n, i+1);
2657 REQ(ch, STAR);
2658 ch = CHILD(n, i+2);
2659 }
2660 else
2661 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002662 REQ(ch, NAME);
2663 c->c_flags |= CO_VARKEYWORDS;
2664 com_newlocal(c, STR(ch));
2665 }
2666 if (complex) {
2667 /* Generate code for complex arguments only after
2668 having counted the simple arguments */
2669 int ilocal = 0;
2670 for (i = 0; i < nch; i++) {
2671 node *ch = CHILD(n, i);
2672 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00002673 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002674 break;
2675 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
2676 fp = CHILD(ch, 0);
2677 if (TYPE(fp) != NAME) {
2678 com_addoparg(c, LOAD_FAST, ilocal);
2679 com_fpdef(c, ch);
2680 }
2681 ilocal++;
2682 if (++i >= nch)
2683 break;
2684 ch = CHILD(n, i);
2685 if (TYPE(ch) == EQUAL)
2686 i += 2;
2687 else
2688 REQ(ch, COMMA);
2689 }
2690 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002691}
2692
2693static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002694com_file_input(c, n)
2695 struct compiling *c;
2696 node *n;
2697{
2698 int i;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002699 object *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002700 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002701 doc = get_docstring(n);
2702 if (doc != NULL) {
2703 int i = com_addconst(c, doc);
2704 DECREF(doc);
2705 com_addoparg(c, LOAD_CONST, i);
2706 com_addopnamestr(c, STORE_NAME, "__doc__");
2707 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002708 for (i = 0; i < NCH(n); i++) {
2709 node *ch = CHILD(n, i);
2710 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
2711 com_node(c, ch);
2712 }
2713}
2714
2715/* Top-level compile-node interface */
2716
2717static void
2718compile_funcdef(c, n)
2719 struct compiling *c;
2720 node *n;
2721{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002722 object *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002723 node *ch;
2724 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00002725 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002726 doc = get_docstring(CHILD(n, 4));
2727 if (doc != NULL) {
2728 (void) com_addconst(c, doc);
2729 DECREF(doc);
2730 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002731 else
2732 (void) com_addconst(c, None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002733 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
2734 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00002735 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002736 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002737 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002738 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002739 c->c_infunction = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002740 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2741 com_addbyte(c, RETURN_VALUE);
2742}
2743
2744static void
Guido van Rossum590baa41993-11-30 13:40:46 +00002745compile_lambdef(c, n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002746 struct compiling *c;
2747 node *n;
2748{
Guido van Rossum590baa41993-11-30 13:40:46 +00002749 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002750 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00002751 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00002752
2753 ch = CHILD(n, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002754 (void) com_addconst(c, None); /* No docstring */
2755 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00002756 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002757 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00002758 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002759 else
2760 ch = CHILD(n, 2);
2761 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002762 com_addbyte(c, RETURN_VALUE);
2763}
2764
2765static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002766compile_classdef(c, n)
2767 struct compiling *c;
2768 node *n;
2769{
2770 node *ch;
2771 object *doc;
2772 REQ(n, classdef);
2773 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
2774 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00002775#ifdef PRIVATE_NAME_MANGLING
2776 c->c_private = c->c_name;
2777#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002778 ch = CHILD(n, NCH(n)-1); /* The suite */
2779 doc = get_docstring(ch);
2780 if (doc != NULL) {
2781 int i = com_addconst(c, doc);
2782 DECREF(doc);
2783 com_addoparg(c, LOAD_CONST, i);
2784 com_addopnamestr(c, STORE_NAME, "__doc__");
2785 }
2786 else
2787 (void) com_addconst(c, None);
2788 com_node(c, ch);
2789 com_addbyte(c, LOAD_LOCALS);
2790 com_addbyte(c, RETURN_VALUE);
2791}
2792
2793static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002794compile_node(c, n)
2795 struct compiling *c;
2796 node *n;
2797{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002798 com_addoparg(c, SET_LINENO, n->n_lineno);
2799
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002800 switch (TYPE(n)) {
2801
Guido van Rossum4c417781991-01-21 16:09:22 +00002802 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002803 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002804 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002805 n = CHILD(n, 0);
2806 if (TYPE(n) != NEWLINE)
2807 com_node(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002808 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2809 com_addbyte(c, RETURN_VALUE);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002810 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002811 break;
2812
Guido van Rossum4c417781991-01-21 16:09:22 +00002813 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002814 com_file_input(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002815 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2816 com_addbyte(c, RETURN_VALUE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002817 break;
2818
Guido van Rossum590baa41993-11-30 13:40:46 +00002819 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00002820 com_node(c, CHILD(n, 0));
2821 com_addbyte(c, RETURN_VALUE);
2822 break;
2823
Guido van Rossum590baa41993-11-30 13:40:46 +00002824 case lambdef: /* anonymous function definition */
2825 compile_lambdef(c, n);
2826 break;
2827
Guido van Rossum4c417781991-01-21 16:09:22 +00002828 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002829 compile_funcdef(c, n);
2830 break;
2831
Guido van Rossum4c417781991-01-21 16:09:22 +00002832 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002833 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002834 break;
2835
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002836 default:
2837 fprintf(stderr, "node type %d\n", TYPE(n));
Guido van Rossum452a9831996-09-17 14:32:04 +00002838 com_error(c, SystemError,
2839 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002840 }
2841}
2842
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002843/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00002844
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002845 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
2846 instructions that refer to local variables with LOAD_FAST etc.
2847 The latter instructions are much faster because they don't need to
2848 look up the variable name in a dictionary.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002849
Guido van Rossum681d79a1995-07-18 14:51:37 +00002850 To find all local variables, we check all STORE_NAME, IMPORT_FROM
2851 and DELETE_NAME instructions. This yields all local variables,
2852 function definitions, class definitions and import statements.
2853 Argument names have already been entered into the list by the
2854 special processing for the argument list.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002855
2856 All remaining LOAD_NAME instructions must refer to non-local (global
2857 or builtin) variables, so are replaced by LOAD_GLOBAL.
2858
2859 There are two problems: 'from foo import *' and 'exec' may introduce
2860 local variables that we can't know while compiling. If this is the
Guido van Rossum681d79a1995-07-18 14:51:37 +00002861 case, we can still optimize bona fide locals (since those
2862 statements will be surrounded by fast_2_locals() and
2863 locals_2_fast()), but we can't change LOAD_NAME to LOAD_GLOBAL.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002864
Guido van Rossum681d79a1995-07-18 14:51:37 +00002865 NB: this modifies the string object c->c_code! */
Guido van Rossum282914b1991-04-04 10:42:56 +00002866
2867static void
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002868optimize(c)
2869 struct compiling *c;
Guido van Rossum282914b1991-04-04 10:42:56 +00002870{
Guido van Rossum0a697f61991-04-16 08:39:12 +00002871 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00002872 int opcode;
Guido van Rossum80bb9651996-12-05 23:27:02 +00002873 int oparg = 0;
Guido van Rossum282914b1991-04-04 10:42:56 +00002874 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002875 object *error_type, *error_value, *error_traceback;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002876
Guido van Rossum282914b1991-04-04 10:42:56 +00002877#define NEXTOP() (*next_instr++)
2878#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
2879#define GETITEM(v, i) (getlistitem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002880#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
2881
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002882 err_fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002883
2884 c->c_flags |= CO_OPTIMIZED;
Guido van Rossum282914b1991-04-04 10:42:56 +00002885
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002886 next_instr = (unsigned char *) getstringvalue(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00002887 for (;;) {
2888 opcode = NEXTOP();
2889 if (opcode == STOP_CODE)
2890 break;
2891 if (HAS_ARG(opcode))
2892 oparg = NEXTARG();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002893 switch (opcode) {
2894 case STORE_NAME:
2895 case DELETE_NAME:
2896 case IMPORT_FROM:
2897 com_addlocal_o(c, GETNAMEOBJ(oparg));
2898 break;
2899 case EXEC_STMT:
2900 c->c_flags &= ~CO_OPTIMIZED;
2901 break;
Guido van Rossum282914b1991-04-04 10:42:56 +00002902 }
2903 }
2904
Guido van Rossum681d79a1995-07-18 14:51:37 +00002905 if (dictlookup(c->c_locals, "*") != NULL)
2906 c->c_flags &= ~CO_OPTIMIZED;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002907
2908 next_instr = (unsigned char *) getstringvalue(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00002909 for (;;) {
2910 cur_instr = next_instr;
2911 opcode = NEXTOP();
2912 if (opcode == STOP_CODE)
2913 break;
2914 if (HAS_ARG(opcode))
2915 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002916 if (opcode == LOAD_NAME ||
2917 opcode == STORE_NAME ||
2918 opcode == DELETE_NAME) {
2919 object *v;
2920 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00002921 name = GETNAMEOBJ(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002922 v = dict2lookup(c->c_locals, name);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002923 if (v == NULL) {
Guido van Rossum83163251991-08-16 08:58:43 +00002924 err_clear();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002925 if (opcode == LOAD_NAME &&
2926 (c->c_flags&CO_OPTIMIZED))
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002927 cur_instr[0] = LOAD_GLOBAL;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002928 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00002929 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002930 i = getintvalue(v);
2931 switch (opcode) {
2932 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
2933 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
2934 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
2935 }
2936 cur_instr[1] = i & 0xff;
2937 cur_instr[2] = (i>>8) & 0xff;
Guido van Rossum282914b1991-04-04 10:42:56 +00002938 }
2939 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002940
Guido van Rossum681d79a1995-07-18 14:51:37 +00002941 if (c->c_errors == 0)
2942 err_restore(error_type, error_value, error_traceback);
Guido van Rossum282914b1991-04-04 10:42:56 +00002943}
2944
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002945codeobject *
Guido van Rossum590baa41993-11-30 13:40:46 +00002946compile(n, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002947 node *n;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002948 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002949{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00002950 return jcompile(n, filename, NULL);
2951}
2952
2953static codeobject *
2954icompile(n, base)
2955 node *n;
2956 struct compiling *base;
2957{
2958 return jcompile(n, base->c_filename, base);
2959}
2960
2961static codeobject *
2962jcompile(n, filename, base)
2963 node *n;
2964 char *filename;
2965 struct compiling *base;
2966{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002967 struct compiling sc;
2968 codeobject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00002969 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002970 return NULL;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00002971#ifdef PRIVATE_NAME_MANGLING
2972 if (base)
2973 sc.c_private = base->c_private;
2974 else
2975 sc.c_private = NULL;
2976#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002977 compile_node(&sc, n);
2978 com_done(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002979 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002980 optimize(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002981 sc.c_flags |= CO_NEWLOCALS;
2982 }
2983 else if (TYPE(n) == classdef)
2984 sc.c_flags |= CO_NEWLOCALS;
Guido van Rossum9bfef441993-03-29 10:43:31 +00002985 co = NULL;
2986 if (sc.c_errors == 0) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002987 object *consts, *names, *varnames, *filename, *name;
2988 consts = listtuple(sc.c_consts);
2989 names = listtuple(sc.c_names);
2990 varnames = listtuple(sc.c_varnames);
2991 filename = newstringobject(sc.c_filename);
2992 name = newstringobject(sc.c_name);
2993 if (!err_occurred())
2994 co = newcodeobject(sc.c_argcount,
2995 sc.c_nlocals,
2996 sc.c_flags,
2997 sc.c_code,
2998 consts,
2999 names,
3000 varnames,
3001 filename,
3002 name);
3003 XDECREF(consts);
3004 XDECREF(names);
3005 XDECREF(varnames);
3006 XDECREF(filename);
3007 XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003008 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003009 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003010 return co;
3011}