blob: a772d79e71df173c0cfc15cdd23407724a875167 [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 Rossum8b993a91997-01-17 21:04:03 +000035 XXX add __doc__ attribute == co_doc to code object attributes?
36 XXX (it's currently the first item of the co_const tuple)
Guido van Rossum3f5da241990-12-20 15:06:42 +000037 XXX Generate simple jump for break/return outside 'try...finally'
Guido van Rossum8b993a91997-01-17 21:04:03 +000038 XXX Allow 'continue' inside try-finally
Guido van Rossum681d79a1995-07-18 14:51:37 +000039 XXX get rid of SET_LINENO instructions, use JAR's table trick
40 XXX (need an option to put them back in, for debugger!)
Guido van Rossum8b993a91997-01-17 21:04:03 +000041 XXX New 1-byte opcode for loading None
42 XXX New opcode for loading the initial index for a for loop
Guido van Rossum681d79a1995-07-18 14:51:37 +000043 XXX other JAR tricks?
Guido van Rossum3f5da241990-12-20 15:06:42 +000044*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +000045
Guido van Rossum8ff077b1996-08-24 06:21:31 +000046#ifndef NO_PRIVATE_NAME_MANGLING
47#define PRIVATE_NAME_MANGLING
48#endif
49
Guido van Rossum3f5da241990-12-20 15:06:42 +000050#include "allobjects.h"
51
Guido van Rossum10dc2e81990-11-18 17:27:39 +000052#include "node.h"
53#include "token.h"
54#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000055#include "compile.h"
56#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000057#include "structmember.h"
58
59#include <ctype.h>
Guido van Rossumf1dc5661993-07-05 10:31:29 +000060#include <errno.h>
Guido van Rossum282914b1991-04-04 10:42:56 +000061
Guido van Rossum8861b741996-07-30 16:49:37 +000062#define OP_DELETE 0
63#define OP_ASSIGN 1
64#define OP_APPLY 2
65
Guido van Rossum3f5da241990-12-20 15:06:42 +000066#define OFF(x) offsetof(codeobject, x)
67
68static struct memberlist code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000069 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
70 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000071 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000072 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000073 {"co_code", T_OBJECT, OFF(co_code), READONLY},
74 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
75 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000076 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000077 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000078 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000079 {NULL} /* Sentinel */
80};
81
82static object *
83code_getattr(co, name)
84 codeobject *co;
85 char *name;
86{
87 return getmember((char *)co, code_memberlist, name);
88}
Guido van Rossum10dc2e81990-11-18 17:27:39 +000089
90static void
Guido van Rossum3f5da241990-12-20 15:06:42 +000091code_dealloc(co)
92 codeobject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +000093{
Guido van Rossum3f5da241990-12-20 15:06:42 +000094 XDECREF(co->co_code);
95 XDECREF(co->co_consts);
96 XDECREF(co->co_names);
97 XDECREF(co->co_filename);
Guido van Rossum9bfef441993-03-29 10:43:31 +000098 XDECREF(co->co_name);
Guido van Rossum681d79a1995-07-18 14:51:37 +000099 XDECREF(co->co_varnames);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000100 DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000101}
102
Guido van Rossum2dff9911992-09-03 20:50:59 +0000103static object *
104code_repr(co)
105 codeobject *co;
106{
107 char buf[500];
108 int lineno = -1;
109 char *p = GETSTRINGVALUE(co->co_code);
110 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000111 char *name = "???";
Guido van Rossum2dff9911992-09-03 20:50:59 +0000112 if (*p == SET_LINENO)
113 lineno = (p[1] & 0xff) | ((p[2] & 0xff) << 8);
114 if (co->co_filename && is_stringobject(co->co_filename))
115 filename = getstringvalue(co->co_filename);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000116 if (co->co_name && is_stringobject(co->co_name))
117 name = getstringvalue(co->co_name);
118 sprintf(buf, "<code object %.100s at %lx, file \"%.300s\", line %d>",
119 name, (long)co, filename, lineno);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000120 return newstringobject(buf);
121}
122
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000123static int
124code_compare(co, cp)
125 codeobject *co, *cp;
126{
127 int cmp;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000128 cmp = cp->co_argcount - cp->co_argcount;
129 if (cmp) return cmp;
130 cmp = cp->co_nlocals - cp->co_nlocals;
131 if (cmp) return cmp;
132 cmp = cp->co_flags - cp->co_flags;
133 if (cmp) return cmp;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000134 cmp = cmpobject((object *)co->co_code, (object *)cp->co_code);
135 if (cmp) return cmp;
136 cmp = cmpobject(co->co_consts, cp->co_consts);
137 if (cmp) return cmp;
138 cmp = cmpobject(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000139 if (cmp) return cmp;
140 cmp = cmpobject(co->co_varnames, cp->co_varnames);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000141 return cmp;
142}
143
144static long
145code_hash(co)
146 codeobject *co;
147{
Guido van Rossum681d79a1995-07-18 14:51:37 +0000148 long h, h1, h2, h3, h4;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000149 h1 = hashobject((object *)co->co_code);
150 if (h1 == -1) return -1;
151 h2 = hashobject(co->co_consts);
152 if (h2 == -1) return -1;
153 h3 = hashobject(co->co_names);
154 if (h3 == -1) return -1;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000155 h4 = hashobject(co->co_varnames);
156 if (h4 == -1) return -1;
157 h = h1 ^ h2 ^ h3 ^ h4 ^
158 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000159 if (h == -1) h = -2;
160 return h;
161}
162
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000163typeobject Codetype = {
164 OB_HEAD_INIT(&Typetype)
165 0,
166 "code",
167 sizeof(codeobject),
168 0,
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000169 (destructor)code_dealloc, /*tp_dealloc*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000170 0, /*tp_print*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000171 (getattrfunc)code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000172 0, /*tp_setattr*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000173 (cmpfunc)code_compare, /*tp_compare*/
174 (reprfunc)code_repr, /*tp_repr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000175 0, /*tp_as_number*/
176 0, /*tp_as_sequence*/
177 0, /*tp_as_mapping*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000178 (hashfunc)code_hash, /*tp_hash*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000179};
180
Guido van Rossuma082ce41991-06-04 19:41:56 +0000181codeobject *
Guido van Rossum8b993a91997-01-17 21:04:03 +0000182newcodeobject(argcount, nlocals, stacksize, flags,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000183 code, consts, names, varnames, filename, name)
184 int argcount;
185 int nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000186 int stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000187 int flags;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000188 object *code;
189 object *consts;
190 object *names;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000191 object *varnames;
Guido van Rossuma082ce41991-06-04 19:41:56 +0000192 object *filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000193 object *name;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000194{
195 codeobject *co;
196 int i;
197 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000198 if (argcount < 0 || nlocals < 0 ||
199 code == NULL || !is_stringobject(code) ||
200 consts == NULL || !is_tupleobject(consts) ||
201 names == NULL || !is_tupleobject(names) ||
202 varnames == NULL || !is_tupleobject(varnames) ||
203 name == NULL || !is_stringobject(name) ||
204 filename == NULL || !is_stringobject(filename)) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000205 err_badcall();
206 return NULL;
207 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000208 /* Make sure names and varnames are all strings, & intern them */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000209 for (i = gettuplesize(names); --i >= 0; ) {
210 object *v = gettupleitem(names, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000211 if (v == NULL || !is_stringobject(v)) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000212 err_badcall();
213 return NULL;
214 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000215 PyString_InternInPlace(&PyTuple_GET_ITEM(names, i));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000216 }
217 for (i = gettuplesize(varnames); --i >= 0; ) {
218 object *v = gettupleitem(varnames, i);
219 if (v == NULL || !is_stringobject(v)) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000220 err_badcall();
221 return NULL;
222 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000223 PyString_InternInPlace(&PyTuple_GET_ITEM(varnames, i));
224 }
225 /* Intern selected string constants */
226 for (i = gettuplesize(consts); --i >= 0; ) {
227 object *v = gettupleitem(consts, i);
228 int n;
229 char *p;
230 if (!is_stringobject(v))
231 continue;
232 p = getstringvalue(v);
233 if (strspn(p, "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz")
234 != getstringsize(v))
235 continue;
236 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000237 }
238 co = NEWOBJ(codeobject, &Codetype);
239 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000240 co->co_argcount = argcount;
241 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000242 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000243 co->co_flags = flags;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000244 INCREF(code);
245 co->co_code = (stringobject *)code;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000246 INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000247 co->co_consts = consts;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000248 INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000249 co->co_names = names;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000250 INCREF(varnames);
251 co->co_varnames = varnames;
Guido van Rossuma082ce41991-06-04 19:41:56 +0000252 INCREF(filename);
253 co->co_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000254 INCREF(name);
255 co->co_name = name;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000256 }
257 return co;
258}
259
260
261/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000262
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000263struct compiling {
264 object *c_code; /* string */
265 object *c_consts; /* list of objects */
266 object *c_names; /* list of strings (names) */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000267 object *c_globals; /* dictionary (value=None) */
268 object *c_locals; /* dictionary (value=localID) */
269 object *c_varnames; /* list (inverse of c_locals) */
270 int c_nlocals; /* index of next local */
271 int c_argcount; /* number of top-level arguments */
272 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000273 int c_nexti; /* index into c_code */
274 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000275 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000276 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000277 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000278 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000279 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000280 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000281 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000282 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000283 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000284 int c_stacklevel; /* Current stack level */
285 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000286#ifdef PRIVATE_NAME_MANGLING
287 char *c_private; /* for private name mangling */
288#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000289};
290
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000291
Guido van Rossum452a9831996-09-17 14:32:04 +0000292/* Error message including line number */
293
294static void
295com_error(c, exc, msg)
296 struct compiling *c;
297 object *exc;
298 char *msg;
299{
300 int n = strlen(msg);
301 object *v;
302 char buffer[30];
303 char *s;
Guido van Rossum635abd21997-01-06 22:56:52 +0000304 c->c_errors++;
Guido van Rossum452a9831996-09-17 14:32:04 +0000305 if (c->c_lineno <= 1) {
306 /* Unknown line number or single interactive command */
307 err_setstr(exc, msg);
308 return;
309 }
310 sprintf(buffer, " (line %d)", c->c_lineno);
311 v = newsizedstringobject((char *)NULL, n + strlen(buffer));
312 if (v == NULL)
313 return; /* MemoryError, too bad */
314 s = GETSTRINGVALUE((stringobject *)v);
315 strcpy(s, msg);
316 strcat(s, buffer);
317 err_setval(exc, v);
318 DECREF(v);
Guido van Rossum452a9831996-09-17 14:32:04 +0000319}
320
321
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000322/* Interface to the block stack */
323
324static void
325block_push(c, type)
326 struct compiling *c;
327 int type;
328{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000329 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum452a9831996-09-17 14:32:04 +0000330 com_error(c, SystemError, "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000331 }
332 else {
333 c->c_block[c->c_nblocks++] = type;
334 }
335}
336
337static void
338block_pop(c, type)
339 struct compiling *c;
340 int type;
341{
342 if (c->c_nblocks > 0)
343 c->c_nblocks--;
344 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum452a9831996-09-17 14:32:04 +0000345 com_error(c, SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000346 }
347}
348
349
Guido van Rossum681d79a1995-07-18 14:51:37 +0000350/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000351
Guido van Rossum590baa41993-11-30 13:40:46 +0000352static int com_init PROTO((struct compiling *, char *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000353static void com_free PROTO((struct compiling *));
Guido van Rossum8b993a91997-01-17 21:04:03 +0000354static void com_push PROTO((struct compiling *, int));
355static void com_pop PROTO((struct compiling *, int));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000356static void com_done PROTO((struct compiling *));
357static void com_node PROTO((struct compiling *, struct _node *));
Guido van Rossum50564e81996-01-12 01:13:16 +0000358static void com_factor PROTO((struct compiling *, struct _node *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000359static void com_addbyte PROTO((struct compiling *, int));
360static void com_addint PROTO((struct compiling *, int));
361static void com_addoparg PROTO((struct compiling *, int, int));
362static void com_addfwref PROTO((struct compiling *, int, int *));
363static void com_backpatch PROTO((struct compiling *, int));
364static int com_add PROTO((struct compiling *, object *, object *));
365static int com_addconst PROTO((struct compiling *, object *));
366static int com_addname PROTO((struct compiling *, object *));
367static void com_addopname PROTO((struct compiling *, int, node *));
Guido van Rossum288a60f1991-12-16 13:05:10 +0000368static void com_list PROTO((struct compiling *, node *, int));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000369static int com_argdefs PROTO((struct compiling *, node *));
370static int com_newlocal PROTO((struct compiling *, char *));
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000371static codeobject *icompile PROTO((struct _node *, struct compiling *));
372static codeobject *jcompile PROTO((struct _node *, char *, struct compiling *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000373
374static int
Guido van Rossum590baa41993-11-30 13:40:46 +0000375com_init(c, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000376 struct compiling *c;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000377 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000378{
Guido van Rossum62d46241991-04-03 19:00:23 +0000379 if ((c->c_code = newsizedstringobject((char *)NULL, 1000)) == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000380 goto fail_3;
381 if ((c->c_consts = newlistobject(0)) == NULL)
382 goto fail_2;
383 if ((c->c_names = newlistobject(0)) == NULL)
384 goto fail_1;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000385 if ((c->c_globals = newdictobject()) == NULL)
386 goto fail_0;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000387 if ((c->c_locals = newdictobject()) == NULL)
388 goto fail_00;
389 if ((c->c_varnames = newlistobject(0)) == NULL)
390 goto fail_000;
391 c->c_nlocals = 0;
392 c->c_argcount = 0;
393 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000394 c->c_nexti = 0;
395 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000396 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000397 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000398 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000399 c->c_begin = 0;
400 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000401 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000402 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000403 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000404 c->c_stacklevel = 0;
405 c->c_maxstacklevel = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000406 return 1;
407
Guido van Rossum681d79a1995-07-18 14:51:37 +0000408 fail_000:
409 DECREF(c->c_locals);
410 fail_00:
411 DECREF(c->c_globals);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000412 fail_0:
413 DECREF(c->c_names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000414 fail_1:
415 DECREF(c->c_consts);
416 fail_2:
417 DECREF(c->c_code);
418 fail_3:
419 return 0;
420}
421
422static void
423com_free(c)
424 struct compiling *c;
425{
426 XDECREF(c->c_code);
427 XDECREF(c->c_consts);
428 XDECREF(c->c_names);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000429 XDECREF(c->c_globals);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000430 XDECREF(c->c_locals);
431 XDECREF(c->c_varnames);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000432}
433
434static void
Guido van Rossum8b993a91997-01-17 21:04:03 +0000435com_push(c, n)
436 struct compiling *c;
437 int n;
438{
439 c->c_stacklevel += n;
440 if (c->c_stacklevel > c->c_maxstacklevel)
441 c->c_maxstacklevel = c->c_stacklevel;
442}
443
444static void
445com_pop(c, n)
446 struct compiling *c;
447 int n;
448{
449 if (c->c_stacklevel < n) {
450 fprintf(stderr,
451 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
452 c->c_filename, c->c_lineno,
453 c->c_nexti, c->c_stacklevel, n);
454 c->c_stacklevel = 0;
455 }
456 else
457 c->c_stacklevel -= n;
458}
459
460static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000461com_done(c)
462 struct compiling *c;
463{
464 if (c->c_code != NULL)
465 resizestring(&c->c_code, c->c_nexti);
466}
467
468static void
469com_addbyte(c, byte)
470 struct compiling *c;
471 int byte;
472{
473 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000474 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000475 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000476 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000477 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000478 fatal("com_addbyte: byte out of range");
Guido van Rossum01cfd441991-10-20 20:12:38 +0000479 */
Guido van Rossum452a9831996-09-17 14:32:04 +0000480 com_error(c, SystemError, "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000481 }
482 if (c->c_code == NULL)
483 return;
484 len = getstringsize(c->c_code);
485 if (c->c_nexti >= len) {
486 if (resizestring(&c->c_code, len+1000) != 0) {
487 c->c_errors++;
488 return;
489 }
490 }
491 getstringvalue(c->c_code)[c->c_nexti++] = byte;
492}
493
494static void
495com_addint(c, x)
496 struct compiling *c;
497 int x;
498{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000499 com_addbyte(c, x & 0xff);
500 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000501}
502
503static void
504com_addoparg(c, op, arg)
505 struct compiling *c;
506 int op;
507 int arg;
508{
Guido van Rossum452a9831996-09-17 14:32:04 +0000509 if (op == SET_LINENO)
510 c->c_lineno = arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000511 com_addbyte(c, op);
512 com_addint(c, arg);
513}
514
515static void
516com_addfwref(c, op, p_anchor)
517 struct compiling *c;
518 int op;
519 int *p_anchor;
520{
521 /* Compile a forward reference for backpatching */
522 int here;
523 int anchor;
524 com_addbyte(c, op);
525 here = c->c_nexti;
526 anchor = *p_anchor;
527 *p_anchor = here;
528 com_addint(c, anchor == 0 ? 0 : here - anchor);
529}
530
531static void
532com_backpatch(c, anchor)
533 struct compiling *c;
534 int anchor; /* Must be nonzero */
535{
536 unsigned char *code = (unsigned char *) getstringvalue(c->c_code);
537 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000538 int dist;
539 int prev;
540 for (;;) {
541 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000542 prev = code[anchor] + (code[anchor+1] << 8);
543 dist = target - (anchor+2);
544 code[anchor] = dist & 0xff;
545 code[anchor+1] = dist >> 8;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000546 if (!prev)
547 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000548 anchor -= prev;
549 }
550}
551
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000552/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000553
554static int
555com_add(c, list, v)
556 struct compiling *c;
557 object *list;
558 object *v;
559{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000560 int n = getlistsize(list);
561 int i;
562 for (i = n; --i >= 0; ) {
563 object *w = getlistitem(list, i);
Guido van Rossumefc0bd01991-07-01 18:44:20 +0000564 if (v->ob_type == w->ob_type && cmpobject(v, w) == 0)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000565 return i;
566 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000567 if (addlistitem(list, v) != 0)
568 c->c_errors++;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000569 return n;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000570}
571
572static int
573com_addconst(c, v)
574 struct compiling *c;
575 object *v;
576{
577 return com_add(c, c->c_consts, v);
578}
579
580static int
581com_addname(c, v)
582 struct compiling *c;
583 object *v;
584{
585 return com_add(c, c->c_names, v);
586}
587
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000588#ifdef PRIVATE_NAME_MANGLING
589static int
590com_mangle(c, name, buffer, maxlen)
591 struct compiling *c;
592 char *name;
593 char *buffer;
594 int maxlen;
595{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000596 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000597 This is independent from how the name is used. */
598 char *p;
599 int nlen, plen;
600 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000601 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000602 return 0; /* Don't mangle __extremely_long_names */
603 if (name[nlen-1] == '_' && name[nlen-2] == '_')
604 return 0; /* Don't mangle __whatever__ */
605 p = c->c_private;
606 /* Strip leading underscores from class name */
607 while (*p == '_')
608 p++;
609 if (*p == '\0')
610 return 0; /* Don't mangle if class is just underscores */
611 plen = strlen(p);
612 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000613 plen = maxlen-nlen-2; /* Truncate class name if too long */
614 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000615 buffer[0] = '_';
616 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000617 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000618 /* fprintf(stderr, "mangle %s -> %s\n", name, buffer); */
619 return 1;
620}
621#endif
622
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000623static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000624com_addopnamestr(c, op, name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000625 struct compiling *c;
626 int op;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000627 char *name;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000628{
629 object *v;
630 int i;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000631#ifdef PRIVATE_NAME_MANGLING
632 char buffer[256];
633 if (name != NULL && name[0] == '_' && name[1] == '_' &&
634 c->c_private != NULL &&
635 com_mangle(c, name, buffer, (int)sizeof(buffer)))
636 name = buffer;
637#endif
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000638 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000639 c->c_errors++;
640 i = 255;
641 }
642 else {
643 i = com_addname(c, v);
644 DECREF(v);
645 }
Guido van Rossumc5e96291991-12-10 13:53:51 +0000646 /* Hack to replace *_NAME opcodes by *_GLOBAL if necessary */
647 switch (op) {
648 case LOAD_NAME:
649 case STORE_NAME:
650 case DELETE_NAME:
651 if (dictlookup(c->c_globals, name) != NULL) {
652 switch (op) {
653 case LOAD_NAME: op = LOAD_GLOBAL; break;
654 case STORE_NAME: op = STORE_GLOBAL; break;
655 case DELETE_NAME: op = DELETE_GLOBAL; break;
656 }
657 }
658 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000659 com_addoparg(c, op, i);
660}
661
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000662static void
663com_addopname(c, op, n)
664 struct compiling *c;
665 int op;
666 node *n;
667{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000668 char *name;
669 char buffer[1000];
670 /* XXX it is possible to write this code without the 1000
671 chars on the total length of dotted names, I just can't be
672 bothered right now */
673 if (TYPE(n) == STAR)
674 name = "*";
675 else if (TYPE(n) == dotted_name) {
676 char *p = buffer;
677 int i;
678 name = buffer;
679 for (i = 0; i < NCH(n); i += 2) {
680 char *s = STR(CHILD(n, i));
681 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum452a9831996-09-17 14:32:04 +0000682 com_error(c, MemoryError,
683 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +0000684 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000685 break;
686 }
687 if (p != buffer)
688 *p++ = '.';
689 strcpy(p, s);
690 p = strchr(p, '\0');
691 }
692 }
693 else {
694 REQ(n, NAME);
695 name = STR(n);
696 }
697 com_addopnamestr(c, op, name);
698}
699
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000700static object *
Guido van Rossum452a9831996-09-17 14:32:04 +0000701parsenumber(co, s)
702 struct compiling *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000703 char *s;
704{
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000705 extern long mystrtol PROTO((const char *, char **, int));
706 extern unsigned long mystrtoul PROTO((const char *, char **, int));
707 extern double atof PROTO((const char *));
Guido van Rossumc5e96291991-12-10 13:53:51 +0000708 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000709 long x;
Guido van Rossum50564e81996-01-12 01:13:16 +0000710#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +0000711 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +0000712 int imflag;
713#endif
714
Guido van Rossum282914b1991-04-04 10:42:56 +0000715 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000716 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +0000717#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +0000718 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +0000719#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000720 if (*end == 'l' || *end == 'L')
Guido van Rossumc5e96291991-12-10 13:53:51 +0000721 return long_scan(s, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000722 if (s[0] == '0')
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000723 x = (long) mystrtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000724 else
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000725 x = mystrtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +0000726 if (*end == '\0') {
727 if (errno != 0) {
Guido van Rossum452a9831996-09-17 14:32:04 +0000728 com_error(co, OverflowError,
729 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000730 return NULL;
731 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000732 return newintobject(x);
Guido van Rossum282914b1991-04-04 10:42:56 +0000733 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000734 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +0000735#ifndef WITHOUT_COMPLEX
736 if (imflag) {
737 c.real = 0.;
738 c.imag = atof(s);
739 return newcomplexobject(c);
740 }
741 else
742#endif
743 return newfloatobject(atof(s));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000744}
745
746static object *
747parsestr(s)
748 char *s;
749{
750 object *v;
751 int len;
752 char *buf;
753 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000754 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000755 int c;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000756 int quote = *s;
757 if (quote != '\'' && quote != '\"') {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000758 err_badcall();
759 return NULL;
760 }
761 s++;
762 len = strlen(s);
Guido van Rossum8054fad1993-10-26 15:19:44 +0000763 if (s[--len] != quote) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000764 err_badcall();
765 return NULL;
766 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000767 if (len >= 4 && s[0] == quote && s[1] == quote) {
768 s += 2;
769 len -= 2;
770 if (s[--len] != quote || s[--len] != quote) {
771 err_badcall();
772 return NULL;
773 }
774 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000775 if (strchr(s, '\\') == NULL)
776 return newsizedstringobject(s, len);
777 v = newsizedstringobject((char *)NULL, len);
778 p = buf = getstringvalue(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000779 end = s + len;
780 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000781 if (*s != '\\') {
782 *p++ = *s++;
783 continue;
784 }
785 s++;
786 switch (*s++) {
787 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000788 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000789 case '\\': *p++ = '\\'; break;
790 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000791 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000792 case 'b': *p++ = '\b'; break;
793 case 'f': *p++ = '\014'; break; /* FF */
794 case 't': *p++ = '\t'; break;
795 case 'n': *p++ = '\n'; break;
796 case 'r': *p++ = '\r'; break;
797 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000798 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
799 case '0': case '1': case '2': case '3':
800 case '4': case '5': case '6': case '7':
801 c = s[-1] - '0';
802 if ('0' <= *s && *s <= '7') {
803 c = (c<<3) + *s++ - '0';
804 if ('0' <= *s && *s <= '7')
805 c = (c<<3) + *s++ - '0';
806 }
807 *p++ = c;
808 break;
809 case 'x':
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000810 if (isxdigit(Py_CHARMASK(*s))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000811 sscanf(s, "%x", &c);
812 *p++ = c;
813 do {
814 s++;
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000815 } while (isxdigit(Py_CHARMASK(*s)));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000816 break;
817 }
818 /* FALLTHROUGH */
819 default: *p++ = '\\'; *p++ = s[-1]; break;
820 }
821 }
822 resizestring(&v, (int)(p - buf));
823 return v;
824}
825
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000826static object *
827parsestrplus(n)
828 node *n;
829{
830 object *v;
831 int i;
832 REQ(CHILD(n, 0), STRING);
833 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
834 /* String literal concatenation */
835 for (i = 1; i < NCH(n) && v != NULL; i++) {
836 joinstring_decref(&v, parsestr(STR(CHILD(n, i))));
837 }
838 }
839 return v;
840}
841
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000842static void
843com_list_constructor(c, n)
844 struct compiling *c;
845 node *n;
846{
847 int len;
848 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000849 if (TYPE(n) != testlist)
850 REQ(n, exprlist);
851 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
852 len = (NCH(n) + 1) / 2;
853 for (i = 0; i < NCH(n); i += 2)
854 com_node(c, CHILD(n, i));
855 com_addoparg(c, BUILD_LIST, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000856 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000857}
858
859static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000860com_dictmaker(c, n)
861 struct compiling *c;
862 node *n;
863{
864 int i;
865 /* dictmaker: test ':' test (',' test ':' value)* [','] */
866 for (i = 0; i+2 < NCH(n); i += 4) {
867 /* We must arrange things just right for STORE_SUBSCR.
868 It wants the stack to look like (value) (dict) (key) */
869 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000870 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000871 com_node(c, CHILD(n, i+2)); /* value */
872 com_addbyte(c, ROT_TWO);
873 com_node(c, CHILD(n, i)); /* key */
874 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000875 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000876 }
877}
878
879static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000880com_atom(c, n)
881 struct compiling *c;
882 node *n;
883{
884 node *ch;
885 object *v;
886 int i;
887 REQ(n, atom);
888 ch = CHILD(n, 0);
889 switch (TYPE(ch)) {
890 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +0000891 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000892 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000893 com_push(c, 1);
894 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000895 else
896 com_node(c, CHILD(n, 1));
897 break;
898 case LSQB:
Guido van Rossum8b993a91997-01-17 21:04:03 +0000899 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000900 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000901 com_push(c, 1);
902 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000903 else
904 com_list_constructor(c, CHILD(n, 1));
905 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000906 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000907 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000908 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000909 if (TYPE(CHILD(n, 1)) != RBRACE)
910 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000911 break;
912 case BACKQUOTE:
913 com_node(c, CHILD(n, 1));
914 com_addbyte(c, UNARY_CONVERT);
915 break;
916 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +0000917 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000918 i = 255;
919 }
920 else {
921 i = com_addconst(c, v);
922 DECREF(v);
923 }
924 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000925 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000926 break;
927 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000928 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000929 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000930 c->c_errors++;
931 i = 255;
932 }
933 else {
934 i = com_addconst(c, v);
935 DECREF(v);
936 }
937 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000938 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000939 break;
940 case NAME:
941 com_addopname(c, LOAD_NAME, ch);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000942 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000943 break;
944 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +0000945 /* XXX fprintf(stderr, "node type %d\n", TYPE(ch)); */
Guido van Rossum452a9831996-09-17 14:32:04 +0000946 com_error(c, SystemError, "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000947 }
948}
949
950static void
951com_slice(c, n, op)
952 struct compiling *c;
953 node *n;
954 int op;
955{
956 if (NCH(n) == 1) {
957 com_addbyte(c, op);
958 }
959 else if (NCH(n) == 2) {
960 if (TYPE(CHILD(n, 0)) != COLON) {
961 com_node(c, CHILD(n, 0));
962 com_addbyte(c, op+1);
963 }
964 else {
965 com_node(c, CHILD(n, 1));
966 com_addbyte(c, op+2);
967 }
Guido van Rossum8b993a91997-01-17 21:04:03 +0000968 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000969 }
970 else {
971 com_node(c, CHILD(n, 0));
972 com_node(c, CHILD(n, 2));
973 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000974 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000975 }
976}
977
Guido van Rossum635abd21997-01-06 22:56:52 +0000978static void
979com_argument(c, n, pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +0000980 struct compiling *c;
981 node *n; /* argument */
Guido van Rossum635abd21997-01-06 22:56:52 +0000982 object **pkeywords;
Guido van Rossumf10570b1995-07-07 22:53:21 +0000983{
984 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000985 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +0000986 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +0000987 if (*pkeywords != NULL) {
Guido van Rossum452a9831996-09-17 14:32:04 +0000988 com_error(c, SyntaxError,
Guido van Rossumf10570b1995-07-07 22:53:21 +0000989 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +0000990 }
991 else {
992 com_node(c, CHILD(n, 0));
993 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000994 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +0000995 }
996 m = n;
997 do {
998 m = CHILD(m, 0);
999 } while (NCH(m) == 1);
1000 if (TYPE(m) != NAME) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001001 com_error(c, SyntaxError, "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001002 }
1003 else {
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001004 object *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001005 if (v != NULL && *pkeywords == NULL)
1006 *pkeywords = newdictobject();
1007 if (v == NULL || *pkeywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001008 c->c_errors++;
1009 else {
Guido van Rossum635abd21997-01-06 22:56:52 +00001010 if (dict2lookup(*pkeywords, v) != NULL)
1011 com_error(c, SyntaxError,
1012 "duplicate keyword argument");
1013 else
1014 if (dict2insert(*pkeywords, v, v) != 0)
1015 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001016 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001017 com_push(c, 1);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001018 DECREF(v);
1019 }
1020 }
1021 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001022}
1023
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001024static void
1025com_call_function(c, n)
1026 struct compiling *c;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001027 node *n; /* EITHER arglist OR ')' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001028{
1029 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001030 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001031 }
1032 else {
Guido van Rossum635abd21997-01-06 22:56:52 +00001033 object *keywords = NULL;
1034 int i, na, nk;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001035 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001036 na = 0;
1037 nk = 0;
1038 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001039 com_argument(c, CHILD(n, i), &keywords);
1040 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001041 na++;
1042 else
1043 nk++;
1044 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001045 XDECREF(keywords);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001046 if (na > 255 || nk > 255) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001047 com_error(c, SyntaxError, "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001048 }
1049 com_addoparg(c, CALL_FUNCTION, na | (nk << 8));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001050 com_pop(c, na + 2*nk);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001051 }
1052}
1053
1054static void
1055com_select_member(c, n)
1056 struct compiling *c;
1057 node *n;
1058{
1059 com_addopname(c, LOAD_ATTR, n);
1060}
1061
1062static void
Guido van Rossum8861b741996-07-30 16:49:37 +00001063com_sliceobj(c, n)
1064 struct compiling *c;
1065 node *n;
1066{
1067 int i=0;
1068 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001069 node *ch;
1070
1071 /* first argument */
1072 if (TYPE(CHILD(n,i)) == COLON) {
1073 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001074 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001075 i++;
1076 }
1077 else {
1078 com_node(c, CHILD(n,i));
1079 i++;
1080 REQ(CHILD(n,i),COLON);
1081 i++;
1082 }
1083 /* second argument */
1084 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1085 com_node(c, CHILD(n,i));
1086 i++;
1087 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001088 else {
1089 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1090 com_push(c, 1);
1091 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001092 /* remaining arguments */
1093 for (; i < NCH(n); i++) {
1094 ns++;
1095 ch=CHILD(n,i);
1096 REQ(ch, sliceop);
1097 if (NCH(ch) == 1) {
1098 /* right argument of ':' missing */
1099 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001100 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001101 }
1102 else
1103 com_node(c, CHILD(ch,1));
1104 }
1105 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001106 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001107}
1108
1109static void
1110com_subscript(c, n)
1111 struct compiling *c;
1112 node *n;
1113{
1114 node *ch;
1115 REQ(n, subscript);
1116 ch = CHILD(n,0);
1117 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001118 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001119 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001120 com_push(c, 1);
1121 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001122 else {
1123 /* check for slice */
1124 if ((TYPE(ch) == COLON || NCH(n) > 1))
1125 com_sliceobj(c, n);
1126 else {
1127 REQ(ch, test);
1128 com_node(c, ch);
1129 }
1130 }
1131}
1132
1133static void
1134com_subscriptlist(c, n, assigning)
1135 struct compiling *c;
1136 node *n;
1137 int assigning;
1138{
1139 int i, op;
1140 REQ(n, subscriptlist);
1141 /* Check to make backward compatible slice behavior for '[i:j]' */
1142 if (NCH(n) == 1) {
1143 node *sub = CHILD(n, 0); /* subscript */
1144 /* Make it is a simple slice.
Guido van Rossum8b993a91997-01-17 21:04:03 +00001145 Should have exactly one colon. */
Guido van Rossum8861b741996-07-30 16:49:37 +00001146 if ((TYPE(CHILD(sub, 0)) == COLON
1147 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
Guido van Rossum8b993a91997-01-17 21:04:03 +00001148 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1149 {
Guido van Rossum8861b741996-07-30 16:49:37 +00001150 if (assigning == OP_APPLY)
1151 op = SLICE;
1152 else
1153 op = ((assigning == OP_ASSIGN) ? STORE_SLICE : DELETE_SLICE);
1154 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001155 if (op == STORE_SLICE)
1156 com_pop(c, 2);
1157 else if (op == DELETE_SLICE)
1158 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001159 return;
1160 }
1161 }
1162 /* Else normal subscriptlist. Compile each subscript. */
1163 for (i = 0; i < NCH(n); i += 2)
1164 com_subscript(c, CHILD(n, i));
1165 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001166 if (NCH(n) > 1) {
1167 i = (NCH(n)+1) / 2;
1168 com_addoparg(c, BUILD_TUPLE, i);
1169 com_pop(c, i-1);
1170 }
1171 if (assigning == OP_APPLY) {
Guido van Rossum8861b741996-07-30 16:49:37 +00001172 op = BINARY_SUBSCR;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001173 i = 1;
1174 }
1175 else if (assigning == OP_ASSIGN) {
1176 op = STORE_SUBSCR;
1177 i = 3;
1178 }
1179 else {
1180 op = DELETE_SUBSCR;
1181 i = 2;
1182 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001183 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001184 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001185}
1186
1187static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001188com_apply_trailer(c, n)
1189 struct compiling *c;
1190 node *n;
1191{
1192 REQ(n, trailer);
1193 switch (TYPE(CHILD(n, 0))) {
1194 case LPAR:
1195 com_call_function(c, CHILD(n, 1));
1196 break;
1197 case DOT:
1198 com_select_member(c, CHILD(n, 1));
1199 break;
1200 case LSQB:
Guido van Rossum8861b741996-07-30 16:49:37 +00001201 com_subscriptlist(c, CHILD(n, 1), OP_APPLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001202 break;
1203 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001204 com_error(c, SystemError,
1205 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001206 }
1207}
1208
1209static void
Guido van Rossum50564e81996-01-12 01:13:16 +00001210com_power(c, n)
1211 struct compiling *c;
1212 node *n;
1213{
1214 int i;
1215 REQ(n, power);
1216 com_atom(c, CHILD(n, 0));
1217 for (i = 1; i < NCH(n); i++) {
1218 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1219 com_factor(c, CHILD(n, i+1));
1220 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001221 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001222 break;
1223 }
1224 else
1225 com_apply_trailer(c, CHILD(n, i));
1226 }
1227}
1228
1229static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001230com_factor(c, n)
1231 struct compiling *c;
1232 node *n;
1233{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001234 REQ(n, factor);
1235 if (TYPE(CHILD(n, 0)) == PLUS) {
1236 com_factor(c, CHILD(n, 1));
1237 com_addbyte(c, UNARY_POSITIVE);
1238 }
1239 else if (TYPE(CHILD(n, 0)) == MINUS) {
1240 com_factor(c, CHILD(n, 1));
1241 com_addbyte(c, UNARY_NEGATIVE);
1242 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001243 else if (TYPE(CHILD(n, 0)) == TILDE) {
1244 com_factor(c, CHILD(n, 1));
1245 com_addbyte(c, UNARY_INVERT);
1246 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001247 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001248 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001249 }
1250}
1251
1252static void
1253com_term(c, n)
1254 struct compiling *c;
1255 node *n;
1256{
1257 int i;
1258 int op;
1259 REQ(n, term);
1260 com_factor(c, CHILD(n, 0));
1261 for (i = 2; i < NCH(n); i += 2) {
1262 com_factor(c, CHILD(n, i));
1263 switch (TYPE(CHILD(n, i-1))) {
1264 case STAR:
1265 op = BINARY_MULTIPLY;
1266 break;
1267 case SLASH:
1268 op = BINARY_DIVIDE;
1269 break;
1270 case PERCENT:
1271 op = BINARY_MODULO;
1272 break;
1273 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001274 com_error(c, SystemError,
1275 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001276 op = 255;
1277 }
1278 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001279 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001280 }
1281}
1282
1283static void
1284com_arith_expr(c, n)
1285 struct compiling *c;
1286 node *n;
1287{
1288 int i;
1289 int op;
1290 REQ(n, arith_expr);
1291 com_term(c, CHILD(n, 0));
1292 for (i = 2; i < NCH(n); i += 2) {
1293 com_term(c, CHILD(n, i));
1294 switch (TYPE(CHILD(n, i-1))) {
1295 case PLUS:
1296 op = BINARY_ADD;
1297 break;
1298 case MINUS:
1299 op = BINARY_SUBTRACT;
1300 break;
1301 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001302 com_error(c, SystemError,
1303 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001304 op = 255;
1305 }
1306 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001307 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001308 }
1309}
1310
1311static void
1312com_shift_expr(c, n)
1313 struct compiling *c;
1314 node *n;
1315{
1316 int i;
1317 int op;
1318 REQ(n, shift_expr);
1319 com_arith_expr(c, CHILD(n, 0));
1320 for (i = 2; i < NCH(n); i += 2) {
1321 com_arith_expr(c, CHILD(n, i));
1322 switch (TYPE(CHILD(n, i-1))) {
1323 case LEFTSHIFT:
1324 op = BINARY_LSHIFT;
1325 break;
1326 case RIGHTSHIFT:
1327 op = BINARY_RSHIFT;
1328 break;
1329 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001330 com_error(c, SystemError,
1331 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001332 op = 255;
1333 }
1334 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001335 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001336 }
1337}
1338
1339static void
1340com_and_expr(c, n)
1341 struct compiling *c;
1342 node *n;
1343{
1344 int i;
1345 int op;
1346 REQ(n, and_expr);
1347 com_shift_expr(c, CHILD(n, 0));
1348 for (i = 2; i < NCH(n); i += 2) {
1349 com_shift_expr(c, CHILD(n, i));
1350 if (TYPE(CHILD(n, i-1)) == AMPER) {
1351 op = BINARY_AND;
1352 }
1353 else {
Guido van Rossum452a9831996-09-17 14:32:04 +00001354 com_error(c, SystemError,
1355 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001356 op = 255;
1357 }
1358 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001359 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001360 }
1361}
1362
1363static void
1364com_xor_expr(c, n)
1365 struct compiling *c;
1366 node *n;
1367{
1368 int i;
1369 int op;
1370 REQ(n, xor_expr);
1371 com_and_expr(c, CHILD(n, 0));
1372 for (i = 2; i < NCH(n); i += 2) {
1373 com_and_expr(c, CHILD(n, i));
1374 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1375 op = BINARY_XOR;
1376 }
1377 else {
Guido van Rossum452a9831996-09-17 14:32:04 +00001378 com_error(c, SystemError,
1379 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001380 op = 255;
1381 }
1382 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001383 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001384 }
1385}
1386
1387static void
1388com_expr(c, n)
1389 struct compiling *c;
1390 node *n;
1391{
1392 int i;
1393 int op;
1394 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001395 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001396 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001397 com_xor_expr(c, CHILD(n, i));
1398 if (TYPE(CHILD(n, i-1)) == VBAR) {
1399 op = BINARY_OR;
1400 }
1401 else {
Guido van Rossum452a9831996-09-17 14:32:04 +00001402 com_error(c, SystemError,
1403 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001404 op = 255;
1405 }
1406 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001407 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001408 }
1409}
1410
1411static enum cmp_op
1412cmp_type(n)
1413 node *n;
1414{
1415 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001416 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001417 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1418 if (NCH(n) == 1) {
1419 n = CHILD(n, 0);
1420 switch (TYPE(n)) {
1421 case LESS: return LT;
1422 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001423 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001424 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001425 case LESSEQUAL: return LE;
1426 case GREATEREQUAL: return GE;
1427 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001428 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1429 if (strcmp(STR(n), "is") == 0) return IS;
1430 }
1431 }
1432 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001433 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001434 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1435 return NOT_IN;
1436 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1437 return IS_NOT;
1438 }
1439 }
1440 return BAD;
1441}
1442
1443static void
1444com_comparison(c, n)
1445 struct compiling *c;
1446 node *n;
1447{
1448 int i;
1449 enum cmp_op op;
1450 int anchor;
1451 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
1452 com_expr(c, CHILD(n, 0));
1453 if (NCH(n) == 1)
1454 return;
1455
1456 /****************************************************************
1457 The following code is generated for all but the last
1458 comparison in a chain:
1459
1460 label: on stack: opcode: jump to:
1461
1462 a <code to load b>
1463 a, b DUP_TOP
1464 a, b, b ROT_THREE
1465 b, a, b COMPARE_OP
1466 b, 0-or-1 JUMP_IF_FALSE L1
1467 b, 1 POP_TOP
1468 b
1469
1470 We are now ready to repeat this sequence for the next
1471 comparison in the chain.
1472
1473 For the last we generate:
1474
1475 b <code to load c>
1476 b, c COMPARE_OP
1477 0-or-1
1478
1479 If there were any jumps to L1 (i.e., there was more than one
1480 comparison), we generate:
1481
1482 0-or-1 JUMP_FORWARD L2
1483 L1: b, 0 ROT_TWO
1484 0, b POP_TOP
1485 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00001486 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001487 ****************************************************************/
1488
1489 anchor = 0;
1490
1491 for (i = 2; i < NCH(n); i += 2) {
1492 com_expr(c, CHILD(n, i));
1493 if (i+2 < NCH(n)) {
1494 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001495 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001496 com_addbyte(c, ROT_THREE);
1497 }
1498 op = cmp_type(CHILD(n, i-1));
1499 if (op == BAD) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001500 com_error(c, SystemError,
1501 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001502 }
1503 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001504 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001505 if (i+2 < NCH(n)) {
1506 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1507 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001508 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001509 }
1510 }
1511
1512 if (anchor) {
1513 int anchor2 = 0;
1514 com_addfwref(c, JUMP_FORWARD, &anchor2);
1515 com_backpatch(c, anchor);
1516 com_addbyte(c, ROT_TWO);
1517 com_addbyte(c, POP_TOP);
1518 com_backpatch(c, anchor2);
1519 }
1520}
1521
1522static void
1523com_not_test(c, n)
1524 struct compiling *c;
1525 node *n;
1526{
1527 REQ(n, not_test); /* 'not' not_test | comparison */
1528 if (NCH(n) == 1) {
1529 com_comparison(c, CHILD(n, 0));
1530 }
1531 else {
1532 com_not_test(c, CHILD(n, 1));
1533 com_addbyte(c, UNARY_NOT);
1534 }
1535}
1536
1537static void
1538com_and_test(c, n)
1539 struct compiling *c;
1540 node *n;
1541{
1542 int i;
1543 int anchor;
1544 REQ(n, and_test); /* not_test ('and' not_test)* */
1545 anchor = 0;
1546 i = 0;
1547 for (;;) {
1548 com_not_test(c, CHILD(n, i));
1549 if ((i += 2) >= NCH(n))
1550 break;
1551 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1552 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001553 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001554 }
1555 if (anchor)
1556 com_backpatch(c, anchor);
1557}
1558
1559static void
1560com_test(c, n)
1561 struct compiling *c;
1562 node *n;
1563{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001564 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00001565 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
1566 object *v;
1567 int i;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001568 int ndefs = com_argdefs(c, CHILD(n, 0));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001569 v = (object *) icompile(CHILD(n, 0), c);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001570 if (v == NULL) {
1571 c->c_errors++;
1572 i = 255;
1573 }
1574 else {
1575 i = com_addconst(c, v);
1576 DECREF(v);
1577 }
1578 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001579 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001580 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001581 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001582 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00001583 else {
1584 int anchor = 0;
1585 int i = 0;
1586 for (;;) {
1587 com_and_test(c, CHILD(n, i));
1588 if ((i += 2) >= NCH(n))
1589 break;
1590 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1591 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001592 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001593 }
1594 if (anchor)
1595 com_backpatch(c, anchor);
1596 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001597}
1598
1599static void
Guido van Rossum288a60f1991-12-16 13:05:10 +00001600com_list(c, n, toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001601 struct compiling *c;
1602 node *n;
Guido van Rossum288a60f1991-12-16 13:05:10 +00001603 int toplevel; /* If nonzero, *always* build a tuple */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001604{
1605 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001606 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001607 com_node(c, CHILD(n, 0));
1608 }
1609 else {
1610 int i;
1611 int len;
1612 len = (NCH(n) + 1) / 2;
1613 for (i = 0; i < NCH(n); i += 2)
1614 com_node(c, CHILD(n, i));
1615 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001616 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001617 }
1618}
1619
1620
1621/* Begin of assignment compilation */
1622
1623static void com_assign_name PROTO((struct compiling *, node *, int));
1624static void com_assign PROTO((struct compiling *, node *, int));
1625
1626static void
1627com_assign_attr(c, n, assigning)
1628 struct compiling *c;
1629 node *n;
1630 int assigning;
1631{
1632 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001633 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001634}
1635
1636static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001637com_assign_trailer(c, n, assigning)
1638 struct compiling *c;
1639 node *n;
1640 int assigning;
1641{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001642 REQ(n, trailer);
1643 switch (TYPE(CHILD(n, 0))) {
1644 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum452a9831996-09-17 14:32:04 +00001645 com_error(c, SyntaxError, "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001646 break;
1647 case DOT: /* '.' NAME */
1648 com_assign_attr(c, CHILD(n, 1), assigning);
1649 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001650 case LSQB: /* '[' subscriptlist ']' */
1651 com_subscriptlist(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001652 break;
1653 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001654 com_error(c, SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001655 }
1656}
1657
1658static void
1659com_assign_tuple(c, n, assigning)
1660 struct compiling *c;
1661 node *n;
1662 int assigning;
1663{
1664 int i;
1665 if (TYPE(n) != testlist)
1666 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001667 if (assigning) {
1668 i = (NCH(n)+1)/2;
1669 com_addoparg(c, UNPACK_TUPLE, i);
1670 com_push(c, i-1);
1671 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001672 for (i = 0; i < NCH(n); i += 2)
1673 com_assign(c, CHILD(n, i), assigning);
1674}
1675
1676static void
1677com_assign_list(c, n, assigning)
1678 struct compiling *c;
1679 node *n;
1680 int assigning;
1681{
1682 int i;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001683 if (assigning) {
1684 i = (NCH(n)+1)/2;
1685 com_addoparg(c, UNPACK_LIST, i);
1686 com_push(c, i-1);
1687 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001688 for (i = 0; i < NCH(n); i += 2)
1689 com_assign(c, CHILD(n, i), assigning);
1690}
1691
1692static void
1693com_assign_name(c, n, assigning)
1694 struct compiling *c;
1695 node *n;
1696 int assigning;
1697{
1698 REQ(n, NAME);
1699 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001700 if (assigning)
1701 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001702}
1703
1704static void
1705com_assign(c, n, assigning)
1706 struct compiling *c;
1707 node *n;
1708 int assigning;
1709{
1710 /* Loop to avoid trivial recursion */
1711 for (;;) {
1712 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001713
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001714 case exprlist:
1715 case testlist:
1716 if (NCH(n) > 1) {
1717 com_assign_tuple(c, n, assigning);
1718 return;
1719 }
1720 n = CHILD(n, 0);
1721 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001722
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001723 case test:
1724 case and_test:
1725 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001726 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001727 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001728 case xor_expr:
1729 case and_expr:
1730 case shift_expr:
1731 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001732 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00001733 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001734 if (NCH(n) > 1) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001735 com_error(c, SyntaxError,
1736 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001737 return;
1738 }
1739 n = CHILD(n, 0);
1740 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001741
Guido van Rossum50564e81996-01-12 01:13:16 +00001742 case power: /* atom trailer* ('**' power)* */
1743/* ('+'|'-'|'~') factor | atom trailer* */
1744 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001745 com_error(c, SyntaxError,
1746 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001747 return;
1748 }
Guido van Rossum50564e81996-01-12 01:13:16 +00001749 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001750 int i;
1751 com_node(c, CHILD(n, 0));
1752 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00001753 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001754 com_error(c, SyntaxError,
1755 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00001756 return;
1757 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001758 com_apply_trailer(c, CHILD(n, i));
1759 } /* NB i is still alive */
1760 com_assign_trailer(c,
1761 CHILD(n, i), assigning);
1762 return;
1763 }
1764 n = CHILD(n, 0);
1765 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001766
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001767 case atom:
1768 switch (TYPE(CHILD(n, 0))) {
1769 case LPAR:
1770 n = CHILD(n, 1);
1771 if (TYPE(n) == RPAR) {
1772 /* XXX Should allow () = () ??? */
Guido van Rossum452a9831996-09-17 14:32:04 +00001773 com_error(c, SyntaxError,
1774 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001775 return;
1776 }
1777 break;
1778 case LSQB:
1779 n = CHILD(n, 1);
1780 if (TYPE(n) == RSQB) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001781 com_error(c, SyntaxError,
1782 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001783 return;
1784 }
1785 com_assign_list(c, n, assigning);
1786 return;
1787 case NAME:
1788 com_assign_name(c, CHILD(n, 0), assigning);
1789 return;
1790 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001791 com_error(c, SyntaxError,
1792 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001793 return;
1794 }
1795 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001796
1797 case lambdef:
Guido van Rossum452a9831996-09-17 14:32:04 +00001798 com_error(c, SyntaxError, "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001799 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001800
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001801 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001802 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum452a9831996-09-17 14:32:04 +00001803 com_error(c, SystemError, "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001804 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001805
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001806 }
1807 }
1808}
Guido van Rossum8b993a91997-01-17 21:04:03 +00001809/* Forward */ static node *get_rawdocstring PROTO((node *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001810
1811static void
1812com_expr_stmt(c, n)
1813 struct compiling *c;
1814 node *n;
1815{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001816 REQ(n, expr_stmt); /* testlist ('=' testlist)* */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001817 /* Forget it if we have just a doc string here */
1818 if (NCH(n) == 1 && get_rawdocstring(n) != NULL)
1819 return;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001820 com_node(c, CHILD(n, NCH(n)-1));
1821 if (NCH(n) == 1) {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001822 if (c->c_interactive)
1823 com_addbyte(c, PRINT_EXPR);
1824 else
1825 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001826 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001827 }
1828 else {
1829 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001830 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00001831 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001832 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001833 com_push(c, 1);
1834 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001835 com_assign(c, CHILD(n, i), OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001836 }
1837 }
1838}
1839
1840static void
1841com_print_stmt(c, n)
1842 struct compiling *c;
1843 node *n;
1844{
1845 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001846 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
1847 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001848 com_node(c, CHILD(n, i));
1849 com_addbyte(c, PRINT_ITEM);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001850 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001851 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001852 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001853 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001854 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001855}
1856
1857static void
1858com_return_stmt(c, n)
1859 struct compiling *c;
1860 node *n;
1861{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001862 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001863 if (!c->c_infunction) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001864 com_error(c, SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001865 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001866 if (NCH(n) < 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001867 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001868 com_push(c, 1);
1869 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001870 else
1871 com_node(c, CHILD(n, 1));
1872 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001873 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001874}
1875
1876static void
1877com_raise_stmt(c, n)
1878 struct compiling *c;
1879 node *n;
1880{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001881 int i;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001882 REQ(n, raise_stmt); /* 'raise' test [',' test [',' test]] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001883 com_node(c, CHILD(n, 1));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001884 if (NCH(n) > 3) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001885 com_node(c, CHILD(n, 3));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001886 if (NCH(n) > 5)
1887 com_node(c, CHILD(n, 5));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001888 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001889 i = NCH(n)/2;
1890 com_addoparg(c, RAISE_VARARGS, i);
1891 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001892}
1893
1894static void
1895com_import_stmt(c, n)
1896 struct compiling *c;
1897 node *n;
1898{
1899 int i;
1900 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001901 /* 'import' dotted_name (',' dotted_name)* |
1902 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001903 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001904 /* 'from' dotted_name 'import' ... */
1905 REQ(CHILD(n, 1), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001906 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001907 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001908 for (i = 3; i < NCH(n); i += 2)
1909 com_addopname(c, IMPORT_FROM, CHILD(n, i));
1910 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001911 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001912 }
1913 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001914 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001915 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001916 REQ(CHILD(n, i), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001917 com_addopname(c, IMPORT_NAME, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001918 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001919 com_addopname(c, STORE_NAME, CHILD(CHILD(n, i), 0));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001920 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001921 }
1922 }
1923}
1924
1925static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00001926com_global_stmt(c, n)
1927 struct compiling *c;
1928 node *n;
1929{
1930 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001931 REQ(n, global_stmt);
1932 /* 'global' NAME (',' NAME)* */
1933 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001934 char *s = STR(CHILD(n, i));
Guido van Rossumfe2236f1996-08-24 07:29:04 +00001935#ifdef PRIVATE_NAME_MANGLING
1936 char buffer[256];
1937 if (s != NULL && s[0] == '_' && s[1] == '_' &&
1938 c->c_private != NULL &&
1939 com_mangle(c, s, buffer, (int)sizeof(buffer)))
1940 s = buffer;
1941#endif
Guido van Rossum681d79a1995-07-18 14:51:37 +00001942 if (dictlookup(c->c_locals, s) != NULL) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001943 com_error(c, SyntaxError, "name is local and global");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001944 }
1945 else if (dictinsert(c->c_globals, s, None) != 0)
Guido van Rossumc5e96291991-12-10 13:53:51 +00001946 c->c_errors++;
1947 }
1948}
1949
Guido van Rossum681d79a1995-07-18 14:51:37 +00001950static int
1951com_newlocal_o(c, nameval)
1952 struct compiling *c;
1953 object *nameval;
1954{
1955 int i;
1956 object *ival;
1957 if (getlistsize(c->c_varnames) != c->c_nlocals) {
1958 /* This is usually caused by an error on a previous call */
1959 if (c->c_errors == 0) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001960 com_error(c, SystemError, "mixed up var name/index");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001961 }
1962 return 0;
1963 }
1964 ival = newintobject(i = c->c_nlocals++);
1965 if (ival == NULL)
1966 c->c_errors++;
1967 else if (mappinginsert(c->c_locals, nameval, ival) != 0)
1968 c->c_errors++;
1969 else if (addlistitem(c->c_varnames, nameval) != 0)
1970 c->c_errors++;
1971 XDECREF(ival);
1972 return i;
1973}
1974
1975static int
1976com_addlocal_o(c, nameval)
1977 struct compiling *c;
1978 object *nameval;
1979{
1980 object *ival = mappinglookup(c->c_locals, nameval);
1981 if (ival != NULL)
1982 return getintvalue(ival);
1983 return com_newlocal_o(c, nameval);
1984}
1985
1986static int
1987com_newlocal(c, name)
1988 struct compiling *c;
1989 char *name;
1990{
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001991 object *nameval = PyString_InternFromString(name);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001992 int i;
1993 if (nameval == NULL) {
1994 c->c_errors++;
1995 return 0;
1996 }
1997 i = com_newlocal_o(c, nameval);
1998 DECREF(nameval);
1999 return i;
2000}
2001
Guido van Rossum8b993a91997-01-17 21:04:03 +00002002#ifdef SUPPORT_OBSOLETE_ACCESS
2003
Guido van Rossum25831651993-05-19 14:50:45 +00002004#define strequ(a, b) (strcmp((a), (b)) == 0)
2005
2006static void
2007com_access_stmt(c, n)
2008 struct compiling *c;
2009 node *n;
2010{
2011 int i, j, k, mode, imode;
2012 object *vmode;
2013 REQ(n, access_stmt);
2014 /* 'access' NAME (',' NAME)* ':' accesstype (',' accesstype)*
2015 accesstype: NAME+ */
2016
2017 /* Find where the colon is */
2018 i = 1;
2019 while (TYPE(CHILD(n,i-1)) != COLON)
2020 i += 1;
2021
2022 /* Calculate the mode mask */
2023 mode = 0;
2024 for (j = i; j < NCH(n); j += 2) {
Guido van Rossum81daa321993-05-20 14:24:46 +00002025 int r = 0, w = 0, p = 0;
2026 for (k = 0; k < NCH(CHILD(n,j)); k++) {
Guido van Rossum25831651993-05-19 14:50:45 +00002027 if (strequ(STR(CHILD(CHILD(n,j),k)), "public"))
2028 p = 0;
2029 else if (strequ(STR(CHILD(CHILD(n,j),k)), "protected"))
2030 p = 1;
2031 else if (strequ(STR(CHILD(CHILD(n,j),k)), "private"))
2032 p = 2;
2033 else if (strequ(STR(CHILD(CHILD(n,j),k)), "read"))
2034 r = 1;
2035 else if (strequ(STR(CHILD(CHILD(n,j),k)), "write"))
2036 w = 1;
2037 else /* XXX should make this an exception */
2038 fprintf(stderr, "bad access type %s\n",
2039 STR(CHILD(CHILD(n,j),k)));
2040 }
2041 if (r == 0 && w == 0)
Guido van Rossum81daa321993-05-20 14:24:46 +00002042 r = w = 1;
Guido van Rossum25831651993-05-19 14:50:45 +00002043 if (p == 0) {
2044 if (r == 1) mode |= AC_R_PUBLIC;
2045 if (w == 1) mode |= AC_W_PUBLIC;
2046 } else if (p == 1) {
2047 if (r == 1) mode |= AC_R_PROTECTED;
2048 if (w == 1) mode |= AC_W_PROTECTED;
2049 } else {
2050 if (r == 1) mode |= AC_R_PRIVATE;
2051 if (w == 1) mode |= AC_W_PRIVATE;
2052 }
2053 }
2054 vmode = newintobject((long)mode);
2055 imode = com_addconst(c, vmode);
2056 XDECREF(vmode);
2057 for (i = 1; TYPE(CHILD(n,i-1)) != COLON; i+=2) {
2058 com_addoparg(c, LOAD_CONST, imode);
2059 com_addopname(c, ACCESS_MODE, CHILD(n, i));
2060 }
2061}
Guido van Rossum0dfcf751996-08-12 22:00:53 +00002062#endif
Guido van Rossum25831651993-05-19 14:50:45 +00002063
Guido van Rossumc5e96291991-12-10 13:53:51 +00002064static void
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002065com_exec_stmt(c, n)
2066 struct compiling *c;
2067 node *n;
2068{
2069 REQ(n, exec_stmt);
2070 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2071 com_node(c, CHILD(n, 1));
2072 if (NCH(n) >= 4)
2073 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002074 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002075 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002076 com_push(c, 1);
2077 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002078 if (NCH(n) >= 6)
2079 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002080 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002081 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002082 com_push(c, 1);
2083 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002084 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002085 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002086}
2087
2088static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002089com_if_stmt(c, n)
2090 struct compiling *c;
2091 node *n;
2092{
2093 int i;
2094 int anchor = 0;
2095 REQ(n, if_stmt);
2096 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2097 for (i = 0; i+3 < NCH(n); i+=4) {
2098 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002099 node *ch = CHILD(n, i+1);
2100 if (i > 0)
2101 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002102 com_node(c, CHILD(n, i+1));
2103 com_addfwref(c, JUMP_IF_FALSE, &a);
2104 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002105 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002106 com_node(c, CHILD(n, i+3));
2107 com_addfwref(c, JUMP_FORWARD, &anchor);
2108 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002109 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002110 com_addbyte(c, POP_TOP);
2111 }
2112 if (i+2 < NCH(n))
2113 com_node(c, CHILD(n, i+2));
2114 com_backpatch(c, anchor);
2115}
2116
2117static void
2118com_while_stmt(c, n)
2119 struct compiling *c;
2120 node *n;
2121{
2122 int break_anchor = 0;
2123 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002124 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002125 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2126 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002127 block_push(c, SETUP_LOOP);
2128 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002129 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002130 com_node(c, CHILD(n, 1));
2131 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2132 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002133 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002134 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002135 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002136 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002137 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2138 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002139 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002140 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002141 com_addbyte(c, POP_TOP);
2142 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002143 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002144 if (NCH(n) > 4)
2145 com_node(c, CHILD(n, 6));
2146 com_backpatch(c, break_anchor);
2147}
2148
2149static void
2150com_for_stmt(c, n)
2151 struct compiling *c;
2152 node *n;
2153{
2154 object *v;
2155 int break_anchor = 0;
2156 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002157 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002158 REQ(n, for_stmt);
2159 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2160 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002161 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002162 com_node(c, CHILD(n, 3));
2163 v = newintobject(0L);
2164 if (v == NULL)
2165 c->c_errors++;
2166 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002167 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002168 XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002169 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002170 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002171 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002172 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002173 com_assign(c, CHILD(n, 1), OP_ASSIGN);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002174 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002175 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002176 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002177 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2178 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002179 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002180 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002181 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002182 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002183 if (NCH(n) > 8)
2184 com_node(c, CHILD(n, 8));
2185 com_backpatch(c, break_anchor);
2186}
2187
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002188/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002189
2190 SETUP_FINALLY L
2191 <code for S>
2192 POP_BLOCK
2193 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002194 L: <code for Sf>
2195 END_FINALLY
2196
2197 The special instructions use the block stack. Each block
2198 stack entry contains the instruction that created it (here
2199 SETUP_FINALLY), the level of the value stack at the time the
2200 block stack entry was created, and a label (here L).
2201
2202 SETUP_FINALLY:
2203 Pushes the current value stack level and the label
2204 onto the block stack.
2205 POP_BLOCK:
2206 Pops en entry from the block stack, and pops the value
2207 stack until its level is the same as indicated on the
2208 block stack. (The label is ignored.)
2209 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002210 Pops a variable number of entries from the *value* stack
2211 and re-raises the exception they specify. The number of
2212 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002213
2214 The block stack is unwound when an exception is raised:
2215 when a SETUP_FINALLY entry is found, the exception is pushed
2216 onto the value stack (and the exception condition is cleared),
2217 and the interpreter jumps to the label gotten from the block
2218 stack.
2219
2220 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002221 (The contents of the value stack is shown in [], with the top
2222 at the right; 'tb' is trace-back info, 'val' the exception's
2223 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002224
2225 Value stack Label Instruction Argument
2226 [] SETUP_EXCEPT L1
2227 [] <code for S>
2228 [] POP_BLOCK
2229 [] JUMP_FORWARD L0
2230
Guido van Rossum3f5da241990-12-20 15:06:42 +00002231 [tb, val, exc] L1: DUP )
2232 [tb, val, exc, exc] <evaluate E1> )
2233 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2234 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2235 [tb, val, exc, 1] POP )
2236 [tb, val, exc] POP
2237 [tb, val] <assign to V1> (or POP if no V1)
2238 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002239 [] <code for S1>
2240 JUMP_FORWARD L0
2241
Guido van Rossum3f5da241990-12-20 15:06:42 +00002242 [tb, val, exc, 0] L2: POP
2243 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002244 .............................etc.......................
2245
Guido van Rossum3f5da241990-12-20 15:06:42 +00002246 [tb, val, exc, 0] Ln+1: POP
2247 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002248
2249 [] L0: <next statement>
2250
2251 Of course, parts are not generated if Vi or Ei is not present.
2252*/
2253
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002254static void
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002255com_try_except(c, n)
2256 struct compiling *c;
2257 node *n;
2258{
2259 int except_anchor = 0;
2260 int end_anchor = 0;
2261 int else_anchor = 0;
2262 int i;
2263 node *ch;
2264
2265 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2266 block_push(c, SETUP_EXCEPT);
2267 com_node(c, CHILD(n, 2));
2268 com_addbyte(c, POP_BLOCK);
2269 block_pop(c, SETUP_EXCEPT);
2270 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2271 com_backpatch(c, except_anchor);
2272 for (i = 3;
2273 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2274 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002275 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002276 if (except_anchor == 0) {
Guido van Rossum452a9831996-09-17 14:32:04 +00002277 com_error(c, SyntaxError,
2278 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002279 break;
2280 }
2281 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002282 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002283 com_addoparg(c, SET_LINENO, ch->n_lineno);
2284 if (NCH(ch) > 1) {
2285 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002286 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002287 com_node(c, CHILD(ch, 1));
2288 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002289 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002290 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
2291 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002292 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002293 }
2294 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002295 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002296 if (NCH(ch) > 3)
Guido van Rossum8861b741996-07-30 16:49:37 +00002297 com_assign(c, CHILD(ch, 3), OP_ASSIGN);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002298 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002299 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002300 com_pop(c, 1);
2301 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002302 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002303 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002304 com_node(c, CHILD(n, i+2));
2305 com_addfwref(c, JUMP_FORWARD, &end_anchor);
2306 if (except_anchor) {
2307 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002308 /* We come in with [tb, val, exc, 0] on the
2309 stack; one pop and it's the same as
2310 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002311 com_addbyte(c, POP_TOP);
2312 }
2313 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002314 /* We actually come in here with [tb, val, exc] but the
2315 END_FINALLY will zap those and jump around.
2316 The c_stacklevel does not reflect them so we need not pop
2317 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002318 com_addbyte(c, END_FINALLY);
2319 com_backpatch(c, else_anchor);
2320 if (i < NCH(n))
2321 com_node(c, CHILD(n, i+2));
2322 com_backpatch(c, end_anchor);
2323}
2324
2325static void
2326com_try_finally(c, n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002327 struct compiling *c;
2328 node *n;
2329{
2330 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002331 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002332
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002333 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
2334 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002335 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002336 com_addbyte(c, POP_BLOCK);
2337 block_pop(c, SETUP_FINALLY);
2338 block_push(c, END_FINALLY);
2339 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002340 /* While the generated code pushes only one item,
2341 the try-finally handling can enter here with
2342 up to three items. OK, here are the details:
2343 3 for an exception, 2 for RETURN, 1 for BREAK. */
2344 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002345 com_backpatch(c, finally_anchor);
2346 ch = CHILD(n, NCH(n)-1);
2347 com_addoparg(c, SET_LINENO, ch->n_lineno);
2348 com_node(c, ch);
2349 com_addbyte(c, END_FINALLY);
2350 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002351 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002352}
2353
2354static void
2355com_try_stmt(c, n)
2356 struct compiling *c;
2357 node *n;
2358{
2359 REQ(n, try_stmt);
2360 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
2361 | 'try' ':' suite 'finally' ':' suite */
2362 if (TYPE(CHILD(n, 3)) != except_clause)
2363 com_try_finally(c, n);
2364 else
2365 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002366}
2367
Guido van Rossum8b993a91997-01-17 21:04:03 +00002368static node *
2369get_rawdocstring(n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002370 node *n;
2371{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002372 int i;
2373
Guido van Rossum8b993a91997-01-17 21:04:03 +00002374 /* Label to avoid tail recursion */
2375 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002376 switch (TYPE(n)) {
2377
2378 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002379 if (NCH(n) == 1) {
2380 n = CHILD(n, 0);
2381 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002382 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002383 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002384 case file_input:
2385 for (i = 0; i < NCH(n); i++) {
2386 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002387 if (TYPE(ch) == stmt) {
2388 n = ch;
2389 goto next;
2390 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002391 }
2392 break;
2393
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002394 case stmt:
2395 case simple_stmt:
2396 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002397 n = CHILD(n, 0);
2398 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002399
2400 case expr_stmt:
2401 case testlist:
2402 case test:
2403 case and_test:
2404 case not_test:
2405 case comparison:
2406 case expr:
2407 case xor_expr:
2408 case and_expr:
2409 case shift_expr:
2410 case arith_expr:
2411 case term:
2412 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00002413 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002414 if (NCH(n) == 1) {
2415 n = CHILD(n, 0);
2416 goto next;
2417 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002418 break;
2419
2420 case atom:
2421 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002422 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002423 break;
2424
2425 }
2426 return NULL;
2427}
2428
Guido van Rossum8b993a91997-01-17 21:04:03 +00002429static object *
2430get_docstring(n)
2431 node *n;
2432{
2433 n = get_rawdocstring(n);
2434 if (n == NULL)
2435 return NULL;
2436 return parsestrplus(n);
2437}
2438
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002439static void
2440com_suite(c, n)
2441 struct compiling *c;
2442 node *n;
2443{
2444 REQ(n, suite);
2445 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
2446 if (NCH(n) == 1) {
2447 com_node(c, CHILD(n, 0));
2448 }
2449 else {
2450 int i;
2451 for (i = 0; i < NCH(n); i++) {
2452 node *ch = CHILD(n, i);
2453 if (TYPE(ch) == stmt)
2454 com_node(c, ch);
2455 }
2456 }
2457}
2458
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002459/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002460static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002461com_continue_stmt(c, n)
2462 struct compiling *c;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002463 node *n; /* Not used, but passed for consistency */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002464{
2465 int i = c->c_nblocks;
2466 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
2467 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2468 }
2469 else {
Guido van Rossum452a9831996-09-17 14:32:04 +00002470 com_error(c, SyntaxError, "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002471 }
2472 /* XXX Could allow it inside a 'finally' clause
2473 XXX if we could pop the exception still on the stack */
2474}
2475
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002476static int
Guido van Rossum681d79a1995-07-18 14:51:37 +00002477com_argdefs(c, n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002478 struct compiling *c;
2479 node *n;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002480{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002481 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002482 if (TYPE(n) == lambdef) {
2483 /* lambdef: 'lambda' [varargslist] ':' test */
2484 n = CHILD(n, 1);
2485 }
2486 else {
2487 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
2488 n = CHILD(n, 2);
2489 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
2490 n = CHILD(n, 1);
2491 }
2492 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002493 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002494 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002495 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002496 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
2497 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002498 nargs = 0;
2499 ndefs = 0;
2500 for (i = 0; i < nch; i++) {
2501 int t;
Guido van Rossum50564e81996-01-12 01:13:16 +00002502 if (TYPE(CHILD(n, i)) == STAR || TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002503 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002504 nargs++;
2505 i++;
2506 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00002507 t = RPAR; /* Anything except EQUAL or COMMA */
2508 else
2509 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002510 if (t == EQUAL) {
2511 i++;
2512 ndefs++;
2513 com_node(c, CHILD(n, i));
2514 i++;
2515 if (i >= nch)
2516 break;
2517 t = TYPE(CHILD(n, i));
2518 }
2519 else {
2520 /* Treat "(a=1, b)" as "(a=1, b=None)" */
2521 if (ndefs) {
2522 com_addoparg(c, LOAD_CONST,
2523 com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002524 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002525 ndefs++;
2526 }
2527 }
2528 if (t != COMMA)
2529 break;
2530 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002531 return ndefs;
2532}
2533
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002534static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002535com_funcdef(c, n)
2536 struct compiling *c;
2537 node *n;
2538{
2539 object *v;
2540 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00002541 v = (object *)icompile(n, c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002542 if (v == NULL)
2543 c->c_errors++;
2544 else {
2545 int i = com_addconst(c, v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002546 int ndefs = com_argdefs(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002547 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002548 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002549 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002550 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002551 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002552 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002553 DECREF(v);
2554 }
2555}
2556
2557static void
Guido van Rossum25831651993-05-19 14:50:45 +00002558com_bases(c, n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002559 struct compiling *c;
2560 node *n;
2561{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002562 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002563 REQ(n, testlist);
2564 /* testlist: test (',' test)* [','] */
2565 for (i = 0; i < NCH(n); i += 2)
2566 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002567 i = (NCH(n)+1) / 2;
2568 com_addoparg(c, BUILD_TUPLE, i);
2569 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00002570}
2571
2572static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002573com_classdef(c, n)
2574 struct compiling *c;
2575 node *n;
2576{
Guido van Rossum25831651993-05-19 14:50:45 +00002577 int i;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002578 object *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002579 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00002580 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00002581 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00002582 c->c_errors++;
2583 return;
2584 }
2585 /* Push the class name on the stack */
2586 i = com_addconst(c, v);
2587 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002588 com_push(c, 1);
Guido van Rossum25831651993-05-19 14:50:45 +00002589 DECREF(v);
2590 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002591 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00002592 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002593 com_push(c, 1);
2594 }
Guido van Rossum25831651993-05-19 14:50:45 +00002595 else
2596 com_bases(c, CHILD(n, 3));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00002597 v = (object *)icompile(n, c);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002598 if (v == NULL)
2599 c->c_errors++;
2600 else {
Guido van Rossum25831651993-05-19 14:50:45 +00002601 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002602 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002603 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002604 com_addoparg(c, MAKE_FUNCTION, 0);
2605 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002606 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002607 com_pop(c, 2);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002608 com_addopname(c, STORE_NAME, CHILD(n, 1));
2609 DECREF(v);
2610 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002611}
2612
2613static void
2614com_node(c, n)
2615 struct compiling *c;
2616 node *n;
2617{
2618 switch (TYPE(n)) {
2619
2620 /* Definition nodes */
2621
2622 case funcdef:
2623 com_funcdef(c, n);
2624 break;
2625 case classdef:
2626 com_classdef(c, n);
2627 break;
2628
2629 /* Trivial parse tree nodes */
2630
2631 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002632 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002633 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002634 com_node(c, CHILD(n, 0));
2635 break;
2636
2637 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002638 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
2639 com_addoparg(c, SET_LINENO, n->n_lineno);
2640 {
2641 int i;
2642 for (i = 0; i < NCH(n)-1; i += 2)
2643 com_node(c, CHILD(n, i));
2644 }
2645 break;
2646
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002647 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002648 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002649 com_node(c, CHILD(n, 0));
2650 break;
2651
2652 /* Statement nodes */
2653
2654 case expr_stmt:
2655 com_expr_stmt(c, n);
2656 break;
2657 case print_stmt:
2658 com_print_stmt(c, n);
2659 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002660 case del_stmt: /* 'del' exprlist */
Guido van Rossum8861b741996-07-30 16:49:37 +00002661 com_assign(c, CHILD(n, 1), OP_DELETE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002662 break;
2663 case pass_stmt:
2664 break;
2665 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002666 if (c->c_loops == 0) {
Guido van Rossum452a9831996-09-17 14:32:04 +00002667 com_error(c, SyntaxError, "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002668 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002669 com_addbyte(c, BREAK_LOOP);
2670 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002671 case continue_stmt:
2672 com_continue_stmt(c, n);
2673 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002674 case return_stmt:
2675 com_return_stmt(c, n);
2676 break;
2677 case raise_stmt:
2678 com_raise_stmt(c, n);
2679 break;
2680 case import_stmt:
2681 com_import_stmt(c, n);
2682 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002683 case global_stmt:
2684 com_global_stmt(c, n);
2685 break;
Guido van Rossum0dfcf751996-08-12 22:00:53 +00002686#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum25831651993-05-19 14:50:45 +00002687 case access_stmt:
2688 com_access_stmt(c, n);
2689 break;
Guido van Rossum0dfcf751996-08-12 22:00:53 +00002690#endif
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002691 case exec_stmt:
2692 com_exec_stmt(c, n);
2693 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002694 case if_stmt:
2695 com_if_stmt(c, n);
2696 break;
2697 case while_stmt:
2698 com_while_stmt(c, n);
2699 break;
2700 case for_stmt:
2701 com_for_stmt(c, n);
2702 break;
2703 case try_stmt:
2704 com_try_stmt(c, n);
2705 break;
2706 case suite:
2707 com_suite(c, n);
2708 break;
2709
2710 /* Expression nodes */
2711
2712 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002713 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002714 break;
2715 case test:
2716 com_test(c, n);
2717 break;
2718 case and_test:
2719 com_and_test(c, n);
2720 break;
2721 case not_test:
2722 com_not_test(c, n);
2723 break;
2724 case comparison:
2725 com_comparison(c, n);
2726 break;
2727 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002728 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002729 break;
2730 case expr:
2731 com_expr(c, n);
2732 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002733 case xor_expr:
2734 com_xor_expr(c, n);
2735 break;
2736 case and_expr:
2737 com_and_expr(c, n);
2738 break;
2739 case shift_expr:
2740 com_shift_expr(c, n);
2741 break;
2742 case arith_expr:
2743 com_arith_expr(c, n);
2744 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002745 case term:
2746 com_term(c, n);
2747 break;
2748 case factor:
2749 com_factor(c, n);
2750 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00002751 case power:
2752 com_power(c, n);
2753 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002754 case atom:
2755 com_atom(c, n);
2756 break;
2757
2758 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002759 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum452a9831996-09-17 14:32:04 +00002760 com_error(c, SystemError, "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002761 }
2762}
2763
2764static void com_fplist PROTO((struct compiling *, node *));
2765
2766static void
2767com_fpdef(c, n)
2768 struct compiling *c;
2769 node *n;
2770{
2771 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
2772 if (TYPE(CHILD(n, 0)) == LPAR)
2773 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002774 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002775 com_addoparg(c, STORE_FAST, com_newlocal(c, STR(CHILD(n, 0))));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002776 com_pop(c, 1);
2777 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002778}
2779
2780static void
2781com_fplist(c, n)
2782 struct compiling *c;
2783 node *n;
2784{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00002785 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002786 if (NCH(n) == 1) {
2787 com_fpdef(c, CHILD(n, 0));
2788 }
2789 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002790 int i = (NCH(n)+1)/2;
2791 com_addoparg(c, UNPACK_TUPLE, i);
2792 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002793 for (i = 0; i < NCH(n); i += 2)
2794 com_fpdef(c, CHILD(n, i));
2795 }
2796}
2797
2798static void
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002799com_arglist(c, n)
2800 struct compiling *c;
2801 node *n;
2802{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002803 int nch, i;
2804 int complex = 0;
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002805 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00002806 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002807 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002808 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002809 /* Enter all arguments in table of locals */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002810 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002811 node *ch = CHILD(n, i);
2812 node *fp;
2813 char *name;
Guido van Rossum50564e81996-01-12 01:13:16 +00002814 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002815 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002816 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
2817 fp = CHILD(ch, 0);
2818 if (TYPE(fp) == NAME)
2819 name = STR(fp);
2820 else {
2821 name = "";
Guido van Rossum530956d1996-07-21 02:27:43 +00002822 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002823 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002824 com_newlocal(c, name);
2825 c->c_argcount++;
2826 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002827 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002828 ch = CHILD(n, i);
2829 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002830 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002831 else
2832 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002833 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002834 /* Handle *arguments */
2835 if (i < nch) {
2836 node *ch;
2837 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00002838 if (TYPE(ch) != DOUBLESTAR) {
2839 REQ(ch, STAR);
2840 ch = CHILD(n, i+1);
2841 if (TYPE(ch) == NAME) {
2842 c->c_flags |= CO_VARARGS;
2843 i += 3;
2844 com_newlocal(c, STR(ch));
2845 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002846 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002847 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002848 /* Handle **keywords */
2849 if (i < nch) {
2850 node *ch;
2851 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00002852 if (TYPE(ch) != DOUBLESTAR) {
2853 REQ(ch, STAR);
2854 ch = CHILD(n, i+1);
2855 REQ(ch, STAR);
2856 ch = CHILD(n, i+2);
2857 }
2858 else
2859 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002860 REQ(ch, NAME);
2861 c->c_flags |= CO_VARKEYWORDS;
2862 com_newlocal(c, STR(ch));
2863 }
2864 if (complex) {
2865 /* Generate code for complex arguments only after
2866 having counted the simple arguments */
2867 int ilocal = 0;
2868 for (i = 0; i < nch; i++) {
2869 node *ch = CHILD(n, i);
2870 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00002871 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002872 break;
2873 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
2874 fp = CHILD(ch, 0);
2875 if (TYPE(fp) != NAME) {
2876 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002877 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002878 com_fpdef(c, ch);
2879 }
2880 ilocal++;
2881 if (++i >= nch)
2882 break;
2883 ch = CHILD(n, i);
2884 if (TYPE(ch) == EQUAL)
2885 i += 2;
2886 else
2887 REQ(ch, COMMA);
2888 }
2889 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002890}
2891
2892static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002893com_file_input(c, n)
2894 struct compiling *c;
2895 node *n;
2896{
2897 int i;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002898 object *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002899 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002900 doc = get_docstring(n);
2901 if (doc != NULL) {
2902 int i = com_addconst(c, doc);
2903 DECREF(doc);
2904 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002905 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002906 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00002907 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002908 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002909 for (i = 0; i < NCH(n); i++) {
2910 node *ch = CHILD(n, i);
2911 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
2912 com_node(c, ch);
2913 }
2914}
2915
2916/* Top-level compile-node interface */
2917
2918static void
2919compile_funcdef(c, n)
2920 struct compiling *c;
2921 node *n;
2922{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002923 object *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002924 node *ch;
2925 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00002926 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002927 doc = get_docstring(CHILD(n, 4));
2928 if (doc != NULL) {
2929 (void) com_addconst(c, doc);
2930 DECREF(doc);
2931 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002932 else
2933 (void) com_addconst(c, None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002934 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
2935 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00002936 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002937 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002938 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002939 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002940 c->c_infunction = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002941 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002942 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002943 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002944 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002945}
2946
2947static void
Guido van Rossum590baa41993-11-30 13:40:46 +00002948compile_lambdef(c, n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002949 struct compiling *c;
2950 node *n;
2951{
Guido van Rossum590baa41993-11-30 13:40:46 +00002952 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002953 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00002954 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00002955
2956 ch = CHILD(n, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002957 (void) com_addconst(c, None); /* No docstring */
2958 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00002959 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002960 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00002961 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002962 else
2963 ch = CHILD(n, 2);
2964 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002965 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002966 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002967}
2968
2969static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002970compile_classdef(c, n)
2971 struct compiling *c;
2972 node *n;
2973{
2974 node *ch;
2975 object *doc;
2976 REQ(n, classdef);
2977 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
2978 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00002979#ifdef PRIVATE_NAME_MANGLING
2980 c->c_private = c->c_name;
2981#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002982 ch = CHILD(n, NCH(n)-1); /* The suite */
2983 doc = get_docstring(ch);
2984 if (doc != NULL) {
2985 int i = com_addconst(c, doc);
2986 DECREF(doc);
2987 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002988 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002989 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00002990 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002991 }
2992 else
2993 (void) com_addconst(c, None);
2994 com_node(c, ch);
2995 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002996 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002997 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002998 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002999}
3000
3001static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003002compile_node(c, n)
3003 struct compiling *c;
3004 node *n;
3005{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003006 com_addoparg(c, SET_LINENO, n->n_lineno);
3007
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003008 switch (TYPE(n)) {
3009
Guido van Rossum4c417781991-01-21 16:09:22 +00003010 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003011 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003012 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003013 n = CHILD(n, 0);
3014 if (TYPE(n) != NEWLINE)
3015 com_node(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003016 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003017 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003018 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003019 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003020 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003021 break;
3022
Guido van Rossum4c417781991-01-21 16:09:22 +00003023 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003024 com_file_input(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003025 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003026 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003027 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003028 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003029 break;
3030
Guido van Rossum590baa41993-11-30 13:40:46 +00003031 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003032 com_node(c, CHILD(n, 0));
3033 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003034 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003035 break;
3036
Guido van Rossum590baa41993-11-30 13:40:46 +00003037 case lambdef: /* anonymous function definition */
3038 compile_lambdef(c, n);
3039 break;
3040
Guido van Rossum4c417781991-01-21 16:09:22 +00003041 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003042 compile_funcdef(c, n);
3043 break;
3044
Guido van Rossum4c417781991-01-21 16:09:22 +00003045 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003046 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003047 break;
3048
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003049 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003050 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum452a9831996-09-17 14:32:04 +00003051 com_error(c, SystemError,
3052 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003053 }
3054}
3055
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003056/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00003057
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003058 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
3059 instructions that refer to local variables with LOAD_FAST etc.
3060 The latter instructions are much faster because they don't need to
3061 look up the variable name in a dictionary.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003062
Guido van Rossum681d79a1995-07-18 14:51:37 +00003063 To find all local variables, we check all STORE_NAME, IMPORT_FROM
3064 and DELETE_NAME instructions. This yields all local variables,
3065 function definitions, class definitions and import statements.
3066 Argument names have already been entered into the list by the
3067 special processing for the argument list.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003068
3069 All remaining LOAD_NAME instructions must refer to non-local (global
3070 or builtin) variables, so are replaced by LOAD_GLOBAL.
3071
3072 There are two problems: 'from foo import *' and 'exec' may introduce
3073 local variables that we can't know while compiling. If this is the
Guido van Rossum681d79a1995-07-18 14:51:37 +00003074 case, we can still optimize bona fide locals (since those
3075 statements will be surrounded by fast_2_locals() and
3076 locals_2_fast()), but we can't change LOAD_NAME to LOAD_GLOBAL.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003077
Guido van Rossum681d79a1995-07-18 14:51:37 +00003078 NB: this modifies the string object c->c_code! */
Guido van Rossum282914b1991-04-04 10:42:56 +00003079
3080static void
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003081optimize(c)
3082 struct compiling *c;
Guido van Rossum282914b1991-04-04 10:42:56 +00003083{
Guido van Rossum0a697f61991-04-16 08:39:12 +00003084 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00003085 int opcode;
Guido van Rossum80bb9651996-12-05 23:27:02 +00003086 int oparg = 0;
Guido van Rossum282914b1991-04-04 10:42:56 +00003087 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003088 object *error_type, *error_value, *error_traceback;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003089
Guido van Rossum282914b1991-04-04 10:42:56 +00003090#define NEXTOP() (*next_instr++)
3091#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
3092#define GETITEM(v, i) (getlistitem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003093#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
3094
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003095 err_fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003096
3097 c->c_flags |= CO_OPTIMIZED;
Guido van Rossum282914b1991-04-04 10:42:56 +00003098
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003099 next_instr = (unsigned char *) getstringvalue(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003100 for (;;) {
3101 opcode = NEXTOP();
3102 if (opcode == STOP_CODE)
3103 break;
3104 if (HAS_ARG(opcode))
3105 oparg = NEXTARG();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003106 switch (opcode) {
3107 case STORE_NAME:
3108 case DELETE_NAME:
3109 case IMPORT_FROM:
3110 com_addlocal_o(c, GETNAMEOBJ(oparg));
3111 break;
3112 case EXEC_STMT:
3113 c->c_flags &= ~CO_OPTIMIZED;
3114 break;
Guido van Rossum282914b1991-04-04 10:42:56 +00003115 }
3116 }
3117
Guido van Rossum681d79a1995-07-18 14:51:37 +00003118 if (dictlookup(c->c_locals, "*") != NULL)
3119 c->c_flags &= ~CO_OPTIMIZED;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003120
3121 next_instr = (unsigned char *) getstringvalue(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003122 for (;;) {
3123 cur_instr = next_instr;
3124 opcode = NEXTOP();
3125 if (opcode == STOP_CODE)
3126 break;
3127 if (HAS_ARG(opcode))
3128 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003129 if (opcode == LOAD_NAME ||
3130 opcode == STORE_NAME ||
3131 opcode == DELETE_NAME) {
3132 object *v;
3133 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00003134 name = GETNAMEOBJ(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003135 v = dict2lookup(c->c_locals, name);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003136 if (v == NULL) {
Guido van Rossum83163251991-08-16 08:58:43 +00003137 err_clear();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003138 if (opcode == LOAD_NAME &&
3139 (c->c_flags&CO_OPTIMIZED))
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003140 cur_instr[0] = LOAD_GLOBAL;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003141 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00003142 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003143 i = getintvalue(v);
3144 switch (opcode) {
3145 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
3146 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
3147 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
3148 }
3149 cur_instr[1] = i & 0xff;
3150 cur_instr[2] = (i>>8) & 0xff;
Guido van Rossum282914b1991-04-04 10:42:56 +00003151 }
3152 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003153
Guido van Rossum681d79a1995-07-18 14:51:37 +00003154 if (c->c_errors == 0)
3155 err_restore(error_type, error_value, error_traceback);
Guido van Rossum282914b1991-04-04 10:42:56 +00003156}
3157
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003158codeobject *
Guido van Rossum590baa41993-11-30 13:40:46 +00003159compile(n, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003160 node *n;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003161 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003162{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003163 return jcompile(n, filename, NULL);
3164}
3165
3166static codeobject *
3167icompile(n, base)
3168 node *n;
3169 struct compiling *base;
3170{
3171 return jcompile(n, base->c_filename, base);
3172}
3173
3174static codeobject *
3175jcompile(n, filename, base)
3176 node *n;
3177 char *filename;
3178 struct compiling *base;
3179{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003180 struct compiling sc;
3181 codeobject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003182 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003183 return NULL;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003184#ifdef PRIVATE_NAME_MANGLING
3185 if (base)
3186 sc.c_private = base->c_private;
3187 else
3188 sc.c_private = NULL;
3189#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003190 compile_node(&sc, n);
3191 com_done(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003192 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003193 optimize(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003194 sc.c_flags |= CO_NEWLOCALS;
3195 }
3196 else if (TYPE(n) == classdef)
3197 sc.c_flags |= CO_NEWLOCALS;
Guido van Rossum9bfef441993-03-29 10:43:31 +00003198 co = NULL;
3199 if (sc.c_errors == 0) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003200 object *consts, *names, *varnames, *filename, *name;
3201 consts = listtuple(sc.c_consts);
3202 names = listtuple(sc.c_names);
3203 varnames = listtuple(sc.c_varnames);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003204 filename = PyString_InternFromString(sc.c_filename);
3205 name = PyString_InternFromString(sc.c_name);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003206 if (!err_occurred())
3207 co = newcodeobject(sc.c_argcount,
3208 sc.c_nlocals,
Guido van Rossum8b993a91997-01-17 21:04:03 +00003209 sc.c_maxstacklevel,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003210 sc.c_flags,
3211 sc.c_code,
3212 consts,
3213 names,
3214 varnames,
3215 filename,
3216 name);
3217 XDECREF(consts);
3218 XDECREF(names);
3219 XDECREF(varnames);
3220 XDECREF(filename);
3221 XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003222 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003223 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003224 return co;
3225}