blob: 0ee55195322a8a39492ba4ea4e0522a5fa52cc16 [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 Rossumda4eb5c1997-01-24 03:43:35 +000079 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
80 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000081 {NULL} /* Sentinel */
82};
83
84static object *
85code_getattr(co, name)
86 codeobject *co;
87 char *name;
88{
89 return getmember((char *)co, code_memberlist, name);
90}
Guido van Rossum10dc2e81990-11-18 17:27:39 +000091
92static void
Guido van Rossum3f5da241990-12-20 15:06:42 +000093code_dealloc(co)
94 codeobject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +000095{
Guido van Rossum3f5da241990-12-20 15:06:42 +000096 XDECREF(co->co_code);
97 XDECREF(co->co_consts);
98 XDECREF(co->co_names);
99 XDECREF(co->co_filename);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000100 XDECREF(co->co_name);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000101 XDECREF(co->co_varnames);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000102 DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000103}
104
Guido van Rossum2dff9911992-09-03 20:50:59 +0000105static object *
106code_repr(co)
107 codeobject *co;
108{
109 char buf[500];
110 int lineno = -1;
111 char *p = GETSTRINGVALUE(co->co_code);
112 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000113 char *name = "???";
Guido van Rossum2dff9911992-09-03 20:50:59 +0000114 if (*p == SET_LINENO)
115 lineno = (p[1] & 0xff) | ((p[2] & 0xff) << 8);
116 if (co->co_filename && is_stringobject(co->co_filename))
117 filename = getstringvalue(co->co_filename);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000118 if (co->co_name && is_stringobject(co->co_name))
119 name = getstringvalue(co->co_name);
120 sprintf(buf, "<code object %.100s at %lx, file \"%.300s\", line %d>",
121 name, (long)co, filename, lineno);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000122 return newstringobject(buf);
123}
124
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000125static int
126code_compare(co, cp)
127 codeobject *co, *cp;
128{
129 int cmp;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000130 cmp = cp->co_argcount - cp->co_argcount;
131 if (cmp) return cmp;
132 cmp = cp->co_nlocals - cp->co_nlocals;
133 if (cmp) return cmp;
134 cmp = cp->co_flags - cp->co_flags;
135 if (cmp) return cmp;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000136 cmp = cmpobject((object *)co->co_code, (object *)cp->co_code);
137 if (cmp) return cmp;
138 cmp = cmpobject(co->co_consts, cp->co_consts);
139 if (cmp) return cmp;
140 cmp = cmpobject(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000141 if (cmp) return cmp;
142 cmp = cmpobject(co->co_varnames, cp->co_varnames);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000143 return cmp;
144}
145
146static long
147code_hash(co)
148 codeobject *co;
149{
Guido van Rossum681d79a1995-07-18 14:51:37 +0000150 long h, h1, h2, h3, h4;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000151 h1 = hashobject((object *)co->co_code);
152 if (h1 == -1) return -1;
153 h2 = hashobject(co->co_consts);
154 if (h2 == -1) return -1;
155 h3 = hashobject(co->co_names);
156 if (h3 == -1) return -1;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000157 h4 = hashobject(co->co_varnames);
158 if (h4 == -1) return -1;
159 h = h1 ^ h2 ^ h3 ^ h4 ^
160 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000161 if (h == -1) h = -2;
162 return h;
163}
164
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000165typeobject Codetype = {
166 OB_HEAD_INIT(&Typetype)
167 0,
168 "code",
169 sizeof(codeobject),
170 0,
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000171 (destructor)code_dealloc, /*tp_dealloc*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000172 0, /*tp_print*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000173 (getattrfunc)code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000174 0, /*tp_setattr*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000175 (cmpfunc)code_compare, /*tp_compare*/
176 (reprfunc)code_repr, /*tp_repr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000177 0, /*tp_as_number*/
178 0, /*tp_as_sequence*/
179 0, /*tp_as_mapping*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000180 (hashfunc)code_hash, /*tp_hash*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000181};
182
Guido van Rossuma082ce41991-06-04 19:41:56 +0000183codeobject *
Guido van Rossum8b993a91997-01-17 21:04:03 +0000184newcodeobject(argcount, nlocals, stacksize, flags,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000185 code, consts, names, varnames, filename, name,
186 firstlineno, lnotab)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000187 int argcount;
188 int nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000189 int stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000190 int flags;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000191 object *code;
192 object *consts;
193 object *names;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000194 object *varnames;
Guido van Rossuma082ce41991-06-04 19:41:56 +0000195 object *filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000196 object *name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000197 int firstlineno;
198 object *lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000199{
200 codeobject *co;
201 int i;
202 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000203 if (argcount < 0 || nlocals < 0 ||
204 code == NULL || !is_stringobject(code) ||
205 consts == NULL || !is_tupleobject(consts) ||
206 names == NULL || !is_tupleobject(names) ||
207 varnames == NULL || !is_tupleobject(varnames) ||
208 name == NULL || !is_stringobject(name) ||
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000209 filename == NULL || !is_stringobject(filename) ||
210 lnotab == NULL || !is_stringobject(lnotab)) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000211 err_badcall();
212 return NULL;
213 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000214 /* Make sure names and varnames are all strings, & intern them */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000215 for (i = gettuplesize(names); --i >= 0; ) {
216 object *v = gettupleitem(names, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000217 if (v == NULL || !is_stringobject(v)) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000218 err_badcall();
219 return NULL;
220 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000221 PyString_InternInPlace(&PyTuple_GET_ITEM(names, i));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000222 }
223 for (i = gettuplesize(varnames); --i >= 0; ) {
224 object *v = gettupleitem(varnames, i);
225 if (v == NULL || !is_stringobject(v)) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000226 err_badcall();
227 return NULL;
228 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000229 PyString_InternInPlace(&PyTuple_GET_ITEM(varnames, i));
230 }
231 /* Intern selected string constants */
232 for (i = gettuplesize(consts); --i >= 0; ) {
233 object *v = gettupleitem(consts, i);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000234 char *p;
235 if (!is_stringobject(v))
236 continue;
237 p = getstringvalue(v);
238 if (strspn(p, "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz")
239 != getstringsize(v))
240 continue;
241 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000242 }
243 co = NEWOBJ(codeobject, &Codetype);
244 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000245 co->co_argcount = argcount;
246 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000247 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000248 co->co_flags = flags;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000249 INCREF(code);
250 co->co_code = (stringobject *)code;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000251 INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000252 co->co_consts = consts;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000253 INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000254 co->co_names = names;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000255 INCREF(varnames);
256 co->co_varnames = varnames;
Guido van Rossuma082ce41991-06-04 19:41:56 +0000257 INCREF(filename);
258 co->co_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000259 INCREF(name);
260 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000261 co->co_firstlineno = firstlineno;
262 INCREF(lnotab);
263 co->co_lnotab = lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000264 }
265 return co;
266}
267
268
269/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000270
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000271struct compiling {
272 object *c_code; /* string */
273 object *c_consts; /* list of objects */
274 object *c_names; /* list of strings (names) */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000275 object *c_globals; /* dictionary (value=None) */
276 object *c_locals; /* dictionary (value=localID) */
277 object *c_varnames; /* list (inverse of c_locals) */
278 int c_nlocals; /* index of next local */
279 int c_argcount; /* number of top-level arguments */
280 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000281 int c_nexti; /* index into c_code */
282 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000283 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000284 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000285 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000286 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000287 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000288 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000289 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000290 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000291 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000292 int c_stacklevel; /* Current stack level */
293 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000294 int c_firstlineno;
295 object *c_lnotab; /* Table mapping address to line number */
296 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000297#ifdef PRIVATE_NAME_MANGLING
298 char *c_private; /* for private name mangling */
299#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000300};
301
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000302
Guido van Rossum452a9831996-09-17 14:32:04 +0000303/* Error message including line number */
304
305static void
306com_error(c, exc, msg)
307 struct compiling *c;
308 object *exc;
309 char *msg;
310{
311 int n = strlen(msg);
312 object *v;
313 char buffer[30];
314 char *s;
Guido van Rossum635abd21997-01-06 22:56:52 +0000315 c->c_errors++;
Guido van Rossum452a9831996-09-17 14:32:04 +0000316 if (c->c_lineno <= 1) {
317 /* Unknown line number or single interactive command */
318 err_setstr(exc, msg);
319 return;
320 }
321 sprintf(buffer, " (line %d)", c->c_lineno);
322 v = newsizedstringobject((char *)NULL, n + strlen(buffer));
323 if (v == NULL)
324 return; /* MemoryError, too bad */
325 s = GETSTRINGVALUE((stringobject *)v);
326 strcpy(s, msg);
327 strcat(s, buffer);
328 err_setval(exc, v);
329 DECREF(v);
Guido van Rossum452a9831996-09-17 14:32:04 +0000330}
331
332
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000333/* Interface to the block stack */
334
335static void
336block_push(c, type)
337 struct compiling *c;
338 int type;
339{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000340 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum452a9831996-09-17 14:32:04 +0000341 com_error(c, SystemError, "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000342 }
343 else {
344 c->c_block[c->c_nblocks++] = type;
345 }
346}
347
348static void
349block_pop(c, type)
350 struct compiling *c;
351 int type;
352{
353 if (c->c_nblocks > 0)
354 c->c_nblocks--;
355 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum452a9831996-09-17 14:32:04 +0000356 com_error(c, SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000357 }
358}
359
360
Guido van Rossum681d79a1995-07-18 14:51:37 +0000361/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000362
Guido van Rossum590baa41993-11-30 13:40:46 +0000363static int com_init PROTO((struct compiling *, char *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000364static void com_free PROTO((struct compiling *));
Guido van Rossum8b993a91997-01-17 21:04:03 +0000365static void com_push PROTO((struct compiling *, int));
366static void com_pop PROTO((struct compiling *, int));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000367static void com_done PROTO((struct compiling *));
368static void com_node PROTO((struct compiling *, struct _node *));
Guido van Rossum50564e81996-01-12 01:13:16 +0000369static void com_factor PROTO((struct compiling *, struct _node *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000370static void com_addbyte PROTO((struct compiling *, int));
371static void com_addint PROTO((struct compiling *, int));
372static void com_addoparg PROTO((struct compiling *, int, int));
373static void com_addfwref PROTO((struct compiling *, int, int *));
374static void com_backpatch PROTO((struct compiling *, int));
375static int com_add PROTO((struct compiling *, object *, object *));
376static int com_addconst PROTO((struct compiling *, object *));
377static int com_addname PROTO((struct compiling *, object *));
378static void com_addopname PROTO((struct compiling *, int, node *));
Guido van Rossum288a60f1991-12-16 13:05:10 +0000379static void com_list PROTO((struct compiling *, node *, int));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000380static int com_argdefs PROTO((struct compiling *, node *));
381static int com_newlocal PROTO((struct compiling *, char *));
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000382static codeobject *icompile PROTO((struct _node *, struct compiling *));
383static codeobject *jcompile PROTO((struct _node *, char *, struct compiling *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000384
385static int
Guido van Rossum590baa41993-11-30 13:40:46 +0000386com_init(c, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000387 struct compiling *c;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000388 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000389{
Guido van Rossum62d46241991-04-03 19:00:23 +0000390 if ((c->c_code = newsizedstringobject((char *)NULL, 1000)) == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000391 goto fail_3;
392 if ((c->c_consts = newlistobject(0)) == NULL)
393 goto fail_2;
394 if ((c->c_names = newlistobject(0)) == NULL)
395 goto fail_1;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000396 if ((c->c_globals = newdictobject()) == NULL)
397 goto fail_0;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000398 if ((c->c_locals = newdictobject()) == NULL)
399 goto fail_00;
400 if ((c->c_varnames = newlistobject(0)) == NULL)
401 goto fail_000;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000402 if ((c->c_lnotab = newsizedstringobject((char *)NULL, 1000)) == NULL)
403 goto fail_0000;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000404 c->c_nlocals = 0;
405 c->c_argcount = 0;
406 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000407 c->c_nexti = 0;
408 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000409 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000410 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000411 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000412 c->c_begin = 0;
413 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000414 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000415 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000416 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000417 c->c_stacklevel = 0;
418 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000419 c->c_firstlineno = 0;
420 c->c_last_addr = 0;
421 c->c_last_line = 0;
422 c-> c_lnotab_next = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000423 return 1;
424
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000425 fail_0000:
426 DECREF(c->c_lnotab);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000427 fail_000:
428 DECREF(c->c_locals);
429 fail_00:
430 DECREF(c->c_globals);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000431 fail_0:
432 DECREF(c->c_names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000433 fail_1:
434 DECREF(c->c_consts);
435 fail_2:
436 DECREF(c->c_code);
437 fail_3:
438 return 0;
439}
440
441static void
442com_free(c)
443 struct compiling *c;
444{
445 XDECREF(c->c_code);
446 XDECREF(c->c_consts);
447 XDECREF(c->c_names);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000448 XDECREF(c->c_globals);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000449 XDECREF(c->c_locals);
450 XDECREF(c->c_varnames);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000451 XDECREF(c->c_lnotab);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000452}
453
454static void
Guido van Rossum8b993a91997-01-17 21:04:03 +0000455com_push(c, n)
456 struct compiling *c;
457 int n;
458{
459 c->c_stacklevel += n;
460 if (c->c_stacklevel > c->c_maxstacklevel)
461 c->c_maxstacklevel = c->c_stacklevel;
462}
463
464static void
465com_pop(c, n)
466 struct compiling *c;
467 int n;
468{
469 if (c->c_stacklevel < n) {
470 fprintf(stderr,
471 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
472 c->c_filename, c->c_lineno,
473 c->c_nexti, c->c_stacklevel, n);
474 c->c_stacklevel = 0;
475 }
476 else
477 c->c_stacklevel -= n;
478}
479
480static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000481com_done(c)
482 struct compiling *c;
483{
484 if (c->c_code != NULL)
485 resizestring(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000486 if (c->c_lnotab != NULL)
487 resizestring(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000488}
489
490static void
491com_addbyte(c, byte)
492 struct compiling *c;
493 int byte;
494{
495 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000496 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000497 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000498 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000499 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000500 fatal("com_addbyte: byte out of range");
Guido van Rossum01cfd441991-10-20 20:12:38 +0000501 */
Guido van Rossum452a9831996-09-17 14:32:04 +0000502 com_error(c, SystemError, "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000503 }
504 if (c->c_code == NULL)
505 return;
506 len = getstringsize(c->c_code);
507 if (c->c_nexti >= len) {
508 if (resizestring(&c->c_code, len+1000) != 0) {
509 c->c_errors++;
510 return;
511 }
512 }
513 getstringvalue(c->c_code)[c->c_nexti++] = byte;
514}
515
516static void
517com_addint(c, x)
518 struct compiling *c;
519 int x;
520{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000521 com_addbyte(c, x & 0xff);
522 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000523}
524
525static void
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000526com_add_lnotab(c, addr, line)
527 struct compiling *c;
528 int addr;
529 int line;
530{
531 int size;
532 char *p;
533 if (c->c_lnotab == NULL)
534 return;
535 size = getstringsize(c->c_lnotab);
536 if (c->c_lnotab_next+2 > size) {
537 if (resizestring(&c->c_lnotab, size + 1000) < 0) {
538 c->c_errors++;
539 return;
540 }
541 }
542 p = getstringvalue(c->c_lnotab) + c->c_lnotab_next;
543 *p++ = addr;
544 *p++ = line;
545 c->c_lnotab_next += 2;
546}
547
548static void
549com_set_lineno(c, lineno)
550 struct compiling *c;
551 int lineno;
552{
553 c->c_lineno = lineno;
554 if (c->c_firstlineno == 0) {
555 c->c_firstlineno = c->c_last_line = lineno;
556 }
557 else {
558 int incr_addr = c->c_nexti - c->c_last_addr;
559 int incr_line = lineno - c->c_last_line;
560 while (incr_addr > 0 || incr_line > 0) {
561 int trunc_addr = incr_addr;
562 int trunc_line = incr_line;
563 if (trunc_addr > 255)
564 trunc_addr = 255;
565 if (trunc_line > 255)
566 trunc_line = 255;
567 com_add_lnotab(c, trunc_addr, trunc_line);
568 incr_addr -= trunc_addr;
569 incr_line -= trunc_line;
570 }
571 c->c_last_addr = c->c_nexti;
572 c->c_last_line = lineno;
573 }
574}
575
576static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000577com_addoparg(c, op, arg)
578 struct compiling *c;
579 int op;
580 int arg;
581{
Guido van Rossum452a9831996-09-17 14:32:04 +0000582 if (op == SET_LINENO)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000583 com_set_lineno(c, arg);
584 else {
585 com_addbyte(c, op);
586 com_addint(c, arg);
587 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000588}
589
590static void
591com_addfwref(c, op, p_anchor)
592 struct compiling *c;
593 int op;
594 int *p_anchor;
595{
596 /* Compile a forward reference for backpatching */
597 int here;
598 int anchor;
599 com_addbyte(c, op);
600 here = c->c_nexti;
601 anchor = *p_anchor;
602 *p_anchor = here;
603 com_addint(c, anchor == 0 ? 0 : here - anchor);
604}
605
606static void
607com_backpatch(c, anchor)
608 struct compiling *c;
609 int anchor; /* Must be nonzero */
610{
611 unsigned char *code = (unsigned char *) getstringvalue(c->c_code);
612 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000613 int dist;
614 int prev;
615 for (;;) {
616 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000617 prev = code[anchor] + (code[anchor+1] << 8);
618 dist = target - (anchor+2);
619 code[anchor] = dist & 0xff;
620 code[anchor+1] = dist >> 8;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000621 if (!prev)
622 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000623 anchor -= prev;
624 }
625}
626
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000627/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000628
629static int
630com_add(c, list, v)
631 struct compiling *c;
632 object *list;
633 object *v;
634{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000635 int n = getlistsize(list);
636 int i;
637 for (i = n; --i >= 0; ) {
638 object *w = getlistitem(list, i);
Guido van Rossumefc0bd01991-07-01 18:44:20 +0000639 if (v->ob_type == w->ob_type && cmpobject(v, w) == 0)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000640 return i;
641 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000642 if (addlistitem(list, v) != 0)
643 c->c_errors++;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000644 return n;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000645}
646
647static int
648com_addconst(c, v)
649 struct compiling *c;
650 object *v;
651{
652 return com_add(c, c->c_consts, v);
653}
654
655static int
656com_addname(c, v)
657 struct compiling *c;
658 object *v;
659{
660 return com_add(c, c->c_names, v);
661}
662
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000663#ifdef PRIVATE_NAME_MANGLING
664static int
665com_mangle(c, name, buffer, maxlen)
666 struct compiling *c;
667 char *name;
668 char *buffer;
669 int maxlen;
670{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000671 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000672 This is independent from how the name is used. */
673 char *p;
674 int nlen, plen;
675 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000676 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000677 return 0; /* Don't mangle __extremely_long_names */
678 if (name[nlen-1] == '_' && name[nlen-2] == '_')
679 return 0; /* Don't mangle __whatever__ */
680 p = c->c_private;
681 /* Strip leading underscores from class name */
682 while (*p == '_')
683 p++;
684 if (*p == '\0')
685 return 0; /* Don't mangle if class is just underscores */
686 plen = strlen(p);
687 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000688 plen = maxlen-nlen-2; /* Truncate class name if too long */
689 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000690 buffer[0] = '_';
691 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000692 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000693 /* fprintf(stderr, "mangle %s -> %s\n", name, buffer); */
694 return 1;
695}
696#endif
697
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000698static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000699com_addopnamestr(c, op, name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000700 struct compiling *c;
701 int op;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000702 char *name;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000703{
704 object *v;
705 int i;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000706#ifdef PRIVATE_NAME_MANGLING
707 char buffer[256];
708 if (name != NULL && name[0] == '_' && name[1] == '_' &&
709 c->c_private != NULL &&
710 com_mangle(c, name, buffer, (int)sizeof(buffer)))
711 name = buffer;
712#endif
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000713 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000714 c->c_errors++;
715 i = 255;
716 }
717 else {
718 i = com_addname(c, v);
719 DECREF(v);
720 }
Guido van Rossumc5e96291991-12-10 13:53:51 +0000721 /* Hack to replace *_NAME opcodes by *_GLOBAL if necessary */
722 switch (op) {
723 case LOAD_NAME:
724 case STORE_NAME:
725 case DELETE_NAME:
726 if (dictlookup(c->c_globals, name) != NULL) {
727 switch (op) {
728 case LOAD_NAME: op = LOAD_GLOBAL; break;
729 case STORE_NAME: op = STORE_GLOBAL; break;
730 case DELETE_NAME: op = DELETE_GLOBAL; break;
731 }
732 }
733 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000734 com_addoparg(c, op, i);
735}
736
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000737static void
738com_addopname(c, op, n)
739 struct compiling *c;
740 int op;
741 node *n;
742{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000743 char *name;
744 char buffer[1000];
745 /* XXX it is possible to write this code without the 1000
746 chars on the total length of dotted names, I just can't be
747 bothered right now */
748 if (TYPE(n) == STAR)
749 name = "*";
750 else if (TYPE(n) == dotted_name) {
751 char *p = buffer;
752 int i;
753 name = buffer;
754 for (i = 0; i < NCH(n); i += 2) {
755 char *s = STR(CHILD(n, i));
756 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum452a9831996-09-17 14:32:04 +0000757 com_error(c, MemoryError,
758 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +0000759 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000760 break;
761 }
762 if (p != buffer)
763 *p++ = '.';
764 strcpy(p, s);
765 p = strchr(p, '\0');
766 }
767 }
768 else {
769 REQ(n, NAME);
770 name = STR(n);
771 }
772 com_addopnamestr(c, op, name);
773}
774
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000775static object *
Guido van Rossum452a9831996-09-17 14:32:04 +0000776parsenumber(co, s)
777 struct compiling *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000778 char *s;
779{
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000780 extern long mystrtol PROTO((const char *, char **, int));
781 extern unsigned long mystrtoul PROTO((const char *, char **, int));
782 extern double atof PROTO((const char *));
Guido van Rossumc5e96291991-12-10 13:53:51 +0000783 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000784 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000785 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +0000786#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +0000787 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +0000788 int imflag;
789#endif
790
Guido van Rossum282914b1991-04-04 10:42:56 +0000791 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000792 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +0000793#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +0000794 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +0000795#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000796 if (*end == 'l' || *end == 'L')
Guido van Rossumc5e96291991-12-10 13:53:51 +0000797 return long_scan(s, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000798 if (s[0] == '0')
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000799 x = (long) mystrtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000800 else
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000801 x = mystrtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +0000802 if (*end == '\0') {
803 if (errno != 0) {
Guido van Rossum452a9831996-09-17 14:32:04 +0000804 com_error(co, OverflowError,
805 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000806 return NULL;
807 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000808 return newintobject(x);
Guido van Rossum282914b1991-04-04 10:42:56 +0000809 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000810 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +0000811#ifndef WITHOUT_COMPLEX
812 if (imflag) {
813 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000814 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +0000815 c.imag = atof(s);
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000816 PyFPE_END_PROTECT
Guido van Rossum50564e81996-01-12 01:13:16 +0000817 return newcomplexobject(c);
818 }
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000819 else {
Guido van Rossum50564e81996-01-12 01:13:16 +0000820#endif
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000821 PyFPE_START_PROTECT("atof", return 0)
822 dx = atof(s);
823 PyFPE_END_PROTECT
824 return newfloatobject(dx);
825 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000826}
827
828static object *
829parsestr(s)
830 char *s;
831{
832 object *v;
833 int len;
834 char *buf;
835 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000836 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000837 int c;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000838 int quote = *s;
839 if (quote != '\'' && quote != '\"') {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000840 err_badcall();
841 return NULL;
842 }
843 s++;
844 len = strlen(s);
Guido van Rossum8054fad1993-10-26 15:19:44 +0000845 if (s[--len] != quote) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000846 err_badcall();
847 return NULL;
848 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000849 if (len >= 4 && s[0] == quote && s[1] == quote) {
850 s += 2;
851 len -= 2;
852 if (s[--len] != quote || s[--len] != quote) {
853 err_badcall();
854 return NULL;
855 }
856 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000857 if (strchr(s, '\\') == NULL)
858 return newsizedstringobject(s, len);
859 v = newsizedstringobject((char *)NULL, len);
860 p = buf = getstringvalue(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000861 end = s + len;
862 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000863 if (*s != '\\') {
864 *p++ = *s++;
865 continue;
866 }
867 s++;
868 switch (*s++) {
869 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000870 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000871 case '\\': *p++ = '\\'; break;
872 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000873 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000874 case 'b': *p++ = '\b'; break;
875 case 'f': *p++ = '\014'; break; /* FF */
876 case 't': *p++ = '\t'; break;
877 case 'n': *p++ = '\n'; break;
878 case 'r': *p++ = '\r'; break;
879 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000880 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
881 case '0': case '1': case '2': case '3':
882 case '4': case '5': case '6': case '7':
883 c = s[-1] - '0';
884 if ('0' <= *s && *s <= '7') {
885 c = (c<<3) + *s++ - '0';
886 if ('0' <= *s && *s <= '7')
887 c = (c<<3) + *s++ - '0';
888 }
889 *p++ = c;
890 break;
891 case 'x':
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000892 if (isxdigit(Py_CHARMASK(*s))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000893 sscanf(s, "%x", &c);
894 *p++ = c;
895 do {
896 s++;
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000897 } while (isxdigit(Py_CHARMASK(*s)));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000898 break;
899 }
900 /* FALLTHROUGH */
901 default: *p++ = '\\'; *p++ = s[-1]; break;
902 }
903 }
904 resizestring(&v, (int)(p - buf));
905 return v;
906}
907
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000908static object *
909parsestrplus(n)
910 node *n;
911{
912 object *v;
913 int i;
914 REQ(CHILD(n, 0), STRING);
915 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
916 /* String literal concatenation */
917 for (i = 1; i < NCH(n) && v != NULL; i++) {
918 joinstring_decref(&v, parsestr(STR(CHILD(n, i))));
919 }
920 }
921 return v;
922}
923
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000924static void
925com_list_constructor(c, n)
926 struct compiling *c;
927 node *n;
928{
929 int len;
930 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000931 if (TYPE(n) != testlist)
932 REQ(n, exprlist);
933 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
934 len = (NCH(n) + 1) / 2;
935 for (i = 0; i < NCH(n); i += 2)
936 com_node(c, CHILD(n, i));
937 com_addoparg(c, BUILD_LIST, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000938 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000939}
940
941static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000942com_dictmaker(c, n)
943 struct compiling *c;
944 node *n;
945{
946 int i;
947 /* dictmaker: test ':' test (',' test ':' value)* [','] */
948 for (i = 0; i+2 < NCH(n); i += 4) {
949 /* We must arrange things just right for STORE_SUBSCR.
950 It wants the stack to look like (value) (dict) (key) */
951 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000952 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000953 com_node(c, CHILD(n, i+2)); /* value */
954 com_addbyte(c, ROT_TWO);
955 com_node(c, CHILD(n, i)); /* key */
956 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000957 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000958 }
959}
960
961static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000962com_atom(c, n)
963 struct compiling *c;
964 node *n;
965{
966 node *ch;
967 object *v;
968 int i;
969 REQ(n, atom);
970 ch = CHILD(n, 0);
971 switch (TYPE(ch)) {
972 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +0000973 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000974 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000975 com_push(c, 1);
976 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000977 else
978 com_node(c, CHILD(n, 1));
979 break;
980 case LSQB:
Guido van Rossum8b993a91997-01-17 21:04:03 +0000981 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000982 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000983 com_push(c, 1);
984 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000985 else
986 com_list_constructor(c, CHILD(n, 1));
987 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000988 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000989 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000990 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000991 if (TYPE(CHILD(n, 1)) != RBRACE)
992 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000993 break;
994 case BACKQUOTE:
995 com_node(c, CHILD(n, 1));
996 com_addbyte(c, UNARY_CONVERT);
997 break;
998 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +0000999 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001000 i = 255;
1001 }
1002 else {
1003 i = com_addconst(c, v);
1004 DECREF(v);
1005 }
1006 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001007 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001008 break;
1009 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001010 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001011 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001012 c->c_errors++;
1013 i = 255;
1014 }
1015 else {
1016 i = com_addconst(c, v);
1017 DECREF(v);
1018 }
1019 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001020 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001021 break;
1022 case NAME:
1023 com_addopname(c, LOAD_NAME, ch);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001024 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001025 break;
1026 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001027 /* XXX fprintf(stderr, "node type %d\n", TYPE(ch)); */
Guido van Rossum452a9831996-09-17 14:32:04 +00001028 com_error(c, SystemError, "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001029 }
1030}
1031
1032static void
1033com_slice(c, n, op)
1034 struct compiling *c;
1035 node *n;
1036 int op;
1037{
1038 if (NCH(n) == 1) {
1039 com_addbyte(c, op);
1040 }
1041 else if (NCH(n) == 2) {
1042 if (TYPE(CHILD(n, 0)) != COLON) {
1043 com_node(c, CHILD(n, 0));
1044 com_addbyte(c, op+1);
1045 }
1046 else {
1047 com_node(c, CHILD(n, 1));
1048 com_addbyte(c, op+2);
1049 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001050 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001051 }
1052 else {
1053 com_node(c, CHILD(n, 0));
1054 com_node(c, CHILD(n, 2));
1055 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001056 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001057 }
1058}
1059
Guido van Rossum635abd21997-01-06 22:56:52 +00001060static void
1061com_argument(c, n, pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001062 struct compiling *c;
1063 node *n; /* argument */
Guido van Rossum635abd21997-01-06 22:56:52 +00001064 object **pkeywords;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001065{
1066 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001067 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001068 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001069 if (*pkeywords != NULL) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001070 com_error(c, SyntaxError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001071 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001072 }
1073 else {
1074 com_node(c, CHILD(n, 0));
1075 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001076 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001077 }
1078 m = n;
1079 do {
1080 m = CHILD(m, 0);
1081 } while (NCH(m) == 1);
1082 if (TYPE(m) != NAME) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001083 com_error(c, SyntaxError, "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001084 }
1085 else {
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001086 object *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001087 if (v != NULL && *pkeywords == NULL)
1088 *pkeywords = newdictobject();
1089 if (v == NULL || *pkeywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001090 c->c_errors++;
1091 else {
Guido van Rossum635abd21997-01-06 22:56:52 +00001092 if (dict2lookup(*pkeywords, v) != NULL)
1093 com_error(c, SyntaxError,
1094 "duplicate keyword argument");
1095 else
1096 if (dict2insert(*pkeywords, v, v) != 0)
1097 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001098 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001099 com_push(c, 1);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001100 DECREF(v);
1101 }
1102 }
1103 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001104}
1105
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001106static void
1107com_call_function(c, n)
1108 struct compiling *c;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001109 node *n; /* EITHER arglist OR ')' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001110{
1111 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001112 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001113 }
1114 else {
Guido van Rossum635abd21997-01-06 22:56:52 +00001115 object *keywords = NULL;
1116 int i, na, nk;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001117 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001118 na = 0;
1119 nk = 0;
1120 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001121 com_argument(c, CHILD(n, i), &keywords);
1122 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001123 na++;
1124 else
1125 nk++;
1126 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001127 XDECREF(keywords);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001128 if (na > 255 || nk > 255) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001129 com_error(c, SyntaxError, "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001130 }
1131 com_addoparg(c, CALL_FUNCTION, na | (nk << 8));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001132 com_pop(c, na + 2*nk);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001133 }
1134}
1135
1136static void
1137com_select_member(c, n)
1138 struct compiling *c;
1139 node *n;
1140{
1141 com_addopname(c, LOAD_ATTR, n);
1142}
1143
1144static void
Guido van Rossum8861b741996-07-30 16:49:37 +00001145com_sliceobj(c, n)
1146 struct compiling *c;
1147 node *n;
1148{
1149 int i=0;
1150 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001151 node *ch;
1152
1153 /* first argument */
1154 if (TYPE(CHILD(n,i)) == COLON) {
1155 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001156 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001157 i++;
1158 }
1159 else {
1160 com_node(c, CHILD(n,i));
1161 i++;
1162 REQ(CHILD(n,i),COLON);
1163 i++;
1164 }
1165 /* second argument */
1166 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1167 com_node(c, CHILD(n,i));
1168 i++;
1169 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001170 else {
1171 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1172 com_push(c, 1);
1173 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001174 /* remaining arguments */
1175 for (; i < NCH(n); i++) {
1176 ns++;
1177 ch=CHILD(n,i);
1178 REQ(ch, sliceop);
1179 if (NCH(ch) == 1) {
1180 /* right argument of ':' missing */
1181 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001182 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001183 }
1184 else
1185 com_node(c, CHILD(ch,1));
1186 }
1187 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001188 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001189}
1190
1191static void
1192com_subscript(c, n)
1193 struct compiling *c;
1194 node *n;
1195{
1196 node *ch;
1197 REQ(n, subscript);
1198 ch = CHILD(n,0);
1199 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001200 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001201 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001202 com_push(c, 1);
1203 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001204 else {
1205 /* check for slice */
1206 if ((TYPE(ch) == COLON || NCH(n) > 1))
1207 com_sliceobj(c, n);
1208 else {
1209 REQ(ch, test);
1210 com_node(c, ch);
1211 }
1212 }
1213}
1214
1215static void
1216com_subscriptlist(c, n, assigning)
1217 struct compiling *c;
1218 node *n;
1219 int assigning;
1220{
1221 int i, op;
1222 REQ(n, subscriptlist);
1223 /* Check to make backward compatible slice behavior for '[i:j]' */
1224 if (NCH(n) == 1) {
1225 node *sub = CHILD(n, 0); /* subscript */
1226 /* Make it is a simple slice.
Guido van Rossum8b993a91997-01-17 21:04:03 +00001227 Should have exactly one colon. */
Guido van Rossum8861b741996-07-30 16:49:37 +00001228 if ((TYPE(CHILD(sub, 0)) == COLON
1229 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
Guido van Rossum8b993a91997-01-17 21:04:03 +00001230 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1231 {
Guido van Rossum8861b741996-07-30 16:49:37 +00001232 if (assigning == OP_APPLY)
1233 op = SLICE;
1234 else
1235 op = ((assigning == OP_ASSIGN) ? STORE_SLICE : DELETE_SLICE);
1236 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001237 if (op == STORE_SLICE)
1238 com_pop(c, 2);
1239 else if (op == DELETE_SLICE)
1240 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001241 return;
1242 }
1243 }
1244 /* Else normal subscriptlist. Compile each subscript. */
1245 for (i = 0; i < NCH(n); i += 2)
1246 com_subscript(c, CHILD(n, i));
1247 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001248 if (NCH(n) > 1) {
1249 i = (NCH(n)+1) / 2;
1250 com_addoparg(c, BUILD_TUPLE, i);
1251 com_pop(c, i-1);
1252 }
1253 if (assigning == OP_APPLY) {
Guido van Rossum8861b741996-07-30 16:49:37 +00001254 op = BINARY_SUBSCR;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001255 i = 1;
1256 }
1257 else if (assigning == OP_ASSIGN) {
1258 op = STORE_SUBSCR;
1259 i = 3;
1260 }
1261 else {
1262 op = DELETE_SUBSCR;
1263 i = 2;
1264 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001265 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001266 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001267}
1268
1269static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001270com_apply_trailer(c, n)
1271 struct compiling *c;
1272 node *n;
1273{
1274 REQ(n, trailer);
1275 switch (TYPE(CHILD(n, 0))) {
1276 case LPAR:
1277 com_call_function(c, CHILD(n, 1));
1278 break;
1279 case DOT:
1280 com_select_member(c, CHILD(n, 1));
1281 break;
1282 case LSQB:
Guido van Rossum8861b741996-07-30 16:49:37 +00001283 com_subscriptlist(c, CHILD(n, 1), OP_APPLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001284 break;
1285 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001286 com_error(c, SystemError,
1287 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001288 }
1289}
1290
1291static void
Guido van Rossum50564e81996-01-12 01:13:16 +00001292com_power(c, n)
1293 struct compiling *c;
1294 node *n;
1295{
1296 int i;
1297 REQ(n, power);
1298 com_atom(c, CHILD(n, 0));
1299 for (i = 1; i < NCH(n); i++) {
1300 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1301 com_factor(c, CHILD(n, i+1));
1302 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001303 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001304 break;
1305 }
1306 else
1307 com_apply_trailer(c, CHILD(n, i));
1308 }
1309}
1310
1311static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001312com_factor(c, n)
1313 struct compiling *c;
1314 node *n;
1315{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001316 REQ(n, factor);
1317 if (TYPE(CHILD(n, 0)) == PLUS) {
1318 com_factor(c, CHILD(n, 1));
1319 com_addbyte(c, UNARY_POSITIVE);
1320 }
1321 else if (TYPE(CHILD(n, 0)) == MINUS) {
1322 com_factor(c, CHILD(n, 1));
1323 com_addbyte(c, UNARY_NEGATIVE);
1324 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001325 else if (TYPE(CHILD(n, 0)) == TILDE) {
1326 com_factor(c, CHILD(n, 1));
1327 com_addbyte(c, UNARY_INVERT);
1328 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001329 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001330 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001331 }
1332}
1333
1334static void
1335com_term(c, n)
1336 struct compiling *c;
1337 node *n;
1338{
1339 int i;
1340 int op;
1341 REQ(n, term);
1342 com_factor(c, CHILD(n, 0));
1343 for (i = 2; i < NCH(n); i += 2) {
1344 com_factor(c, CHILD(n, i));
1345 switch (TYPE(CHILD(n, i-1))) {
1346 case STAR:
1347 op = BINARY_MULTIPLY;
1348 break;
1349 case SLASH:
1350 op = BINARY_DIVIDE;
1351 break;
1352 case PERCENT:
1353 op = BINARY_MODULO;
1354 break;
1355 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001356 com_error(c, SystemError,
1357 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001358 op = 255;
1359 }
1360 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001361 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001362 }
1363}
1364
1365static void
1366com_arith_expr(c, n)
1367 struct compiling *c;
1368 node *n;
1369{
1370 int i;
1371 int op;
1372 REQ(n, arith_expr);
1373 com_term(c, CHILD(n, 0));
1374 for (i = 2; i < NCH(n); i += 2) {
1375 com_term(c, CHILD(n, i));
1376 switch (TYPE(CHILD(n, i-1))) {
1377 case PLUS:
1378 op = BINARY_ADD;
1379 break;
1380 case MINUS:
1381 op = BINARY_SUBTRACT;
1382 break;
1383 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001384 com_error(c, SystemError,
1385 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001386 op = 255;
1387 }
1388 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001389 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001390 }
1391}
1392
1393static void
1394com_shift_expr(c, n)
1395 struct compiling *c;
1396 node *n;
1397{
1398 int i;
1399 int op;
1400 REQ(n, shift_expr);
1401 com_arith_expr(c, CHILD(n, 0));
1402 for (i = 2; i < NCH(n); i += 2) {
1403 com_arith_expr(c, CHILD(n, i));
1404 switch (TYPE(CHILD(n, i-1))) {
1405 case LEFTSHIFT:
1406 op = BINARY_LSHIFT;
1407 break;
1408 case RIGHTSHIFT:
1409 op = BINARY_RSHIFT;
1410 break;
1411 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001412 com_error(c, SystemError,
1413 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001414 op = 255;
1415 }
1416 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001417 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001418 }
1419}
1420
1421static void
1422com_and_expr(c, n)
1423 struct compiling *c;
1424 node *n;
1425{
1426 int i;
1427 int op;
1428 REQ(n, and_expr);
1429 com_shift_expr(c, CHILD(n, 0));
1430 for (i = 2; i < NCH(n); i += 2) {
1431 com_shift_expr(c, CHILD(n, i));
1432 if (TYPE(CHILD(n, i-1)) == AMPER) {
1433 op = BINARY_AND;
1434 }
1435 else {
Guido van Rossum452a9831996-09-17 14:32:04 +00001436 com_error(c, SystemError,
1437 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001438 op = 255;
1439 }
1440 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001441 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001442 }
1443}
1444
1445static void
1446com_xor_expr(c, n)
1447 struct compiling *c;
1448 node *n;
1449{
1450 int i;
1451 int op;
1452 REQ(n, xor_expr);
1453 com_and_expr(c, CHILD(n, 0));
1454 for (i = 2; i < NCH(n); i += 2) {
1455 com_and_expr(c, CHILD(n, i));
1456 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1457 op = BINARY_XOR;
1458 }
1459 else {
Guido van Rossum452a9831996-09-17 14:32:04 +00001460 com_error(c, SystemError,
1461 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001462 op = 255;
1463 }
1464 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001465 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001466 }
1467}
1468
1469static void
1470com_expr(c, n)
1471 struct compiling *c;
1472 node *n;
1473{
1474 int i;
1475 int op;
1476 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001477 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001478 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001479 com_xor_expr(c, CHILD(n, i));
1480 if (TYPE(CHILD(n, i-1)) == VBAR) {
1481 op = BINARY_OR;
1482 }
1483 else {
Guido van Rossum452a9831996-09-17 14:32:04 +00001484 com_error(c, SystemError,
1485 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001486 op = 255;
1487 }
1488 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001489 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001490 }
1491}
1492
1493static enum cmp_op
1494cmp_type(n)
1495 node *n;
1496{
1497 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001498 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001499 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1500 if (NCH(n) == 1) {
1501 n = CHILD(n, 0);
1502 switch (TYPE(n)) {
1503 case LESS: return LT;
1504 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001505 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001506 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001507 case LESSEQUAL: return LE;
1508 case GREATEREQUAL: return GE;
1509 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001510 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1511 if (strcmp(STR(n), "is") == 0) return IS;
1512 }
1513 }
1514 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001515 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001516 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1517 return NOT_IN;
1518 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1519 return IS_NOT;
1520 }
1521 }
1522 return BAD;
1523}
1524
1525static void
1526com_comparison(c, n)
1527 struct compiling *c;
1528 node *n;
1529{
1530 int i;
1531 enum cmp_op op;
1532 int anchor;
1533 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
1534 com_expr(c, CHILD(n, 0));
1535 if (NCH(n) == 1)
1536 return;
1537
1538 /****************************************************************
1539 The following code is generated for all but the last
1540 comparison in a chain:
1541
1542 label: on stack: opcode: jump to:
1543
1544 a <code to load b>
1545 a, b DUP_TOP
1546 a, b, b ROT_THREE
1547 b, a, b COMPARE_OP
1548 b, 0-or-1 JUMP_IF_FALSE L1
1549 b, 1 POP_TOP
1550 b
1551
1552 We are now ready to repeat this sequence for the next
1553 comparison in the chain.
1554
1555 For the last we generate:
1556
1557 b <code to load c>
1558 b, c COMPARE_OP
1559 0-or-1
1560
1561 If there were any jumps to L1 (i.e., there was more than one
1562 comparison), we generate:
1563
1564 0-or-1 JUMP_FORWARD L2
1565 L1: b, 0 ROT_TWO
1566 0, b POP_TOP
1567 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00001568 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001569 ****************************************************************/
1570
1571 anchor = 0;
1572
1573 for (i = 2; i < NCH(n); i += 2) {
1574 com_expr(c, CHILD(n, i));
1575 if (i+2 < NCH(n)) {
1576 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001577 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001578 com_addbyte(c, ROT_THREE);
1579 }
1580 op = cmp_type(CHILD(n, i-1));
1581 if (op == BAD) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001582 com_error(c, SystemError,
1583 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001584 }
1585 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001586 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001587 if (i+2 < NCH(n)) {
1588 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1589 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001590 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001591 }
1592 }
1593
1594 if (anchor) {
1595 int anchor2 = 0;
1596 com_addfwref(c, JUMP_FORWARD, &anchor2);
1597 com_backpatch(c, anchor);
1598 com_addbyte(c, ROT_TWO);
1599 com_addbyte(c, POP_TOP);
1600 com_backpatch(c, anchor2);
1601 }
1602}
1603
1604static void
1605com_not_test(c, n)
1606 struct compiling *c;
1607 node *n;
1608{
1609 REQ(n, not_test); /* 'not' not_test | comparison */
1610 if (NCH(n) == 1) {
1611 com_comparison(c, CHILD(n, 0));
1612 }
1613 else {
1614 com_not_test(c, CHILD(n, 1));
1615 com_addbyte(c, UNARY_NOT);
1616 }
1617}
1618
1619static void
1620com_and_test(c, n)
1621 struct compiling *c;
1622 node *n;
1623{
1624 int i;
1625 int anchor;
1626 REQ(n, and_test); /* not_test ('and' not_test)* */
1627 anchor = 0;
1628 i = 0;
1629 for (;;) {
1630 com_not_test(c, CHILD(n, i));
1631 if ((i += 2) >= NCH(n))
1632 break;
1633 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1634 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001635 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001636 }
1637 if (anchor)
1638 com_backpatch(c, anchor);
1639}
1640
1641static void
1642com_test(c, n)
1643 struct compiling *c;
1644 node *n;
1645{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001646 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00001647 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
1648 object *v;
1649 int i;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001650 int ndefs = com_argdefs(c, CHILD(n, 0));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001651 v = (object *) icompile(CHILD(n, 0), c);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001652 if (v == NULL) {
1653 c->c_errors++;
1654 i = 255;
1655 }
1656 else {
1657 i = com_addconst(c, v);
1658 DECREF(v);
1659 }
1660 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001661 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001662 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001663 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001664 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00001665 else {
1666 int anchor = 0;
1667 int i = 0;
1668 for (;;) {
1669 com_and_test(c, CHILD(n, i));
1670 if ((i += 2) >= NCH(n))
1671 break;
1672 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1673 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001674 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001675 }
1676 if (anchor)
1677 com_backpatch(c, anchor);
1678 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001679}
1680
1681static void
Guido van Rossum288a60f1991-12-16 13:05:10 +00001682com_list(c, n, toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001683 struct compiling *c;
1684 node *n;
Guido van Rossum288a60f1991-12-16 13:05:10 +00001685 int toplevel; /* If nonzero, *always* build a tuple */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001686{
1687 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001688 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001689 com_node(c, CHILD(n, 0));
1690 }
1691 else {
1692 int i;
1693 int len;
1694 len = (NCH(n) + 1) / 2;
1695 for (i = 0; i < NCH(n); i += 2)
1696 com_node(c, CHILD(n, i));
1697 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001698 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001699 }
1700}
1701
1702
1703/* Begin of assignment compilation */
1704
1705static void com_assign_name PROTO((struct compiling *, node *, int));
1706static void com_assign PROTO((struct compiling *, node *, int));
1707
1708static void
1709com_assign_attr(c, n, assigning)
1710 struct compiling *c;
1711 node *n;
1712 int assigning;
1713{
1714 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001715 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001716}
1717
1718static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001719com_assign_trailer(c, n, assigning)
1720 struct compiling *c;
1721 node *n;
1722 int assigning;
1723{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001724 REQ(n, trailer);
1725 switch (TYPE(CHILD(n, 0))) {
1726 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum452a9831996-09-17 14:32:04 +00001727 com_error(c, SyntaxError, "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001728 break;
1729 case DOT: /* '.' NAME */
1730 com_assign_attr(c, CHILD(n, 1), assigning);
1731 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001732 case LSQB: /* '[' subscriptlist ']' */
1733 com_subscriptlist(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001734 break;
1735 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001736 com_error(c, SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001737 }
1738}
1739
1740static void
1741com_assign_tuple(c, n, assigning)
1742 struct compiling *c;
1743 node *n;
1744 int assigning;
1745{
1746 int i;
1747 if (TYPE(n) != testlist)
1748 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001749 if (assigning) {
1750 i = (NCH(n)+1)/2;
1751 com_addoparg(c, UNPACK_TUPLE, i);
1752 com_push(c, i-1);
1753 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001754 for (i = 0; i < NCH(n); i += 2)
1755 com_assign(c, CHILD(n, i), assigning);
1756}
1757
1758static void
1759com_assign_list(c, n, assigning)
1760 struct compiling *c;
1761 node *n;
1762 int assigning;
1763{
1764 int i;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001765 if (assigning) {
1766 i = (NCH(n)+1)/2;
1767 com_addoparg(c, UNPACK_LIST, i);
1768 com_push(c, i-1);
1769 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001770 for (i = 0; i < NCH(n); i += 2)
1771 com_assign(c, CHILD(n, i), assigning);
1772}
1773
1774static void
1775com_assign_name(c, n, assigning)
1776 struct compiling *c;
1777 node *n;
1778 int assigning;
1779{
1780 REQ(n, NAME);
1781 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001782 if (assigning)
1783 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001784}
1785
1786static void
1787com_assign(c, n, assigning)
1788 struct compiling *c;
1789 node *n;
1790 int assigning;
1791{
1792 /* Loop to avoid trivial recursion */
1793 for (;;) {
1794 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001795
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001796 case exprlist:
1797 case testlist:
1798 if (NCH(n) > 1) {
1799 com_assign_tuple(c, n, assigning);
1800 return;
1801 }
1802 n = CHILD(n, 0);
1803 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001804
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001805 case test:
1806 case and_test:
1807 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001808 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001809 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001810 case xor_expr:
1811 case and_expr:
1812 case shift_expr:
1813 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001814 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00001815 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001816 if (NCH(n) > 1) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001817 com_error(c, SyntaxError,
1818 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001819 return;
1820 }
1821 n = CHILD(n, 0);
1822 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001823
Guido van Rossum50564e81996-01-12 01:13:16 +00001824 case power: /* atom trailer* ('**' power)* */
1825/* ('+'|'-'|'~') factor | atom trailer* */
1826 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001827 com_error(c, SyntaxError,
1828 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001829 return;
1830 }
Guido van Rossum50564e81996-01-12 01:13:16 +00001831 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001832 int i;
1833 com_node(c, CHILD(n, 0));
1834 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00001835 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001836 com_error(c, SyntaxError,
1837 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00001838 return;
1839 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001840 com_apply_trailer(c, CHILD(n, i));
1841 } /* NB i is still alive */
1842 com_assign_trailer(c,
1843 CHILD(n, i), assigning);
1844 return;
1845 }
1846 n = CHILD(n, 0);
1847 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001848
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001849 case atom:
1850 switch (TYPE(CHILD(n, 0))) {
1851 case LPAR:
1852 n = CHILD(n, 1);
1853 if (TYPE(n) == RPAR) {
1854 /* XXX Should allow () = () ??? */
Guido van Rossum452a9831996-09-17 14:32:04 +00001855 com_error(c, SyntaxError,
1856 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001857 return;
1858 }
1859 break;
1860 case LSQB:
1861 n = CHILD(n, 1);
1862 if (TYPE(n) == RSQB) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001863 com_error(c, SyntaxError,
1864 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001865 return;
1866 }
1867 com_assign_list(c, n, assigning);
1868 return;
1869 case NAME:
1870 com_assign_name(c, CHILD(n, 0), assigning);
1871 return;
1872 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001873 com_error(c, SyntaxError,
1874 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001875 return;
1876 }
1877 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001878
1879 case lambdef:
Guido van Rossum452a9831996-09-17 14:32:04 +00001880 com_error(c, SyntaxError, "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001881 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001882
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001883 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001884 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum452a9831996-09-17 14:32:04 +00001885 com_error(c, SystemError, "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001886 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001887
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001888 }
1889 }
1890}
Guido van Rossum8b993a91997-01-17 21:04:03 +00001891/* Forward */ static node *get_rawdocstring PROTO((node *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001892
1893static void
1894com_expr_stmt(c, n)
1895 struct compiling *c;
1896 node *n;
1897{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001898 REQ(n, expr_stmt); /* testlist ('=' testlist)* */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001899 /* Forget it if we have just a doc string here */
1900 if (NCH(n) == 1 && get_rawdocstring(n) != NULL)
1901 return;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001902 com_node(c, CHILD(n, NCH(n)-1));
1903 if (NCH(n) == 1) {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001904 if (c->c_interactive)
1905 com_addbyte(c, PRINT_EXPR);
1906 else
1907 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001908 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001909 }
1910 else {
1911 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001912 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00001913 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001914 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001915 com_push(c, 1);
1916 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001917 com_assign(c, CHILD(n, i), OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001918 }
1919 }
1920}
1921
1922static void
1923com_print_stmt(c, n)
1924 struct compiling *c;
1925 node *n;
1926{
1927 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001928 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
1929 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001930 com_node(c, CHILD(n, i));
1931 com_addbyte(c, PRINT_ITEM);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001932 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001933 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001934 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001935 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001936 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001937}
1938
1939static void
1940com_return_stmt(c, n)
1941 struct compiling *c;
1942 node *n;
1943{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001944 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001945 if (!c->c_infunction) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001946 com_error(c, SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001947 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001948 if (NCH(n) < 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001949 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001950 com_push(c, 1);
1951 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001952 else
1953 com_node(c, CHILD(n, 1));
1954 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001955 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001956}
1957
1958static void
1959com_raise_stmt(c, n)
1960 struct compiling *c;
1961 node *n;
1962{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001963 int i;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001964 REQ(n, raise_stmt); /* 'raise' test [',' test [',' test]] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001965 com_node(c, CHILD(n, 1));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001966 if (NCH(n) > 3) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001967 com_node(c, CHILD(n, 3));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001968 if (NCH(n) > 5)
1969 com_node(c, CHILD(n, 5));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001970 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001971 i = NCH(n)/2;
1972 com_addoparg(c, RAISE_VARARGS, i);
1973 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001974}
1975
1976static void
1977com_import_stmt(c, n)
1978 struct compiling *c;
1979 node *n;
1980{
1981 int i;
1982 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001983 /* 'import' dotted_name (',' dotted_name)* |
1984 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001985 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001986 /* 'from' dotted_name 'import' ... */
1987 REQ(CHILD(n, 1), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001988 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001989 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001990 for (i = 3; i < NCH(n); i += 2)
1991 com_addopname(c, IMPORT_FROM, CHILD(n, i));
1992 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001993 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001994 }
1995 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001996 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001997 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001998 REQ(CHILD(n, i), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001999 com_addopname(c, IMPORT_NAME, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002000 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002001 com_addopname(c, STORE_NAME, CHILD(CHILD(n, i), 0));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002002 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002003 }
2004 }
2005}
2006
2007static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00002008com_global_stmt(c, n)
2009 struct compiling *c;
2010 node *n;
2011{
2012 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002013 REQ(n, global_stmt);
2014 /* 'global' NAME (',' NAME)* */
2015 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002016 char *s = STR(CHILD(n, i));
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002017#ifdef PRIVATE_NAME_MANGLING
2018 char buffer[256];
2019 if (s != NULL && s[0] == '_' && s[1] == '_' &&
2020 c->c_private != NULL &&
2021 com_mangle(c, s, buffer, (int)sizeof(buffer)))
2022 s = buffer;
2023#endif
Guido van Rossum681d79a1995-07-18 14:51:37 +00002024 if (dictlookup(c->c_locals, s) != NULL) {
Guido van Rossum452a9831996-09-17 14:32:04 +00002025 com_error(c, SyntaxError, "name is local and global");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002026 }
2027 else if (dictinsert(c->c_globals, s, None) != 0)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002028 c->c_errors++;
2029 }
2030}
2031
Guido van Rossum681d79a1995-07-18 14:51:37 +00002032static int
2033com_newlocal_o(c, nameval)
2034 struct compiling *c;
2035 object *nameval;
2036{
2037 int i;
2038 object *ival;
2039 if (getlistsize(c->c_varnames) != c->c_nlocals) {
2040 /* This is usually caused by an error on a previous call */
2041 if (c->c_errors == 0) {
Guido van Rossum452a9831996-09-17 14:32:04 +00002042 com_error(c, SystemError, "mixed up var name/index");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002043 }
2044 return 0;
2045 }
2046 ival = newintobject(i = c->c_nlocals++);
2047 if (ival == NULL)
2048 c->c_errors++;
2049 else if (mappinginsert(c->c_locals, nameval, ival) != 0)
2050 c->c_errors++;
2051 else if (addlistitem(c->c_varnames, nameval) != 0)
2052 c->c_errors++;
2053 XDECREF(ival);
2054 return i;
2055}
2056
2057static int
2058com_addlocal_o(c, nameval)
2059 struct compiling *c;
2060 object *nameval;
2061{
2062 object *ival = mappinglookup(c->c_locals, nameval);
2063 if (ival != NULL)
2064 return getintvalue(ival);
2065 return com_newlocal_o(c, nameval);
2066}
2067
2068static int
2069com_newlocal(c, name)
2070 struct compiling *c;
2071 char *name;
2072{
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00002073 object *nameval = PyString_InternFromString(name);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002074 int i;
2075 if (nameval == NULL) {
2076 c->c_errors++;
2077 return 0;
2078 }
2079 i = com_newlocal_o(c, nameval);
2080 DECREF(nameval);
2081 return i;
2082}
2083
Guido van Rossum8b993a91997-01-17 21:04:03 +00002084#ifdef SUPPORT_OBSOLETE_ACCESS
2085
Guido van Rossum25831651993-05-19 14:50:45 +00002086#define strequ(a, b) (strcmp((a), (b)) == 0)
2087
2088static void
2089com_access_stmt(c, n)
2090 struct compiling *c;
2091 node *n;
2092{
2093 int i, j, k, mode, imode;
2094 object *vmode;
2095 REQ(n, access_stmt);
2096 /* 'access' NAME (',' NAME)* ':' accesstype (',' accesstype)*
2097 accesstype: NAME+ */
2098
2099 /* Find where the colon is */
2100 i = 1;
2101 while (TYPE(CHILD(n,i-1)) != COLON)
2102 i += 1;
2103
2104 /* Calculate the mode mask */
2105 mode = 0;
2106 for (j = i; j < NCH(n); j += 2) {
Guido van Rossum81daa321993-05-20 14:24:46 +00002107 int r = 0, w = 0, p = 0;
2108 for (k = 0; k < NCH(CHILD(n,j)); k++) {
Guido van Rossum25831651993-05-19 14:50:45 +00002109 if (strequ(STR(CHILD(CHILD(n,j),k)), "public"))
2110 p = 0;
2111 else if (strequ(STR(CHILD(CHILD(n,j),k)), "protected"))
2112 p = 1;
2113 else if (strequ(STR(CHILD(CHILD(n,j),k)), "private"))
2114 p = 2;
2115 else if (strequ(STR(CHILD(CHILD(n,j),k)), "read"))
2116 r = 1;
2117 else if (strequ(STR(CHILD(CHILD(n,j),k)), "write"))
2118 w = 1;
2119 else /* XXX should make this an exception */
2120 fprintf(stderr, "bad access type %s\n",
2121 STR(CHILD(CHILD(n,j),k)));
2122 }
2123 if (r == 0 && w == 0)
Guido van Rossum81daa321993-05-20 14:24:46 +00002124 r = w = 1;
Guido van Rossum25831651993-05-19 14:50:45 +00002125 if (p == 0) {
2126 if (r == 1) mode |= AC_R_PUBLIC;
2127 if (w == 1) mode |= AC_W_PUBLIC;
2128 } else if (p == 1) {
2129 if (r == 1) mode |= AC_R_PROTECTED;
2130 if (w == 1) mode |= AC_W_PROTECTED;
2131 } else {
2132 if (r == 1) mode |= AC_R_PRIVATE;
2133 if (w == 1) mode |= AC_W_PRIVATE;
2134 }
2135 }
2136 vmode = newintobject((long)mode);
2137 imode = com_addconst(c, vmode);
2138 XDECREF(vmode);
2139 for (i = 1; TYPE(CHILD(n,i-1)) != COLON; i+=2) {
2140 com_addoparg(c, LOAD_CONST, imode);
2141 com_addopname(c, ACCESS_MODE, CHILD(n, i));
2142 }
2143}
Guido van Rossum0dfcf751996-08-12 22:00:53 +00002144#endif
Guido van Rossum25831651993-05-19 14:50:45 +00002145
Guido van Rossumc5e96291991-12-10 13:53:51 +00002146static void
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002147com_exec_stmt(c, n)
2148 struct compiling *c;
2149 node *n;
2150{
2151 REQ(n, exec_stmt);
2152 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2153 com_node(c, CHILD(n, 1));
2154 if (NCH(n) >= 4)
2155 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002156 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002157 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002158 com_push(c, 1);
2159 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002160 if (NCH(n) >= 6)
2161 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002162 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002163 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002164 com_push(c, 1);
2165 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002166 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002167 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002168}
2169
2170static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002171com_if_stmt(c, n)
2172 struct compiling *c;
2173 node *n;
2174{
2175 int i;
2176 int anchor = 0;
2177 REQ(n, if_stmt);
2178 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2179 for (i = 0; i+3 < NCH(n); i+=4) {
2180 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002181 node *ch = CHILD(n, i+1);
2182 if (i > 0)
2183 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002184 com_node(c, CHILD(n, i+1));
2185 com_addfwref(c, JUMP_IF_FALSE, &a);
2186 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002187 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002188 com_node(c, CHILD(n, i+3));
2189 com_addfwref(c, JUMP_FORWARD, &anchor);
2190 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002191 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002192 com_addbyte(c, POP_TOP);
2193 }
2194 if (i+2 < NCH(n))
2195 com_node(c, CHILD(n, i+2));
2196 com_backpatch(c, anchor);
2197}
2198
2199static void
2200com_while_stmt(c, n)
2201 struct compiling *c;
2202 node *n;
2203{
2204 int break_anchor = 0;
2205 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002206 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002207 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2208 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002209 block_push(c, SETUP_LOOP);
2210 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002211 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002212 com_node(c, CHILD(n, 1));
2213 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2214 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002215 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002216 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002217 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002218 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002219 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2220 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002221 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002222 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002223 com_addbyte(c, POP_TOP);
2224 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002225 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002226 if (NCH(n) > 4)
2227 com_node(c, CHILD(n, 6));
2228 com_backpatch(c, break_anchor);
2229}
2230
2231static void
2232com_for_stmt(c, n)
2233 struct compiling *c;
2234 node *n;
2235{
2236 object *v;
2237 int break_anchor = 0;
2238 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002239 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002240 REQ(n, for_stmt);
2241 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2242 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002243 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002244 com_node(c, CHILD(n, 3));
2245 v = newintobject(0L);
2246 if (v == NULL)
2247 c->c_errors++;
2248 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002249 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002250 XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002251 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002252 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002253 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002254 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002255 com_assign(c, CHILD(n, 1), OP_ASSIGN);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002256 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002257 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002258 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002259 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2260 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002261 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002262 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002263 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002264 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002265 if (NCH(n) > 8)
2266 com_node(c, CHILD(n, 8));
2267 com_backpatch(c, break_anchor);
2268}
2269
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002270/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002271
2272 SETUP_FINALLY L
2273 <code for S>
2274 POP_BLOCK
2275 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002276 L: <code for Sf>
2277 END_FINALLY
2278
2279 The special instructions use the block stack. Each block
2280 stack entry contains the instruction that created it (here
2281 SETUP_FINALLY), the level of the value stack at the time the
2282 block stack entry was created, and a label (here L).
2283
2284 SETUP_FINALLY:
2285 Pushes the current value stack level and the label
2286 onto the block stack.
2287 POP_BLOCK:
2288 Pops en entry from the block stack, and pops the value
2289 stack until its level is the same as indicated on the
2290 block stack. (The label is ignored.)
2291 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002292 Pops a variable number of entries from the *value* stack
2293 and re-raises the exception they specify. The number of
2294 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002295
2296 The block stack is unwound when an exception is raised:
2297 when a SETUP_FINALLY entry is found, the exception is pushed
2298 onto the value stack (and the exception condition is cleared),
2299 and the interpreter jumps to the label gotten from the block
2300 stack.
2301
2302 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002303 (The contents of the value stack is shown in [], with the top
2304 at the right; 'tb' is trace-back info, 'val' the exception's
2305 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002306
2307 Value stack Label Instruction Argument
2308 [] SETUP_EXCEPT L1
2309 [] <code for S>
2310 [] POP_BLOCK
2311 [] JUMP_FORWARD L0
2312
Guido van Rossum3f5da241990-12-20 15:06:42 +00002313 [tb, val, exc] L1: DUP )
2314 [tb, val, exc, exc] <evaluate E1> )
2315 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2316 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2317 [tb, val, exc, 1] POP )
2318 [tb, val, exc] POP
2319 [tb, val] <assign to V1> (or POP if no V1)
2320 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002321 [] <code for S1>
2322 JUMP_FORWARD L0
2323
Guido van Rossum3f5da241990-12-20 15:06:42 +00002324 [tb, val, exc, 0] L2: POP
2325 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002326 .............................etc.......................
2327
Guido van Rossum3f5da241990-12-20 15:06:42 +00002328 [tb, val, exc, 0] Ln+1: POP
2329 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002330
2331 [] L0: <next statement>
2332
2333 Of course, parts are not generated if Vi or Ei is not present.
2334*/
2335
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002336static void
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002337com_try_except(c, n)
2338 struct compiling *c;
2339 node *n;
2340{
2341 int except_anchor = 0;
2342 int end_anchor = 0;
2343 int else_anchor = 0;
2344 int i;
2345 node *ch;
2346
2347 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2348 block_push(c, SETUP_EXCEPT);
2349 com_node(c, CHILD(n, 2));
2350 com_addbyte(c, POP_BLOCK);
2351 block_pop(c, SETUP_EXCEPT);
2352 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2353 com_backpatch(c, except_anchor);
2354 for (i = 3;
2355 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2356 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002357 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002358 if (except_anchor == 0) {
Guido van Rossum452a9831996-09-17 14:32:04 +00002359 com_error(c, SyntaxError,
2360 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002361 break;
2362 }
2363 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002364 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002365 com_addoparg(c, SET_LINENO, ch->n_lineno);
2366 if (NCH(ch) > 1) {
2367 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002368 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002369 com_node(c, CHILD(ch, 1));
2370 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002371 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002372 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
2373 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002374 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002375 }
2376 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002377 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002378 if (NCH(ch) > 3)
Guido van Rossum8861b741996-07-30 16:49:37 +00002379 com_assign(c, CHILD(ch, 3), OP_ASSIGN);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002380 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002381 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002382 com_pop(c, 1);
2383 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002384 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002385 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002386 com_node(c, CHILD(n, i+2));
2387 com_addfwref(c, JUMP_FORWARD, &end_anchor);
2388 if (except_anchor) {
2389 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002390 /* We come in with [tb, val, exc, 0] on the
2391 stack; one pop and it's the same as
2392 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002393 com_addbyte(c, POP_TOP);
2394 }
2395 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002396 /* We actually come in here with [tb, val, exc] but the
2397 END_FINALLY will zap those and jump around.
2398 The c_stacklevel does not reflect them so we need not pop
2399 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002400 com_addbyte(c, END_FINALLY);
2401 com_backpatch(c, else_anchor);
2402 if (i < NCH(n))
2403 com_node(c, CHILD(n, i+2));
2404 com_backpatch(c, end_anchor);
2405}
2406
2407static void
2408com_try_finally(c, n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002409 struct compiling *c;
2410 node *n;
2411{
2412 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002413 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002414
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002415 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
2416 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002417 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002418 com_addbyte(c, POP_BLOCK);
2419 block_pop(c, SETUP_FINALLY);
2420 block_push(c, END_FINALLY);
2421 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002422 /* While the generated code pushes only one item,
2423 the try-finally handling can enter here with
2424 up to three items. OK, here are the details:
2425 3 for an exception, 2 for RETURN, 1 for BREAK. */
2426 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002427 com_backpatch(c, finally_anchor);
2428 ch = CHILD(n, NCH(n)-1);
2429 com_addoparg(c, SET_LINENO, ch->n_lineno);
2430 com_node(c, ch);
2431 com_addbyte(c, END_FINALLY);
2432 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002433 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002434}
2435
2436static void
2437com_try_stmt(c, n)
2438 struct compiling *c;
2439 node *n;
2440{
2441 REQ(n, try_stmt);
2442 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
2443 | 'try' ':' suite 'finally' ':' suite */
2444 if (TYPE(CHILD(n, 3)) != except_clause)
2445 com_try_finally(c, n);
2446 else
2447 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002448}
2449
Guido van Rossum8b993a91997-01-17 21:04:03 +00002450static node *
2451get_rawdocstring(n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002452 node *n;
2453{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002454 int i;
2455
Guido van Rossum8b993a91997-01-17 21:04:03 +00002456 /* Label to avoid tail recursion */
2457 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002458 switch (TYPE(n)) {
2459
2460 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002461 if (NCH(n) == 1) {
2462 n = CHILD(n, 0);
2463 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002464 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002465 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002466 case file_input:
2467 for (i = 0; i < NCH(n); i++) {
2468 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002469 if (TYPE(ch) == stmt) {
2470 n = ch;
2471 goto next;
2472 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002473 }
2474 break;
2475
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002476 case stmt:
2477 case simple_stmt:
2478 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002479 n = CHILD(n, 0);
2480 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002481
2482 case expr_stmt:
2483 case testlist:
2484 case test:
2485 case and_test:
2486 case not_test:
2487 case comparison:
2488 case expr:
2489 case xor_expr:
2490 case and_expr:
2491 case shift_expr:
2492 case arith_expr:
2493 case term:
2494 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00002495 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002496 if (NCH(n) == 1) {
2497 n = CHILD(n, 0);
2498 goto next;
2499 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002500 break;
2501
2502 case atom:
2503 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002504 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002505 break;
2506
2507 }
2508 return NULL;
2509}
2510
Guido van Rossum8b993a91997-01-17 21:04:03 +00002511static object *
2512get_docstring(n)
2513 node *n;
2514{
2515 n = get_rawdocstring(n);
2516 if (n == NULL)
2517 return NULL;
2518 return parsestrplus(n);
2519}
2520
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002521static void
2522com_suite(c, n)
2523 struct compiling *c;
2524 node *n;
2525{
2526 REQ(n, suite);
2527 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
2528 if (NCH(n) == 1) {
2529 com_node(c, CHILD(n, 0));
2530 }
2531 else {
2532 int i;
2533 for (i = 0; i < NCH(n); i++) {
2534 node *ch = CHILD(n, i);
2535 if (TYPE(ch) == stmt)
2536 com_node(c, ch);
2537 }
2538 }
2539}
2540
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002541/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002542static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002543com_continue_stmt(c, n)
2544 struct compiling *c;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002545 node *n; /* Not used, but passed for consistency */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002546{
2547 int i = c->c_nblocks;
2548 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
2549 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2550 }
2551 else {
Guido van Rossum452a9831996-09-17 14:32:04 +00002552 com_error(c, SyntaxError, "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002553 }
2554 /* XXX Could allow it inside a 'finally' clause
2555 XXX if we could pop the exception still on the stack */
2556}
2557
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002558static int
Guido van Rossum681d79a1995-07-18 14:51:37 +00002559com_argdefs(c, n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002560 struct compiling *c;
2561 node *n;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002562{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002563 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002564 if (TYPE(n) == lambdef) {
2565 /* lambdef: 'lambda' [varargslist] ':' test */
2566 n = CHILD(n, 1);
2567 }
2568 else {
2569 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
2570 n = CHILD(n, 2);
2571 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
2572 n = CHILD(n, 1);
2573 }
2574 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002575 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002576 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002577 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002578 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
2579 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002580 nargs = 0;
2581 ndefs = 0;
2582 for (i = 0; i < nch; i++) {
2583 int t;
Guido van Rossum50564e81996-01-12 01:13:16 +00002584 if (TYPE(CHILD(n, i)) == STAR || TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002585 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002586 nargs++;
2587 i++;
2588 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00002589 t = RPAR; /* Anything except EQUAL or COMMA */
2590 else
2591 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002592 if (t == EQUAL) {
2593 i++;
2594 ndefs++;
2595 com_node(c, CHILD(n, i));
2596 i++;
2597 if (i >= nch)
2598 break;
2599 t = TYPE(CHILD(n, i));
2600 }
2601 else {
2602 /* Treat "(a=1, b)" as "(a=1, b=None)" */
2603 if (ndefs) {
2604 com_addoparg(c, LOAD_CONST,
2605 com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002606 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002607 ndefs++;
2608 }
2609 }
2610 if (t != COMMA)
2611 break;
2612 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002613 return ndefs;
2614}
2615
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002616static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002617com_funcdef(c, n)
2618 struct compiling *c;
2619 node *n;
2620{
2621 object *v;
2622 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00002623 v = (object *)icompile(n, c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002624 if (v == NULL)
2625 c->c_errors++;
2626 else {
2627 int i = com_addconst(c, v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002628 int ndefs = com_argdefs(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002629 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002630 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002631 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002632 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002633 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002634 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002635 DECREF(v);
2636 }
2637}
2638
2639static void
Guido van Rossum25831651993-05-19 14:50:45 +00002640com_bases(c, n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002641 struct compiling *c;
2642 node *n;
2643{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002644 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002645 REQ(n, testlist);
2646 /* testlist: test (',' test)* [','] */
2647 for (i = 0; i < NCH(n); i += 2)
2648 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002649 i = (NCH(n)+1) / 2;
2650 com_addoparg(c, BUILD_TUPLE, i);
2651 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00002652}
2653
2654static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002655com_classdef(c, n)
2656 struct compiling *c;
2657 node *n;
2658{
Guido van Rossum25831651993-05-19 14:50:45 +00002659 int i;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002660 object *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002661 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00002662 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00002663 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00002664 c->c_errors++;
2665 return;
2666 }
2667 /* Push the class name on the stack */
2668 i = com_addconst(c, v);
2669 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002670 com_push(c, 1);
Guido van Rossum25831651993-05-19 14:50:45 +00002671 DECREF(v);
2672 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002673 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00002674 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002675 com_push(c, 1);
2676 }
Guido van Rossum25831651993-05-19 14:50:45 +00002677 else
2678 com_bases(c, CHILD(n, 3));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00002679 v = (object *)icompile(n, c);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002680 if (v == NULL)
2681 c->c_errors++;
2682 else {
Guido van Rossum25831651993-05-19 14:50:45 +00002683 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002684 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002685 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002686 com_addoparg(c, MAKE_FUNCTION, 0);
2687 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002688 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002689 com_pop(c, 2);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002690 com_addopname(c, STORE_NAME, CHILD(n, 1));
2691 DECREF(v);
2692 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002693}
2694
2695static void
2696com_node(c, n)
2697 struct compiling *c;
2698 node *n;
2699{
2700 switch (TYPE(n)) {
2701
2702 /* Definition nodes */
2703
2704 case funcdef:
2705 com_funcdef(c, n);
2706 break;
2707 case classdef:
2708 com_classdef(c, n);
2709 break;
2710
2711 /* Trivial parse tree nodes */
2712
2713 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002714 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002715 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002716 com_node(c, CHILD(n, 0));
2717 break;
2718
2719 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002720 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
2721 com_addoparg(c, SET_LINENO, n->n_lineno);
2722 {
2723 int i;
2724 for (i = 0; i < NCH(n)-1; i += 2)
2725 com_node(c, CHILD(n, i));
2726 }
2727 break;
2728
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002729 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002730 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002731 com_node(c, CHILD(n, 0));
2732 break;
2733
2734 /* Statement nodes */
2735
2736 case expr_stmt:
2737 com_expr_stmt(c, n);
2738 break;
2739 case print_stmt:
2740 com_print_stmt(c, n);
2741 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002742 case del_stmt: /* 'del' exprlist */
Guido van Rossum8861b741996-07-30 16:49:37 +00002743 com_assign(c, CHILD(n, 1), OP_DELETE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002744 break;
2745 case pass_stmt:
2746 break;
2747 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002748 if (c->c_loops == 0) {
Guido van Rossum452a9831996-09-17 14:32:04 +00002749 com_error(c, SyntaxError, "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002750 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002751 com_addbyte(c, BREAK_LOOP);
2752 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002753 case continue_stmt:
2754 com_continue_stmt(c, n);
2755 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002756 case return_stmt:
2757 com_return_stmt(c, n);
2758 break;
2759 case raise_stmt:
2760 com_raise_stmt(c, n);
2761 break;
2762 case import_stmt:
2763 com_import_stmt(c, n);
2764 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002765 case global_stmt:
2766 com_global_stmt(c, n);
2767 break;
Guido van Rossum0dfcf751996-08-12 22:00:53 +00002768#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum25831651993-05-19 14:50:45 +00002769 case access_stmt:
2770 com_access_stmt(c, n);
2771 break;
Guido van Rossum0dfcf751996-08-12 22:00:53 +00002772#endif
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002773 case exec_stmt:
2774 com_exec_stmt(c, n);
2775 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002776 case if_stmt:
2777 com_if_stmt(c, n);
2778 break;
2779 case while_stmt:
2780 com_while_stmt(c, n);
2781 break;
2782 case for_stmt:
2783 com_for_stmt(c, n);
2784 break;
2785 case try_stmt:
2786 com_try_stmt(c, n);
2787 break;
2788 case suite:
2789 com_suite(c, n);
2790 break;
2791
2792 /* Expression nodes */
2793
2794 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002795 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002796 break;
2797 case test:
2798 com_test(c, n);
2799 break;
2800 case and_test:
2801 com_and_test(c, n);
2802 break;
2803 case not_test:
2804 com_not_test(c, n);
2805 break;
2806 case comparison:
2807 com_comparison(c, n);
2808 break;
2809 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002810 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002811 break;
2812 case expr:
2813 com_expr(c, n);
2814 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002815 case xor_expr:
2816 com_xor_expr(c, n);
2817 break;
2818 case and_expr:
2819 com_and_expr(c, n);
2820 break;
2821 case shift_expr:
2822 com_shift_expr(c, n);
2823 break;
2824 case arith_expr:
2825 com_arith_expr(c, n);
2826 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002827 case term:
2828 com_term(c, n);
2829 break;
2830 case factor:
2831 com_factor(c, n);
2832 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00002833 case power:
2834 com_power(c, n);
2835 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002836 case atom:
2837 com_atom(c, n);
2838 break;
2839
2840 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002841 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum452a9831996-09-17 14:32:04 +00002842 com_error(c, SystemError, "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002843 }
2844}
2845
2846static void com_fplist PROTO((struct compiling *, node *));
2847
2848static void
2849com_fpdef(c, n)
2850 struct compiling *c;
2851 node *n;
2852{
2853 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
2854 if (TYPE(CHILD(n, 0)) == LPAR)
2855 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002856 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002857 com_addoparg(c, STORE_FAST, com_newlocal(c, STR(CHILD(n, 0))));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002858 com_pop(c, 1);
2859 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002860}
2861
2862static void
2863com_fplist(c, n)
2864 struct compiling *c;
2865 node *n;
2866{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00002867 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002868 if (NCH(n) == 1) {
2869 com_fpdef(c, CHILD(n, 0));
2870 }
2871 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002872 int i = (NCH(n)+1)/2;
2873 com_addoparg(c, UNPACK_TUPLE, i);
2874 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002875 for (i = 0; i < NCH(n); i += 2)
2876 com_fpdef(c, CHILD(n, i));
2877 }
2878}
2879
2880static void
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002881com_arglist(c, n)
2882 struct compiling *c;
2883 node *n;
2884{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002885 int nch, i;
2886 int complex = 0;
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002887 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00002888 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002889 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002890 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002891 /* Enter all arguments in table of locals */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002892 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002893 node *ch = CHILD(n, i);
2894 node *fp;
2895 char *name;
Guido van Rossum50564e81996-01-12 01:13:16 +00002896 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002897 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002898 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
2899 fp = CHILD(ch, 0);
2900 if (TYPE(fp) == NAME)
2901 name = STR(fp);
2902 else {
2903 name = "";
Guido van Rossum530956d1996-07-21 02:27:43 +00002904 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002905 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002906 com_newlocal(c, name);
2907 c->c_argcount++;
2908 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002909 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002910 ch = CHILD(n, i);
2911 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002912 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002913 else
2914 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002915 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002916 /* Handle *arguments */
2917 if (i < nch) {
2918 node *ch;
2919 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00002920 if (TYPE(ch) != DOUBLESTAR) {
2921 REQ(ch, STAR);
2922 ch = CHILD(n, i+1);
2923 if (TYPE(ch) == NAME) {
2924 c->c_flags |= CO_VARARGS;
2925 i += 3;
2926 com_newlocal(c, STR(ch));
2927 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002928 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002929 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002930 /* Handle **keywords */
2931 if (i < nch) {
2932 node *ch;
2933 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00002934 if (TYPE(ch) != DOUBLESTAR) {
2935 REQ(ch, STAR);
2936 ch = CHILD(n, i+1);
2937 REQ(ch, STAR);
2938 ch = CHILD(n, i+2);
2939 }
2940 else
2941 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002942 REQ(ch, NAME);
2943 c->c_flags |= CO_VARKEYWORDS;
2944 com_newlocal(c, STR(ch));
2945 }
2946 if (complex) {
2947 /* Generate code for complex arguments only after
2948 having counted the simple arguments */
2949 int ilocal = 0;
2950 for (i = 0; i < nch; i++) {
2951 node *ch = CHILD(n, i);
2952 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00002953 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002954 break;
2955 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
2956 fp = CHILD(ch, 0);
2957 if (TYPE(fp) != NAME) {
2958 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002959 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002960 com_fpdef(c, ch);
2961 }
2962 ilocal++;
2963 if (++i >= nch)
2964 break;
2965 ch = CHILD(n, i);
2966 if (TYPE(ch) == EQUAL)
2967 i += 2;
2968 else
2969 REQ(ch, COMMA);
2970 }
2971 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002972}
2973
2974static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002975com_file_input(c, n)
2976 struct compiling *c;
2977 node *n;
2978{
2979 int i;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002980 object *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002981 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002982 doc = get_docstring(n);
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 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002991 for (i = 0; i < NCH(n); i++) {
2992 node *ch = CHILD(n, i);
2993 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
2994 com_node(c, ch);
2995 }
2996}
2997
2998/* Top-level compile-node interface */
2999
3000static void
3001compile_funcdef(c, n)
3002 struct compiling *c;
3003 node *n;
3004{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003005 object *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003006 node *ch;
3007 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003008 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003009 doc = get_docstring(CHILD(n, 4));
3010 if (doc != NULL) {
3011 (void) com_addconst(c, doc);
3012 DECREF(doc);
3013 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003014 else
3015 (void) com_addconst(c, None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003016 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3017 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003018 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003019 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003020 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003021 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003022 c->c_infunction = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003023 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003024 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003025 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003026 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003027}
3028
3029static void
Guido van Rossum590baa41993-11-30 13:40:46 +00003030compile_lambdef(c, n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003031 struct compiling *c;
3032 node *n;
3033{
Guido van Rossum590baa41993-11-30 13:40:46 +00003034 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003035 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003036 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003037
3038 ch = CHILD(n, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003039 (void) com_addconst(c, None); /* No docstring */
3040 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003041 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003042 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003043 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003044 else
3045 ch = CHILD(n, 2);
3046 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003047 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003048 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003049}
3050
3051static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003052compile_classdef(c, n)
3053 struct compiling *c;
3054 node *n;
3055{
3056 node *ch;
3057 object *doc;
3058 REQ(n, classdef);
3059 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3060 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003061#ifdef PRIVATE_NAME_MANGLING
3062 c->c_private = c->c_name;
3063#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003064 ch = CHILD(n, NCH(n)-1); /* The suite */
3065 doc = get_docstring(ch);
3066 if (doc != NULL) {
3067 int i = com_addconst(c, doc);
3068 DECREF(doc);
3069 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003070 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003071 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003072 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003073 }
3074 else
3075 (void) com_addconst(c, None);
3076 com_node(c, ch);
3077 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003078 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003079 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003080 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003081}
3082
3083static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003084compile_node(c, n)
3085 struct compiling *c;
3086 node *n;
3087{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003088 com_addoparg(c, SET_LINENO, n->n_lineno);
3089
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003090 switch (TYPE(n)) {
3091
Guido van Rossum4c417781991-01-21 16:09:22 +00003092 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003093 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003094 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003095 n = CHILD(n, 0);
3096 if (TYPE(n) != NEWLINE)
3097 com_node(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003098 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003099 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003100 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003101 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003102 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003103 break;
3104
Guido van Rossum4c417781991-01-21 16:09:22 +00003105 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003106 com_file_input(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003107 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003108 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003109 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003110 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003111 break;
3112
Guido van Rossum590baa41993-11-30 13:40:46 +00003113 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003114 com_node(c, CHILD(n, 0));
3115 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003116 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003117 break;
3118
Guido van Rossum590baa41993-11-30 13:40:46 +00003119 case lambdef: /* anonymous function definition */
3120 compile_lambdef(c, n);
3121 break;
3122
Guido van Rossum4c417781991-01-21 16:09:22 +00003123 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003124 compile_funcdef(c, n);
3125 break;
3126
Guido van Rossum4c417781991-01-21 16:09:22 +00003127 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003128 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003129 break;
3130
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003131 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003132 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum452a9831996-09-17 14:32:04 +00003133 com_error(c, SystemError,
3134 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003135 }
3136}
3137
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003138/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00003139
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003140 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
3141 instructions that refer to local variables with LOAD_FAST etc.
3142 The latter instructions are much faster because they don't need to
3143 look up the variable name in a dictionary.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003144
Guido van Rossum681d79a1995-07-18 14:51:37 +00003145 To find all local variables, we check all STORE_NAME, IMPORT_FROM
3146 and DELETE_NAME instructions. This yields all local variables,
3147 function definitions, class definitions and import statements.
3148 Argument names have already been entered into the list by the
3149 special processing for the argument list.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003150
3151 All remaining LOAD_NAME instructions must refer to non-local (global
3152 or builtin) variables, so are replaced by LOAD_GLOBAL.
3153
3154 There are two problems: 'from foo import *' and 'exec' may introduce
3155 local variables that we can't know while compiling. If this is the
Guido van Rossum681d79a1995-07-18 14:51:37 +00003156 case, we can still optimize bona fide locals (since those
3157 statements will be surrounded by fast_2_locals() and
3158 locals_2_fast()), but we can't change LOAD_NAME to LOAD_GLOBAL.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003159
Guido van Rossum681d79a1995-07-18 14:51:37 +00003160 NB: this modifies the string object c->c_code! */
Guido van Rossum282914b1991-04-04 10:42:56 +00003161
3162static void
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003163optimize(c)
3164 struct compiling *c;
Guido van Rossum282914b1991-04-04 10:42:56 +00003165{
Guido van Rossum0a697f61991-04-16 08:39:12 +00003166 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00003167 int opcode;
Guido van Rossum80bb9651996-12-05 23:27:02 +00003168 int oparg = 0;
Guido van Rossum282914b1991-04-04 10:42:56 +00003169 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003170 object *error_type, *error_value, *error_traceback;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003171
Guido van Rossum282914b1991-04-04 10:42:56 +00003172#define NEXTOP() (*next_instr++)
3173#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
3174#define GETITEM(v, i) (getlistitem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003175#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
3176
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003177 err_fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003178
3179 c->c_flags |= CO_OPTIMIZED;
Guido van Rossum282914b1991-04-04 10:42:56 +00003180
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003181 next_instr = (unsigned char *) getstringvalue(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003182 for (;;) {
3183 opcode = NEXTOP();
3184 if (opcode == STOP_CODE)
3185 break;
3186 if (HAS_ARG(opcode))
3187 oparg = NEXTARG();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003188 switch (opcode) {
3189 case STORE_NAME:
3190 case DELETE_NAME:
3191 case IMPORT_FROM:
3192 com_addlocal_o(c, GETNAMEOBJ(oparg));
3193 break;
3194 case EXEC_STMT:
3195 c->c_flags &= ~CO_OPTIMIZED;
3196 break;
Guido van Rossum282914b1991-04-04 10:42:56 +00003197 }
3198 }
3199
Guido van Rossum681d79a1995-07-18 14:51:37 +00003200 if (dictlookup(c->c_locals, "*") != NULL)
3201 c->c_flags &= ~CO_OPTIMIZED;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003202
3203 next_instr = (unsigned char *) getstringvalue(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003204 for (;;) {
3205 cur_instr = next_instr;
3206 opcode = NEXTOP();
3207 if (opcode == STOP_CODE)
3208 break;
3209 if (HAS_ARG(opcode))
3210 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003211 if (opcode == LOAD_NAME ||
3212 opcode == STORE_NAME ||
3213 opcode == DELETE_NAME) {
3214 object *v;
3215 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00003216 name = GETNAMEOBJ(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003217 v = dict2lookup(c->c_locals, name);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003218 if (v == NULL) {
Guido van Rossum83163251991-08-16 08:58:43 +00003219 err_clear();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003220 if (opcode == LOAD_NAME &&
3221 (c->c_flags&CO_OPTIMIZED))
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003222 cur_instr[0] = LOAD_GLOBAL;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003223 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00003224 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003225 i = getintvalue(v);
3226 switch (opcode) {
3227 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
3228 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
3229 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
3230 }
3231 cur_instr[1] = i & 0xff;
3232 cur_instr[2] = (i>>8) & 0xff;
Guido van Rossum282914b1991-04-04 10:42:56 +00003233 }
3234 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003235
Guido van Rossum681d79a1995-07-18 14:51:37 +00003236 if (c->c_errors == 0)
3237 err_restore(error_type, error_value, error_traceback);
Guido van Rossum282914b1991-04-04 10:42:56 +00003238}
3239
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003240codeobject *
Guido van Rossum590baa41993-11-30 13:40:46 +00003241compile(n, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003242 node *n;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003243 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003244{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003245 return jcompile(n, filename, NULL);
3246}
3247
3248static codeobject *
3249icompile(n, base)
3250 node *n;
3251 struct compiling *base;
3252{
3253 return jcompile(n, base->c_filename, base);
3254}
3255
3256static codeobject *
3257jcompile(n, filename, base)
3258 node *n;
3259 char *filename;
3260 struct compiling *base;
3261{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003262 struct compiling sc;
3263 codeobject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003264 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003265 return NULL;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003266#ifdef PRIVATE_NAME_MANGLING
3267 if (base)
3268 sc.c_private = base->c_private;
3269 else
3270 sc.c_private = NULL;
3271#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003272 compile_node(&sc, n);
3273 com_done(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003274 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003275 optimize(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003276 sc.c_flags |= CO_NEWLOCALS;
3277 }
3278 else if (TYPE(n) == classdef)
3279 sc.c_flags |= CO_NEWLOCALS;
Guido van Rossum9bfef441993-03-29 10:43:31 +00003280 co = NULL;
3281 if (sc.c_errors == 0) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003282 object *consts, *names, *varnames, *filename, *name;
3283 consts = listtuple(sc.c_consts);
3284 names = listtuple(sc.c_names);
3285 varnames = listtuple(sc.c_varnames);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003286 filename = PyString_InternFromString(sc.c_filename);
3287 name = PyString_InternFromString(sc.c_name);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003288 if (!err_occurred())
3289 co = newcodeobject(sc.c_argcount,
3290 sc.c_nlocals,
Guido van Rossum8b993a91997-01-17 21:04:03 +00003291 sc.c_maxstacklevel,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003292 sc.c_flags,
3293 sc.c_code,
3294 consts,
3295 names,
3296 varnames,
3297 filename,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003298 name,
3299 sc.c_firstlineno,
3300 sc.c_lnotab);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003301 XDECREF(consts);
3302 XDECREF(names);
3303 XDECREF(varnames);
3304 XDECREF(filename);
3305 XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003306 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003307 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003308 return co;
3309}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003310
3311int
3312PyCode_Addr2Line(co, addrq)
3313 PyCodeObject *co;
3314 int addrq;
3315{
3316 int size = PyString_Size(co->co_lnotab) / 2;
3317 char *p = PyString_AsString(co->co_lnotab);
3318 int line = co->co_firstlineno;
3319 int addr = 0;
3320 while (--size >= 0) {
3321 addr += *p++;
3322 if (addr > addrq)
3323 break;
3324 line += *p++;
3325 }
3326 return line;
3327}