blob: 21629abd9cc8e5bb0268f79503817d9cd112e705 [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 Rossum8e793d91997-03-03 19:13:14 +000062int Py_OptimizeFlag = 0;
63
Guido van Rossum8861b741996-07-30 16:49:37 +000064#define OP_DELETE 0
65#define OP_ASSIGN 1
66#define OP_APPLY 2
67
Guido van Rossum3f5da241990-12-20 15:06:42 +000068#define OFF(x) offsetof(codeobject, x)
69
70static struct memberlist code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000071 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
72 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000073 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000074 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000075 {"co_code", T_OBJECT, OFF(co_code), READONLY},
76 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
77 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000078 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000079 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000080 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000081 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
82 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000083 {NULL} /* Sentinel */
84};
85
86static object *
87code_getattr(co, name)
88 codeobject *co;
89 char *name;
90{
91 return getmember((char *)co, code_memberlist, name);
92}
Guido van Rossum10dc2e81990-11-18 17:27:39 +000093
94static void
Guido van Rossum3f5da241990-12-20 15:06:42 +000095code_dealloc(co)
96 codeobject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +000097{
Guido van Rossum3f5da241990-12-20 15:06:42 +000098 XDECREF(co->co_code);
99 XDECREF(co->co_consts);
100 XDECREF(co->co_names);
101 XDECREF(co->co_filename);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000102 XDECREF(co->co_name);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000103 XDECREF(co->co_varnames);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000104 DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000105}
106
Guido van Rossum2dff9911992-09-03 20:50:59 +0000107static object *
108code_repr(co)
109 codeobject *co;
110{
111 char buf[500];
112 int lineno = -1;
113 char *p = GETSTRINGVALUE(co->co_code);
114 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000115 char *name = "???";
Guido van Rossum2dff9911992-09-03 20:50:59 +0000116 if (*p == SET_LINENO)
117 lineno = (p[1] & 0xff) | ((p[2] & 0xff) << 8);
118 if (co->co_filename && is_stringobject(co->co_filename))
119 filename = getstringvalue(co->co_filename);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000120 if (co->co_name && is_stringobject(co->co_name))
121 name = getstringvalue(co->co_name);
122 sprintf(buf, "<code object %.100s at %lx, file \"%.300s\", line %d>",
123 name, (long)co, filename, lineno);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000124 return newstringobject(buf);
125}
126
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000127static int
128code_compare(co, cp)
129 codeobject *co, *cp;
130{
131 int cmp;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000132 cmp = cp->co_argcount - cp->co_argcount;
133 if (cmp) return cmp;
134 cmp = cp->co_nlocals - cp->co_nlocals;
135 if (cmp) return cmp;
136 cmp = cp->co_flags - cp->co_flags;
137 if (cmp) return cmp;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000138 cmp = cmpobject((object *)co->co_code, (object *)cp->co_code);
139 if (cmp) return cmp;
140 cmp = cmpobject(co->co_consts, cp->co_consts);
141 if (cmp) return cmp;
142 cmp = cmpobject(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000143 if (cmp) return cmp;
144 cmp = cmpobject(co->co_varnames, cp->co_varnames);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000145 return cmp;
146}
147
148static long
149code_hash(co)
150 codeobject *co;
151{
Guido van Rossum681d79a1995-07-18 14:51:37 +0000152 long h, h1, h2, h3, h4;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000153 h1 = hashobject((object *)co->co_code);
154 if (h1 == -1) return -1;
155 h2 = hashobject(co->co_consts);
156 if (h2 == -1) return -1;
157 h3 = hashobject(co->co_names);
158 if (h3 == -1) return -1;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000159 h4 = hashobject(co->co_varnames);
160 if (h4 == -1) return -1;
161 h = h1 ^ h2 ^ h3 ^ h4 ^
162 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000163 if (h == -1) h = -2;
164 return h;
165}
166
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000167typeobject Codetype = {
168 OB_HEAD_INIT(&Typetype)
169 0,
170 "code",
171 sizeof(codeobject),
172 0,
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000173 (destructor)code_dealloc, /*tp_dealloc*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000174 0, /*tp_print*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000175 (getattrfunc)code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000176 0, /*tp_setattr*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000177 (cmpfunc)code_compare, /*tp_compare*/
178 (reprfunc)code_repr, /*tp_repr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000179 0, /*tp_as_number*/
180 0, /*tp_as_sequence*/
181 0, /*tp_as_mapping*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000182 (hashfunc)code_hash, /*tp_hash*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000183};
184
Guido van Rossum644a12b1997-04-09 19:24:53 +0000185#define NAME_CHARS \
186 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
187
Guido van Rossuma082ce41991-06-04 19:41:56 +0000188codeobject *
Guido van Rossum8b993a91997-01-17 21:04:03 +0000189newcodeobject(argcount, nlocals, stacksize, flags,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000190 code, consts, names, varnames, filename, name,
191 firstlineno, lnotab)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000192 int argcount;
193 int nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000194 int stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000195 int flags;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000196 object *code;
197 object *consts;
198 object *names;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000199 object *varnames;
Guido van Rossuma082ce41991-06-04 19:41:56 +0000200 object *filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000201 object *name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000202 int firstlineno;
203 object *lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000204{
205 codeobject *co;
206 int i;
207 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000208 if (argcount < 0 || nlocals < 0 ||
209 code == NULL || !is_stringobject(code) ||
210 consts == NULL || !is_tupleobject(consts) ||
211 names == NULL || !is_tupleobject(names) ||
212 varnames == NULL || !is_tupleobject(varnames) ||
213 name == NULL || !is_stringobject(name) ||
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000214 filename == NULL || !is_stringobject(filename) ||
215 lnotab == NULL || !is_stringobject(lnotab)) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000216 err_badcall();
217 return NULL;
218 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000219 /* Make sure names and varnames are all strings, & intern them */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000220 for (i = gettuplesize(names); --i >= 0; ) {
221 object *v = gettupleitem(names, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000222 if (v == NULL || !is_stringobject(v)) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000223 err_badcall();
224 return NULL;
225 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000226 PyString_InternInPlace(&PyTuple_GET_ITEM(names, i));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000227 }
228 for (i = gettuplesize(varnames); --i >= 0; ) {
229 object *v = gettupleitem(varnames, i);
230 if (v == NULL || !is_stringobject(v)) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000231 err_badcall();
232 return NULL;
233 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000234 PyString_InternInPlace(&PyTuple_GET_ITEM(varnames, i));
235 }
236 /* Intern selected string constants */
237 for (i = gettuplesize(consts); --i >= 0; ) {
238 object *v = gettupleitem(consts, i);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000239 char *p;
240 if (!is_stringobject(v))
241 continue;
242 p = getstringvalue(v);
Guido van Rossum644a12b1997-04-09 19:24:53 +0000243 if ((int)strspn(p, NAME_CHARS)
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000244 != getstringsize(v))
245 continue;
246 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000247 }
248 co = NEWOBJ(codeobject, &Codetype);
249 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000250 co->co_argcount = argcount;
251 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000252 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000253 co->co_flags = flags;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000254 INCREF(code);
255 co->co_code = (stringobject *)code;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000256 INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000257 co->co_consts = consts;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000258 INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000259 co->co_names = names;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000260 INCREF(varnames);
261 co->co_varnames = varnames;
Guido van Rossuma082ce41991-06-04 19:41:56 +0000262 INCREF(filename);
263 co->co_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000264 INCREF(name);
265 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000266 co->co_firstlineno = firstlineno;
267 INCREF(lnotab);
268 co->co_lnotab = lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000269 }
270 return co;
271}
272
273
274/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000275
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000276struct compiling {
277 object *c_code; /* string */
278 object *c_consts; /* list of objects */
279 object *c_names; /* list of strings (names) */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000280 object *c_globals; /* dictionary (value=None) */
281 object *c_locals; /* dictionary (value=localID) */
282 object *c_varnames; /* list (inverse of c_locals) */
283 int c_nlocals; /* index of next local */
284 int c_argcount; /* number of top-level arguments */
285 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000286 int c_nexti; /* index into c_code */
287 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000288 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000289 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000290 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000291 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000292 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000293 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000294 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000295 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000296 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000297 int c_stacklevel; /* Current stack level */
298 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000299 int c_firstlineno;
300 object *c_lnotab; /* Table mapping address to line number */
301 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000302#ifdef PRIVATE_NAME_MANGLING
303 char *c_private; /* for private name mangling */
304#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000305};
306
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000307
Guido van Rossum452a9831996-09-17 14:32:04 +0000308/* Error message including line number */
309
310static void
311com_error(c, exc, msg)
312 struct compiling *c;
313 object *exc;
314 char *msg;
315{
316 int n = strlen(msg);
317 object *v;
318 char buffer[30];
319 char *s;
Guido van Rossum635abd21997-01-06 22:56:52 +0000320 c->c_errors++;
Guido van Rossum452a9831996-09-17 14:32:04 +0000321 if (c->c_lineno <= 1) {
322 /* Unknown line number or single interactive command */
323 err_setstr(exc, msg);
324 return;
325 }
326 sprintf(buffer, " (line %d)", c->c_lineno);
327 v = newsizedstringobject((char *)NULL, n + strlen(buffer));
328 if (v == NULL)
329 return; /* MemoryError, too bad */
330 s = GETSTRINGVALUE((stringobject *)v);
331 strcpy(s, msg);
332 strcat(s, buffer);
333 err_setval(exc, v);
334 DECREF(v);
Guido van Rossum452a9831996-09-17 14:32:04 +0000335}
336
337
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000338/* Interface to the block stack */
339
340static void
341block_push(c, type)
342 struct compiling *c;
343 int type;
344{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000345 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum452a9831996-09-17 14:32:04 +0000346 com_error(c, SystemError, "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000347 }
348 else {
349 c->c_block[c->c_nblocks++] = type;
350 }
351}
352
353static void
354block_pop(c, type)
355 struct compiling *c;
356 int type;
357{
358 if (c->c_nblocks > 0)
359 c->c_nblocks--;
360 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum452a9831996-09-17 14:32:04 +0000361 com_error(c, SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000362 }
363}
364
365
Guido van Rossum681d79a1995-07-18 14:51:37 +0000366/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000367
Guido van Rossum590baa41993-11-30 13:40:46 +0000368static int com_init PROTO((struct compiling *, char *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000369static void com_free PROTO((struct compiling *));
Guido van Rossum8b993a91997-01-17 21:04:03 +0000370static void com_push PROTO((struct compiling *, int));
371static void com_pop PROTO((struct compiling *, int));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000372static void com_done PROTO((struct compiling *));
373static void com_node PROTO((struct compiling *, struct _node *));
Guido van Rossum50564e81996-01-12 01:13:16 +0000374static void com_factor PROTO((struct compiling *, struct _node *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000375static void com_addbyte PROTO((struct compiling *, int));
376static void com_addint PROTO((struct compiling *, int));
377static void com_addoparg PROTO((struct compiling *, int, int));
378static void com_addfwref PROTO((struct compiling *, int, int *));
379static void com_backpatch PROTO((struct compiling *, int));
380static int com_add PROTO((struct compiling *, object *, object *));
381static int com_addconst PROTO((struct compiling *, object *));
382static int com_addname PROTO((struct compiling *, object *));
383static void com_addopname PROTO((struct compiling *, int, node *));
Guido van Rossum288a60f1991-12-16 13:05:10 +0000384static void com_list PROTO((struct compiling *, node *, int));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000385static int com_argdefs PROTO((struct compiling *, node *));
386static int com_newlocal PROTO((struct compiling *, char *));
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000387static codeobject *icompile PROTO((struct _node *, struct compiling *));
388static codeobject *jcompile PROTO((struct _node *, char *, struct compiling *));
Guido van Rossum6af0c001997-03-11 21:25:55 +0000389static object *parsestrplus PROTO((node *));
390static object *parsestr PROTO((char *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000391
392static int
Guido van Rossum590baa41993-11-30 13:40:46 +0000393com_init(c, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000394 struct compiling *c;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000395 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000396{
Guido van Rossum62d46241991-04-03 19:00:23 +0000397 if ((c->c_code = newsizedstringobject((char *)NULL, 1000)) == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000398 goto fail_3;
399 if ((c->c_consts = newlistobject(0)) == NULL)
400 goto fail_2;
401 if ((c->c_names = newlistobject(0)) == NULL)
402 goto fail_1;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000403 if ((c->c_globals = newdictobject()) == NULL)
404 goto fail_0;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000405 if ((c->c_locals = newdictobject()) == NULL)
406 goto fail_00;
407 if ((c->c_varnames = newlistobject(0)) == NULL)
408 goto fail_000;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000409 if ((c->c_lnotab = newsizedstringobject((char *)NULL, 1000)) == NULL)
410 goto fail_0000;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000411 c->c_nlocals = 0;
412 c->c_argcount = 0;
413 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000414 c->c_nexti = 0;
415 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000416 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000417 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000418 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000419 c->c_begin = 0;
420 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000421 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000422 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000423 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000424 c->c_stacklevel = 0;
425 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000426 c->c_firstlineno = 0;
427 c->c_last_addr = 0;
428 c->c_last_line = 0;
429 c-> c_lnotab_next = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000430 return 1;
431
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000432 fail_0000:
433 DECREF(c->c_lnotab);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000434 fail_000:
435 DECREF(c->c_locals);
436 fail_00:
437 DECREF(c->c_globals);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000438 fail_0:
439 DECREF(c->c_names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000440 fail_1:
441 DECREF(c->c_consts);
442 fail_2:
443 DECREF(c->c_code);
444 fail_3:
445 return 0;
446}
447
448static void
449com_free(c)
450 struct compiling *c;
451{
452 XDECREF(c->c_code);
453 XDECREF(c->c_consts);
454 XDECREF(c->c_names);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000455 XDECREF(c->c_globals);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000456 XDECREF(c->c_locals);
457 XDECREF(c->c_varnames);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000458 XDECREF(c->c_lnotab);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000459}
460
461static void
Guido van Rossum8b993a91997-01-17 21:04:03 +0000462com_push(c, n)
463 struct compiling *c;
464 int n;
465{
466 c->c_stacklevel += n;
467 if (c->c_stacklevel > c->c_maxstacklevel)
468 c->c_maxstacklevel = c->c_stacklevel;
469}
470
471static void
472com_pop(c, n)
473 struct compiling *c;
474 int n;
475{
476 if (c->c_stacklevel < n) {
477 fprintf(stderr,
478 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
479 c->c_filename, c->c_lineno,
480 c->c_nexti, c->c_stacklevel, n);
481 c->c_stacklevel = 0;
482 }
483 else
484 c->c_stacklevel -= n;
485}
486
487static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000488com_done(c)
489 struct compiling *c;
490{
491 if (c->c_code != NULL)
492 resizestring(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000493 if (c->c_lnotab != NULL)
494 resizestring(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000495}
496
497static void
498com_addbyte(c, byte)
499 struct compiling *c;
500 int byte;
501{
502 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000503 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000504 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000505 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000506 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000507 fatal("com_addbyte: byte out of range");
Guido van Rossum01cfd441991-10-20 20:12:38 +0000508 */
Guido van Rossum452a9831996-09-17 14:32:04 +0000509 com_error(c, SystemError, "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000510 }
511 if (c->c_code == NULL)
512 return;
513 len = getstringsize(c->c_code);
514 if (c->c_nexti >= len) {
515 if (resizestring(&c->c_code, len+1000) != 0) {
516 c->c_errors++;
517 return;
518 }
519 }
520 getstringvalue(c->c_code)[c->c_nexti++] = byte;
521}
522
523static void
524com_addint(c, x)
525 struct compiling *c;
526 int x;
527{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000528 com_addbyte(c, x & 0xff);
529 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000530}
531
532static void
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000533com_add_lnotab(c, addr, line)
534 struct compiling *c;
535 int addr;
536 int line;
537{
538 int size;
539 char *p;
540 if (c->c_lnotab == NULL)
541 return;
542 size = getstringsize(c->c_lnotab);
543 if (c->c_lnotab_next+2 > size) {
544 if (resizestring(&c->c_lnotab, size + 1000) < 0) {
545 c->c_errors++;
546 return;
547 }
548 }
549 p = getstringvalue(c->c_lnotab) + c->c_lnotab_next;
550 *p++ = addr;
551 *p++ = line;
552 c->c_lnotab_next += 2;
553}
554
555static void
556com_set_lineno(c, lineno)
557 struct compiling *c;
558 int lineno;
559{
560 c->c_lineno = lineno;
561 if (c->c_firstlineno == 0) {
562 c->c_firstlineno = c->c_last_line = lineno;
563 }
564 else {
565 int incr_addr = c->c_nexti - c->c_last_addr;
566 int incr_line = lineno - c->c_last_line;
567 while (incr_addr > 0 || incr_line > 0) {
568 int trunc_addr = incr_addr;
569 int trunc_line = incr_line;
570 if (trunc_addr > 255)
571 trunc_addr = 255;
572 if (trunc_line > 255)
573 trunc_line = 255;
574 com_add_lnotab(c, trunc_addr, trunc_line);
575 incr_addr -= trunc_addr;
576 incr_line -= trunc_line;
577 }
578 c->c_last_addr = c->c_nexti;
579 c->c_last_line = lineno;
580 }
581}
582
583static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000584com_addoparg(c, op, arg)
585 struct compiling *c;
586 int op;
587 int arg;
588{
Guido van Rossum8e793d91997-03-03 19:13:14 +0000589 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000590 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000591 if (Py_OptimizeFlag)
592 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000593 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000594 com_addbyte(c, op);
595 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000596}
597
598static void
599com_addfwref(c, op, p_anchor)
600 struct compiling *c;
601 int op;
602 int *p_anchor;
603{
604 /* Compile a forward reference for backpatching */
605 int here;
606 int anchor;
607 com_addbyte(c, op);
608 here = c->c_nexti;
609 anchor = *p_anchor;
610 *p_anchor = here;
611 com_addint(c, anchor == 0 ? 0 : here - anchor);
612}
613
614static void
615com_backpatch(c, anchor)
616 struct compiling *c;
617 int anchor; /* Must be nonzero */
618{
619 unsigned char *code = (unsigned char *) getstringvalue(c->c_code);
620 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000621 int dist;
622 int prev;
623 for (;;) {
624 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000625 prev = code[anchor] + (code[anchor+1] << 8);
626 dist = target - (anchor+2);
627 code[anchor] = dist & 0xff;
628 code[anchor+1] = dist >> 8;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000629 if (!prev)
630 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000631 anchor -= prev;
632 }
633}
634
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000635/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000636
637static int
638com_add(c, list, v)
639 struct compiling *c;
640 object *list;
641 object *v;
642{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000643 int n = getlistsize(list);
644 int i;
645 for (i = n; --i >= 0; ) {
646 object *w = getlistitem(list, i);
Guido van Rossumefc0bd01991-07-01 18:44:20 +0000647 if (v->ob_type == w->ob_type && cmpobject(v, w) == 0)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000648 return i;
649 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000650 if (addlistitem(list, v) != 0)
651 c->c_errors++;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000652 return n;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000653}
654
655static int
656com_addconst(c, v)
657 struct compiling *c;
658 object *v;
659{
660 return com_add(c, c->c_consts, v);
661}
662
663static int
664com_addname(c, v)
665 struct compiling *c;
666 object *v;
667{
668 return com_add(c, c->c_names, v);
669}
670
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000671#ifdef PRIVATE_NAME_MANGLING
672static int
673com_mangle(c, name, buffer, maxlen)
674 struct compiling *c;
675 char *name;
676 char *buffer;
677 int maxlen;
678{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000679 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000680 This is independent from how the name is used. */
681 char *p;
682 int nlen, plen;
683 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000684 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000685 return 0; /* Don't mangle __extremely_long_names */
686 if (name[nlen-1] == '_' && name[nlen-2] == '_')
687 return 0; /* Don't mangle __whatever__ */
688 p = c->c_private;
689 /* Strip leading underscores from class name */
690 while (*p == '_')
691 p++;
692 if (*p == '\0')
693 return 0; /* Don't mangle if class is just underscores */
694 plen = strlen(p);
695 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000696 plen = maxlen-nlen-2; /* Truncate class name if too long */
697 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000698 buffer[0] = '_';
699 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000700 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000701 /* fprintf(stderr, "mangle %s -> %s\n", name, buffer); */
702 return 1;
703}
704#endif
705
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000706static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000707com_addopnamestr(c, op, name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000708 struct compiling *c;
709 int op;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000710 char *name;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000711{
712 object *v;
713 int i;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000714#ifdef PRIVATE_NAME_MANGLING
715 char buffer[256];
716 if (name != NULL && name[0] == '_' && name[1] == '_' &&
717 c->c_private != NULL &&
718 com_mangle(c, name, buffer, (int)sizeof(buffer)))
719 name = buffer;
720#endif
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000721 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000722 c->c_errors++;
723 i = 255;
724 }
725 else {
726 i = com_addname(c, v);
727 DECREF(v);
728 }
Guido van Rossumc5e96291991-12-10 13:53:51 +0000729 /* Hack to replace *_NAME opcodes by *_GLOBAL if necessary */
730 switch (op) {
731 case LOAD_NAME:
732 case STORE_NAME:
733 case DELETE_NAME:
734 if (dictlookup(c->c_globals, name) != NULL) {
735 switch (op) {
736 case LOAD_NAME: op = LOAD_GLOBAL; break;
737 case STORE_NAME: op = STORE_GLOBAL; break;
738 case DELETE_NAME: op = DELETE_GLOBAL; break;
739 }
740 }
741 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000742 com_addoparg(c, op, i);
743}
744
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000745static void
746com_addopname(c, op, n)
747 struct compiling *c;
748 int op;
749 node *n;
750{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000751 char *name;
752 char buffer[1000];
753 /* XXX it is possible to write this code without the 1000
754 chars on the total length of dotted names, I just can't be
755 bothered right now */
756 if (TYPE(n) == STAR)
757 name = "*";
758 else if (TYPE(n) == dotted_name) {
759 char *p = buffer;
760 int i;
761 name = buffer;
762 for (i = 0; i < NCH(n); i += 2) {
763 char *s = STR(CHILD(n, i));
764 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum452a9831996-09-17 14:32:04 +0000765 com_error(c, MemoryError,
766 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +0000767 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000768 break;
769 }
770 if (p != buffer)
771 *p++ = '.';
772 strcpy(p, s);
773 p = strchr(p, '\0');
774 }
775 }
776 else {
777 REQ(n, NAME);
778 name = STR(n);
779 }
780 com_addopnamestr(c, op, name);
781}
782
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000783static object *
Guido van Rossum452a9831996-09-17 14:32:04 +0000784parsenumber(co, s)
785 struct compiling *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000786 char *s;
787{
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000788 extern long mystrtol PROTO((const char *, char **, int));
789 extern unsigned long mystrtoul PROTO((const char *, char **, int));
790 extern double atof PROTO((const char *));
Guido van Rossumc5e96291991-12-10 13:53:51 +0000791 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000792 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000793 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +0000794#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +0000795 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +0000796 int imflag;
797#endif
798
Guido van Rossum282914b1991-04-04 10:42:56 +0000799 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000800 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +0000801#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +0000802 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +0000803#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000804 if (*end == 'l' || *end == 'L')
Guido van Rossumc5e96291991-12-10 13:53:51 +0000805 return long_scan(s, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000806 if (s[0] == '0')
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000807 x = (long) mystrtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000808 else
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000809 x = mystrtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +0000810 if (*end == '\0') {
811 if (errno != 0) {
Guido van Rossum452a9831996-09-17 14:32:04 +0000812 com_error(co, OverflowError,
813 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000814 return NULL;
815 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000816 return newintobject(x);
Guido van Rossum282914b1991-04-04 10:42:56 +0000817 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000818 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +0000819#ifndef WITHOUT_COMPLEX
820 if (imflag) {
821 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000822 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +0000823 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000824 PyFPE_END_PROTECT(c)
Guido van Rossum50564e81996-01-12 01:13:16 +0000825 return newcomplexobject(c);
826 }
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000827 else {
Guido van Rossum50564e81996-01-12 01:13:16 +0000828#endif
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000829 PyFPE_START_PROTECT("atof", return 0)
830 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000831 PyFPE_END_PROTECT(dx)
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000832 return newfloatobject(dx);
833 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000834}
835
836static object *
837parsestr(s)
838 char *s;
839{
840 object *v;
841 int len;
842 char *buf;
843 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000844 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000845 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +0000846 int first = *s;
847 int quote = first;
848 if (isalpha(quote) || quote == '_')
849 quote = *++s;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000850 if (quote != '\'' && quote != '\"') {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000851 err_badcall();
852 return NULL;
853 }
854 s++;
855 len = strlen(s);
Guido van Rossum8054fad1993-10-26 15:19:44 +0000856 if (s[--len] != quote) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000857 err_badcall();
858 return NULL;
859 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000860 if (len >= 4 && s[0] == quote && s[1] == quote) {
861 s += 2;
862 len -= 2;
863 if (s[--len] != quote || s[--len] != quote) {
864 err_badcall();
865 return NULL;
866 }
867 }
Guido van Rossum5f5e8171997-04-06 03:41:40 +0000868 if (first != quote || strchr(s, '\\') == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000869 return newsizedstringobject(s, len);
870 v = newsizedstringobject((char *)NULL, len);
871 p = buf = getstringvalue(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000872 end = s + len;
873 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000874 if (*s != '\\') {
875 *p++ = *s++;
876 continue;
877 }
878 s++;
879 switch (*s++) {
880 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000881 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000882 case '\\': *p++ = '\\'; break;
883 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000884 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000885 case 'b': *p++ = '\b'; break;
886 case 'f': *p++ = '\014'; break; /* FF */
887 case 't': *p++ = '\t'; break;
888 case 'n': *p++ = '\n'; break;
889 case 'r': *p++ = '\r'; break;
890 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000891 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
892 case '0': case '1': case '2': case '3':
893 case '4': case '5': case '6': case '7':
894 c = s[-1] - '0';
895 if ('0' <= *s && *s <= '7') {
896 c = (c<<3) + *s++ - '0';
897 if ('0' <= *s && *s <= '7')
898 c = (c<<3) + *s++ - '0';
899 }
900 *p++ = c;
901 break;
902 case 'x':
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000903 if (isxdigit(Py_CHARMASK(*s))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000904 sscanf(s, "%x", &c);
905 *p++ = c;
906 do {
907 s++;
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000908 } while (isxdigit(Py_CHARMASK(*s)));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000909 break;
910 }
911 /* FALLTHROUGH */
912 default: *p++ = '\\'; *p++ = s[-1]; break;
913 }
914 }
915 resizestring(&v, (int)(p - buf));
916 return v;
917}
918
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000919static object *
920parsestrplus(n)
921 node *n;
922{
923 object *v;
924 int i;
925 REQ(CHILD(n, 0), STRING);
926 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
927 /* String literal concatenation */
928 for (i = 1; i < NCH(n) && v != NULL; i++) {
929 joinstring_decref(&v, parsestr(STR(CHILD(n, i))));
930 }
931 }
932 return v;
933}
934
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000935static void
936com_list_constructor(c, n)
937 struct compiling *c;
938 node *n;
939{
940 int len;
941 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000942 if (TYPE(n) != testlist)
943 REQ(n, exprlist);
944 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
945 len = (NCH(n) + 1) / 2;
946 for (i = 0; i < NCH(n); i += 2)
947 com_node(c, CHILD(n, i));
948 com_addoparg(c, BUILD_LIST, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000949 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000950}
951
952static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000953com_dictmaker(c, n)
954 struct compiling *c;
955 node *n;
956{
957 int i;
958 /* dictmaker: test ':' test (',' test ':' value)* [','] */
959 for (i = 0; i+2 < NCH(n); i += 4) {
960 /* We must arrange things just right for STORE_SUBSCR.
961 It wants the stack to look like (value) (dict) (key) */
962 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000963 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000964 com_node(c, CHILD(n, i+2)); /* value */
965 com_addbyte(c, ROT_TWO);
966 com_node(c, CHILD(n, i)); /* key */
967 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000968 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000969 }
970}
971
972static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000973com_atom(c, n)
974 struct compiling *c;
975 node *n;
976{
977 node *ch;
978 object *v;
979 int i;
980 REQ(n, atom);
981 ch = CHILD(n, 0);
982 switch (TYPE(ch)) {
983 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +0000984 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000985 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000986 com_push(c, 1);
987 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000988 else
989 com_node(c, CHILD(n, 1));
990 break;
991 case LSQB:
Guido van Rossum8b993a91997-01-17 21:04:03 +0000992 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000993 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000994 com_push(c, 1);
995 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000996 else
997 com_list_constructor(c, CHILD(n, 1));
998 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000999 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001000 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001001 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001002 if (TYPE(CHILD(n, 1)) != RBRACE)
1003 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001004 break;
1005 case BACKQUOTE:
1006 com_node(c, CHILD(n, 1));
1007 com_addbyte(c, UNARY_CONVERT);
1008 break;
1009 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001010 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001011 i = 255;
1012 }
1013 else {
1014 i = com_addconst(c, v);
1015 DECREF(v);
1016 }
1017 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001018 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001019 break;
1020 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001021 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001022 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001023 c->c_errors++;
1024 i = 255;
1025 }
1026 else {
1027 i = com_addconst(c, v);
1028 DECREF(v);
1029 }
1030 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001031 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001032 break;
1033 case NAME:
1034 com_addopname(c, LOAD_NAME, ch);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001035 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001036 break;
1037 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001038 /* XXX fprintf(stderr, "node type %d\n", TYPE(ch)); */
Guido van Rossum452a9831996-09-17 14:32:04 +00001039 com_error(c, SystemError, "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001040 }
1041}
1042
1043static void
1044com_slice(c, n, op)
1045 struct compiling *c;
1046 node *n;
1047 int op;
1048{
1049 if (NCH(n) == 1) {
1050 com_addbyte(c, op);
1051 }
1052 else if (NCH(n) == 2) {
1053 if (TYPE(CHILD(n, 0)) != COLON) {
1054 com_node(c, CHILD(n, 0));
1055 com_addbyte(c, op+1);
1056 }
1057 else {
1058 com_node(c, CHILD(n, 1));
1059 com_addbyte(c, op+2);
1060 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001061 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001062 }
1063 else {
1064 com_node(c, CHILD(n, 0));
1065 com_node(c, CHILD(n, 2));
1066 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001067 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001068 }
1069}
1070
Guido van Rossum635abd21997-01-06 22:56:52 +00001071static void
1072com_argument(c, n, pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001073 struct compiling *c;
1074 node *n; /* argument */
Guido van Rossum635abd21997-01-06 22:56:52 +00001075 object **pkeywords;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001076{
1077 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001078 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001079 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001080 if (*pkeywords != NULL) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001081 com_error(c, SyntaxError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001082 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001083 }
1084 else {
1085 com_node(c, CHILD(n, 0));
1086 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001087 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001088 }
1089 m = n;
1090 do {
1091 m = CHILD(m, 0);
1092 } while (NCH(m) == 1);
1093 if (TYPE(m) != NAME) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001094 com_error(c, SyntaxError, "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001095 }
1096 else {
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001097 object *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001098 if (v != NULL && *pkeywords == NULL)
1099 *pkeywords = newdictobject();
1100 if (v == NULL || *pkeywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001101 c->c_errors++;
1102 else {
Guido van Rossum635abd21997-01-06 22:56:52 +00001103 if (dict2lookup(*pkeywords, v) != NULL)
1104 com_error(c, SyntaxError,
1105 "duplicate keyword argument");
1106 else
1107 if (dict2insert(*pkeywords, v, v) != 0)
1108 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001109 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001110 com_push(c, 1);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001111 DECREF(v);
1112 }
1113 }
1114 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001115}
1116
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001117static void
1118com_call_function(c, n)
1119 struct compiling *c;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001120 node *n; /* EITHER arglist OR ')' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001121{
1122 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001123 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001124 }
1125 else {
Guido van Rossum635abd21997-01-06 22:56:52 +00001126 object *keywords = NULL;
1127 int i, na, nk;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001128 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001129 na = 0;
1130 nk = 0;
1131 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001132 com_argument(c, CHILD(n, i), &keywords);
1133 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001134 na++;
1135 else
1136 nk++;
1137 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001138 XDECREF(keywords);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001139 if (na > 255 || nk > 255) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001140 com_error(c, SyntaxError, "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001141 }
1142 com_addoparg(c, CALL_FUNCTION, na | (nk << 8));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001143 com_pop(c, na + 2*nk);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001144 }
1145}
1146
1147static void
1148com_select_member(c, n)
1149 struct compiling *c;
1150 node *n;
1151{
1152 com_addopname(c, LOAD_ATTR, n);
1153}
1154
1155static void
Guido van Rossum8861b741996-07-30 16:49:37 +00001156com_sliceobj(c, n)
1157 struct compiling *c;
1158 node *n;
1159{
1160 int i=0;
1161 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001162 node *ch;
1163
1164 /* first argument */
1165 if (TYPE(CHILD(n,i)) == COLON) {
1166 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001167 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001168 i++;
1169 }
1170 else {
1171 com_node(c, CHILD(n,i));
1172 i++;
1173 REQ(CHILD(n,i),COLON);
1174 i++;
1175 }
1176 /* second argument */
1177 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1178 com_node(c, CHILD(n,i));
1179 i++;
1180 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001181 else {
1182 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1183 com_push(c, 1);
1184 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001185 /* remaining arguments */
1186 for (; i < NCH(n); i++) {
1187 ns++;
1188 ch=CHILD(n,i);
1189 REQ(ch, sliceop);
1190 if (NCH(ch) == 1) {
1191 /* right argument of ':' missing */
1192 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001193 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001194 }
1195 else
1196 com_node(c, CHILD(ch,1));
1197 }
1198 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001199 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001200}
1201
1202static void
1203com_subscript(c, n)
1204 struct compiling *c;
1205 node *n;
1206{
1207 node *ch;
1208 REQ(n, subscript);
1209 ch = CHILD(n,0);
1210 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001211 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001212 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001213 com_push(c, 1);
1214 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001215 else {
1216 /* check for slice */
1217 if ((TYPE(ch) == COLON || NCH(n) > 1))
1218 com_sliceobj(c, n);
1219 else {
1220 REQ(ch, test);
1221 com_node(c, ch);
1222 }
1223 }
1224}
1225
1226static void
1227com_subscriptlist(c, n, assigning)
1228 struct compiling *c;
1229 node *n;
1230 int assigning;
1231{
1232 int i, op;
1233 REQ(n, subscriptlist);
1234 /* Check to make backward compatible slice behavior for '[i:j]' */
1235 if (NCH(n) == 1) {
1236 node *sub = CHILD(n, 0); /* subscript */
1237 /* Make it is a simple slice.
Guido van Rossum8b993a91997-01-17 21:04:03 +00001238 Should have exactly one colon. */
Guido van Rossum8861b741996-07-30 16:49:37 +00001239 if ((TYPE(CHILD(sub, 0)) == COLON
1240 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
Guido van Rossum8b993a91997-01-17 21:04:03 +00001241 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1242 {
Guido van Rossum8861b741996-07-30 16:49:37 +00001243 if (assigning == OP_APPLY)
1244 op = SLICE;
1245 else
1246 op = ((assigning == OP_ASSIGN) ? STORE_SLICE : DELETE_SLICE);
1247 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001248 if (op == STORE_SLICE)
1249 com_pop(c, 2);
1250 else if (op == DELETE_SLICE)
1251 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001252 return;
1253 }
1254 }
1255 /* Else normal subscriptlist. Compile each subscript. */
1256 for (i = 0; i < NCH(n); i += 2)
1257 com_subscript(c, CHILD(n, i));
1258 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001259 if (NCH(n) > 1) {
1260 i = (NCH(n)+1) / 2;
1261 com_addoparg(c, BUILD_TUPLE, i);
1262 com_pop(c, i-1);
1263 }
1264 if (assigning == OP_APPLY) {
Guido van Rossum8861b741996-07-30 16:49:37 +00001265 op = BINARY_SUBSCR;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001266 i = 1;
1267 }
1268 else if (assigning == OP_ASSIGN) {
1269 op = STORE_SUBSCR;
1270 i = 3;
1271 }
1272 else {
1273 op = DELETE_SUBSCR;
1274 i = 2;
1275 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001276 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001277 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001278}
1279
1280static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001281com_apply_trailer(c, n)
1282 struct compiling *c;
1283 node *n;
1284{
1285 REQ(n, trailer);
1286 switch (TYPE(CHILD(n, 0))) {
1287 case LPAR:
1288 com_call_function(c, CHILD(n, 1));
1289 break;
1290 case DOT:
1291 com_select_member(c, CHILD(n, 1));
1292 break;
1293 case LSQB:
Guido van Rossum8861b741996-07-30 16:49:37 +00001294 com_subscriptlist(c, CHILD(n, 1), OP_APPLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001295 break;
1296 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001297 com_error(c, SystemError,
1298 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001299 }
1300}
1301
1302static void
Guido van Rossum50564e81996-01-12 01:13:16 +00001303com_power(c, n)
1304 struct compiling *c;
1305 node *n;
1306{
1307 int i;
1308 REQ(n, power);
1309 com_atom(c, CHILD(n, 0));
1310 for (i = 1; i < NCH(n); i++) {
1311 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1312 com_factor(c, CHILD(n, i+1));
1313 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001314 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001315 break;
1316 }
1317 else
1318 com_apply_trailer(c, CHILD(n, i));
1319 }
1320}
1321
1322static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001323com_factor(c, n)
1324 struct compiling *c;
1325 node *n;
1326{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001327 REQ(n, factor);
1328 if (TYPE(CHILD(n, 0)) == PLUS) {
1329 com_factor(c, CHILD(n, 1));
1330 com_addbyte(c, UNARY_POSITIVE);
1331 }
1332 else if (TYPE(CHILD(n, 0)) == MINUS) {
1333 com_factor(c, CHILD(n, 1));
1334 com_addbyte(c, UNARY_NEGATIVE);
1335 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001336 else if (TYPE(CHILD(n, 0)) == TILDE) {
1337 com_factor(c, CHILD(n, 1));
1338 com_addbyte(c, UNARY_INVERT);
1339 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001340 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001341 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001342 }
1343}
1344
1345static void
1346com_term(c, n)
1347 struct compiling *c;
1348 node *n;
1349{
1350 int i;
1351 int op;
1352 REQ(n, term);
1353 com_factor(c, CHILD(n, 0));
1354 for (i = 2; i < NCH(n); i += 2) {
1355 com_factor(c, CHILD(n, i));
1356 switch (TYPE(CHILD(n, i-1))) {
1357 case STAR:
1358 op = BINARY_MULTIPLY;
1359 break;
1360 case SLASH:
1361 op = BINARY_DIVIDE;
1362 break;
1363 case PERCENT:
1364 op = BINARY_MODULO;
1365 break;
1366 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001367 com_error(c, SystemError,
1368 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001369 op = 255;
1370 }
1371 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001372 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001373 }
1374}
1375
1376static void
1377com_arith_expr(c, n)
1378 struct compiling *c;
1379 node *n;
1380{
1381 int i;
1382 int op;
1383 REQ(n, arith_expr);
1384 com_term(c, CHILD(n, 0));
1385 for (i = 2; i < NCH(n); i += 2) {
1386 com_term(c, CHILD(n, i));
1387 switch (TYPE(CHILD(n, i-1))) {
1388 case PLUS:
1389 op = BINARY_ADD;
1390 break;
1391 case MINUS:
1392 op = BINARY_SUBTRACT;
1393 break;
1394 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001395 com_error(c, SystemError,
1396 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001397 op = 255;
1398 }
1399 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001400 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001401 }
1402}
1403
1404static void
1405com_shift_expr(c, n)
1406 struct compiling *c;
1407 node *n;
1408{
1409 int i;
1410 int op;
1411 REQ(n, shift_expr);
1412 com_arith_expr(c, CHILD(n, 0));
1413 for (i = 2; i < NCH(n); i += 2) {
1414 com_arith_expr(c, CHILD(n, i));
1415 switch (TYPE(CHILD(n, i-1))) {
1416 case LEFTSHIFT:
1417 op = BINARY_LSHIFT;
1418 break;
1419 case RIGHTSHIFT:
1420 op = BINARY_RSHIFT;
1421 break;
1422 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001423 com_error(c, SystemError,
1424 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001425 op = 255;
1426 }
1427 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001428 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001429 }
1430}
1431
1432static void
1433com_and_expr(c, n)
1434 struct compiling *c;
1435 node *n;
1436{
1437 int i;
1438 int op;
1439 REQ(n, and_expr);
1440 com_shift_expr(c, CHILD(n, 0));
1441 for (i = 2; i < NCH(n); i += 2) {
1442 com_shift_expr(c, CHILD(n, i));
1443 if (TYPE(CHILD(n, i-1)) == AMPER) {
1444 op = BINARY_AND;
1445 }
1446 else {
Guido van Rossum452a9831996-09-17 14:32:04 +00001447 com_error(c, SystemError,
1448 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001449 op = 255;
1450 }
1451 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001452 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001453 }
1454}
1455
1456static void
1457com_xor_expr(c, n)
1458 struct compiling *c;
1459 node *n;
1460{
1461 int i;
1462 int op;
1463 REQ(n, xor_expr);
1464 com_and_expr(c, CHILD(n, 0));
1465 for (i = 2; i < NCH(n); i += 2) {
1466 com_and_expr(c, CHILD(n, i));
1467 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1468 op = BINARY_XOR;
1469 }
1470 else {
Guido van Rossum452a9831996-09-17 14:32:04 +00001471 com_error(c, SystemError,
1472 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001473 op = 255;
1474 }
1475 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001476 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001477 }
1478}
1479
1480static void
1481com_expr(c, n)
1482 struct compiling *c;
1483 node *n;
1484{
1485 int i;
1486 int op;
1487 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001488 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001489 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001490 com_xor_expr(c, CHILD(n, i));
1491 if (TYPE(CHILD(n, i-1)) == VBAR) {
1492 op = BINARY_OR;
1493 }
1494 else {
Guido van Rossum452a9831996-09-17 14:32:04 +00001495 com_error(c, SystemError,
1496 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001497 op = 255;
1498 }
1499 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001500 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001501 }
1502}
1503
1504static enum cmp_op
1505cmp_type(n)
1506 node *n;
1507{
1508 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001509 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001510 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1511 if (NCH(n) == 1) {
1512 n = CHILD(n, 0);
1513 switch (TYPE(n)) {
1514 case LESS: return LT;
1515 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001516 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001517 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001518 case LESSEQUAL: return LE;
1519 case GREATEREQUAL: return GE;
1520 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001521 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1522 if (strcmp(STR(n), "is") == 0) return IS;
1523 }
1524 }
1525 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001526 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001527 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1528 return NOT_IN;
1529 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1530 return IS_NOT;
1531 }
1532 }
1533 return BAD;
1534}
1535
1536static void
1537com_comparison(c, n)
1538 struct compiling *c;
1539 node *n;
1540{
1541 int i;
1542 enum cmp_op op;
1543 int anchor;
1544 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
1545 com_expr(c, CHILD(n, 0));
1546 if (NCH(n) == 1)
1547 return;
1548
1549 /****************************************************************
1550 The following code is generated for all but the last
1551 comparison in a chain:
1552
1553 label: on stack: opcode: jump to:
1554
1555 a <code to load b>
1556 a, b DUP_TOP
1557 a, b, b ROT_THREE
1558 b, a, b COMPARE_OP
1559 b, 0-or-1 JUMP_IF_FALSE L1
1560 b, 1 POP_TOP
1561 b
1562
1563 We are now ready to repeat this sequence for the next
1564 comparison in the chain.
1565
1566 For the last we generate:
1567
1568 b <code to load c>
1569 b, c COMPARE_OP
1570 0-or-1
1571
1572 If there were any jumps to L1 (i.e., there was more than one
1573 comparison), we generate:
1574
1575 0-or-1 JUMP_FORWARD L2
1576 L1: b, 0 ROT_TWO
1577 0, b POP_TOP
1578 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00001579 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001580 ****************************************************************/
1581
1582 anchor = 0;
1583
1584 for (i = 2; i < NCH(n); i += 2) {
1585 com_expr(c, CHILD(n, i));
1586 if (i+2 < NCH(n)) {
1587 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001588 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001589 com_addbyte(c, ROT_THREE);
1590 }
1591 op = cmp_type(CHILD(n, i-1));
1592 if (op == BAD) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001593 com_error(c, SystemError,
1594 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001595 }
1596 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001597 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001598 if (i+2 < NCH(n)) {
1599 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1600 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001601 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001602 }
1603 }
1604
1605 if (anchor) {
1606 int anchor2 = 0;
1607 com_addfwref(c, JUMP_FORWARD, &anchor2);
1608 com_backpatch(c, anchor);
1609 com_addbyte(c, ROT_TWO);
1610 com_addbyte(c, POP_TOP);
1611 com_backpatch(c, anchor2);
1612 }
1613}
1614
1615static void
1616com_not_test(c, n)
1617 struct compiling *c;
1618 node *n;
1619{
1620 REQ(n, not_test); /* 'not' not_test | comparison */
1621 if (NCH(n) == 1) {
1622 com_comparison(c, CHILD(n, 0));
1623 }
1624 else {
1625 com_not_test(c, CHILD(n, 1));
1626 com_addbyte(c, UNARY_NOT);
1627 }
1628}
1629
1630static void
1631com_and_test(c, n)
1632 struct compiling *c;
1633 node *n;
1634{
1635 int i;
1636 int anchor;
1637 REQ(n, and_test); /* not_test ('and' not_test)* */
1638 anchor = 0;
1639 i = 0;
1640 for (;;) {
1641 com_not_test(c, CHILD(n, i));
1642 if ((i += 2) >= NCH(n))
1643 break;
1644 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1645 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001646 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001647 }
1648 if (anchor)
1649 com_backpatch(c, anchor);
1650}
1651
1652static void
1653com_test(c, n)
1654 struct compiling *c;
1655 node *n;
1656{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001657 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00001658 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
1659 object *v;
1660 int i;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001661 int ndefs = com_argdefs(c, CHILD(n, 0));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001662 v = (object *) icompile(CHILD(n, 0), c);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001663 if (v == NULL) {
1664 c->c_errors++;
1665 i = 255;
1666 }
1667 else {
1668 i = com_addconst(c, v);
1669 DECREF(v);
1670 }
1671 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001672 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001673 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001674 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001675 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00001676 else {
1677 int anchor = 0;
1678 int i = 0;
1679 for (;;) {
1680 com_and_test(c, CHILD(n, i));
1681 if ((i += 2) >= NCH(n))
1682 break;
1683 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1684 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001685 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001686 }
1687 if (anchor)
1688 com_backpatch(c, anchor);
1689 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001690}
1691
1692static void
Guido van Rossum288a60f1991-12-16 13:05:10 +00001693com_list(c, n, toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001694 struct compiling *c;
1695 node *n;
Guido van Rossum288a60f1991-12-16 13:05:10 +00001696 int toplevel; /* If nonzero, *always* build a tuple */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001697{
1698 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001699 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001700 com_node(c, CHILD(n, 0));
1701 }
1702 else {
1703 int i;
1704 int len;
1705 len = (NCH(n) + 1) / 2;
1706 for (i = 0; i < NCH(n); i += 2)
1707 com_node(c, CHILD(n, i));
1708 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001709 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001710 }
1711}
1712
1713
1714/* Begin of assignment compilation */
1715
1716static void com_assign_name PROTO((struct compiling *, node *, int));
1717static void com_assign PROTO((struct compiling *, node *, int));
1718
1719static void
1720com_assign_attr(c, n, assigning)
1721 struct compiling *c;
1722 node *n;
1723 int assigning;
1724{
1725 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001726 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001727}
1728
1729static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001730com_assign_trailer(c, n, assigning)
1731 struct compiling *c;
1732 node *n;
1733 int assigning;
1734{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001735 REQ(n, trailer);
1736 switch (TYPE(CHILD(n, 0))) {
1737 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum452a9831996-09-17 14:32:04 +00001738 com_error(c, SyntaxError, "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001739 break;
1740 case DOT: /* '.' NAME */
1741 com_assign_attr(c, CHILD(n, 1), assigning);
1742 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001743 case LSQB: /* '[' subscriptlist ']' */
1744 com_subscriptlist(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001745 break;
1746 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001747 com_error(c, SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001748 }
1749}
1750
1751static void
1752com_assign_tuple(c, n, assigning)
1753 struct compiling *c;
1754 node *n;
1755 int assigning;
1756{
1757 int i;
1758 if (TYPE(n) != testlist)
1759 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001760 if (assigning) {
1761 i = (NCH(n)+1)/2;
1762 com_addoparg(c, UNPACK_TUPLE, i);
1763 com_push(c, i-1);
1764 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001765 for (i = 0; i < NCH(n); i += 2)
1766 com_assign(c, CHILD(n, i), assigning);
1767}
1768
1769static void
1770com_assign_list(c, n, assigning)
1771 struct compiling *c;
1772 node *n;
1773 int assigning;
1774{
1775 int i;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001776 if (assigning) {
1777 i = (NCH(n)+1)/2;
1778 com_addoparg(c, UNPACK_LIST, i);
1779 com_push(c, i-1);
1780 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001781 for (i = 0; i < NCH(n); i += 2)
1782 com_assign(c, CHILD(n, i), assigning);
1783}
1784
1785static void
1786com_assign_name(c, n, assigning)
1787 struct compiling *c;
1788 node *n;
1789 int assigning;
1790{
1791 REQ(n, NAME);
1792 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001793 if (assigning)
1794 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001795}
1796
1797static void
1798com_assign(c, n, assigning)
1799 struct compiling *c;
1800 node *n;
1801 int assigning;
1802{
1803 /* Loop to avoid trivial recursion */
1804 for (;;) {
1805 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001806
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001807 case exprlist:
1808 case testlist:
1809 if (NCH(n) > 1) {
1810 com_assign_tuple(c, n, assigning);
1811 return;
1812 }
1813 n = CHILD(n, 0);
1814 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001815
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001816 case test:
1817 case and_test:
1818 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001819 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001820 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001821 case xor_expr:
1822 case and_expr:
1823 case shift_expr:
1824 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001825 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00001826 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001827 if (NCH(n) > 1) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001828 com_error(c, SyntaxError,
1829 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001830 return;
1831 }
1832 n = CHILD(n, 0);
1833 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001834
Guido van Rossum50564e81996-01-12 01:13:16 +00001835 case power: /* atom trailer* ('**' power)* */
1836/* ('+'|'-'|'~') factor | atom trailer* */
1837 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001838 com_error(c, SyntaxError,
1839 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001840 return;
1841 }
Guido van Rossum50564e81996-01-12 01:13:16 +00001842 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001843 int i;
1844 com_node(c, CHILD(n, 0));
1845 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00001846 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001847 com_error(c, SyntaxError,
1848 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00001849 return;
1850 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001851 com_apply_trailer(c, CHILD(n, i));
1852 } /* NB i is still alive */
1853 com_assign_trailer(c,
1854 CHILD(n, i), assigning);
1855 return;
1856 }
1857 n = CHILD(n, 0);
1858 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001859
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001860 case atom:
1861 switch (TYPE(CHILD(n, 0))) {
1862 case LPAR:
1863 n = CHILD(n, 1);
1864 if (TYPE(n) == RPAR) {
1865 /* XXX Should allow () = () ??? */
Guido van Rossum452a9831996-09-17 14:32:04 +00001866 com_error(c, SyntaxError,
1867 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001868 return;
1869 }
1870 break;
1871 case LSQB:
1872 n = CHILD(n, 1);
1873 if (TYPE(n) == RSQB) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001874 com_error(c, SyntaxError,
1875 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001876 return;
1877 }
1878 com_assign_list(c, n, assigning);
1879 return;
1880 case NAME:
1881 com_assign_name(c, CHILD(n, 0), assigning);
1882 return;
1883 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001884 com_error(c, SyntaxError,
1885 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001886 return;
1887 }
1888 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001889
1890 case lambdef:
Guido van Rossum452a9831996-09-17 14:32:04 +00001891 com_error(c, SyntaxError, "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001892 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001893
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001894 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001895 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum452a9831996-09-17 14:32:04 +00001896 com_error(c, SystemError, "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001897 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001898
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001899 }
1900 }
1901}
Guido van Rossum7c531111997-03-11 18:42:21 +00001902
Guido van Rossum8b993a91997-01-17 21:04:03 +00001903/* Forward */ static node *get_rawdocstring PROTO((node *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001904
1905static void
1906com_expr_stmt(c, n)
1907 struct compiling *c;
1908 node *n;
1909{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001910 REQ(n, expr_stmt); /* testlist ('=' testlist)* */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001911 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001912 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001913 return;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001914 com_node(c, CHILD(n, NCH(n)-1));
1915 if (NCH(n) == 1) {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001916 if (c->c_interactive)
1917 com_addbyte(c, PRINT_EXPR);
1918 else
1919 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001920 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001921 }
1922 else {
1923 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001924 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00001925 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001926 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001927 com_push(c, 1);
1928 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001929 com_assign(c, CHILD(n, i), OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001930 }
1931 }
1932}
1933
1934static void
Guido van Rossum228d7f31997-04-02 05:24:36 +00001935com_assert_stmt(c, n)
1936 struct compiling *c;
1937 node *n;
1938{
1939 int a = 0, b = 0;
1940 int i;
1941 REQ(n, assert_stmt); /* 'assert' test [',' test] */
1942 /* Generate code like for
1943
1944 if __debug__:
1945 if not <test>:
1946 raise AssertionError [, <message>]
1947
1948 where <message> is the second test, if present.
1949 */
1950 if (Py_OptimizeFlag)
1951 return;
1952 com_addopnamestr(c, LOAD_GLOBAL, "__debug__");
1953 com_push(c, 1);
1954 com_addfwref(c, JUMP_IF_FALSE, &a);
1955 com_addbyte(c, POP_TOP);
1956 com_pop(c, 1);
1957 com_node(c, CHILD(n, 1));
1958 com_addfwref(c, JUMP_IF_TRUE, &b);
1959 com_addbyte(c, POP_TOP);
1960 com_pop(c, 1);
1961 /* Raise that exception! */
1962 com_addopnamestr(c, LOAD_GLOBAL, "AssertionError");
1963 com_push(c, 1);
1964 i = NCH(n)/2; /* Either 2 or 4 */
1965 if (i > 1)
1966 com_node(c, CHILD(n, 3));
1967 com_addoparg(c, RAISE_VARARGS, i);
1968 com_pop(c, i);
1969 /* The interpreter does not fall through */
1970 /* All jumps converge here */
1971 com_backpatch(c, a);
1972 com_backpatch(c, b);
1973 com_addbyte(c, POP_TOP);
1974}
1975
1976static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001977com_print_stmt(c, n)
1978 struct compiling *c;
1979 node *n;
1980{
1981 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001982 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
1983 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001984 com_node(c, CHILD(n, i));
1985 com_addbyte(c, PRINT_ITEM);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001986 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001987 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001988 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001989 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001990 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001991}
1992
1993static void
1994com_return_stmt(c, n)
1995 struct compiling *c;
1996 node *n;
1997{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001998 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001999 if (!c->c_infunction) {
Guido van Rossum452a9831996-09-17 14:32:04 +00002000 com_error(c, SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002001 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002002 if (NCH(n) < 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002003 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002004 com_push(c, 1);
2005 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002006 else
2007 com_node(c, CHILD(n, 1));
2008 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002009 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002010}
2011
2012static void
2013com_raise_stmt(c, n)
2014 struct compiling *c;
2015 node *n;
2016{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002017 int i;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002018 REQ(n, raise_stmt); /* 'raise' test [',' test [',' test]] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002019 com_node(c, CHILD(n, 1));
Guido van Rossum681d79a1995-07-18 14:51:37 +00002020 if (NCH(n) > 3) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002021 com_node(c, CHILD(n, 3));
Guido van Rossum681d79a1995-07-18 14:51:37 +00002022 if (NCH(n) > 5)
2023 com_node(c, CHILD(n, 5));
Guido van Rossumf10570b1995-07-07 22:53:21 +00002024 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002025 i = NCH(n)/2;
2026 com_addoparg(c, RAISE_VARARGS, i);
2027 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002028}
2029
2030static void
2031com_import_stmt(c, n)
2032 struct compiling *c;
2033 node *n;
2034{
2035 int i;
2036 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002037 /* 'import' dotted_name (',' dotted_name)* |
2038 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002039 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002040 /* 'from' dotted_name 'import' ... */
2041 REQ(CHILD(n, 1), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002042 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002043 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002044 for (i = 3; i < NCH(n); i += 2)
2045 com_addopname(c, IMPORT_FROM, CHILD(n, i));
2046 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002047 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002048 }
2049 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002050 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002051 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002052 REQ(CHILD(n, i), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002053 com_addopname(c, IMPORT_NAME, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002054 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002055 com_addopname(c, STORE_NAME, CHILD(CHILD(n, i), 0));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002056 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002057 }
2058 }
2059}
2060
2061static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00002062com_global_stmt(c, n)
2063 struct compiling *c;
2064 node *n;
2065{
2066 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002067 REQ(n, global_stmt);
2068 /* 'global' NAME (',' NAME)* */
2069 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002070 char *s = STR(CHILD(n, i));
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002071#ifdef PRIVATE_NAME_MANGLING
2072 char buffer[256];
2073 if (s != NULL && s[0] == '_' && s[1] == '_' &&
2074 c->c_private != NULL &&
2075 com_mangle(c, s, buffer, (int)sizeof(buffer)))
2076 s = buffer;
2077#endif
Guido van Rossum681d79a1995-07-18 14:51:37 +00002078 if (dictlookup(c->c_locals, s) != NULL) {
Guido van Rossum452a9831996-09-17 14:32:04 +00002079 com_error(c, SyntaxError, "name is local and global");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002080 }
2081 else if (dictinsert(c->c_globals, s, None) != 0)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002082 c->c_errors++;
2083 }
2084}
2085
Guido van Rossum681d79a1995-07-18 14:51:37 +00002086static int
2087com_newlocal_o(c, nameval)
2088 struct compiling *c;
2089 object *nameval;
2090{
2091 int i;
2092 object *ival;
2093 if (getlistsize(c->c_varnames) != c->c_nlocals) {
2094 /* This is usually caused by an error on a previous call */
2095 if (c->c_errors == 0) {
Guido van Rossum452a9831996-09-17 14:32:04 +00002096 com_error(c, SystemError, "mixed up var name/index");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002097 }
2098 return 0;
2099 }
2100 ival = newintobject(i = c->c_nlocals++);
2101 if (ival == NULL)
2102 c->c_errors++;
2103 else if (mappinginsert(c->c_locals, nameval, ival) != 0)
2104 c->c_errors++;
2105 else if (addlistitem(c->c_varnames, nameval) != 0)
2106 c->c_errors++;
2107 XDECREF(ival);
2108 return i;
2109}
2110
2111static int
2112com_addlocal_o(c, nameval)
2113 struct compiling *c;
2114 object *nameval;
2115{
2116 object *ival = mappinglookup(c->c_locals, nameval);
2117 if (ival != NULL)
2118 return getintvalue(ival);
2119 return com_newlocal_o(c, nameval);
2120}
2121
2122static int
2123com_newlocal(c, name)
2124 struct compiling *c;
2125 char *name;
2126{
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00002127 object *nameval = PyString_InternFromString(name);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002128 int i;
2129 if (nameval == NULL) {
2130 c->c_errors++;
2131 return 0;
2132 }
2133 i = com_newlocal_o(c, nameval);
2134 DECREF(nameval);
2135 return i;
2136}
2137
Guido van Rossum8b993a91997-01-17 21:04:03 +00002138#ifdef SUPPORT_OBSOLETE_ACCESS
2139
Guido van Rossum25831651993-05-19 14:50:45 +00002140#define strequ(a, b) (strcmp((a), (b)) == 0)
2141
2142static void
2143com_access_stmt(c, n)
2144 struct compiling *c;
2145 node *n;
2146{
2147 int i, j, k, mode, imode;
2148 object *vmode;
2149 REQ(n, access_stmt);
2150 /* 'access' NAME (',' NAME)* ':' accesstype (',' accesstype)*
2151 accesstype: NAME+ */
2152
2153 /* Find where the colon is */
2154 i = 1;
2155 while (TYPE(CHILD(n,i-1)) != COLON)
2156 i += 1;
2157
2158 /* Calculate the mode mask */
2159 mode = 0;
2160 for (j = i; j < NCH(n); j += 2) {
Guido van Rossum81daa321993-05-20 14:24:46 +00002161 int r = 0, w = 0, p = 0;
2162 for (k = 0; k < NCH(CHILD(n,j)); k++) {
Guido van Rossum25831651993-05-19 14:50:45 +00002163 if (strequ(STR(CHILD(CHILD(n,j),k)), "public"))
2164 p = 0;
2165 else if (strequ(STR(CHILD(CHILD(n,j),k)), "protected"))
2166 p = 1;
2167 else if (strequ(STR(CHILD(CHILD(n,j),k)), "private"))
2168 p = 2;
2169 else if (strequ(STR(CHILD(CHILD(n,j),k)), "read"))
2170 r = 1;
2171 else if (strequ(STR(CHILD(CHILD(n,j),k)), "write"))
2172 w = 1;
2173 else /* XXX should make this an exception */
2174 fprintf(stderr, "bad access type %s\n",
2175 STR(CHILD(CHILD(n,j),k)));
2176 }
2177 if (r == 0 && w == 0)
Guido van Rossum81daa321993-05-20 14:24:46 +00002178 r = w = 1;
Guido van Rossum25831651993-05-19 14:50:45 +00002179 if (p == 0) {
2180 if (r == 1) mode |= AC_R_PUBLIC;
2181 if (w == 1) mode |= AC_W_PUBLIC;
2182 } else if (p == 1) {
2183 if (r == 1) mode |= AC_R_PROTECTED;
2184 if (w == 1) mode |= AC_W_PROTECTED;
2185 } else {
2186 if (r == 1) mode |= AC_R_PRIVATE;
2187 if (w == 1) mode |= AC_W_PRIVATE;
2188 }
2189 }
2190 vmode = newintobject((long)mode);
2191 imode = com_addconst(c, vmode);
2192 XDECREF(vmode);
2193 for (i = 1; TYPE(CHILD(n,i-1)) != COLON; i+=2) {
2194 com_addoparg(c, LOAD_CONST, imode);
2195 com_addopname(c, ACCESS_MODE, CHILD(n, i));
2196 }
2197}
Guido van Rossum0dfcf751996-08-12 22:00:53 +00002198#endif
Guido van Rossum25831651993-05-19 14:50:45 +00002199
Guido van Rossumc5e96291991-12-10 13:53:51 +00002200static void
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002201com_exec_stmt(c, n)
2202 struct compiling *c;
2203 node *n;
2204{
2205 REQ(n, exec_stmt);
2206 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2207 com_node(c, CHILD(n, 1));
2208 if (NCH(n) >= 4)
2209 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002210 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002211 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002212 com_push(c, 1);
2213 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002214 if (NCH(n) >= 6)
2215 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002216 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002217 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002218 com_push(c, 1);
2219 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002220 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002221 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002222}
2223
Guido van Rossum7c531111997-03-11 18:42:21 +00002224static int
2225is_constant_false(c, n)
2226 struct compiling *c;
2227 node *n;
2228{
2229 object *v;
2230 int i;
2231
2232 /* Label to avoid tail recursion */
2233 next:
2234 switch (TYPE(n)) {
2235
2236 case suite:
2237 if (NCH(n) == 1) {
2238 n = CHILD(n, 0);
2239 goto next;
2240 }
2241 /* Fall through */
2242 case file_input:
2243 for (i = 0; i < NCH(n); i++) {
2244 node *ch = CHILD(n, i);
2245 if (TYPE(ch) == stmt) {
2246 n = ch;
2247 goto next;
2248 }
2249 }
2250 break;
2251
2252 case stmt:
2253 case simple_stmt:
2254 case small_stmt:
2255 n = CHILD(n, 0);
2256 goto next;
2257
2258 case expr_stmt:
2259 case testlist:
2260 case test:
2261 case and_test:
2262 case not_test:
2263 case comparison:
2264 case expr:
2265 case xor_expr:
2266 case and_expr:
2267 case shift_expr:
2268 case arith_expr:
2269 case term:
2270 case factor:
2271 case power:
2272 case atom:
2273 if (NCH(n) == 1) {
2274 n = CHILD(n, 0);
2275 goto next;
2276 }
2277 break;
2278
2279 case NAME:
2280 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2281 return 1;
2282 break;
2283
2284 case NUMBER:
2285 v = parsenumber(c, STR(n));
2286 if (v == NULL) {
2287 err_clear();
2288 break;
2289 }
2290 i = testbool(v);
2291 DECREF(v);
2292 return i == 0;
2293
2294 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002295 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002296 if (v == NULL) {
2297 err_clear();
2298 break;
2299 }
2300 i = testbool(v);
2301 DECREF(v);
2302 return i == 0;
2303
2304 }
2305 return 0;
2306}
2307
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002308static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002309com_if_stmt(c, n)
2310 struct compiling *c;
2311 node *n;
2312{
2313 int i;
2314 int anchor = 0;
2315 REQ(n, if_stmt);
2316 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2317 for (i = 0; i+3 < NCH(n); i+=4) {
2318 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002319 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002320 if (is_constant_false(c, ch))
2321 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002322 if (i > 0)
2323 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002324 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002325 com_addfwref(c, JUMP_IF_FALSE, &a);
2326 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002327 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002328 com_node(c, CHILD(n, i+3));
2329 com_addfwref(c, JUMP_FORWARD, &anchor);
2330 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002331 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002332 com_addbyte(c, POP_TOP);
2333 }
2334 if (i+2 < NCH(n))
2335 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002336 if (anchor)
2337 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002338}
2339
2340static void
2341com_while_stmt(c, n)
2342 struct compiling *c;
2343 node *n;
2344{
2345 int break_anchor = 0;
2346 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002347 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002348 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2349 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002350 block_push(c, SETUP_LOOP);
2351 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002352 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002353 com_node(c, CHILD(n, 1));
2354 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2355 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002356 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002357 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002358 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002359 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002360 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2361 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002362 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002363 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002364 com_addbyte(c, POP_TOP);
2365 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002366 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002367 if (NCH(n) > 4)
2368 com_node(c, CHILD(n, 6));
2369 com_backpatch(c, break_anchor);
2370}
2371
2372static void
2373com_for_stmt(c, n)
2374 struct compiling *c;
2375 node *n;
2376{
2377 object *v;
2378 int break_anchor = 0;
2379 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002380 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002381 REQ(n, for_stmt);
2382 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2383 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002384 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002385 com_node(c, CHILD(n, 3));
2386 v = newintobject(0L);
2387 if (v == NULL)
2388 c->c_errors++;
2389 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002390 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002391 XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002392 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002393 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002394 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002395 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002396 com_assign(c, CHILD(n, 1), OP_ASSIGN);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002397 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002398 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002399 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002400 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2401 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002402 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002403 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002404 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002405 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002406 if (NCH(n) > 8)
2407 com_node(c, CHILD(n, 8));
2408 com_backpatch(c, break_anchor);
2409}
2410
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002411/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002412
2413 SETUP_FINALLY L
2414 <code for S>
2415 POP_BLOCK
2416 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002417 L: <code for Sf>
2418 END_FINALLY
2419
2420 The special instructions use the block stack. Each block
2421 stack entry contains the instruction that created it (here
2422 SETUP_FINALLY), the level of the value stack at the time the
2423 block stack entry was created, and a label (here L).
2424
2425 SETUP_FINALLY:
2426 Pushes the current value stack level and the label
2427 onto the block stack.
2428 POP_BLOCK:
2429 Pops en entry from the block stack, and pops the value
2430 stack until its level is the same as indicated on the
2431 block stack. (The label is ignored.)
2432 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002433 Pops a variable number of entries from the *value* stack
2434 and re-raises the exception they specify. The number of
2435 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002436
2437 The block stack is unwound when an exception is raised:
2438 when a SETUP_FINALLY entry is found, the exception is pushed
2439 onto the value stack (and the exception condition is cleared),
2440 and the interpreter jumps to the label gotten from the block
2441 stack.
2442
2443 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002444 (The contents of the value stack is shown in [], with the top
2445 at the right; 'tb' is trace-back info, 'val' the exception's
2446 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002447
2448 Value stack Label Instruction Argument
2449 [] SETUP_EXCEPT L1
2450 [] <code for S>
2451 [] POP_BLOCK
2452 [] JUMP_FORWARD L0
2453
Guido van Rossum3f5da241990-12-20 15:06:42 +00002454 [tb, val, exc] L1: DUP )
2455 [tb, val, exc, exc] <evaluate E1> )
2456 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2457 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2458 [tb, val, exc, 1] POP )
2459 [tb, val, exc] POP
2460 [tb, val] <assign to V1> (or POP if no V1)
2461 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002462 [] <code for S1>
2463 JUMP_FORWARD L0
2464
Guido van Rossum3f5da241990-12-20 15:06:42 +00002465 [tb, val, exc, 0] L2: POP
2466 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002467 .............................etc.......................
2468
Guido van Rossum3f5da241990-12-20 15:06:42 +00002469 [tb, val, exc, 0] Ln+1: POP
2470 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002471
2472 [] L0: <next statement>
2473
2474 Of course, parts are not generated if Vi or Ei is not present.
2475*/
2476
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002477static void
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002478com_try_except(c, n)
2479 struct compiling *c;
2480 node *n;
2481{
2482 int except_anchor = 0;
2483 int end_anchor = 0;
2484 int else_anchor = 0;
2485 int i;
2486 node *ch;
2487
2488 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2489 block_push(c, SETUP_EXCEPT);
2490 com_node(c, CHILD(n, 2));
2491 com_addbyte(c, POP_BLOCK);
2492 block_pop(c, SETUP_EXCEPT);
2493 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2494 com_backpatch(c, except_anchor);
2495 for (i = 3;
2496 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2497 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002498 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002499 if (except_anchor == 0) {
Guido van Rossum452a9831996-09-17 14:32:04 +00002500 com_error(c, SyntaxError,
2501 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002502 break;
2503 }
2504 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002505 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002506 com_addoparg(c, SET_LINENO, ch->n_lineno);
2507 if (NCH(ch) > 1) {
2508 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002509 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002510 com_node(c, CHILD(ch, 1));
2511 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002512 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002513 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
2514 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002515 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002516 }
2517 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002518 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002519 if (NCH(ch) > 3)
Guido van Rossum8861b741996-07-30 16:49:37 +00002520 com_assign(c, CHILD(ch, 3), OP_ASSIGN);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002521 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002522 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002523 com_pop(c, 1);
2524 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002525 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002526 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002527 com_node(c, CHILD(n, i+2));
2528 com_addfwref(c, JUMP_FORWARD, &end_anchor);
2529 if (except_anchor) {
2530 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002531 /* We come in with [tb, val, exc, 0] on the
2532 stack; one pop and it's the same as
2533 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002534 com_addbyte(c, POP_TOP);
2535 }
2536 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002537 /* We actually come in here with [tb, val, exc] but the
2538 END_FINALLY will zap those and jump around.
2539 The c_stacklevel does not reflect them so we need not pop
2540 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002541 com_addbyte(c, END_FINALLY);
2542 com_backpatch(c, else_anchor);
2543 if (i < NCH(n))
2544 com_node(c, CHILD(n, i+2));
2545 com_backpatch(c, end_anchor);
2546}
2547
2548static void
2549com_try_finally(c, n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002550 struct compiling *c;
2551 node *n;
2552{
2553 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002554 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002555
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002556 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
2557 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002558 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002559 com_addbyte(c, POP_BLOCK);
2560 block_pop(c, SETUP_FINALLY);
2561 block_push(c, END_FINALLY);
2562 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002563 /* While the generated code pushes only one item,
2564 the try-finally handling can enter here with
2565 up to three items. OK, here are the details:
2566 3 for an exception, 2 for RETURN, 1 for BREAK. */
2567 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002568 com_backpatch(c, finally_anchor);
2569 ch = CHILD(n, NCH(n)-1);
2570 com_addoparg(c, SET_LINENO, ch->n_lineno);
2571 com_node(c, ch);
2572 com_addbyte(c, END_FINALLY);
2573 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002574 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002575}
2576
2577static void
2578com_try_stmt(c, n)
2579 struct compiling *c;
2580 node *n;
2581{
2582 REQ(n, try_stmt);
2583 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
2584 | 'try' ':' suite 'finally' ':' suite */
2585 if (TYPE(CHILD(n, 3)) != except_clause)
2586 com_try_finally(c, n);
2587 else
2588 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002589}
2590
Guido van Rossum8b993a91997-01-17 21:04:03 +00002591static node *
2592get_rawdocstring(n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002593 node *n;
2594{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002595 int i;
2596
Guido van Rossum8b993a91997-01-17 21:04:03 +00002597 /* Label to avoid tail recursion */
2598 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002599 switch (TYPE(n)) {
2600
2601 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002602 if (NCH(n) == 1) {
2603 n = CHILD(n, 0);
2604 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002605 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002606 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002607 case file_input:
2608 for (i = 0; i < NCH(n); i++) {
2609 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002610 if (TYPE(ch) == stmt) {
2611 n = ch;
2612 goto next;
2613 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002614 }
2615 break;
2616
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002617 case stmt:
2618 case simple_stmt:
2619 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002620 n = CHILD(n, 0);
2621 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002622
2623 case expr_stmt:
2624 case testlist:
2625 case test:
2626 case and_test:
2627 case not_test:
2628 case comparison:
2629 case expr:
2630 case xor_expr:
2631 case and_expr:
2632 case shift_expr:
2633 case arith_expr:
2634 case term:
2635 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00002636 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002637 if (NCH(n) == 1) {
2638 n = CHILD(n, 0);
2639 goto next;
2640 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002641 break;
2642
2643 case atom:
2644 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002645 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002646 break;
2647
2648 }
2649 return NULL;
2650}
2651
Guido van Rossum8b993a91997-01-17 21:04:03 +00002652static object *
2653get_docstring(n)
2654 node *n;
2655{
2656 n = get_rawdocstring(n);
2657 if (n == NULL)
2658 return NULL;
2659 return parsestrplus(n);
2660}
2661
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002662static void
2663com_suite(c, n)
2664 struct compiling *c;
2665 node *n;
2666{
2667 REQ(n, suite);
2668 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
2669 if (NCH(n) == 1) {
2670 com_node(c, CHILD(n, 0));
2671 }
2672 else {
2673 int i;
2674 for (i = 0; i < NCH(n); i++) {
2675 node *ch = CHILD(n, i);
2676 if (TYPE(ch) == stmt)
2677 com_node(c, ch);
2678 }
2679 }
2680}
2681
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002682/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002683static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002684com_continue_stmt(c, n)
2685 struct compiling *c;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002686 node *n; /* Not used, but passed for consistency */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002687{
2688 int i = c->c_nblocks;
2689 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
2690 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2691 }
2692 else {
Guido van Rossum452a9831996-09-17 14:32:04 +00002693 com_error(c, SyntaxError, "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002694 }
2695 /* XXX Could allow it inside a 'finally' clause
2696 XXX if we could pop the exception still on the stack */
2697}
2698
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002699static int
Guido van Rossum681d79a1995-07-18 14:51:37 +00002700com_argdefs(c, n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002701 struct compiling *c;
2702 node *n;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002703{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002704 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002705 if (TYPE(n) == lambdef) {
2706 /* lambdef: 'lambda' [varargslist] ':' test */
2707 n = CHILD(n, 1);
2708 }
2709 else {
2710 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
2711 n = CHILD(n, 2);
2712 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
2713 n = CHILD(n, 1);
2714 }
2715 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002716 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002717 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002718 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002719 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
2720 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002721 nargs = 0;
2722 ndefs = 0;
2723 for (i = 0; i < nch; i++) {
2724 int t;
Guido van Rossum50564e81996-01-12 01:13:16 +00002725 if (TYPE(CHILD(n, i)) == STAR || TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002726 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002727 nargs++;
2728 i++;
2729 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00002730 t = RPAR; /* Anything except EQUAL or COMMA */
2731 else
2732 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002733 if (t == EQUAL) {
2734 i++;
2735 ndefs++;
2736 com_node(c, CHILD(n, i));
2737 i++;
2738 if (i >= nch)
2739 break;
2740 t = TYPE(CHILD(n, i));
2741 }
2742 else {
2743 /* Treat "(a=1, b)" as "(a=1, b=None)" */
2744 if (ndefs) {
2745 com_addoparg(c, LOAD_CONST,
2746 com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002747 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002748 ndefs++;
2749 }
2750 }
2751 if (t != COMMA)
2752 break;
2753 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002754 return ndefs;
2755}
2756
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002757static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002758com_funcdef(c, n)
2759 struct compiling *c;
2760 node *n;
2761{
2762 object *v;
2763 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00002764 v = (object *)icompile(n, c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002765 if (v == NULL)
2766 c->c_errors++;
2767 else {
2768 int i = com_addconst(c, v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002769 int ndefs = com_argdefs(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002770 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002771 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002772 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002773 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002774 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002775 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002776 DECREF(v);
2777 }
2778}
2779
2780static void
Guido van Rossum25831651993-05-19 14:50:45 +00002781com_bases(c, n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002782 struct compiling *c;
2783 node *n;
2784{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002785 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002786 REQ(n, testlist);
2787 /* testlist: test (',' test)* [','] */
2788 for (i = 0; i < NCH(n); i += 2)
2789 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002790 i = (NCH(n)+1) / 2;
2791 com_addoparg(c, BUILD_TUPLE, i);
2792 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00002793}
2794
2795static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002796com_classdef(c, n)
2797 struct compiling *c;
2798 node *n;
2799{
Guido van Rossum25831651993-05-19 14:50:45 +00002800 int i;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002801 object *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002802 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00002803 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00002804 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00002805 c->c_errors++;
2806 return;
2807 }
2808 /* Push the class name on the stack */
2809 i = com_addconst(c, v);
2810 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002811 com_push(c, 1);
Guido van Rossum25831651993-05-19 14:50:45 +00002812 DECREF(v);
2813 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002814 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00002815 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002816 com_push(c, 1);
2817 }
Guido van Rossum25831651993-05-19 14:50:45 +00002818 else
2819 com_bases(c, CHILD(n, 3));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00002820 v = (object *)icompile(n, c);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002821 if (v == NULL)
2822 c->c_errors++;
2823 else {
Guido van Rossum25831651993-05-19 14:50:45 +00002824 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002825 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002826 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002827 com_addoparg(c, MAKE_FUNCTION, 0);
2828 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002829 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002830 com_pop(c, 2);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002831 com_addopname(c, STORE_NAME, CHILD(n, 1));
2832 DECREF(v);
2833 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002834}
2835
2836static void
2837com_node(c, n)
2838 struct compiling *c;
2839 node *n;
2840{
2841 switch (TYPE(n)) {
2842
2843 /* Definition nodes */
2844
2845 case funcdef:
2846 com_funcdef(c, n);
2847 break;
2848 case classdef:
2849 com_classdef(c, n);
2850 break;
2851
2852 /* Trivial parse tree nodes */
2853
2854 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002855 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002856 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002857 com_node(c, CHILD(n, 0));
2858 break;
2859
2860 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002861 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
2862 com_addoparg(c, SET_LINENO, n->n_lineno);
2863 {
2864 int i;
2865 for (i = 0; i < NCH(n)-1; i += 2)
2866 com_node(c, CHILD(n, i));
2867 }
2868 break;
2869
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002870 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002871 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002872 com_node(c, CHILD(n, 0));
2873 break;
2874
2875 /* Statement nodes */
2876
2877 case expr_stmt:
2878 com_expr_stmt(c, n);
2879 break;
2880 case print_stmt:
2881 com_print_stmt(c, n);
2882 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002883 case del_stmt: /* 'del' exprlist */
Guido van Rossum8861b741996-07-30 16:49:37 +00002884 com_assign(c, CHILD(n, 1), OP_DELETE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002885 break;
2886 case pass_stmt:
2887 break;
2888 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002889 if (c->c_loops == 0) {
Guido van Rossum452a9831996-09-17 14:32:04 +00002890 com_error(c, SyntaxError, "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002891 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002892 com_addbyte(c, BREAK_LOOP);
2893 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002894 case continue_stmt:
2895 com_continue_stmt(c, n);
2896 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002897 case return_stmt:
2898 com_return_stmt(c, n);
2899 break;
2900 case raise_stmt:
2901 com_raise_stmt(c, n);
2902 break;
2903 case import_stmt:
2904 com_import_stmt(c, n);
2905 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002906 case global_stmt:
2907 com_global_stmt(c, n);
2908 break;
Guido van Rossum0dfcf751996-08-12 22:00:53 +00002909#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum25831651993-05-19 14:50:45 +00002910 case access_stmt:
2911 com_access_stmt(c, n);
2912 break;
Guido van Rossum0dfcf751996-08-12 22:00:53 +00002913#endif
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002914 case exec_stmt:
2915 com_exec_stmt(c, n);
2916 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002917 case assert_stmt:
2918 com_assert_stmt(c, n);
2919 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002920 case if_stmt:
2921 com_if_stmt(c, n);
2922 break;
2923 case while_stmt:
2924 com_while_stmt(c, n);
2925 break;
2926 case for_stmt:
2927 com_for_stmt(c, n);
2928 break;
2929 case try_stmt:
2930 com_try_stmt(c, n);
2931 break;
2932 case suite:
2933 com_suite(c, n);
2934 break;
2935
2936 /* Expression nodes */
2937
2938 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002939 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002940 break;
2941 case test:
2942 com_test(c, n);
2943 break;
2944 case and_test:
2945 com_and_test(c, n);
2946 break;
2947 case not_test:
2948 com_not_test(c, n);
2949 break;
2950 case comparison:
2951 com_comparison(c, n);
2952 break;
2953 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002954 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002955 break;
2956 case expr:
2957 com_expr(c, n);
2958 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002959 case xor_expr:
2960 com_xor_expr(c, n);
2961 break;
2962 case and_expr:
2963 com_and_expr(c, n);
2964 break;
2965 case shift_expr:
2966 com_shift_expr(c, n);
2967 break;
2968 case arith_expr:
2969 com_arith_expr(c, n);
2970 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002971 case term:
2972 com_term(c, n);
2973 break;
2974 case factor:
2975 com_factor(c, n);
2976 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00002977 case power:
2978 com_power(c, n);
2979 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002980 case atom:
2981 com_atom(c, n);
2982 break;
2983
2984 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002985 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum452a9831996-09-17 14:32:04 +00002986 com_error(c, SystemError, "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002987 }
2988}
2989
2990static void com_fplist PROTO((struct compiling *, node *));
2991
2992static void
2993com_fpdef(c, n)
2994 struct compiling *c;
2995 node *n;
2996{
2997 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
2998 if (TYPE(CHILD(n, 0)) == LPAR)
2999 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003000 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003001 com_addoparg(c, STORE_FAST, com_newlocal(c, STR(CHILD(n, 0))));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003002 com_pop(c, 1);
3003 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003004}
3005
3006static void
3007com_fplist(c, n)
3008 struct compiling *c;
3009 node *n;
3010{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003011 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003012 if (NCH(n) == 1) {
3013 com_fpdef(c, CHILD(n, 0));
3014 }
3015 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003016 int i = (NCH(n)+1)/2;
3017 com_addoparg(c, UNPACK_TUPLE, i);
3018 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003019 for (i = 0; i < NCH(n); i += 2)
3020 com_fpdef(c, CHILD(n, i));
3021 }
3022}
3023
3024static void
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003025com_arglist(c, n)
3026 struct compiling *c;
3027 node *n;
3028{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003029 int nch, i;
3030 int complex = 0;
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003031 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003032 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003033 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003034 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003035 /* Enter all arguments in table of locals */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003036 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003037 node *ch = CHILD(n, i);
3038 node *fp;
3039 char *name;
Guido van Rossum50564e81996-01-12 01:13:16 +00003040 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003041 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003042 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3043 fp = CHILD(ch, 0);
3044 if (TYPE(fp) == NAME)
3045 name = STR(fp);
3046 else {
3047 name = "";
Guido van Rossum530956d1996-07-21 02:27:43 +00003048 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003049 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003050 com_newlocal(c, name);
3051 c->c_argcount++;
3052 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003053 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003054 ch = CHILD(n, i);
3055 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003056 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003057 else
3058 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003059 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003060 /* Handle *arguments */
3061 if (i < nch) {
3062 node *ch;
3063 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003064 if (TYPE(ch) != DOUBLESTAR) {
3065 REQ(ch, STAR);
3066 ch = CHILD(n, i+1);
3067 if (TYPE(ch) == NAME) {
3068 c->c_flags |= CO_VARARGS;
3069 i += 3;
3070 com_newlocal(c, STR(ch));
3071 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003072 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003073 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003074 /* Handle **keywords */
3075 if (i < nch) {
3076 node *ch;
3077 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003078 if (TYPE(ch) != DOUBLESTAR) {
3079 REQ(ch, STAR);
3080 ch = CHILD(n, i+1);
3081 REQ(ch, STAR);
3082 ch = CHILD(n, i+2);
3083 }
3084 else
3085 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003086 REQ(ch, NAME);
3087 c->c_flags |= CO_VARKEYWORDS;
3088 com_newlocal(c, STR(ch));
3089 }
3090 if (complex) {
3091 /* Generate code for complex arguments only after
3092 having counted the simple arguments */
3093 int ilocal = 0;
3094 for (i = 0; i < nch; i++) {
3095 node *ch = CHILD(n, i);
3096 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003097 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003098 break;
3099 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3100 fp = CHILD(ch, 0);
3101 if (TYPE(fp) != NAME) {
3102 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003103 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003104 com_fpdef(c, ch);
3105 }
3106 ilocal++;
3107 if (++i >= nch)
3108 break;
3109 ch = CHILD(n, i);
3110 if (TYPE(ch) == EQUAL)
3111 i += 2;
3112 else
3113 REQ(ch, COMMA);
3114 }
3115 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003116}
3117
3118static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003119com_file_input(c, n)
3120 struct compiling *c;
3121 node *n;
3122{
3123 int i;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003124 object *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003125 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003126 doc = get_docstring(n);
3127 if (doc != NULL) {
3128 int i = com_addconst(c, doc);
3129 DECREF(doc);
3130 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003131 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003132 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003133 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003134 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003135 for (i = 0; i < NCH(n); i++) {
3136 node *ch = CHILD(n, i);
3137 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3138 com_node(c, ch);
3139 }
3140}
3141
3142/* Top-level compile-node interface */
3143
3144static void
3145compile_funcdef(c, n)
3146 struct compiling *c;
3147 node *n;
3148{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003149 object *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003150 node *ch;
3151 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003152 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003153 doc = get_docstring(CHILD(n, 4));
3154 if (doc != NULL) {
3155 (void) com_addconst(c, doc);
3156 DECREF(doc);
3157 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003158 else
3159 (void) com_addconst(c, None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003160 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3161 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003162 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003163 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003164 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003165 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003166 c->c_infunction = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003167 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003168 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003169 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003170 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003171}
3172
3173static void
Guido van Rossum590baa41993-11-30 13:40:46 +00003174compile_lambdef(c, n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003175 struct compiling *c;
3176 node *n;
3177{
Guido van Rossum590baa41993-11-30 13:40:46 +00003178 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003179 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003180 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003181
3182 ch = CHILD(n, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003183 (void) com_addconst(c, None); /* No docstring */
3184 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003185 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003186 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003187 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003188 else
3189 ch = CHILD(n, 2);
3190 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003191 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003192 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003193}
3194
3195static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003196compile_classdef(c, n)
3197 struct compiling *c;
3198 node *n;
3199{
3200 node *ch;
3201 object *doc;
3202 REQ(n, classdef);
3203 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3204 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003205#ifdef PRIVATE_NAME_MANGLING
3206 c->c_private = c->c_name;
3207#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003208 ch = CHILD(n, NCH(n)-1); /* The suite */
3209 doc = get_docstring(ch);
3210 if (doc != NULL) {
3211 int i = com_addconst(c, doc);
3212 DECREF(doc);
3213 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003214 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003215 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003216 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003217 }
3218 else
3219 (void) com_addconst(c, None);
3220 com_node(c, ch);
3221 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003222 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003223 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003224 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003225}
3226
3227static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003228compile_node(c, n)
3229 struct compiling *c;
3230 node *n;
3231{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003232 com_addoparg(c, SET_LINENO, n->n_lineno);
3233
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003234 switch (TYPE(n)) {
3235
Guido van Rossum4c417781991-01-21 16:09:22 +00003236 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003237 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003238 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003239 n = CHILD(n, 0);
3240 if (TYPE(n) != NEWLINE)
3241 com_node(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003242 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003243 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003244 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003245 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003246 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003247 break;
3248
Guido van Rossum4c417781991-01-21 16:09:22 +00003249 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003250 com_file_input(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003251 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003252 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003253 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003254 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003255 break;
3256
Guido van Rossum590baa41993-11-30 13:40:46 +00003257 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003258 com_node(c, CHILD(n, 0));
3259 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003260 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003261 break;
3262
Guido van Rossum590baa41993-11-30 13:40:46 +00003263 case lambdef: /* anonymous function definition */
3264 compile_lambdef(c, n);
3265 break;
3266
Guido van Rossum4c417781991-01-21 16:09:22 +00003267 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003268 compile_funcdef(c, n);
3269 break;
3270
Guido van Rossum4c417781991-01-21 16:09:22 +00003271 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003272 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003273 break;
3274
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003275 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003276 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum452a9831996-09-17 14:32:04 +00003277 com_error(c, SystemError,
3278 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003279 }
3280}
3281
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003282/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00003283
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003284 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
3285 instructions that refer to local variables with LOAD_FAST etc.
3286 The latter instructions are much faster because they don't need to
3287 look up the variable name in a dictionary.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003288
Guido van Rossum681d79a1995-07-18 14:51:37 +00003289 To find all local variables, we check all STORE_NAME, IMPORT_FROM
3290 and DELETE_NAME instructions. This yields all local variables,
3291 function definitions, class definitions and import statements.
3292 Argument names have already been entered into the list by the
3293 special processing for the argument list.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003294
3295 All remaining LOAD_NAME instructions must refer to non-local (global
3296 or builtin) variables, so are replaced by LOAD_GLOBAL.
3297
3298 There are two problems: 'from foo import *' and 'exec' may introduce
3299 local variables that we can't know while compiling. If this is the
Guido van Rossum681d79a1995-07-18 14:51:37 +00003300 case, we can still optimize bona fide locals (since those
3301 statements will be surrounded by fast_2_locals() and
3302 locals_2_fast()), but we can't change LOAD_NAME to LOAD_GLOBAL.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003303
Guido van Rossum681d79a1995-07-18 14:51:37 +00003304 NB: this modifies the string object c->c_code! */
Guido van Rossum282914b1991-04-04 10:42:56 +00003305
3306static void
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003307optimize(c)
3308 struct compiling *c;
Guido van Rossum282914b1991-04-04 10:42:56 +00003309{
Guido van Rossum0a697f61991-04-16 08:39:12 +00003310 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00003311 int opcode;
Guido van Rossum80bb9651996-12-05 23:27:02 +00003312 int oparg = 0;
Guido van Rossum282914b1991-04-04 10:42:56 +00003313 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003314 object *error_type, *error_value, *error_traceback;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003315
Guido van Rossum282914b1991-04-04 10:42:56 +00003316#define NEXTOP() (*next_instr++)
3317#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
3318#define GETITEM(v, i) (getlistitem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003319#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
3320
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003321 err_fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003322
3323 c->c_flags |= CO_OPTIMIZED;
Guido van Rossum282914b1991-04-04 10:42:56 +00003324
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003325 next_instr = (unsigned char *) getstringvalue(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003326 for (;;) {
3327 opcode = NEXTOP();
3328 if (opcode == STOP_CODE)
3329 break;
3330 if (HAS_ARG(opcode))
3331 oparg = NEXTARG();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003332 switch (opcode) {
3333 case STORE_NAME:
3334 case DELETE_NAME:
3335 case IMPORT_FROM:
3336 com_addlocal_o(c, GETNAMEOBJ(oparg));
3337 break;
3338 case EXEC_STMT:
3339 c->c_flags &= ~CO_OPTIMIZED;
3340 break;
Guido van Rossum282914b1991-04-04 10:42:56 +00003341 }
3342 }
3343
Guido van Rossum681d79a1995-07-18 14:51:37 +00003344 if (dictlookup(c->c_locals, "*") != NULL)
3345 c->c_flags &= ~CO_OPTIMIZED;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003346
3347 next_instr = (unsigned char *) getstringvalue(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003348 for (;;) {
3349 cur_instr = next_instr;
3350 opcode = NEXTOP();
3351 if (opcode == STOP_CODE)
3352 break;
3353 if (HAS_ARG(opcode))
3354 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003355 if (opcode == LOAD_NAME ||
3356 opcode == STORE_NAME ||
3357 opcode == DELETE_NAME) {
3358 object *v;
3359 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00003360 name = GETNAMEOBJ(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003361 v = dict2lookup(c->c_locals, name);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003362 if (v == NULL) {
Guido van Rossum83163251991-08-16 08:58:43 +00003363 err_clear();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003364 if (opcode == LOAD_NAME &&
3365 (c->c_flags&CO_OPTIMIZED))
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003366 cur_instr[0] = LOAD_GLOBAL;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003367 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00003368 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003369 i = getintvalue(v);
3370 switch (opcode) {
3371 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
3372 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
3373 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
3374 }
3375 cur_instr[1] = i & 0xff;
3376 cur_instr[2] = (i>>8) & 0xff;
Guido van Rossum282914b1991-04-04 10:42:56 +00003377 }
3378 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003379
Guido van Rossum681d79a1995-07-18 14:51:37 +00003380 if (c->c_errors == 0)
3381 err_restore(error_type, error_value, error_traceback);
Guido van Rossum282914b1991-04-04 10:42:56 +00003382}
3383
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003384codeobject *
Guido van Rossum590baa41993-11-30 13:40:46 +00003385compile(n, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003386 node *n;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003387 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003388{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003389 return jcompile(n, filename, NULL);
3390}
3391
3392static codeobject *
3393icompile(n, base)
3394 node *n;
3395 struct compiling *base;
3396{
3397 return jcompile(n, base->c_filename, base);
3398}
3399
3400static codeobject *
3401jcompile(n, filename, base)
3402 node *n;
3403 char *filename;
3404 struct compiling *base;
3405{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003406 struct compiling sc;
3407 codeobject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003408 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003409 return NULL;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003410#ifdef PRIVATE_NAME_MANGLING
3411 if (base)
3412 sc.c_private = base->c_private;
3413 else
3414 sc.c_private = NULL;
3415#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003416 compile_node(&sc, n);
3417 com_done(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003418 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003419 optimize(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003420 sc.c_flags |= CO_NEWLOCALS;
3421 }
3422 else if (TYPE(n) == classdef)
3423 sc.c_flags |= CO_NEWLOCALS;
Guido van Rossum9bfef441993-03-29 10:43:31 +00003424 co = NULL;
3425 if (sc.c_errors == 0) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003426 object *consts, *names, *varnames, *filename, *name;
3427 consts = listtuple(sc.c_consts);
3428 names = listtuple(sc.c_names);
3429 varnames = listtuple(sc.c_varnames);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003430 filename = PyString_InternFromString(sc.c_filename);
3431 name = PyString_InternFromString(sc.c_name);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003432 if (!err_occurred())
3433 co = newcodeobject(sc.c_argcount,
3434 sc.c_nlocals,
Guido van Rossum8b993a91997-01-17 21:04:03 +00003435 sc.c_maxstacklevel,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003436 sc.c_flags,
3437 sc.c_code,
3438 consts,
3439 names,
3440 varnames,
3441 filename,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003442 name,
3443 sc.c_firstlineno,
3444 sc.c_lnotab);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003445 XDECREF(consts);
3446 XDECREF(names);
3447 XDECREF(varnames);
3448 XDECREF(filename);
3449 XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003450 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003451 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003452 return co;
3453}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003454
3455int
3456PyCode_Addr2Line(co, addrq)
3457 PyCodeObject *co;
3458 int addrq;
3459{
3460 int size = PyString_Size(co->co_lnotab) / 2;
3461 char *p = PyString_AsString(co->co_lnotab);
3462 int line = co->co_firstlineno;
3463 int addr = 0;
3464 while (--size >= 0) {
3465 addr += *p++;
3466 if (addr > addrq)
3467 break;
3468 line += *p++;
3469 }
3470 return line;
3471}