blob: 6d3a479f49c84f0cbda5a74ee55f1a6fb9bf2a22 [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);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000228 char *p;
229 if (!is_stringobject(v))
230 continue;
231 p = getstringvalue(v);
232 if (strspn(p, "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz")
233 != getstringsize(v))
234 continue;
235 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000236 }
237 co = NEWOBJ(codeobject, &Codetype);
238 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000239 co->co_argcount = argcount;
240 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000241 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000242 co->co_flags = flags;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000243 INCREF(code);
244 co->co_code = (stringobject *)code;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000245 INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000246 co->co_consts = consts;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000247 INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000248 co->co_names = names;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000249 INCREF(varnames);
250 co->co_varnames = varnames;
Guido van Rossuma082ce41991-06-04 19:41:56 +0000251 INCREF(filename);
252 co->co_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000253 INCREF(name);
254 co->co_name = name;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000255 }
256 return co;
257}
258
259
260/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000261
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000262struct compiling {
263 object *c_code; /* string */
264 object *c_consts; /* list of objects */
265 object *c_names; /* list of strings (names) */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000266 object *c_globals; /* dictionary (value=None) */
267 object *c_locals; /* dictionary (value=localID) */
268 object *c_varnames; /* list (inverse of c_locals) */
269 int c_nlocals; /* index of next local */
270 int c_argcount; /* number of top-level arguments */
271 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000272 int c_nexti; /* index into c_code */
273 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000274 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000275 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000276 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000277 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000278 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000279 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000280 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000281 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000282 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000283 int c_stacklevel; /* Current stack level */
284 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000285#ifdef PRIVATE_NAME_MANGLING
286 char *c_private; /* for private name mangling */
287#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000288};
289
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000290
Guido van Rossum452a9831996-09-17 14:32:04 +0000291/* Error message including line number */
292
293static void
294com_error(c, exc, msg)
295 struct compiling *c;
296 object *exc;
297 char *msg;
298{
299 int n = strlen(msg);
300 object *v;
301 char buffer[30];
302 char *s;
Guido van Rossum635abd21997-01-06 22:56:52 +0000303 c->c_errors++;
Guido van Rossum452a9831996-09-17 14:32:04 +0000304 if (c->c_lineno <= 1) {
305 /* Unknown line number or single interactive command */
306 err_setstr(exc, msg);
307 return;
308 }
309 sprintf(buffer, " (line %d)", c->c_lineno);
310 v = newsizedstringobject((char *)NULL, n + strlen(buffer));
311 if (v == NULL)
312 return; /* MemoryError, too bad */
313 s = GETSTRINGVALUE((stringobject *)v);
314 strcpy(s, msg);
315 strcat(s, buffer);
316 err_setval(exc, v);
317 DECREF(v);
Guido van Rossum452a9831996-09-17 14:32:04 +0000318}
319
320
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000321/* Interface to the block stack */
322
323static void
324block_push(c, type)
325 struct compiling *c;
326 int type;
327{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000328 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum452a9831996-09-17 14:32:04 +0000329 com_error(c, SystemError, "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000330 }
331 else {
332 c->c_block[c->c_nblocks++] = type;
333 }
334}
335
336static void
337block_pop(c, type)
338 struct compiling *c;
339 int type;
340{
341 if (c->c_nblocks > 0)
342 c->c_nblocks--;
343 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum452a9831996-09-17 14:32:04 +0000344 com_error(c, SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000345 }
346}
347
348
Guido van Rossum681d79a1995-07-18 14:51:37 +0000349/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000350
Guido van Rossum590baa41993-11-30 13:40:46 +0000351static int com_init PROTO((struct compiling *, char *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000352static void com_free PROTO((struct compiling *));
Guido van Rossum8b993a91997-01-17 21:04:03 +0000353static void com_push PROTO((struct compiling *, int));
354static void com_pop PROTO((struct compiling *, int));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000355static void com_done PROTO((struct compiling *));
356static void com_node PROTO((struct compiling *, struct _node *));
Guido van Rossum50564e81996-01-12 01:13:16 +0000357static void com_factor PROTO((struct compiling *, struct _node *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000358static void com_addbyte PROTO((struct compiling *, int));
359static void com_addint PROTO((struct compiling *, int));
360static void com_addoparg PROTO((struct compiling *, int, int));
361static void com_addfwref PROTO((struct compiling *, int, int *));
362static void com_backpatch PROTO((struct compiling *, int));
363static int com_add PROTO((struct compiling *, object *, object *));
364static int com_addconst PROTO((struct compiling *, object *));
365static int com_addname PROTO((struct compiling *, object *));
366static void com_addopname PROTO((struct compiling *, int, node *));
Guido van Rossum288a60f1991-12-16 13:05:10 +0000367static void com_list PROTO((struct compiling *, node *, int));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000368static int com_argdefs PROTO((struct compiling *, node *));
369static int com_newlocal PROTO((struct compiling *, char *));
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000370static codeobject *icompile PROTO((struct _node *, struct compiling *));
371static codeobject *jcompile PROTO((struct _node *, char *, struct compiling *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000372
373static int
Guido van Rossum590baa41993-11-30 13:40:46 +0000374com_init(c, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000375 struct compiling *c;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000376 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000377{
Guido van Rossum62d46241991-04-03 19:00:23 +0000378 if ((c->c_code = newsizedstringobject((char *)NULL, 1000)) == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000379 goto fail_3;
380 if ((c->c_consts = newlistobject(0)) == NULL)
381 goto fail_2;
382 if ((c->c_names = newlistobject(0)) == NULL)
383 goto fail_1;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000384 if ((c->c_globals = newdictobject()) == NULL)
385 goto fail_0;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000386 if ((c->c_locals = newdictobject()) == NULL)
387 goto fail_00;
388 if ((c->c_varnames = newlistobject(0)) == NULL)
389 goto fail_000;
390 c->c_nlocals = 0;
391 c->c_argcount = 0;
392 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000393 c->c_nexti = 0;
394 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000395 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000396 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000397 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000398 c->c_begin = 0;
399 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000400 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000401 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000402 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000403 c->c_stacklevel = 0;
404 c->c_maxstacklevel = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000405 return 1;
406
Guido van Rossum681d79a1995-07-18 14:51:37 +0000407 fail_000:
408 DECREF(c->c_locals);
409 fail_00:
410 DECREF(c->c_globals);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000411 fail_0:
412 DECREF(c->c_names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000413 fail_1:
414 DECREF(c->c_consts);
415 fail_2:
416 DECREF(c->c_code);
417 fail_3:
418 return 0;
419}
420
421static void
422com_free(c)
423 struct compiling *c;
424{
425 XDECREF(c->c_code);
426 XDECREF(c->c_consts);
427 XDECREF(c->c_names);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000428 XDECREF(c->c_globals);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000429 XDECREF(c->c_locals);
430 XDECREF(c->c_varnames);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000431}
432
433static void
Guido van Rossum8b993a91997-01-17 21:04:03 +0000434com_push(c, n)
435 struct compiling *c;
436 int n;
437{
438 c->c_stacklevel += n;
439 if (c->c_stacklevel > c->c_maxstacklevel)
440 c->c_maxstacklevel = c->c_stacklevel;
441}
442
443static void
444com_pop(c, n)
445 struct compiling *c;
446 int n;
447{
448 if (c->c_stacklevel < n) {
449 fprintf(stderr,
450 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
451 c->c_filename, c->c_lineno,
452 c->c_nexti, c->c_stacklevel, n);
453 c->c_stacklevel = 0;
454 }
455 else
456 c->c_stacklevel -= n;
457}
458
459static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000460com_done(c)
461 struct compiling *c;
462{
463 if (c->c_code != NULL)
464 resizestring(&c->c_code, c->c_nexti);
465}
466
467static void
468com_addbyte(c, byte)
469 struct compiling *c;
470 int byte;
471{
472 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000473 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000474 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000475 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000476 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000477 fatal("com_addbyte: byte out of range");
Guido van Rossum01cfd441991-10-20 20:12:38 +0000478 */
Guido van Rossum452a9831996-09-17 14:32:04 +0000479 com_error(c, SystemError, "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000480 }
481 if (c->c_code == NULL)
482 return;
483 len = getstringsize(c->c_code);
484 if (c->c_nexti >= len) {
485 if (resizestring(&c->c_code, len+1000) != 0) {
486 c->c_errors++;
487 return;
488 }
489 }
490 getstringvalue(c->c_code)[c->c_nexti++] = byte;
491}
492
493static void
494com_addint(c, x)
495 struct compiling *c;
496 int x;
497{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000498 com_addbyte(c, x & 0xff);
499 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000500}
501
502static void
503com_addoparg(c, op, arg)
504 struct compiling *c;
505 int op;
506 int arg;
507{
Guido van Rossum452a9831996-09-17 14:32:04 +0000508 if (op == SET_LINENO)
509 c->c_lineno = arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000510 com_addbyte(c, op);
511 com_addint(c, arg);
512}
513
514static void
515com_addfwref(c, op, p_anchor)
516 struct compiling *c;
517 int op;
518 int *p_anchor;
519{
520 /* Compile a forward reference for backpatching */
521 int here;
522 int anchor;
523 com_addbyte(c, op);
524 here = c->c_nexti;
525 anchor = *p_anchor;
526 *p_anchor = here;
527 com_addint(c, anchor == 0 ? 0 : here - anchor);
528}
529
530static void
531com_backpatch(c, anchor)
532 struct compiling *c;
533 int anchor; /* Must be nonzero */
534{
535 unsigned char *code = (unsigned char *) getstringvalue(c->c_code);
536 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000537 int dist;
538 int prev;
539 for (;;) {
540 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000541 prev = code[anchor] + (code[anchor+1] << 8);
542 dist = target - (anchor+2);
543 code[anchor] = dist & 0xff;
544 code[anchor+1] = dist >> 8;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000545 if (!prev)
546 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000547 anchor -= prev;
548 }
549}
550
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000551/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000552
553static int
554com_add(c, list, v)
555 struct compiling *c;
556 object *list;
557 object *v;
558{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000559 int n = getlistsize(list);
560 int i;
561 for (i = n; --i >= 0; ) {
562 object *w = getlistitem(list, i);
Guido van Rossumefc0bd01991-07-01 18:44:20 +0000563 if (v->ob_type == w->ob_type && cmpobject(v, w) == 0)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000564 return i;
565 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000566 if (addlistitem(list, v) != 0)
567 c->c_errors++;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000568 return n;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000569}
570
571static int
572com_addconst(c, v)
573 struct compiling *c;
574 object *v;
575{
576 return com_add(c, c->c_consts, v);
577}
578
579static int
580com_addname(c, v)
581 struct compiling *c;
582 object *v;
583{
584 return com_add(c, c->c_names, v);
585}
586
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000587#ifdef PRIVATE_NAME_MANGLING
588static int
589com_mangle(c, name, buffer, maxlen)
590 struct compiling *c;
591 char *name;
592 char *buffer;
593 int maxlen;
594{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000595 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000596 This is independent from how the name is used. */
597 char *p;
598 int nlen, plen;
599 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000600 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000601 return 0; /* Don't mangle __extremely_long_names */
602 if (name[nlen-1] == '_' && name[nlen-2] == '_')
603 return 0; /* Don't mangle __whatever__ */
604 p = c->c_private;
605 /* Strip leading underscores from class name */
606 while (*p == '_')
607 p++;
608 if (*p == '\0')
609 return 0; /* Don't mangle if class is just underscores */
610 plen = strlen(p);
611 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000612 plen = maxlen-nlen-2; /* Truncate class name if too long */
613 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000614 buffer[0] = '_';
615 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000616 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000617 /* fprintf(stderr, "mangle %s -> %s\n", name, buffer); */
618 return 1;
619}
620#endif
621
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000622static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000623com_addopnamestr(c, op, name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000624 struct compiling *c;
625 int op;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000626 char *name;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000627{
628 object *v;
629 int i;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000630#ifdef PRIVATE_NAME_MANGLING
631 char buffer[256];
632 if (name != NULL && name[0] == '_' && name[1] == '_' &&
633 c->c_private != NULL &&
634 com_mangle(c, name, buffer, (int)sizeof(buffer)))
635 name = buffer;
636#endif
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000637 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000638 c->c_errors++;
639 i = 255;
640 }
641 else {
642 i = com_addname(c, v);
643 DECREF(v);
644 }
Guido van Rossumc5e96291991-12-10 13:53:51 +0000645 /* Hack to replace *_NAME opcodes by *_GLOBAL if necessary */
646 switch (op) {
647 case LOAD_NAME:
648 case STORE_NAME:
649 case DELETE_NAME:
650 if (dictlookup(c->c_globals, name) != NULL) {
651 switch (op) {
652 case LOAD_NAME: op = LOAD_GLOBAL; break;
653 case STORE_NAME: op = STORE_GLOBAL; break;
654 case DELETE_NAME: op = DELETE_GLOBAL; break;
655 }
656 }
657 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000658 com_addoparg(c, op, i);
659}
660
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000661static void
662com_addopname(c, op, n)
663 struct compiling *c;
664 int op;
665 node *n;
666{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000667 char *name;
668 char buffer[1000];
669 /* XXX it is possible to write this code without the 1000
670 chars on the total length of dotted names, I just can't be
671 bothered right now */
672 if (TYPE(n) == STAR)
673 name = "*";
674 else if (TYPE(n) == dotted_name) {
675 char *p = buffer;
676 int i;
677 name = buffer;
678 for (i = 0; i < NCH(n); i += 2) {
679 char *s = STR(CHILD(n, i));
680 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum452a9831996-09-17 14:32:04 +0000681 com_error(c, MemoryError,
682 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +0000683 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000684 break;
685 }
686 if (p != buffer)
687 *p++ = '.';
688 strcpy(p, s);
689 p = strchr(p, '\0');
690 }
691 }
692 else {
693 REQ(n, NAME);
694 name = STR(n);
695 }
696 com_addopnamestr(c, op, name);
697}
698
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000699static object *
Guido van Rossum452a9831996-09-17 14:32:04 +0000700parsenumber(co, s)
701 struct compiling *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000702 char *s;
703{
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000704 extern long mystrtol PROTO((const char *, char **, int));
705 extern unsigned long mystrtoul PROTO((const char *, char **, int));
706 extern double atof PROTO((const char *));
Guido van Rossumc5e96291991-12-10 13:53:51 +0000707 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000708 long x;
Guido van Rossum50564e81996-01-12 01:13:16 +0000709#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +0000710 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +0000711 int imflag;
712#endif
713
Guido van Rossum282914b1991-04-04 10:42:56 +0000714 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000715 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +0000716#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +0000717 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +0000718#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000719 if (*end == 'l' || *end == 'L')
Guido van Rossumc5e96291991-12-10 13:53:51 +0000720 return long_scan(s, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000721 if (s[0] == '0')
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000722 x = (long) mystrtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000723 else
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000724 x = mystrtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +0000725 if (*end == '\0') {
726 if (errno != 0) {
Guido van Rossum452a9831996-09-17 14:32:04 +0000727 com_error(co, OverflowError,
728 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000729 return NULL;
730 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000731 return newintobject(x);
Guido van Rossum282914b1991-04-04 10:42:56 +0000732 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000733 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +0000734#ifndef WITHOUT_COMPLEX
735 if (imflag) {
736 c.real = 0.;
737 c.imag = atof(s);
738 return newcomplexobject(c);
739 }
740 else
741#endif
742 return newfloatobject(atof(s));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000743}
744
745static object *
746parsestr(s)
747 char *s;
748{
749 object *v;
750 int len;
751 char *buf;
752 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000753 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000754 int c;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000755 int quote = *s;
756 if (quote != '\'' && quote != '\"') {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000757 err_badcall();
758 return NULL;
759 }
760 s++;
761 len = strlen(s);
Guido van Rossum8054fad1993-10-26 15:19:44 +0000762 if (s[--len] != quote) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000763 err_badcall();
764 return NULL;
765 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000766 if (len >= 4 && s[0] == quote && s[1] == quote) {
767 s += 2;
768 len -= 2;
769 if (s[--len] != quote || s[--len] != quote) {
770 err_badcall();
771 return NULL;
772 }
773 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000774 if (strchr(s, '\\') == NULL)
775 return newsizedstringobject(s, len);
776 v = newsizedstringobject((char *)NULL, len);
777 p = buf = getstringvalue(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000778 end = s + len;
779 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000780 if (*s != '\\') {
781 *p++ = *s++;
782 continue;
783 }
784 s++;
785 switch (*s++) {
786 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000787 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000788 case '\\': *p++ = '\\'; break;
789 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000790 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000791 case 'b': *p++ = '\b'; break;
792 case 'f': *p++ = '\014'; break; /* FF */
793 case 't': *p++ = '\t'; break;
794 case 'n': *p++ = '\n'; break;
795 case 'r': *p++ = '\r'; break;
796 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000797 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
798 case '0': case '1': case '2': case '3':
799 case '4': case '5': case '6': case '7':
800 c = s[-1] - '0';
801 if ('0' <= *s && *s <= '7') {
802 c = (c<<3) + *s++ - '0';
803 if ('0' <= *s && *s <= '7')
804 c = (c<<3) + *s++ - '0';
805 }
806 *p++ = c;
807 break;
808 case 'x':
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000809 if (isxdigit(Py_CHARMASK(*s))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000810 sscanf(s, "%x", &c);
811 *p++ = c;
812 do {
813 s++;
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000814 } while (isxdigit(Py_CHARMASK(*s)));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000815 break;
816 }
817 /* FALLTHROUGH */
818 default: *p++ = '\\'; *p++ = s[-1]; break;
819 }
820 }
821 resizestring(&v, (int)(p - buf));
822 return v;
823}
824
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000825static object *
826parsestrplus(n)
827 node *n;
828{
829 object *v;
830 int i;
831 REQ(CHILD(n, 0), STRING);
832 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
833 /* String literal concatenation */
834 for (i = 1; i < NCH(n) && v != NULL; i++) {
835 joinstring_decref(&v, parsestr(STR(CHILD(n, i))));
836 }
837 }
838 return v;
839}
840
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000841static void
842com_list_constructor(c, n)
843 struct compiling *c;
844 node *n;
845{
846 int len;
847 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000848 if (TYPE(n) != testlist)
849 REQ(n, exprlist);
850 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
851 len = (NCH(n) + 1) / 2;
852 for (i = 0; i < NCH(n); i += 2)
853 com_node(c, CHILD(n, i));
854 com_addoparg(c, BUILD_LIST, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000855 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000856}
857
858static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000859com_dictmaker(c, n)
860 struct compiling *c;
861 node *n;
862{
863 int i;
864 /* dictmaker: test ':' test (',' test ':' value)* [','] */
865 for (i = 0; i+2 < NCH(n); i += 4) {
866 /* We must arrange things just right for STORE_SUBSCR.
867 It wants the stack to look like (value) (dict) (key) */
868 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000869 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000870 com_node(c, CHILD(n, i+2)); /* value */
871 com_addbyte(c, ROT_TWO);
872 com_node(c, CHILD(n, i)); /* key */
873 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000874 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000875 }
876}
877
878static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000879com_atom(c, n)
880 struct compiling *c;
881 node *n;
882{
883 node *ch;
884 object *v;
885 int i;
886 REQ(n, atom);
887 ch = CHILD(n, 0);
888 switch (TYPE(ch)) {
889 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +0000890 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000891 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000892 com_push(c, 1);
893 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000894 else
895 com_node(c, CHILD(n, 1));
896 break;
897 case LSQB:
Guido van Rossum8b993a91997-01-17 21:04:03 +0000898 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000899 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000900 com_push(c, 1);
901 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000902 else
903 com_list_constructor(c, CHILD(n, 1));
904 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000905 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000906 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000907 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000908 if (TYPE(CHILD(n, 1)) != RBRACE)
909 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000910 break;
911 case BACKQUOTE:
912 com_node(c, CHILD(n, 1));
913 com_addbyte(c, UNARY_CONVERT);
914 break;
915 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +0000916 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000917 i = 255;
918 }
919 else {
920 i = com_addconst(c, v);
921 DECREF(v);
922 }
923 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000924 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000925 break;
926 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000927 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000928 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000929 c->c_errors++;
930 i = 255;
931 }
932 else {
933 i = com_addconst(c, v);
934 DECREF(v);
935 }
936 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000937 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000938 break;
939 case NAME:
940 com_addopname(c, LOAD_NAME, ch);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000941 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000942 break;
943 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +0000944 /* XXX fprintf(stderr, "node type %d\n", TYPE(ch)); */
Guido van Rossum452a9831996-09-17 14:32:04 +0000945 com_error(c, SystemError, "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000946 }
947}
948
949static void
950com_slice(c, n, op)
951 struct compiling *c;
952 node *n;
953 int op;
954{
955 if (NCH(n) == 1) {
956 com_addbyte(c, op);
957 }
958 else if (NCH(n) == 2) {
959 if (TYPE(CHILD(n, 0)) != COLON) {
960 com_node(c, CHILD(n, 0));
961 com_addbyte(c, op+1);
962 }
963 else {
964 com_node(c, CHILD(n, 1));
965 com_addbyte(c, op+2);
966 }
Guido van Rossum8b993a91997-01-17 21:04:03 +0000967 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000968 }
969 else {
970 com_node(c, CHILD(n, 0));
971 com_node(c, CHILD(n, 2));
972 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000973 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000974 }
975}
976
Guido van Rossum635abd21997-01-06 22:56:52 +0000977static void
978com_argument(c, n, pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +0000979 struct compiling *c;
980 node *n; /* argument */
Guido van Rossum635abd21997-01-06 22:56:52 +0000981 object **pkeywords;
Guido van Rossumf10570b1995-07-07 22:53:21 +0000982{
983 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000984 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +0000985 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +0000986 if (*pkeywords != NULL) {
Guido van Rossum452a9831996-09-17 14:32:04 +0000987 com_error(c, SyntaxError,
Guido van Rossumf10570b1995-07-07 22:53:21 +0000988 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +0000989 }
990 else {
991 com_node(c, CHILD(n, 0));
992 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000993 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +0000994 }
995 m = n;
996 do {
997 m = CHILD(m, 0);
998 } while (NCH(m) == 1);
999 if (TYPE(m) != NAME) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001000 com_error(c, SyntaxError, "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001001 }
1002 else {
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001003 object *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001004 if (v != NULL && *pkeywords == NULL)
1005 *pkeywords = newdictobject();
1006 if (v == NULL || *pkeywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001007 c->c_errors++;
1008 else {
Guido van Rossum635abd21997-01-06 22:56:52 +00001009 if (dict2lookup(*pkeywords, v) != NULL)
1010 com_error(c, SyntaxError,
1011 "duplicate keyword argument");
1012 else
1013 if (dict2insert(*pkeywords, v, v) != 0)
1014 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001015 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001016 com_push(c, 1);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001017 DECREF(v);
1018 }
1019 }
1020 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001021}
1022
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001023static void
1024com_call_function(c, n)
1025 struct compiling *c;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001026 node *n; /* EITHER arglist OR ')' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001027{
1028 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001029 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001030 }
1031 else {
Guido van Rossum635abd21997-01-06 22:56:52 +00001032 object *keywords = NULL;
1033 int i, na, nk;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001034 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001035 na = 0;
1036 nk = 0;
1037 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001038 com_argument(c, CHILD(n, i), &keywords);
1039 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001040 na++;
1041 else
1042 nk++;
1043 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001044 XDECREF(keywords);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001045 if (na > 255 || nk > 255) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001046 com_error(c, SyntaxError, "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001047 }
1048 com_addoparg(c, CALL_FUNCTION, na | (nk << 8));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001049 com_pop(c, na + 2*nk);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001050 }
1051}
1052
1053static void
1054com_select_member(c, n)
1055 struct compiling *c;
1056 node *n;
1057{
1058 com_addopname(c, LOAD_ATTR, n);
1059}
1060
1061static void
Guido van Rossum8861b741996-07-30 16:49:37 +00001062com_sliceobj(c, n)
1063 struct compiling *c;
1064 node *n;
1065{
1066 int i=0;
1067 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001068 node *ch;
1069
1070 /* first argument */
1071 if (TYPE(CHILD(n,i)) == COLON) {
1072 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001073 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001074 i++;
1075 }
1076 else {
1077 com_node(c, CHILD(n,i));
1078 i++;
1079 REQ(CHILD(n,i),COLON);
1080 i++;
1081 }
1082 /* second argument */
1083 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1084 com_node(c, CHILD(n,i));
1085 i++;
1086 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001087 else {
1088 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1089 com_push(c, 1);
1090 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001091 /* remaining arguments */
1092 for (; i < NCH(n); i++) {
1093 ns++;
1094 ch=CHILD(n,i);
1095 REQ(ch, sliceop);
1096 if (NCH(ch) == 1) {
1097 /* right argument of ':' missing */
1098 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001099 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001100 }
1101 else
1102 com_node(c, CHILD(ch,1));
1103 }
1104 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001105 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001106}
1107
1108static void
1109com_subscript(c, n)
1110 struct compiling *c;
1111 node *n;
1112{
1113 node *ch;
1114 REQ(n, subscript);
1115 ch = CHILD(n,0);
1116 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001117 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001118 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001119 com_push(c, 1);
1120 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001121 else {
1122 /* check for slice */
1123 if ((TYPE(ch) == COLON || NCH(n) > 1))
1124 com_sliceobj(c, n);
1125 else {
1126 REQ(ch, test);
1127 com_node(c, ch);
1128 }
1129 }
1130}
1131
1132static void
1133com_subscriptlist(c, n, assigning)
1134 struct compiling *c;
1135 node *n;
1136 int assigning;
1137{
1138 int i, op;
1139 REQ(n, subscriptlist);
1140 /* Check to make backward compatible slice behavior for '[i:j]' */
1141 if (NCH(n) == 1) {
1142 node *sub = CHILD(n, 0); /* subscript */
1143 /* Make it is a simple slice.
Guido van Rossum8b993a91997-01-17 21:04:03 +00001144 Should have exactly one colon. */
Guido van Rossum8861b741996-07-30 16:49:37 +00001145 if ((TYPE(CHILD(sub, 0)) == COLON
1146 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
Guido van Rossum8b993a91997-01-17 21:04:03 +00001147 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1148 {
Guido van Rossum8861b741996-07-30 16:49:37 +00001149 if (assigning == OP_APPLY)
1150 op = SLICE;
1151 else
1152 op = ((assigning == OP_ASSIGN) ? STORE_SLICE : DELETE_SLICE);
1153 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001154 if (op == STORE_SLICE)
1155 com_pop(c, 2);
1156 else if (op == DELETE_SLICE)
1157 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001158 return;
1159 }
1160 }
1161 /* Else normal subscriptlist. Compile each subscript. */
1162 for (i = 0; i < NCH(n); i += 2)
1163 com_subscript(c, CHILD(n, i));
1164 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001165 if (NCH(n) > 1) {
1166 i = (NCH(n)+1) / 2;
1167 com_addoparg(c, BUILD_TUPLE, i);
1168 com_pop(c, i-1);
1169 }
1170 if (assigning == OP_APPLY) {
Guido van Rossum8861b741996-07-30 16:49:37 +00001171 op = BINARY_SUBSCR;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001172 i = 1;
1173 }
1174 else if (assigning == OP_ASSIGN) {
1175 op = STORE_SUBSCR;
1176 i = 3;
1177 }
1178 else {
1179 op = DELETE_SUBSCR;
1180 i = 2;
1181 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001182 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001183 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001184}
1185
1186static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001187com_apply_trailer(c, n)
1188 struct compiling *c;
1189 node *n;
1190{
1191 REQ(n, trailer);
1192 switch (TYPE(CHILD(n, 0))) {
1193 case LPAR:
1194 com_call_function(c, CHILD(n, 1));
1195 break;
1196 case DOT:
1197 com_select_member(c, CHILD(n, 1));
1198 break;
1199 case LSQB:
Guido van Rossum8861b741996-07-30 16:49:37 +00001200 com_subscriptlist(c, CHILD(n, 1), OP_APPLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001201 break;
1202 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001203 com_error(c, SystemError,
1204 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001205 }
1206}
1207
1208static void
Guido van Rossum50564e81996-01-12 01:13:16 +00001209com_power(c, n)
1210 struct compiling *c;
1211 node *n;
1212{
1213 int i;
1214 REQ(n, power);
1215 com_atom(c, CHILD(n, 0));
1216 for (i = 1; i < NCH(n); i++) {
1217 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1218 com_factor(c, CHILD(n, i+1));
1219 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001220 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001221 break;
1222 }
1223 else
1224 com_apply_trailer(c, CHILD(n, i));
1225 }
1226}
1227
1228static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001229com_factor(c, n)
1230 struct compiling *c;
1231 node *n;
1232{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001233 REQ(n, factor);
1234 if (TYPE(CHILD(n, 0)) == PLUS) {
1235 com_factor(c, CHILD(n, 1));
1236 com_addbyte(c, UNARY_POSITIVE);
1237 }
1238 else if (TYPE(CHILD(n, 0)) == MINUS) {
1239 com_factor(c, CHILD(n, 1));
1240 com_addbyte(c, UNARY_NEGATIVE);
1241 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001242 else if (TYPE(CHILD(n, 0)) == TILDE) {
1243 com_factor(c, CHILD(n, 1));
1244 com_addbyte(c, UNARY_INVERT);
1245 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001246 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001247 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001248 }
1249}
1250
1251static void
1252com_term(c, n)
1253 struct compiling *c;
1254 node *n;
1255{
1256 int i;
1257 int op;
1258 REQ(n, term);
1259 com_factor(c, CHILD(n, 0));
1260 for (i = 2; i < NCH(n); i += 2) {
1261 com_factor(c, CHILD(n, i));
1262 switch (TYPE(CHILD(n, i-1))) {
1263 case STAR:
1264 op = BINARY_MULTIPLY;
1265 break;
1266 case SLASH:
1267 op = BINARY_DIVIDE;
1268 break;
1269 case PERCENT:
1270 op = BINARY_MODULO;
1271 break;
1272 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001273 com_error(c, SystemError,
1274 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001275 op = 255;
1276 }
1277 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001278 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001279 }
1280}
1281
1282static void
1283com_arith_expr(c, n)
1284 struct compiling *c;
1285 node *n;
1286{
1287 int i;
1288 int op;
1289 REQ(n, arith_expr);
1290 com_term(c, CHILD(n, 0));
1291 for (i = 2; i < NCH(n); i += 2) {
1292 com_term(c, CHILD(n, i));
1293 switch (TYPE(CHILD(n, i-1))) {
1294 case PLUS:
1295 op = BINARY_ADD;
1296 break;
1297 case MINUS:
1298 op = BINARY_SUBTRACT;
1299 break;
1300 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001301 com_error(c, SystemError,
1302 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001303 op = 255;
1304 }
1305 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001306 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001307 }
1308}
1309
1310static void
1311com_shift_expr(c, n)
1312 struct compiling *c;
1313 node *n;
1314{
1315 int i;
1316 int op;
1317 REQ(n, shift_expr);
1318 com_arith_expr(c, CHILD(n, 0));
1319 for (i = 2; i < NCH(n); i += 2) {
1320 com_arith_expr(c, CHILD(n, i));
1321 switch (TYPE(CHILD(n, i-1))) {
1322 case LEFTSHIFT:
1323 op = BINARY_LSHIFT;
1324 break;
1325 case RIGHTSHIFT:
1326 op = BINARY_RSHIFT;
1327 break;
1328 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001329 com_error(c, SystemError,
1330 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001331 op = 255;
1332 }
1333 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001334 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001335 }
1336}
1337
1338static void
1339com_and_expr(c, n)
1340 struct compiling *c;
1341 node *n;
1342{
1343 int i;
1344 int op;
1345 REQ(n, and_expr);
1346 com_shift_expr(c, CHILD(n, 0));
1347 for (i = 2; i < NCH(n); i += 2) {
1348 com_shift_expr(c, CHILD(n, i));
1349 if (TYPE(CHILD(n, i-1)) == AMPER) {
1350 op = BINARY_AND;
1351 }
1352 else {
Guido van Rossum452a9831996-09-17 14:32:04 +00001353 com_error(c, SystemError,
1354 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001355 op = 255;
1356 }
1357 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001358 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001359 }
1360}
1361
1362static void
1363com_xor_expr(c, n)
1364 struct compiling *c;
1365 node *n;
1366{
1367 int i;
1368 int op;
1369 REQ(n, xor_expr);
1370 com_and_expr(c, CHILD(n, 0));
1371 for (i = 2; i < NCH(n); i += 2) {
1372 com_and_expr(c, CHILD(n, i));
1373 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1374 op = BINARY_XOR;
1375 }
1376 else {
Guido van Rossum452a9831996-09-17 14:32:04 +00001377 com_error(c, SystemError,
1378 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001379 op = 255;
1380 }
1381 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001382 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001383 }
1384}
1385
1386static void
1387com_expr(c, n)
1388 struct compiling *c;
1389 node *n;
1390{
1391 int i;
1392 int op;
1393 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001394 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001395 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001396 com_xor_expr(c, CHILD(n, i));
1397 if (TYPE(CHILD(n, i-1)) == VBAR) {
1398 op = BINARY_OR;
1399 }
1400 else {
Guido van Rossum452a9831996-09-17 14:32:04 +00001401 com_error(c, SystemError,
1402 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001403 op = 255;
1404 }
1405 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001406 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001407 }
1408}
1409
1410static enum cmp_op
1411cmp_type(n)
1412 node *n;
1413{
1414 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001415 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001416 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1417 if (NCH(n) == 1) {
1418 n = CHILD(n, 0);
1419 switch (TYPE(n)) {
1420 case LESS: return LT;
1421 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001422 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001423 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001424 case LESSEQUAL: return LE;
1425 case GREATEREQUAL: return GE;
1426 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001427 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1428 if (strcmp(STR(n), "is") == 0) return IS;
1429 }
1430 }
1431 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001432 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001433 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1434 return NOT_IN;
1435 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1436 return IS_NOT;
1437 }
1438 }
1439 return BAD;
1440}
1441
1442static void
1443com_comparison(c, n)
1444 struct compiling *c;
1445 node *n;
1446{
1447 int i;
1448 enum cmp_op op;
1449 int anchor;
1450 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
1451 com_expr(c, CHILD(n, 0));
1452 if (NCH(n) == 1)
1453 return;
1454
1455 /****************************************************************
1456 The following code is generated for all but the last
1457 comparison in a chain:
1458
1459 label: on stack: opcode: jump to:
1460
1461 a <code to load b>
1462 a, b DUP_TOP
1463 a, b, b ROT_THREE
1464 b, a, b COMPARE_OP
1465 b, 0-or-1 JUMP_IF_FALSE L1
1466 b, 1 POP_TOP
1467 b
1468
1469 We are now ready to repeat this sequence for the next
1470 comparison in the chain.
1471
1472 For the last we generate:
1473
1474 b <code to load c>
1475 b, c COMPARE_OP
1476 0-or-1
1477
1478 If there were any jumps to L1 (i.e., there was more than one
1479 comparison), we generate:
1480
1481 0-or-1 JUMP_FORWARD L2
1482 L1: b, 0 ROT_TWO
1483 0, b POP_TOP
1484 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00001485 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001486 ****************************************************************/
1487
1488 anchor = 0;
1489
1490 for (i = 2; i < NCH(n); i += 2) {
1491 com_expr(c, CHILD(n, i));
1492 if (i+2 < NCH(n)) {
1493 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001494 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001495 com_addbyte(c, ROT_THREE);
1496 }
1497 op = cmp_type(CHILD(n, i-1));
1498 if (op == BAD) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001499 com_error(c, SystemError,
1500 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001501 }
1502 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001503 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001504 if (i+2 < NCH(n)) {
1505 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1506 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001507 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001508 }
1509 }
1510
1511 if (anchor) {
1512 int anchor2 = 0;
1513 com_addfwref(c, JUMP_FORWARD, &anchor2);
1514 com_backpatch(c, anchor);
1515 com_addbyte(c, ROT_TWO);
1516 com_addbyte(c, POP_TOP);
1517 com_backpatch(c, anchor2);
1518 }
1519}
1520
1521static void
1522com_not_test(c, n)
1523 struct compiling *c;
1524 node *n;
1525{
1526 REQ(n, not_test); /* 'not' not_test | comparison */
1527 if (NCH(n) == 1) {
1528 com_comparison(c, CHILD(n, 0));
1529 }
1530 else {
1531 com_not_test(c, CHILD(n, 1));
1532 com_addbyte(c, UNARY_NOT);
1533 }
1534}
1535
1536static void
1537com_and_test(c, n)
1538 struct compiling *c;
1539 node *n;
1540{
1541 int i;
1542 int anchor;
1543 REQ(n, and_test); /* not_test ('and' not_test)* */
1544 anchor = 0;
1545 i = 0;
1546 for (;;) {
1547 com_not_test(c, CHILD(n, i));
1548 if ((i += 2) >= NCH(n))
1549 break;
1550 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1551 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001552 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001553 }
1554 if (anchor)
1555 com_backpatch(c, anchor);
1556}
1557
1558static void
1559com_test(c, n)
1560 struct compiling *c;
1561 node *n;
1562{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001563 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00001564 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
1565 object *v;
1566 int i;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001567 int ndefs = com_argdefs(c, CHILD(n, 0));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001568 v = (object *) icompile(CHILD(n, 0), c);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001569 if (v == NULL) {
1570 c->c_errors++;
1571 i = 255;
1572 }
1573 else {
1574 i = com_addconst(c, v);
1575 DECREF(v);
1576 }
1577 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001578 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001579 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001580 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001581 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00001582 else {
1583 int anchor = 0;
1584 int i = 0;
1585 for (;;) {
1586 com_and_test(c, CHILD(n, i));
1587 if ((i += 2) >= NCH(n))
1588 break;
1589 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1590 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001591 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001592 }
1593 if (anchor)
1594 com_backpatch(c, anchor);
1595 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001596}
1597
1598static void
Guido van Rossum288a60f1991-12-16 13:05:10 +00001599com_list(c, n, toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001600 struct compiling *c;
1601 node *n;
Guido van Rossum288a60f1991-12-16 13:05:10 +00001602 int toplevel; /* If nonzero, *always* build a tuple */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001603{
1604 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001605 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001606 com_node(c, CHILD(n, 0));
1607 }
1608 else {
1609 int i;
1610 int len;
1611 len = (NCH(n) + 1) / 2;
1612 for (i = 0; i < NCH(n); i += 2)
1613 com_node(c, CHILD(n, i));
1614 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001615 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001616 }
1617}
1618
1619
1620/* Begin of assignment compilation */
1621
1622static void com_assign_name PROTO((struct compiling *, node *, int));
1623static void com_assign PROTO((struct compiling *, node *, int));
1624
1625static void
1626com_assign_attr(c, n, assigning)
1627 struct compiling *c;
1628 node *n;
1629 int assigning;
1630{
1631 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001632 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001633}
1634
1635static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001636com_assign_trailer(c, n, assigning)
1637 struct compiling *c;
1638 node *n;
1639 int assigning;
1640{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001641 REQ(n, trailer);
1642 switch (TYPE(CHILD(n, 0))) {
1643 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum452a9831996-09-17 14:32:04 +00001644 com_error(c, SyntaxError, "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001645 break;
1646 case DOT: /* '.' NAME */
1647 com_assign_attr(c, CHILD(n, 1), assigning);
1648 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001649 case LSQB: /* '[' subscriptlist ']' */
1650 com_subscriptlist(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001651 break;
1652 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001653 com_error(c, SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001654 }
1655}
1656
1657static void
1658com_assign_tuple(c, n, assigning)
1659 struct compiling *c;
1660 node *n;
1661 int assigning;
1662{
1663 int i;
1664 if (TYPE(n) != testlist)
1665 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001666 if (assigning) {
1667 i = (NCH(n)+1)/2;
1668 com_addoparg(c, UNPACK_TUPLE, i);
1669 com_push(c, i-1);
1670 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001671 for (i = 0; i < NCH(n); i += 2)
1672 com_assign(c, CHILD(n, i), assigning);
1673}
1674
1675static void
1676com_assign_list(c, n, assigning)
1677 struct compiling *c;
1678 node *n;
1679 int assigning;
1680{
1681 int i;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001682 if (assigning) {
1683 i = (NCH(n)+1)/2;
1684 com_addoparg(c, UNPACK_LIST, i);
1685 com_push(c, i-1);
1686 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001687 for (i = 0; i < NCH(n); i += 2)
1688 com_assign(c, CHILD(n, i), assigning);
1689}
1690
1691static void
1692com_assign_name(c, n, assigning)
1693 struct compiling *c;
1694 node *n;
1695 int assigning;
1696{
1697 REQ(n, NAME);
1698 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001699 if (assigning)
1700 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001701}
1702
1703static void
1704com_assign(c, n, assigning)
1705 struct compiling *c;
1706 node *n;
1707 int assigning;
1708{
1709 /* Loop to avoid trivial recursion */
1710 for (;;) {
1711 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001712
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001713 case exprlist:
1714 case testlist:
1715 if (NCH(n) > 1) {
1716 com_assign_tuple(c, n, assigning);
1717 return;
1718 }
1719 n = CHILD(n, 0);
1720 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001721
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001722 case test:
1723 case and_test:
1724 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001725 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001726 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001727 case xor_expr:
1728 case and_expr:
1729 case shift_expr:
1730 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001731 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00001732 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001733 if (NCH(n) > 1) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001734 com_error(c, SyntaxError,
1735 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001736 return;
1737 }
1738 n = CHILD(n, 0);
1739 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001740
Guido van Rossum50564e81996-01-12 01:13:16 +00001741 case power: /* atom trailer* ('**' power)* */
1742/* ('+'|'-'|'~') factor | atom trailer* */
1743 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001744 com_error(c, SyntaxError,
1745 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001746 return;
1747 }
Guido van Rossum50564e81996-01-12 01:13:16 +00001748 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001749 int i;
1750 com_node(c, CHILD(n, 0));
1751 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00001752 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001753 com_error(c, SyntaxError,
1754 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00001755 return;
1756 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001757 com_apply_trailer(c, CHILD(n, i));
1758 } /* NB i is still alive */
1759 com_assign_trailer(c,
1760 CHILD(n, i), assigning);
1761 return;
1762 }
1763 n = CHILD(n, 0);
1764 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001765
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001766 case atom:
1767 switch (TYPE(CHILD(n, 0))) {
1768 case LPAR:
1769 n = CHILD(n, 1);
1770 if (TYPE(n) == RPAR) {
1771 /* XXX Should allow () = () ??? */
Guido van Rossum452a9831996-09-17 14:32:04 +00001772 com_error(c, SyntaxError,
1773 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001774 return;
1775 }
1776 break;
1777 case LSQB:
1778 n = CHILD(n, 1);
1779 if (TYPE(n) == RSQB) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001780 com_error(c, SyntaxError,
1781 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001782 return;
1783 }
1784 com_assign_list(c, n, assigning);
1785 return;
1786 case NAME:
1787 com_assign_name(c, CHILD(n, 0), assigning);
1788 return;
1789 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001790 com_error(c, SyntaxError,
1791 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001792 return;
1793 }
1794 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001795
1796 case lambdef:
Guido van Rossum452a9831996-09-17 14:32:04 +00001797 com_error(c, SyntaxError, "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001798 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001799
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001800 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001801 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum452a9831996-09-17 14:32:04 +00001802 com_error(c, SystemError, "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001803 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001804
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001805 }
1806 }
1807}
Guido van Rossum8b993a91997-01-17 21:04:03 +00001808/* Forward */ static node *get_rawdocstring PROTO((node *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001809
1810static void
1811com_expr_stmt(c, n)
1812 struct compiling *c;
1813 node *n;
1814{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001815 REQ(n, expr_stmt); /* testlist ('=' testlist)* */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001816 /* Forget it if we have just a doc string here */
1817 if (NCH(n) == 1 && get_rawdocstring(n) != NULL)
1818 return;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001819 com_node(c, CHILD(n, NCH(n)-1));
1820 if (NCH(n) == 1) {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001821 if (c->c_interactive)
1822 com_addbyte(c, PRINT_EXPR);
1823 else
1824 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001825 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001826 }
1827 else {
1828 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001829 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00001830 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001831 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001832 com_push(c, 1);
1833 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001834 com_assign(c, CHILD(n, i), OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001835 }
1836 }
1837}
1838
1839static void
1840com_print_stmt(c, n)
1841 struct compiling *c;
1842 node *n;
1843{
1844 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001845 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
1846 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001847 com_node(c, CHILD(n, i));
1848 com_addbyte(c, PRINT_ITEM);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001849 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001850 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001851 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001852 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001853 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001854}
1855
1856static void
1857com_return_stmt(c, n)
1858 struct compiling *c;
1859 node *n;
1860{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001861 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001862 if (!c->c_infunction) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001863 com_error(c, SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001864 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001865 if (NCH(n) < 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001866 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001867 com_push(c, 1);
1868 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001869 else
1870 com_node(c, CHILD(n, 1));
1871 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001872 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001873}
1874
1875static void
1876com_raise_stmt(c, n)
1877 struct compiling *c;
1878 node *n;
1879{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001880 int i;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001881 REQ(n, raise_stmt); /* 'raise' test [',' test [',' test]] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001882 com_node(c, CHILD(n, 1));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001883 if (NCH(n) > 3) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001884 com_node(c, CHILD(n, 3));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001885 if (NCH(n) > 5)
1886 com_node(c, CHILD(n, 5));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001887 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001888 i = NCH(n)/2;
1889 com_addoparg(c, RAISE_VARARGS, i);
1890 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001891}
1892
1893static void
1894com_import_stmt(c, n)
1895 struct compiling *c;
1896 node *n;
1897{
1898 int i;
1899 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001900 /* 'import' dotted_name (',' dotted_name)* |
1901 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001902 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001903 /* 'from' dotted_name 'import' ... */
1904 REQ(CHILD(n, 1), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001905 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001906 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001907 for (i = 3; i < NCH(n); i += 2)
1908 com_addopname(c, IMPORT_FROM, CHILD(n, i));
1909 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001910 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001911 }
1912 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001913 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001914 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001915 REQ(CHILD(n, i), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001916 com_addopname(c, IMPORT_NAME, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001917 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001918 com_addopname(c, STORE_NAME, CHILD(CHILD(n, i), 0));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001919 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001920 }
1921 }
1922}
1923
1924static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00001925com_global_stmt(c, n)
1926 struct compiling *c;
1927 node *n;
1928{
1929 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001930 REQ(n, global_stmt);
1931 /* 'global' NAME (',' NAME)* */
1932 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001933 char *s = STR(CHILD(n, i));
Guido van Rossumfe2236f1996-08-24 07:29:04 +00001934#ifdef PRIVATE_NAME_MANGLING
1935 char buffer[256];
1936 if (s != NULL && s[0] == '_' && s[1] == '_' &&
1937 c->c_private != NULL &&
1938 com_mangle(c, s, buffer, (int)sizeof(buffer)))
1939 s = buffer;
1940#endif
Guido van Rossum681d79a1995-07-18 14:51:37 +00001941 if (dictlookup(c->c_locals, s) != NULL) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001942 com_error(c, SyntaxError, "name is local and global");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001943 }
1944 else if (dictinsert(c->c_globals, s, None) != 0)
Guido van Rossumc5e96291991-12-10 13:53:51 +00001945 c->c_errors++;
1946 }
1947}
1948
Guido van Rossum681d79a1995-07-18 14:51:37 +00001949static int
1950com_newlocal_o(c, nameval)
1951 struct compiling *c;
1952 object *nameval;
1953{
1954 int i;
1955 object *ival;
1956 if (getlistsize(c->c_varnames) != c->c_nlocals) {
1957 /* This is usually caused by an error on a previous call */
1958 if (c->c_errors == 0) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001959 com_error(c, SystemError, "mixed up var name/index");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001960 }
1961 return 0;
1962 }
1963 ival = newintobject(i = c->c_nlocals++);
1964 if (ival == NULL)
1965 c->c_errors++;
1966 else if (mappinginsert(c->c_locals, nameval, ival) != 0)
1967 c->c_errors++;
1968 else if (addlistitem(c->c_varnames, nameval) != 0)
1969 c->c_errors++;
1970 XDECREF(ival);
1971 return i;
1972}
1973
1974static int
1975com_addlocal_o(c, nameval)
1976 struct compiling *c;
1977 object *nameval;
1978{
1979 object *ival = mappinglookup(c->c_locals, nameval);
1980 if (ival != NULL)
1981 return getintvalue(ival);
1982 return com_newlocal_o(c, nameval);
1983}
1984
1985static int
1986com_newlocal(c, name)
1987 struct compiling *c;
1988 char *name;
1989{
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001990 object *nameval = PyString_InternFromString(name);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001991 int i;
1992 if (nameval == NULL) {
1993 c->c_errors++;
1994 return 0;
1995 }
1996 i = com_newlocal_o(c, nameval);
1997 DECREF(nameval);
1998 return i;
1999}
2000
Guido van Rossum8b993a91997-01-17 21:04:03 +00002001#ifdef SUPPORT_OBSOLETE_ACCESS
2002
Guido van Rossum25831651993-05-19 14:50:45 +00002003#define strequ(a, b) (strcmp((a), (b)) == 0)
2004
2005static void
2006com_access_stmt(c, n)
2007 struct compiling *c;
2008 node *n;
2009{
2010 int i, j, k, mode, imode;
2011 object *vmode;
2012 REQ(n, access_stmt);
2013 /* 'access' NAME (',' NAME)* ':' accesstype (',' accesstype)*
2014 accesstype: NAME+ */
2015
2016 /* Find where the colon is */
2017 i = 1;
2018 while (TYPE(CHILD(n,i-1)) != COLON)
2019 i += 1;
2020
2021 /* Calculate the mode mask */
2022 mode = 0;
2023 for (j = i; j < NCH(n); j += 2) {
Guido van Rossum81daa321993-05-20 14:24:46 +00002024 int r = 0, w = 0, p = 0;
2025 for (k = 0; k < NCH(CHILD(n,j)); k++) {
Guido van Rossum25831651993-05-19 14:50:45 +00002026 if (strequ(STR(CHILD(CHILD(n,j),k)), "public"))
2027 p = 0;
2028 else if (strequ(STR(CHILD(CHILD(n,j),k)), "protected"))
2029 p = 1;
2030 else if (strequ(STR(CHILD(CHILD(n,j),k)), "private"))
2031 p = 2;
2032 else if (strequ(STR(CHILD(CHILD(n,j),k)), "read"))
2033 r = 1;
2034 else if (strequ(STR(CHILD(CHILD(n,j),k)), "write"))
2035 w = 1;
2036 else /* XXX should make this an exception */
2037 fprintf(stderr, "bad access type %s\n",
2038 STR(CHILD(CHILD(n,j),k)));
2039 }
2040 if (r == 0 && w == 0)
Guido van Rossum81daa321993-05-20 14:24:46 +00002041 r = w = 1;
Guido van Rossum25831651993-05-19 14:50:45 +00002042 if (p == 0) {
2043 if (r == 1) mode |= AC_R_PUBLIC;
2044 if (w == 1) mode |= AC_W_PUBLIC;
2045 } else if (p == 1) {
2046 if (r == 1) mode |= AC_R_PROTECTED;
2047 if (w == 1) mode |= AC_W_PROTECTED;
2048 } else {
2049 if (r == 1) mode |= AC_R_PRIVATE;
2050 if (w == 1) mode |= AC_W_PRIVATE;
2051 }
2052 }
2053 vmode = newintobject((long)mode);
2054 imode = com_addconst(c, vmode);
2055 XDECREF(vmode);
2056 for (i = 1; TYPE(CHILD(n,i-1)) != COLON; i+=2) {
2057 com_addoparg(c, LOAD_CONST, imode);
2058 com_addopname(c, ACCESS_MODE, CHILD(n, i));
2059 }
2060}
Guido van Rossum0dfcf751996-08-12 22:00:53 +00002061#endif
Guido van Rossum25831651993-05-19 14:50:45 +00002062
Guido van Rossumc5e96291991-12-10 13:53:51 +00002063static void
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002064com_exec_stmt(c, n)
2065 struct compiling *c;
2066 node *n;
2067{
2068 REQ(n, exec_stmt);
2069 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2070 com_node(c, CHILD(n, 1));
2071 if (NCH(n) >= 4)
2072 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002073 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002074 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002075 com_push(c, 1);
2076 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002077 if (NCH(n) >= 6)
2078 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002079 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002080 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002081 com_push(c, 1);
2082 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002083 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002084 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002085}
2086
2087static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002088com_if_stmt(c, n)
2089 struct compiling *c;
2090 node *n;
2091{
2092 int i;
2093 int anchor = 0;
2094 REQ(n, if_stmt);
2095 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2096 for (i = 0; i+3 < NCH(n); i+=4) {
2097 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002098 node *ch = CHILD(n, i+1);
2099 if (i > 0)
2100 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002101 com_node(c, CHILD(n, i+1));
2102 com_addfwref(c, JUMP_IF_FALSE, &a);
2103 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002104 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002105 com_node(c, CHILD(n, i+3));
2106 com_addfwref(c, JUMP_FORWARD, &anchor);
2107 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002108 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002109 com_addbyte(c, POP_TOP);
2110 }
2111 if (i+2 < NCH(n))
2112 com_node(c, CHILD(n, i+2));
2113 com_backpatch(c, anchor);
2114}
2115
2116static void
2117com_while_stmt(c, n)
2118 struct compiling *c;
2119 node *n;
2120{
2121 int break_anchor = 0;
2122 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002123 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002124 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2125 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002126 block_push(c, SETUP_LOOP);
2127 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002128 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002129 com_node(c, CHILD(n, 1));
2130 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2131 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002132 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002133 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002134 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002135 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002136 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2137 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002138 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002139 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002140 com_addbyte(c, POP_TOP);
2141 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002142 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002143 if (NCH(n) > 4)
2144 com_node(c, CHILD(n, 6));
2145 com_backpatch(c, break_anchor);
2146}
2147
2148static void
2149com_for_stmt(c, n)
2150 struct compiling *c;
2151 node *n;
2152{
2153 object *v;
2154 int break_anchor = 0;
2155 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002156 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002157 REQ(n, for_stmt);
2158 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2159 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002160 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002161 com_node(c, CHILD(n, 3));
2162 v = newintobject(0L);
2163 if (v == NULL)
2164 c->c_errors++;
2165 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002166 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002167 XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002168 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002169 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002170 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002171 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002172 com_assign(c, CHILD(n, 1), OP_ASSIGN);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002173 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002174 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002175 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002176 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2177 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002178 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002179 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002180 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002181 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002182 if (NCH(n) > 8)
2183 com_node(c, CHILD(n, 8));
2184 com_backpatch(c, break_anchor);
2185}
2186
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002187/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002188
2189 SETUP_FINALLY L
2190 <code for S>
2191 POP_BLOCK
2192 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002193 L: <code for Sf>
2194 END_FINALLY
2195
2196 The special instructions use the block stack. Each block
2197 stack entry contains the instruction that created it (here
2198 SETUP_FINALLY), the level of the value stack at the time the
2199 block stack entry was created, and a label (here L).
2200
2201 SETUP_FINALLY:
2202 Pushes the current value stack level and the label
2203 onto the block stack.
2204 POP_BLOCK:
2205 Pops en entry from the block stack, and pops the value
2206 stack until its level is the same as indicated on the
2207 block stack. (The label is ignored.)
2208 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002209 Pops a variable number of entries from the *value* stack
2210 and re-raises the exception they specify. The number of
2211 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002212
2213 The block stack is unwound when an exception is raised:
2214 when a SETUP_FINALLY entry is found, the exception is pushed
2215 onto the value stack (and the exception condition is cleared),
2216 and the interpreter jumps to the label gotten from the block
2217 stack.
2218
2219 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002220 (The contents of the value stack is shown in [], with the top
2221 at the right; 'tb' is trace-back info, 'val' the exception's
2222 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002223
2224 Value stack Label Instruction Argument
2225 [] SETUP_EXCEPT L1
2226 [] <code for S>
2227 [] POP_BLOCK
2228 [] JUMP_FORWARD L0
2229
Guido van Rossum3f5da241990-12-20 15:06:42 +00002230 [tb, val, exc] L1: DUP )
2231 [tb, val, exc, exc] <evaluate E1> )
2232 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2233 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2234 [tb, val, exc, 1] POP )
2235 [tb, val, exc] POP
2236 [tb, val] <assign to V1> (or POP if no V1)
2237 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002238 [] <code for S1>
2239 JUMP_FORWARD L0
2240
Guido van Rossum3f5da241990-12-20 15:06:42 +00002241 [tb, val, exc, 0] L2: POP
2242 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002243 .............................etc.......................
2244
Guido van Rossum3f5da241990-12-20 15:06:42 +00002245 [tb, val, exc, 0] Ln+1: POP
2246 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002247
2248 [] L0: <next statement>
2249
2250 Of course, parts are not generated if Vi or Ei is not present.
2251*/
2252
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002253static void
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002254com_try_except(c, n)
2255 struct compiling *c;
2256 node *n;
2257{
2258 int except_anchor = 0;
2259 int end_anchor = 0;
2260 int else_anchor = 0;
2261 int i;
2262 node *ch;
2263
2264 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2265 block_push(c, SETUP_EXCEPT);
2266 com_node(c, CHILD(n, 2));
2267 com_addbyte(c, POP_BLOCK);
2268 block_pop(c, SETUP_EXCEPT);
2269 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2270 com_backpatch(c, except_anchor);
2271 for (i = 3;
2272 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2273 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002274 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002275 if (except_anchor == 0) {
Guido van Rossum452a9831996-09-17 14:32:04 +00002276 com_error(c, SyntaxError,
2277 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002278 break;
2279 }
2280 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002281 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002282 com_addoparg(c, SET_LINENO, ch->n_lineno);
2283 if (NCH(ch) > 1) {
2284 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002285 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002286 com_node(c, CHILD(ch, 1));
2287 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002288 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002289 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
2290 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002291 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002292 }
2293 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002294 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002295 if (NCH(ch) > 3)
Guido van Rossum8861b741996-07-30 16:49:37 +00002296 com_assign(c, CHILD(ch, 3), OP_ASSIGN);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002297 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002298 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002299 com_pop(c, 1);
2300 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002301 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002302 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002303 com_node(c, CHILD(n, i+2));
2304 com_addfwref(c, JUMP_FORWARD, &end_anchor);
2305 if (except_anchor) {
2306 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002307 /* We come in with [tb, val, exc, 0] on the
2308 stack; one pop and it's the same as
2309 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002310 com_addbyte(c, POP_TOP);
2311 }
2312 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002313 /* We actually come in here with [tb, val, exc] but the
2314 END_FINALLY will zap those and jump around.
2315 The c_stacklevel does not reflect them so we need not pop
2316 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002317 com_addbyte(c, END_FINALLY);
2318 com_backpatch(c, else_anchor);
2319 if (i < NCH(n))
2320 com_node(c, CHILD(n, i+2));
2321 com_backpatch(c, end_anchor);
2322}
2323
2324static void
2325com_try_finally(c, n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002326 struct compiling *c;
2327 node *n;
2328{
2329 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002330 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002331
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002332 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
2333 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002334 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002335 com_addbyte(c, POP_BLOCK);
2336 block_pop(c, SETUP_FINALLY);
2337 block_push(c, END_FINALLY);
2338 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002339 /* While the generated code pushes only one item,
2340 the try-finally handling can enter here with
2341 up to three items. OK, here are the details:
2342 3 for an exception, 2 for RETURN, 1 for BREAK. */
2343 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002344 com_backpatch(c, finally_anchor);
2345 ch = CHILD(n, NCH(n)-1);
2346 com_addoparg(c, SET_LINENO, ch->n_lineno);
2347 com_node(c, ch);
2348 com_addbyte(c, END_FINALLY);
2349 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002350 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002351}
2352
2353static void
2354com_try_stmt(c, n)
2355 struct compiling *c;
2356 node *n;
2357{
2358 REQ(n, try_stmt);
2359 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
2360 | 'try' ':' suite 'finally' ':' suite */
2361 if (TYPE(CHILD(n, 3)) != except_clause)
2362 com_try_finally(c, n);
2363 else
2364 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002365}
2366
Guido van Rossum8b993a91997-01-17 21:04:03 +00002367static node *
2368get_rawdocstring(n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002369 node *n;
2370{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002371 int i;
2372
Guido van Rossum8b993a91997-01-17 21:04:03 +00002373 /* Label to avoid tail recursion */
2374 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002375 switch (TYPE(n)) {
2376
2377 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002378 if (NCH(n) == 1) {
2379 n = CHILD(n, 0);
2380 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002381 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002382 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002383 case file_input:
2384 for (i = 0; i < NCH(n); i++) {
2385 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002386 if (TYPE(ch) == stmt) {
2387 n = ch;
2388 goto next;
2389 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002390 }
2391 break;
2392
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002393 case stmt:
2394 case simple_stmt:
2395 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002396 n = CHILD(n, 0);
2397 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002398
2399 case expr_stmt:
2400 case testlist:
2401 case test:
2402 case and_test:
2403 case not_test:
2404 case comparison:
2405 case expr:
2406 case xor_expr:
2407 case and_expr:
2408 case shift_expr:
2409 case arith_expr:
2410 case term:
2411 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00002412 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002413 if (NCH(n) == 1) {
2414 n = CHILD(n, 0);
2415 goto next;
2416 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002417 break;
2418
2419 case atom:
2420 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002421 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002422 break;
2423
2424 }
2425 return NULL;
2426}
2427
Guido van Rossum8b993a91997-01-17 21:04:03 +00002428static object *
2429get_docstring(n)
2430 node *n;
2431{
2432 n = get_rawdocstring(n);
2433 if (n == NULL)
2434 return NULL;
2435 return parsestrplus(n);
2436}
2437
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002438static void
2439com_suite(c, n)
2440 struct compiling *c;
2441 node *n;
2442{
2443 REQ(n, suite);
2444 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
2445 if (NCH(n) == 1) {
2446 com_node(c, CHILD(n, 0));
2447 }
2448 else {
2449 int i;
2450 for (i = 0; i < NCH(n); i++) {
2451 node *ch = CHILD(n, i);
2452 if (TYPE(ch) == stmt)
2453 com_node(c, ch);
2454 }
2455 }
2456}
2457
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002458/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002459static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002460com_continue_stmt(c, n)
2461 struct compiling *c;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002462 node *n; /* Not used, but passed for consistency */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002463{
2464 int i = c->c_nblocks;
2465 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
2466 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2467 }
2468 else {
Guido van Rossum452a9831996-09-17 14:32:04 +00002469 com_error(c, SyntaxError, "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002470 }
2471 /* XXX Could allow it inside a 'finally' clause
2472 XXX if we could pop the exception still on the stack */
2473}
2474
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002475static int
Guido van Rossum681d79a1995-07-18 14:51:37 +00002476com_argdefs(c, n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002477 struct compiling *c;
2478 node *n;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002479{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002480 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002481 if (TYPE(n) == lambdef) {
2482 /* lambdef: 'lambda' [varargslist] ':' test */
2483 n = CHILD(n, 1);
2484 }
2485 else {
2486 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
2487 n = CHILD(n, 2);
2488 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
2489 n = CHILD(n, 1);
2490 }
2491 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002492 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002493 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002494 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002495 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
2496 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002497 nargs = 0;
2498 ndefs = 0;
2499 for (i = 0; i < nch; i++) {
2500 int t;
Guido van Rossum50564e81996-01-12 01:13:16 +00002501 if (TYPE(CHILD(n, i)) == STAR || TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002502 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002503 nargs++;
2504 i++;
2505 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00002506 t = RPAR; /* Anything except EQUAL or COMMA */
2507 else
2508 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002509 if (t == EQUAL) {
2510 i++;
2511 ndefs++;
2512 com_node(c, CHILD(n, i));
2513 i++;
2514 if (i >= nch)
2515 break;
2516 t = TYPE(CHILD(n, i));
2517 }
2518 else {
2519 /* Treat "(a=1, b)" as "(a=1, b=None)" */
2520 if (ndefs) {
2521 com_addoparg(c, LOAD_CONST,
2522 com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002523 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002524 ndefs++;
2525 }
2526 }
2527 if (t != COMMA)
2528 break;
2529 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002530 return ndefs;
2531}
2532
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002533static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002534com_funcdef(c, n)
2535 struct compiling *c;
2536 node *n;
2537{
2538 object *v;
2539 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00002540 v = (object *)icompile(n, c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002541 if (v == NULL)
2542 c->c_errors++;
2543 else {
2544 int i = com_addconst(c, v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002545 int ndefs = com_argdefs(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002546 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002547 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002548 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002549 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002550 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002551 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002552 DECREF(v);
2553 }
2554}
2555
2556static void
Guido van Rossum25831651993-05-19 14:50:45 +00002557com_bases(c, n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002558 struct compiling *c;
2559 node *n;
2560{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002561 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002562 REQ(n, testlist);
2563 /* testlist: test (',' test)* [','] */
2564 for (i = 0; i < NCH(n); i += 2)
2565 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002566 i = (NCH(n)+1) / 2;
2567 com_addoparg(c, BUILD_TUPLE, i);
2568 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00002569}
2570
2571static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002572com_classdef(c, n)
2573 struct compiling *c;
2574 node *n;
2575{
Guido van Rossum25831651993-05-19 14:50:45 +00002576 int i;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002577 object *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002578 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00002579 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00002580 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00002581 c->c_errors++;
2582 return;
2583 }
2584 /* Push the class name on the stack */
2585 i = com_addconst(c, v);
2586 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002587 com_push(c, 1);
Guido van Rossum25831651993-05-19 14:50:45 +00002588 DECREF(v);
2589 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002590 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00002591 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002592 com_push(c, 1);
2593 }
Guido van Rossum25831651993-05-19 14:50:45 +00002594 else
2595 com_bases(c, CHILD(n, 3));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00002596 v = (object *)icompile(n, c);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002597 if (v == NULL)
2598 c->c_errors++;
2599 else {
Guido van Rossum25831651993-05-19 14:50:45 +00002600 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002601 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002602 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002603 com_addoparg(c, MAKE_FUNCTION, 0);
2604 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002605 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002606 com_pop(c, 2);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002607 com_addopname(c, STORE_NAME, CHILD(n, 1));
2608 DECREF(v);
2609 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002610}
2611
2612static void
2613com_node(c, n)
2614 struct compiling *c;
2615 node *n;
2616{
2617 switch (TYPE(n)) {
2618
2619 /* Definition nodes */
2620
2621 case funcdef:
2622 com_funcdef(c, n);
2623 break;
2624 case classdef:
2625 com_classdef(c, n);
2626 break;
2627
2628 /* Trivial parse tree nodes */
2629
2630 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002631 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002632 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002633 com_node(c, CHILD(n, 0));
2634 break;
2635
2636 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002637 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
2638 com_addoparg(c, SET_LINENO, n->n_lineno);
2639 {
2640 int i;
2641 for (i = 0; i < NCH(n)-1; i += 2)
2642 com_node(c, CHILD(n, i));
2643 }
2644 break;
2645
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002646 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002647 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002648 com_node(c, CHILD(n, 0));
2649 break;
2650
2651 /* Statement nodes */
2652
2653 case expr_stmt:
2654 com_expr_stmt(c, n);
2655 break;
2656 case print_stmt:
2657 com_print_stmt(c, n);
2658 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002659 case del_stmt: /* 'del' exprlist */
Guido van Rossum8861b741996-07-30 16:49:37 +00002660 com_assign(c, CHILD(n, 1), OP_DELETE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002661 break;
2662 case pass_stmt:
2663 break;
2664 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002665 if (c->c_loops == 0) {
Guido van Rossum452a9831996-09-17 14:32:04 +00002666 com_error(c, SyntaxError, "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002667 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002668 com_addbyte(c, BREAK_LOOP);
2669 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002670 case continue_stmt:
2671 com_continue_stmt(c, n);
2672 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002673 case return_stmt:
2674 com_return_stmt(c, n);
2675 break;
2676 case raise_stmt:
2677 com_raise_stmt(c, n);
2678 break;
2679 case import_stmt:
2680 com_import_stmt(c, n);
2681 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002682 case global_stmt:
2683 com_global_stmt(c, n);
2684 break;
Guido van Rossum0dfcf751996-08-12 22:00:53 +00002685#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum25831651993-05-19 14:50:45 +00002686 case access_stmt:
2687 com_access_stmt(c, n);
2688 break;
Guido van Rossum0dfcf751996-08-12 22:00:53 +00002689#endif
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002690 case exec_stmt:
2691 com_exec_stmt(c, n);
2692 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002693 case if_stmt:
2694 com_if_stmt(c, n);
2695 break;
2696 case while_stmt:
2697 com_while_stmt(c, n);
2698 break;
2699 case for_stmt:
2700 com_for_stmt(c, n);
2701 break;
2702 case try_stmt:
2703 com_try_stmt(c, n);
2704 break;
2705 case suite:
2706 com_suite(c, n);
2707 break;
2708
2709 /* Expression nodes */
2710
2711 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002712 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002713 break;
2714 case test:
2715 com_test(c, n);
2716 break;
2717 case and_test:
2718 com_and_test(c, n);
2719 break;
2720 case not_test:
2721 com_not_test(c, n);
2722 break;
2723 case comparison:
2724 com_comparison(c, n);
2725 break;
2726 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002727 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002728 break;
2729 case expr:
2730 com_expr(c, n);
2731 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002732 case xor_expr:
2733 com_xor_expr(c, n);
2734 break;
2735 case and_expr:
2736 com_and_expr(c, n);
2737 break;
2738 case shift_expr:
2739 com_shift_expr(c, n);
2740 break;
2741 case arith_expr:
2742 com_arith_expr(c, n);
2743 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002744 case term:
2745 com_term(c, n);
2746 break;
2747 case factor:
2748 com_factor(c, n);
2749 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00002750 case power:
2751 com_power(c, n);
2752 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002753 case atom:
2754 com_atom(c, n);
2755 break;
2756
2757 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002758 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum452a9831996-09-17 14:32:04 +00002759 com_error(c, SystemError, "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002760 }
2761}
2762
2763static void com_fplist PROTO((struct compiling *, node *));
2764
2765static void
2766com_fpdef(c, n)
2767 struct compiling *c;
2768 node *n;
2769{
2770 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
2771 if (TYPE(CHILD(n, 0)) == LPAR)
2772 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002773 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002774 com_addoparg(c, STORE_FAST, com_newlocal(c, STR(CHILD(n, 0))));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002775 com_pop(c, 1);
2776 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002777}
2778
2779static void
2780com_fplist(c, n)
2781 struct compiling *c;
2782 node *n;
2783{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00002784 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002785 if (NCH(n) == 1) {
2786 com_fpdef(c, CHILD(n, 0));
2787 }
2788 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002789 int i = (NCH(n)+1)/2;
2790 com_addoparg(c, UNPACK_TUPLE, i);
2791 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002792 for (i = 0; i < NCH(n); i += 2)
2793 com_fpdef(c, CHILD(n, i));
2794 }
2795}
2796
2797static void
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002798com_arglist(c, n)
2799 struct compiling *c;
2800 node *n;
2801{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002802 int nch, i;
2803 int complex = 0;
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002804 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00002805 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002806 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002807 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002808 /* Enter all arguments in table of locals */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002809 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002810 node *ch = CHILD(n, i);
2811 node *fp;
2812 char *name;
Guido van Rossum50564e81996-01-12 01:13:16 +00002813 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002814 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002815 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
2816 fp = CHILD(ch, 0);
2817 if (TYPE(fp) == NAME)
2818 name = STR(fp);
2819 else {
2820 name = "";
Guido van Rossum530956d1996-07-21 02:27:43 +00002821 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002822 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002823 com_newlocal(c, name);
2824 c->c_argcount++;
2825 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002826 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002827 ch = CHILD(n, i);
2828 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002829 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002830 else
2831 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002832 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002833 /* Handle *arguments */
2834 if (i < nch) {
2835 node *ch;
2836 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00002837 if (TYPE(ch) != DOUBLESTAR) {
2838 REQ(ch, STAR);
2839 ch = CHILD(n, i+1);
2840 if (TYPE(ch) == NAME) {
2841 c->c_flags |= CO_VARARGS;
2842 i += 3;
2843 com_newlocal(c, STR(ch));
2844 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002845 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002846 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002847 /* Handle **keywords */
2848 if (i < nch) {
2849 node *ch;
2850 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00002851 if (TYPE(ch) != DOUBLESTAR) {
2852 REQ(ch, STAR);
2853 ch = CHILD(n, i+1);
2854 REQ(ch, STAR);
2855 ch = CHILD(n, i+2);
2856 }
2857 else
2858 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002859 REQ(ch, NAME);
2860 c->c_flags |= CO_VARKEYWORDS;
2861 com_newlocal(c, STR(ch));
2862 }
2863 if (complex) {
2864 /* Generate code for complex arguments only after
2865 having counted the simple arguments */
2866 int ilocal = 0;
2867 for (i = 0; i < nch; i++) {
2868 node *ch = CHILD(n, i);
2869 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00002870 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002871 break;
2872 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
2873 fp = CHILD(ch, 0);
2874 if (TYPE(fp) != NAME) {
2875 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002876 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002877 com_fpdef(c, ch);
2878 }
2879 ilocal++;
2880 if (++i >= nch)
2881 break;
2882 ch = CHILD(n, i);
2883 if (TYPE(ch) == EQUAL)
2884 i += 2;
2885 else
2886 REQ(ch, COMMA);
2887 }
2888 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002889}
2890
2891static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002892com_file_input(c, n)
2893 struct compiling *c;
2894 node *n;
2895{
2896 int i;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002897 object *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002898 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002899 doc = get_docstring(n);
2900 if (doc != NULL) {
2901 int i = com_addconst(c, doc);
2902 DECREF(doc);
2903 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002904 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002905 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00002906 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002907 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002908 for (i = 0; i < NCH(n); i++) {
2909 node *ch = CHILD(n, i);
2910 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
2911 com_node(c, ch);
2912 }
2913}
2914
2915/* Top-level compile-node interface */
2916
2917static void
2918compile_funcdef(c, n)
2919 struct compiling *c;
2920 node *n;
2921{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002922 object *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002923 node *ch;
2924 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00002925 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002926 doc = get_docstring(CHILD(n, 4));
2927 if (doc != NULL) {
2928 (void) com_addconst(c, doc);
2929 DECREF(doc);
2930 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002931 else
2932 (void) com_addconst(c, None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002933 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
2934 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00002935 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002936 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002937 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002938 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002939 c->c_infunction = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002940 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002941 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002942 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002943 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002944}
2945
2946static void
Guido van Rossum590baa41993-11-30 13:40:46 +00002947compile_lambdef(c, n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002948 struct compiling *c;
2949 node *n;
2950{
Guido van Rossum590baa41993-11-30 13:40:46 +00002951 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002952 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00002953 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00002954
2955 ch = CHILD(n, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002956 (void) com_addconst(c, None); /* No docstring */
2957 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00002958 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002959 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00002960 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002961 else
2962 ch = CHILD(n, 2);
2963 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002964 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002965 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002966}
2967
2968static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002969compile_classdef(c, n)
2970 struct compiling *c;
2971 node *n;
2972{
2973 node *ch;
2974 object *doc;
2975 REQ(n, classdef);
2976 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
2977 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00002978#ifdef PRIVATE_NAME_MANGLING
2979 c->c_private = c->c_name;
2980#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002981 ch = CHILD(n, NCH(n)-1); /* The suite */
2982 doc = get_docstring(ch);
2983 if (doc != NULL) {
2984 int i = com_addconst(c, doc);
2985 DECREF(doc);
2986 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002987 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002988 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00002989 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002990 }
2991 else
2992 (void) com_addconst(c, None);
2993 com_node(c, ch);
2994 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002995 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002996 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002997 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002998}
2999
3000static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003001compile_node(c, n)
3002 struct compiling *c;
3003 node *n;
3004{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003005 com_addoparg(c, SET_LINENO, n->n_lineno);
3006
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003007 switch (TYPE(n)) {
3008
Guido van Rossum4c417781991-01-21 16:09:22 +00003009 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003010 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003011 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003012 n = CHILD(n, 0);
3013 if (TYPE(n) != NEWLINE)
3014 com_node(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003015 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003016 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003017 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003018 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003019 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003020 break;
3021
Guido van Rossum4c417781991-01-21 16:09:22 +00003022 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003023 com_file_input(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003024 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003025 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003026 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003027 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003028 break;
3029
Guido van Rossum590baa41993-11-30 13:40:46 +00003030 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003031 com_node(c, CHILD(n, 0));
3032 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003033 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003034 break;
3035
Guido van Rossum590baa41993-11-30 13:40:46 +00003036 case lambdef: /* anonymous function definition */
3037 compile_lambdef(c, n);
3038 break;
3039
Guido van Rossum4c417781991-01-21 16:09:22 +00003040 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003041 compile_funcdef(c, n);
3042 break;
3043
Guido van Rossum4c417781991-01-21 16:09:22 +00003044 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003045 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003046 break;
3047
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003048 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003049 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum452a9831996-09-17 14:32:04 +00003050 com_error(c, SystemError,
3051 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003052 }
3053}
3054
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003055/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00003056
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003057 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
3058 instructions that refer to local variables with LOAD_FAST etc.
3059 The latter instructions are much faster because they don't need to
3060 look up the variable name in a dictionary.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003061
Guido van Rossum681d79a1995-07-18 14:51:37 +00003062 To find all local variables, we check all STORE_NAME, IMPORT_FROM
3063 and DELETE_NAME instructions. This yields all local variables,
3064 function definitions, class definitions and import statements.
3065 Argument names have already been entered into the list by the
3066 special processing for the argument list.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003067
3068 All remaining LOAD_NAME instructions must refer to non-local (global
3069 or builtin) variables, so are replaced by LOAD_GLOBAL.
3070
3071 There are two problems: 'from foo import *' and 'exec' may introduce
3072 local variables that we can't know while compiling. If this is the
Guido van Rossum681d79a1995-07-18 14:51:37 +00003073 case, we can still optimize bona fide locals (since those
3074 statements will be surrounded by fast_2_locals() and
3075 locals_2_fast()), but we can't change LOAD_NAME to LOAD_GLOBAL.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003076
Guido van Rossum681d79a1995-07-18 14:51:37 +00003077 NB: this modifies the string object c->c_code! */
Guido van Rossum282914b1991-04-04 10:42:56 +00003078
3079static void
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003080optimize(c)
3081 struct compiling *c;
Guido van Rossum282914b1991-04-04 10:42:56 +00003082{
Guido van Rossum0a697f61991-04-16 08:39:12 +00003083 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00003084 int opcode;
Guido van Rossum80bb9651996-12-05 23:27:02 +00003085 int oparg = 0;
Guido van Rossum282914b1991-04-04 10:42:56 +00003086 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003087 object *error_type, *error_value, *error_traceback;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003088
Guido van Rossum282914b1991-04-04 10:42:56 +00003089#define NEXTOP() (*next_instr++)
3090#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
3091#define GETITEM(v, i) (getlistitem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003092#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
3093
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003094 err_fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003095
3096 c->c_flags |= CO_OPTIMIZED;
Guido van Rossum282914b1991-04-04 10:42:56 +00003097
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003098 next_instr = (unsigned char *) getstringvalue(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003099 for (;;) {
3100 opcode = NEXTOP();
3101 if (opcode == STOP_CODE)
3102 break;
3103 if (HAS_ARG(opcode))
3104 oparg = NEXTARG();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003105 switch (opcode) {
3106 case STORE_NAME:
3107 case DELETE_NAME:
3108 case IMPORT_FROM:
3109 com_addlocal_o(c, GETNAMEOBJ(oparg));
3110 break;
3111 case EXEC_STMT:
3112 c->c_flags &= ~CO_OPTIMIZED;
3113 break;
Guido van Rossum282914b1991-04-04 10:42:56 +00003114 }
3115 }
3116
Guido van Rossum681d79a1995-07-18 14:51:37 +00003117 if (dictlookup(c->c_locals, "*") != NULL)
3118 c->c_flags &= ~CO_OPTIMIZED;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003119
3120 next_instr = (unsigned char *) getstringvalue(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003121 for (;;) {
3122 cur_instr = next_instr;
3123 opcode = NEXTOP();
3124 if (opcode == STOP_CODE)
3125 break;
3126 if (HAS_ARG(opcode))
3127 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003128 if (opcode == LOAD_NAME ||
3129 opcode == STORE_NAME ||
3130 opcode == DELETE_NAME) {
3131 object *v;
3132 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00003133 name = GETNAMEOBJ(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003134 v = dict2lookup(c->c_locals, name);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003135 if (v == NULL) {
Guido van Rossum83163251991-08-16 08:58:43 +00003136 err_clear();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003137 if (opcode == LOAD_NAME &&
3138 (c->c_flags&CO_OPTIMIZED))
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003139 cur_instr[0] = LOAD_GLOBAL;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003140 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00003141 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003142 i = getintvalue(v);
3143 switch (opcode) {
3144 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
3145 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
3146 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
3147 }
3148 cur_instr[1] = i & 0xff;
3149 cur_instr[2] = (i>>8) & 0xff;
Guido van Rossum282914b1991-04-04 10:42:56 +00003150 }
3151 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003152
Guido van Rossum681d79a1995-07-18 14:51:37 +00003153 if (c->c_errors == 0)
3154 err_restore(error_type, error_value, error_traceback);
Guido van Rossum282914b1991-04-04 10:42:56 +00003155}
3156
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003157codeobject *
Guido van Rossum590baa41993-11-30 13:40:46 +00003158compile(n, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003159 node *n;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003160 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003161{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003162 return jcompile(n, filename, NULL);
3163}
3164
3165static codeobject *
3166icompile(n, base)
3167 node *n;
3168 struct compiling *base;
3169{
3170 return jcompile(n, base->c_filename, base);
3171}
3172
3173static codeobject *
3174jcompile(n, filename, base)
3175 node *n;
3176 char *filename;
3177 struct compiling *base;
3178{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003179 struct compiling sc;
3180 codeobject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003181 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003182 return NULL;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003183#ifdef PRIVATE_NAME_MANGLING
3184 if (base)
3185 sc.c_private = base->c_private;
3186 else
3187 sc.c_private = NULL;
3188#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003189 compile_node(&sc, n);
3190 com_done(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003191 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003192 optimize(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003193 sc.c_flags |= CO_NEWLOCALS;
3194 }
3195 else if (TYPE(n) == classdef)
3196 sc.c_flags |= CO_NEWLOCALS;
Guido van Rossum9bfef441993-03-29 10:43:31 +00003197 co = NULL;
3198 if (sc.c_errors == 0) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003199 object *consts, *names, *varnames, *filename, *name;
3200 consts = listtuple(sc.c_consts);
3201 names = listtuple(sc.c_names);
3202 varnames = listtuple(sc.c_varnames);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003203 filename = PyString_InternFromString(sc.c_filename);
3204 name = PyString_InternFromString(sc.c_name);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003205 if (!err_occurred())
3206 co = newcodeobject(sc.c_argcount,
3207 sc.c_nlocals,
Guido van Rossum8b993a91997-01-17 21:04:03 +00003208 sc.c_maxstacklevel,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003209 sc.c_flags,
3210 sc.c_code,
3211 consts,
3212 names,
3213 varnames,
3214 filename,
3215 name);
3216 XDECREF(consts);
3217 XDECREF(names);
3218 XDECREF(varnames);
3219 XDECREF(filename);
3220 XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003221 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003222 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003223 return co;
3224}