blob: 0338d6ff45f37569d913fc4c26b392695c9b5e41 [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 Rossuma082ce41991-06-04 19:41:56 +0000185codeobject *
Guido van Rossum8b993a91997-01-17 21:04:03 +0000186newcodeobject(argcount, nlocals, stacksize, flags,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000187 code, consts, names, varnames, filename, name,
188 firstlineno, lnotab)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000189 int argcount;
190 int nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000191 int stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000192 int flags;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000193 object *code;
194 object *consts;
195 object *names;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000196 object *varnames;
Guido van Rossuma082ce41991-06-04 19:41:56 +0000197 object *filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000198 object *name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000199 int firstlineno;
200 object *lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000201{
202 codeobject *co;
203 int i;
204 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000205 if (argcount < 0 || nlocals < 0 ||
206 code == NULL || !is_stringobject(code) ||
207 consts == NULL || !is_tupleobject(consts) ||
208 names == NULL || !is_tupleobject(names) ||
209 varnames == NULL || !is_tupleobject(varnames) ||
210 name == NULL || !is_stringobject(name) ||
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000211 filename == NULL || !is_stringobject(filename) ||
212 lnotab == NULL || !is_stringobject(lnotab)) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000213 err_badcall();
214 return NULL;
215 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000216 /* Make sure names and varnames are all strings, & intern them */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000217 for (i = gettuplesize(names); --i >= 0; ) {
218 object *v = gettupleitem(names, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000219 if (v == NULL || !is_stringobject(v)) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000220 err_badcall();
221 return NULL;
222 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000223 PyString_InternInPlace(&PyTuple_GET_ITEM(names, i));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000224 }
225 for (i = gettuplesize(varnames); --i >= 0; ) {
226 object *v = gettupleitem(varnames, i);
227 if (v == NULL || !is_stringobject(v)) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000228 err_badcall();
229 return NULL;
230 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000231 PyString_InternInPlace(&PyTuple_GET_ITEM(varnames, i));
232 }
233 /* Intern selected string constants */
234 for (i = gettuplesize(consts); --i >= 0; ) {
235 object *v = gettupleitem(consts, i);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000236 char *p;
237 if (!is_stringobject(v))
238 continue;
239 p = getstringvalue(v);
240 if (strspn(p, "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz")
241 != getstringsize(v))
242 continue;
243 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000244 }
245 co = NEWOBJ(codeobject, &Codetype);
246 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000247 co->co_argcount = argcount;
248 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000249 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000250 co->co_flags = flags;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000251 INCREF(code);
252 co->co_code = (stringobject *)code;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000253 INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000254 co->co_consts = consts;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000255 INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000256 co->co_names = names;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000257 INCREF(varnames);
258 co->co_varnames = varnames;
Guido van Rossuma082ce41991-06-04 19:41:56 +0000259 INCREF(filename);
260 co->co_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000261 INCREF(name);
262 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000263 co->co_firstlineno = firstlineno;
264 INCREF(lnotab);
265 co->co_lnotab = lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000266 }
267 return co;
268}
269
270
271/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000272
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000273struct compiling {
274 object *c_code; /* string */
275 object *c_consts; /* list of objects */
276 object *c_names; /* list of strings (names) */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000277 object *c_globals; /* dictionary (value=None) */
278 object *c_locals; /* dictionary (value=localID) */
279 object *c_varnames; /* list (inverse of c_locals) */
280 int c_nlocals; /* index of next local */
281 int c_argcount; /* number of top-level arguments */
282 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000283 int c_nexti; /* index into c_code */
284 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000285 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000286 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000287 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000288 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000289 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000290 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000291 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000292 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000293 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000294 int c_stacklevel; /* Current stack level */
295 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000296 int c_firstlineno;
297 object *c_lnotab; /* Table mapping address to line number */
298 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000299#ifdef PRIVATE_NAME_MANGLING
300 char *c_private; /* for private name mangling */
301#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000302};
303
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000304
Guido van Rossum452a9831996-09-17 14:32:04 +0000305/* Error message including line number */
306
307static void
308com_error(c, exc, msg)
309 struct compiling *c;
310 object *exc;
311 char *msg;
312{
313 int n = strlen(msg);
314 object *v;
315 char buffer[30];
316 char *s;
Guido van Rossum635abd21997-01-06 22:56:52 +0000317 c->c_errors++;
Guido van Rossum452a9831996-09-17 14:32:04 +0000318 if (c->c_lineno <= 1) {
319 /* Unknown line number or single interactive command */
320 err_setstr(exc, msg);
321 return;
322 }
323 sprintf(buffer, " (line %d)", c->c_lineno);
324 v = newsizedstringobject((char *)NULL, n + strlen(buffer));
325 if (v == NULL)
326 return; /* MemoryError, too bad */
327 s = GETSTRINGVALUE((stringobject *)v);
328 strcpy(s, msg);
329 strcat(s, buffer);
330 err_setval(exc, v);
331 DECREF(v);
Guido van Rossum452a9831996-09-17 14:32:04 +0000332}
333
334
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000335/* Interface to the block stack */
336
337static void
338block_push(c, type)
339 struct compiling *c;
340 int type;
341{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000342 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum452a9831996-09-17 14:32:04 +0000343 com_error(c, SystemError, "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000344 }
345 else {
346 c->c_block[c->c_nblocks++] = type;
347 }
348}
349
350static void
351block_pop(c, type)
352 struct compiling *c;
353 int type;
354{
355 if (c->c_nblocks > 0)
356 c->c_nblocks--;
357 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum452a9831996-09-17 14:32:04 +0000358 com_error(c, SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000359 }
360}
361
362
Guido van Rossum681d79a1995-07-18 14:51:37 +0000363/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000364
Guido van Rossum590baa41993-11-30 13:40:46 +0000365static int com_init PROTO((struct compiling *, char *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000366static void com_free PROTO((struct compiling *));
Guido van Rossum8b993a91997-01-17 21:04:03 +0000367static void com_push PROTO((struct compiling *, int));
368static void com_pop PROTO((struct compiling *, int));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000369static void com_done PROTO((struct compiling *));
370static void com_node PROTO((struct compiling *, struct _node *));
Guido van Rossum50564e81996-01-12 01:13:16 +0000371static void com_factor PROTO((struct compiling *, struct _node *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000372static void com_addbyte PROTO((struct compiling *, int));
373static void com_addint PROTO((struct compiling *, int));
374static void com_addoparg PROTO((struct compiling *, int, int));
375static void com_addfwref PROTO((struct compiling *, int, int *));
376static void com_backpatch PROTO((struct compiling *, int));
377static int com_add PROTO((struct compiling *, object *, object *));
378static int com_addconst PROTO((struct compiling *, object *));
379static int com_addname PROTO((struct compiling *, object *));
380static void com_addopname PROTO((struct compiling *, int, node *));
Guido van Rossum288a60f1991-12-16 13:05:10 +0000381static void com_list PROTO((struct compiling *, node *, int));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000382static int com_argdefs PROTO((struct compiling *, node *));
383static int com_newlocal PROTO((struct compiling *, char *));
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000384static codeobject *icompile PROTO((struct _node *, struct compiling *));
385static codeobject *jcompile PROTO((struct _node *, char *, struct compiling *));
Guido van Rossum6af0c001997-03-11 21:25:55 +0000386static object *parsestrplus PROTO((node *));
387static object *parsestr PROTO((char *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000388
389static int
Guido van Rossum590baa41993-11-30 13:40:46 +0000390com_init(c, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000391 struct compiling *c;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000392 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000393{
Guido van Rossum62d46241991-04-03 19:00:23 +0000394 if ((c->c_code = newsizedstringobject((char *)NULL, 1000)) == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000395 goto fail_3;
396 if ((c->c_consts = newlistobject(0)) == NULL)
397 goto fail_2;
398 if ((c->c_names = newlistobject(0)) == NULL)
399 goto fail_1;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000400 if ((c->c_globals = newdictobject()) == NULL)
401 goto fail_0;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000402 if ((c->c_locals = newdictobject()) == NULL)
403 goto fail_00;
404 if ((c->c_varnames = newlistobject(0)) == NULL)
405 goto fail_000;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000406 if ((c->c_lnotab = newsizedstringobject((char *)NULL, 1000)) == NULL)
407 goto fail_0000;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000408 c->c_nlocals = 0;
409 c->c_argcount = 0;
410 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000411 c->c_nexti = 0;
412 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000413 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000414 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000415 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000416 c->c_begin = 0;
417 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000418 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000419 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000420 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000421 c->c_stacklevel = 0;
422 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000423 c->c_firstlineno = 0;
424 c->c_last_addr = 0;
425 c->c_last_line = 0;
426 c-> c_lnotab_next = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000427 return 1;
428
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000429 fail_0000:
430 DECREF(c->c_lnotab);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000431 fail_000:
432 DECREF(c->c_locals);
433 fail_00:
434 DECREF(c->c_globals);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000435 fail_0:
436 DECREF(c->c_names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000437 fail_1:
438 DECREF(c->c_consts);
439 fail_2:
440 DECREF(c->c_code);
441 fail_3:
442 return 0;
443}
444
445static void
446com_free(c)
447 struct compiling *c;
448{
449 XDECREF(c->c_code);
450 XDECREF(c->c_consts);
451 XDECREF(c->c_names);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000452 XDECREF(c->c_globals);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000453 XDECREF(c->c_locals);
454 XDECREF(c->c_varnames);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000455 XDECREF(c->c_lnotab);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000456}
457
458static void
Guido van Rossum8b993a91997-01-17 21:04:03 +0000459com_push(c, n)
460 struct compiling *c;
461 int n;
462{
463 c->c_stacklevel += n;
464 if (c->c_stacklevel > c->c_maxstacklevel)
465 c->c_maxstacklevel = c->c_stacklevel;
466}
467
468static void
469com_pop(c, n)
470 struct compiling *c;
471 int n;
472{
473 if (c->c_stacklevel < n) {
474 fprintf(stderr,
475 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
476 c->c_filename, c->c_lineno,
477 c->c_nexti, c->c_stacklevel, n);
478 c->c_stacklevel = 0;
479 }
480 else
481 c->c_stacklevel -= n;
482}
483
484static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000485com_done(c)
486 struct compiling *c;
487{
488 if (c->c_code != NULL)
489 resizestring(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000490 if (c->c_lnotab != NULL)
491 resizestring(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000492}
493
494static void
495com_addbyte(c, byte)
496 struct compiling *c;
497 int byte;
498{
499 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000500 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000501 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000502 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000503 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000504 fatal("com_addbyte: byte out of range");
Guido van Rossum01cfd441991-10-20 20:12:38 +0000505 */
Guido van Rossum452a9831996-09-17 14:32:04 +0000506 com_error(c, SystemError, "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000507 }
508 if (c->c_code == NULL)
509 return;
510 len = getstringsize(c->c_code);
511 if (c->c_nexti >= len) {
512 if (resizestring(&c->c_code, len+1000) != 0) {
513 c->c_errors++;
514 return;
515 }
516 }
517 getstringvalue(c->c_code)[c->c_nexti++] = byte;
518}
519
520static void
521com_addint(c, x)
522 struct compiling *c;
523 int x;
524{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000525 com_addbyte(c, x & 0xff);
526 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000527}
528
529static void
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000530com_add_lnotab(c, addr, line)
531 struct compiling *c;
532 int addr;
533 int line;
534{
535 int size;
536 char *p;
537 if (c->c_lnotab == NULL)
538 return;
539 size = getstringsize(c->c_lnotab);
540 if (c->c_lnotab_next+2 > size) {
541 if (resizestring(&c->c_lnotab, size + 1000) < 0) {
542 c->c_errors++;
543 return;
544 }
545 }
546 p = getstringvalue(c->c_lnotab) + c->c_lnotab_next;
547 *p++ = addr;
548 *p++ = line;
549 c->c_lnotab_next += 2;
550}
551
552static void
553com_set_lineno(c, lineno)
554 struct compiling *c;
555 int lineno;
556{
557 c->c_lineno = lineno;
558 if (c->c_firstlineno == 0) {
559 c->c_firstlineno = c->c_last_line = lineno;
560 }
561 else {
562 int incr_addr = c->c_nexti - c->c_last_addr;
563 int incr_line = lineno - c->c_last_line;
564 while (incr_addr > 0 || incr_line > 0) {
565 int trunc_addr = incr_addr;
566 int trunc_line = incr_line;
567 if (trunc_addr > 255)
568 trunc_addr = 255;
569 if (trunc_line > 255)
570 trunc_line = 255;
571 com_add_lnotab(c, trunc_addr, trunc_line);
572 incr_addr -= trunc_addr;
573 incr_line -= trunc_line;
574 }
575 c->c_last_addr = c->c_nexti;
576 c->c_last_line = lineno;
577 }
578}
579
580static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000581com_addoparg(c, op, arg)
582 struct compiling *c;
583 int op;
584 int arg;
585{
Guido van Rossum8e793d91997-03-03 19:13:14 +0000586 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000587 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000588 if (Py_OptimizeFlag)
589 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000590 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000591 com_addbyte(c, op);
592 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000593}
594
595static void
596com_addfwref(c, op, p_anchor)
597 struct compiling *c;
598 int op;
599 int *p_anchor;
600{
601 /* Compile a forward reference for backpatching */
602 int here;
603 int anchor;
604 com_addbyte(c, op);
605 here = c->c_nexti;
606 anchor = *p_anchor;
607 *p_anchor = here;
608 com_addint(c, anchor == 0 ? 0 : here - anchor);
609}
610
611static void
612com_backpatch(c, anchor)
613 struct compiling *c;
614 int anchor; /* Must be nonzero */
615{
616 unsigned char *code = (unsigned char *) getstringvalue(c->c_code);
617 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000618 int dist;
619 int prev;
620 for (;;) {
621 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000622 prev = code[anchor] + (code[anchor+1] << 8);
623 dist = target - (anchor+2);
624 code[anchor] = dist & 0xff;
625 code[anchor+1] = dist >> 8;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000626 if (!prev)
627 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000628 anchor -= prev;
629 }
630}
631
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000632/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000633
634static int
635com_add(c, list, v)
636 struct compiling *c;
637 object *list;
638 object *v;
639{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000640 int n = getlistsize(list);
641 int i;
642 for (i = n; --i >= 0; ) {
643 object *w = getlistitem(list, i);
Guido van Rossumefc0bd01991-07-01 18:44:20 +0000644 if (v->ob_type == w->ob_type && cmpobject(v, w) == 0)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000645 return i;
646 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000647 if (addlistitem(list, v) != 0)
648 c->c_errors++;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000649 return n;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000650}
651
652static int
653com_addconst(c, v)
654 struct compiling *c;
655 object *v;
656{
657 return com_add(c, c->c_consts, v);
658}
659
660static int
661com_addname(c, v)
662 struct compiling *c;
663 object *v;
664{
665 return com_add(c, c->c_names, v);
666}
667
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000668#ifdef PRIVATE_NAME_MANGLING
669static int
670com_mangle(c, name, buffer, maxlen)
671 struct compiling *c;
672 char *name;
673 char *buffer;
674 int maxlen;
675{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000676 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000677 This is independent from how the name is used. */
678 char *p;
679 int nlen, plen;
680 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000681 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000682 return 0; /* Don't mangle __extremely_long_names */
683 if (name[nlen-1] == '_' && name[nlen-2] == '_')
684 return 0; /* Don't mangle __whatever__ */
685 p = c->c_private;
686 /* Strip leading underscores from class name */
687 while (*p == '_')
688 p++;
689 if (*p == '\0')
690 return 0; /* Don't mangle if class is just underscores */
691 plen = strlen(p);
692 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000693 plen = maxlen-nlen-2; /* Truncate class name if too long */
694 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000695 buffer[0] = '_';
696 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000697 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000698 /* fprintf(stderr, "mangle %s -> %s\n", name, buffer); */
699 return 1;
700}
701#endif
702
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000703static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000704com_addopnamestr(c, op, name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000705 struct compiling *c;
706 int op;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000707 char *name;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000708{
709 object *v;
710 int i;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000711#ifdef PRIVATE_NAME_MANGLING
712 char buffer[256];
713 if (name != NULL && name[0] == '_' && name[1] == '_' &&
714 c->c_private != NULL &&
715 com_mangle(c, name, buffer, (int)sizeof(buffer)))
716 name = buffer;
717#endif
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000718 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000719 c->c_errors++;
720 i = 255;
721 }
722 else {
723 i = com_addname(c, v);
724 DECREF(v);
725 }
Guido van Rossumc5e96291991-12-10 13:53:51 +0000726 /* Hack to replace *_NAME opcodes by *_GLOBAL if necessary */
727 switch (op) {
728 case LOAD_NAME:
729 case STORE_NAME:
730 case DELETE_NAME:
731 if (dictlookup(c->c_globals, name) != NULL) {
732 switch (op) {
733 case LOAD_NAME: op = LOAD_GLOBAL; break;
734 case STORE_NAME: op = STORE_GLOBAL; break;
735 case DELETE_NAME: op = DELETE_GLOBAL; break;
736 }
737 }
738 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000739 com_addoparg(c, op, i);
740}
741
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000742static void
743com_addopname(c, op, n)
744 struct compiling *c;
745 int op;
746 node *n;
747{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000748 char *name;
749 char buffer[1000];
750 /* XXX it is possible to write this code without the 1000
751 chars on the total length of dotted names, I just can't be
752 bothered right now */
753 if (TYPE(n) == STAR)
754 name = "*";
755 else if (TYPE(n) == dotted_name) {
756 char *p = buffer;
757 int i;
758 name = buffer;
759 for (i = 0; i < NCH(n); i += 2) {
760 char *s = STR(CHILD(n, i));
761 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum452a9831996-09-17 14:32:04 +0000762 com_error(c, MemoryError,
763 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +0000764 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000765 break;
766 }
767 if (p != buffer)
768 *p++ = '.';
769 strcpy(p, s);
770 p = strchr(p, '\0');
771 }
772 }
773 else {
774 REQ(n, NAME);
775 name = STR(n);
776 }
777 com_addopnamestr(c, op, name);
778}
779
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000780static object *
Guido van Rossum452a9831996-09-17 14:32:04 +0000781parsenumber(co, s)
782 struct compiling *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000783 char *s;
784{
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000785 extern long mystrtol PROTO((const char *, char **, int));
786 extern unsigned long mystrtoul PROTO((const char *, char **, int));
787 extern double atof PROTO((const char *));
Guido van Rossumc5e96291991-12-10 13:53:51 +0000788 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000789 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000790 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +0000791#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +0000792 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +0000793 int imflag;
794#endif
795
Guido van Rossum282914b1991-04-04 10:42:56 +0000796 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000797 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +0000798#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +0000799 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +0000800#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000801 if (*end == 'l' || *end == 'L')
Guido van Rossumc5e96291991-12-10 13:53:51 +0000802 return long_scan(s, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000803 if (s[0] == '0')
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000804 x = (long) mystrtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000805 else
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000806 x = mystrtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +0000807 if (*end == '\0') {
808 if (errno != 0) {
Guido van Rossum452a9831996-09-17 14:32:04 +0000809 com_error(co, OverflowError,
810 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000811 return NULL;
812 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000813 return newintobject(x);
Guido van Rossum282914b1991-04-04 10:42:56 +0000814 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000815 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +0000816#ifndef WITHOUT_COMPLEX
817 if (imflag) {
818 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000819 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +0000820 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000821 PyFPE_END_PROTECT(c)
Guido van Rossum50564e81996-01-12 01:13:16 +0000822 return newcomplexobject(c);
823 }
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000824 else {
Guido van Rossum50564e81996-01-12 01:13:16 +0000825#endif
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000826 PyFPE_START_PROTECT("atof", return 0)
827 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +0000828 PyFPE_END_PROTECT(dx)
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000829 return newfloatobject(dx);
830 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000831}
832
833static object *
834parsestr(s)
835 char *s;
836{
837 object *v;
838 int len;
839 char *buf;
840 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000841 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000842 int c;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000843 int quote = *s;
844 if (quote != '\'' && quote != '\"') {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000845 err_badcall();
846 return NULL;
847 }
848 s++;
849 len = strlen(s);
Guido van Rossum8054fad1993-10-26 15:19:44 +0000850 if (s[--len] != quote) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000851 err_badcall();
852 return NULL;
853 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000854 if (len >= 4 && s[0] == quote && s[1] == quote) {
855 s += 2;
856 len -= 2;
857 if (s[--len] != quote || s[--len] != quote) {
858 err_badcall();
859 return NULL;
860 }
861 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000862 if (strchr(s, '\\') == NULL)
863 return newsizedstringobject(s, len);
864 v = newsizedstringobject((char *)NULL, len);
865 p = buf = getstringvalue(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000866 end = s + len;
867 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000868 if (*s != '\\') {
869 *p++ = *s++;
870 continue;
871 }
872 s++;
873 switch (*s++) {
874 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000875 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000876 case '\\': *p++ = '\\'; break;
877 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000878 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000879 case 'b': *p++ = '\b'; break;
880 case 'f': *p++ = '\014'; break; /* FF */
881 case 't': *p++ = '\t'; break;
882 case 'n': *p++ = '\n'; break;
883 case 'r': *p++ = '\r'; break;
884 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000885 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
886 case '0': case '1': case '2': case '3':
887 case '4': case '5': case '6': case '7':
888 c = s[-1] - '0';
889 if ('0' <= *s && *s <= '7') {
890 c = (c<<3) + *s++ - '0';
891 if ('0' <= *s && *s <= '7')
892 c = (c<<3) + *s++ - '0';
893 }
894 *p++ = c;
895 break;
896 case 'x':
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000897 if (isxdigit(Py_CHARMASK(*s))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000898 sscanf(s, "%x", &c);
899 *p++ = c;
900 do {
901 s++;
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000902 } while (isxdigit(Py_CHARMASK(*s)));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000903 break;
904 }
905 /* FALLTHROUGH */
906 default: *p++ = '\\'; *p++ = s[-1]; break;
907 }
908 }
909 resizestring(&v, (int)(p - buf));
910 return v;
911}
912
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000913static object *
914parsestrplus(n)
915 node *n;
916{
917 object *v;
918 int i;
919 REQ(CHILD(n, 0), STRING);
920 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
921 /* String literal concatenation */
922 for (i = 1; i < NCH(n) && v != NULL; i++) {
923 joinstring_decref(&v, parsestr(STR(CHILD(n, i))));
924 }
925 }
926 return v;
927}
928
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000929static void
930com_list_constructor(c, n)
931 struct compiling *c;
932 node *n;
933{
934 int len;
935 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000936 if (TYPE(n) != testlist)
937 REQ(n, exprlist);
938 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
939 len = (NCH(n) + 1) / 2;
940 for (i = 0; i < NCH(n); i += 2)
941 com_node(c, CHILD(n, i));
942 com_addoparg(c, BUILD_LIST, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000943 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000944}
945
946static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000947com_dictmaker(c, n)
948 struct compiling *c;
949 node *n;
950{
951 int i;
952 /* dictmaker: test ':' test (',' test ':' value)* [','] */
953 for (i = 0; i+2 < NCH(n); i += 4) {
954 /* We must arrange things just right for STORE_SUBSCR.
955 It wants the stack to look like (value) (dict) (key) */
956 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000957 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000958 com_node(c, CHILD(n, i+2)); /* value */
959 com_addbyte(c, ROT_TWO);
960 com_node(c, CHILD(n, i)); /* key */
961 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000962 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000963 }
964}
965
966static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000967com_atom(c, n)
968 struct compiling *c;
969 node *n;
970{
971 node *ch;
972 object *v;
973 int i;
974 REQ(n, atom);
975 ch = CHILD(n, 0);
976 switch (TYPE(ch)) {
977 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +0000978 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000979 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000980 com_push(c, 1);
981 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000982 else
983 com_node(c, CHILD(n, 1));
984 break;
985 case LSQB:
Guido van Rossum8b993a91997-01-17 21:04:03 +0000986 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000987 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000988 com_push(c, 1);
989 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000990 else
991 com_list_constructor(c, CHILD(n, 1));
992 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000993 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000994 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000995 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000996 if (TYPE(CHILD(n, 1)) != RBRACE)
997 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000998 break;
999 case BACKQUOTE:
1000 com_node(c, CHILD(n, 1));
1001 com_addbyte(c, UNARY_CONVERT);
1002 break;
1003 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001004 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001005 i = 255;
1006 }
1007 else {
1008 i = com_addconst(c, v);
1009 DECREF(v);
1010 }
1011 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001012 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001013 break;
1014 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001015 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001016 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001017 c->c_errors++;
1018 i = 255;
1019 }
1020 else {
1021 i = com_addconst(c, v);
1022 DECREF(v);
1023 }
1024 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001025 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001026 break;
1027 case NAME:
1028 com_addopname(c, LOAD_NAME, ch);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001029 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001030 break;
1031 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001032 /* XXX fprintf(stderr, "node type %d\n", TYPE(ch)); */
Guido van Rossum452a9831996-09-17 14:32:04 +00001033 com_error(c, SystemError, "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001034 }
1035}
1036
1037static void
1038com_slice(c, n, op)
1039 struct compiling *c;
1040 node *n;
1041 int op;
1042{
1043 if (NCH(n) == 1) {
1044 com_addbyte(c, op);
1045 }
1046 else if (NCH(n) == 2) {
1047 if (TYPE(CHILD(n, 0)) != COLON) {
1048 com_node(c, CHILD(n, 0));
1049 com_addbyte(c, op+1);
1050 }
1051 else {
1052 com_node(c, CHILD(n, 1));
1053 com_addbyte(c, op+2);
1054 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001055 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001056 }
1057 else {
1058 com_node(c, CHILD(n, 0));
1059 com_node(c, CHILD(n, 2));
1060 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001061 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001062 }
1063}
1064
Guido van Rossum635abd21997-01-06 22:56:52 +00001065static void
1066com_argument(c, n, pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001067 struct compiling *c;
1068 node *n; /* argument */
Guido van Rossum635abd21997-01-06 22:56:52 +00001069 object **pkeywords;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001070{
1071 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001072 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001073 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001074 if (*pkeywords != NULL) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001075 com_error(c, SyntaxError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001076 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001077 }
1078 else {
1079 com_node(c, CHILD(n, 0));
1080 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001081 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001082 }
1083 m = n;
1084 do {
1085 m = CHILD(m, 0);
1086 } while (NCH(m) == 1);
1087 if (TYPE(m) != NAME) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001088 com_error(c, SyntaxError, "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001089 }
1090 else {
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001091 object *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001092 if (v != NULL && *pkeywords == NULL)
1093 *pkeywords = newdictobject();
1094 if (v == NULL || *pkeywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001095 c->c_errors++;
1096 else {
Guido van Rossum635abd21997-01-06 22:56:52 +00001097 if (dict2lookup(*pkeywords, v) != NULL)
1098 com_error(c, SyntaxError,
1099 "duplicate keyword argument");
1100 else
1101 if (dict2insert(*pkeywords, v, v) != 0)
1102 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001103 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001104 com_push(c, 1);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001105 DECREF(v);
1106 }
1107 }
1108 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001109}
1110
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001111static void
1112com_call_function(c, n)
1113 struct compiling *c;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001114 node *n; /* EITHER arglist OR ')' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001115{
1116 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001117 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001118 }
1119 else {
Guido van Rossum635abd21997-01-06 22:56:52 +00001120 object *keywords = NULL;
1121 int i, na, nk;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001122 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001123 na = 0;
1124 nk = 0;
1125 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001126 com_argument(c, CHILD(n, i), &keywords);
1127 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001128 na++;
1129 else
1130 nk++;
1131 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001132 XDECREF(keywords);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001133 if (na > 255 || nk > 255) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001134 com_error(c, SyntaxError, "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001135 }
1136 com_addoparg(c, CALL_FUNCTION, na | (nk << 8));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001137 com_pop(c, na + 2*nk);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001138 }
1139}
1140
1141static void
1142com_select_member(c, n)
1143 struct compiling *c;
1144 node *n;
1145{
1146 com_addopname(c, LOAD_ATTR, n);
1147}
1148
1149static void
Guido van Rossum8861b741996-07-30 16:49:37 +00001150com_sliceobj(c, n)
1151 struct compiling *c;
1152 node *n;
1153{
1154 int i=0;
1155 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001156 node *ch;
1157
1158 /* first argument */
1159 if (TYPE(CHILD(n,i)) == COLON) {
1160 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001161 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001162 i++;
1163 }
1164 else {
1165 com_node(c, CHILD(n,i));
1166 i++;
1167 REQ(CHILD(n,i),COLON);
1168 i++;
1169 }
1170 /* second argument */
1171 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1172 com_node(c, CHILD(n,i));
1173 i++;
1174 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001175 else {
1176 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1177 com_push(c, 1);
1178 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001179 /* remaining arguments */
1180 for (; i < NCH(n); i++) {
1181 ns++;
1182 ch=CHILD(n,i);
1183 REQ(ch, sliceop);
1184 if (NCH(ch) == 1) {
1185 /* right argument of ':' missing */
1186 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001187 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001188 }
1189 else
1190 com_node(c, CHILD(ch,1));
1191 }
1192 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001193 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001194}
1195
1196static void
1197com_subscript(c, n)
1198 struct compiling *c;
1199 node *n;
1200{
1201 node *ch;
1202 REQ(n, subscript);
1203 ch = CHILD(n,0);
1204 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001205 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001206 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001207 com_push(c, 1);
1208 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001209 else {
1210 /* check for slice */
1211 if ((TYPE(ch) == COLON || NCH(n) > 1))
1212 com_sliceobj(c, n);
1213 else {
1214 REQ(ch, test);
1215 com_node(c, ch);
1216 }
1217 }
1218}
1219
1220static void
1221com_subscriptlist(c, n, assigning)
1222 struct compiling *c;
1223 node *n;
1224 int assigning;
1225{
1226 int i, op;
1227 REQ(n, subscriptlist);
1228 /* Check to make backward compatible slice behavior for '[i:j]' */
1229 if (NCH(n) == 1) {
1230 node *sub = CHILD(n, 0); /* subscript */
1231 /* Make it is a simple slice.
Guido van Rossum8b993a91997-01-17 21:04:03 +00001232 Should have exactly one colon. */
Guido van Rossum8861b741996-07-30 16:49:37 +00001233 if ((TYPE(CHILD(sub, 0)) == COLON
1234 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
Guido van Rossum8b993a91997-01-17 21:04:03 +00001235 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1236 {
Guido van Rossum8861b741996-07-30 16:49:37 +00001237 if (assigning == OP_APPLY)
1238 op = SLICE;
1239 else
1240 op = ((assigning == OP_ASSIGN) ? STORE_SLICE : DELETE_SLICE);
1241 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001242 if (op == STORE_SLICE)
1243 com_pop(c, 2);
1244 else if (op == DELETE_SLICE)
1245 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001246 return;
1247 }
1248 }
1249 /* Else normal subscriptlist. Compile each subscript. */
1250 for (i = 0; i < NCH(n); i += 2)
1251 com_subscript(c, CHILD(n, i));
1252 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001253 if (NCH(n) > 1) {
1254 i = (NCH(n)+1) / 2;
1255 com_addoparg(c, BUILD_TUPLE, i);
1256 com_pop(c, i-1);
1257 }
1258 if (assigning == OP_APPLY) {
Guido van Rossum8861b741996-07-30 16:49:37 +00001259 op = BINARY_SUBSCR;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001260 i = 1;
1261 }
1262 else if (assigning == OP_ASSIGN) {
1263 op = STORE_SUBSCR;
1264 i = 3;
1265 }
1266 else {
1267 op = DELETE_SUBSCR;
1268 i = 2;
1269 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001270 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001271 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001272}
1273
1274static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001275com_apply_trailer(c, n)
1276 struct compiling *c;
1277 node *n;
1278{
1279 REQ(n, trailer);
1280 switch (TYPE(CHILD(n, 0))) {
1281 case LPAR:
1282 com_call_function(c, CHILD(n, 1));
1283 break;
1284 case DOT:
1285 com_select_member(c, CHILD(n, 1));
1286 break;
1287 case LSQB:
Guido van Rossum8861b741996-07-30 16:49:37 +00001288 com_subscriptlist(c, CHILD(n, 1), OP_APPLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001289 break;
1290 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001291 com_error(c, SystemError,
1292 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001293 }
1294}
1295
1296static void
Guido van Rossum50564e81996-01-12 01:13:16 +00001297com_power(c, n)
1298 struct compiling *c;
1299 node *n;
1300{
1301 int i;
1302 REQ(n, power);
1303 com_atom(c, CHILD(n, 0));
1304 for (i = 1; i < NCH(n); i++) {
1305 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1306 com_factor(c, CHILD(n, i+1));
1307 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001308 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001309 break;
1310 }
1311 else
1312 com_apply_trailer(c, CHILD(n, i));
1313 }
1314}
1315
1316static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001317com_factor(c, n)
1318 struct compiling *c;
1319 node *n;
1320{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001321 REQ(n, factor);
1322 if (TYPE(CHILD(n, 0)) == PLUS) {
1323 com_factor(c, CHILD(n, 1));
1324 com_addbyte(c, UNARY_POSITIVE);
1325 }
1326 else if (TYPE(CHILD(n, 0)) == MINUS) {
1327 com_factor(c, CHILD(n, 1));
1328 com_addbyte(c, UNARY_NEGATIVE);
1329 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001330 else if (TYPE(CHILD(n, 0)) == TILDE) {
1331 com_factor(c, CHILD(n, 1));
1332 com_addbyte(c, UNARY_INVERT);
1333 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001334 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001335 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001336 }
1337}
1338
1339static void
1340com_term(c, n)
1341 struct compiling *c;
1342 node *n;
1343{
1344 int i;
1345 int op;
1346 REQ(n, term);
1347 com_factor(c, CHILD(n, 0));
1348 for (i = 2; i < NCH(n); i += 2) {
1349 com_factor(c, CHILD(n, i));
1350 switch (TYPE(CHILD(n, i-1))) {
1351 case STAR:
1352 op = BINARY_MULTIPLY;
1353 break;
1354 case SLASH:
1355 op = BINARY_DIVIDE;
1356 break;
1357 case PERCENT:
1358 op = BINARY_MODULO;
1359 break;
1360 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001361 com_error(c, SystemError,
1362 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001363 op = 255;
1364 }
1365 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001366 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001367 }
1368}
1369
1370static void
1371com_arith_expr(c, n)
1372 struct compiling *c;
1373 node *n;
1374{
1375 int i;
1376 int op;
1377 REQ(n, arith_expr);
1378 com_term(c, CHILD(n, 0));
1379 for (i = 2; i < NCH(n); i += 2) {
1380 com_term(c, CHILD(n, i));
1381 switch (TYPE(CHILD(n, i-1))) {
1382 case PLUS:
1383 op = BINARY_ADD;
1384 break;
1385 case MINUS:
1386 op = BINARY_SUBTRACT;
1387 break;
1388 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001389 com_error(c, SystemError,
1390 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001391 op = 255;
1392 }
1393 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001394 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001395 }
1396}
1397
1398static void
1399com_shift_expr(c, n)
1400 struct compiling *c;
1401 node *n;
1402{
1403 int i;
1404 int op;
1405 REQ(n, shift_expr);
1406 com_arith_expr(c, CHILD(n, 0));
1407 for (i = 2; i < NCH(n); i += 2) {
1408 com_arith_expr(c, CHILD(n, i));
1409 switch (TYPE(CHILD(n, i-1))) {
1410 case LEFTSHIFT:
1411 op = BINARY_LSHIFT;
1412 break;
1413 case RIGHTSHIFT:
1414 op = BINARY_RSHIFT;
1415 break;
1416 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001417 com_error(c, SystemError,
1418 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001419 op = 255;
1420 }
1421 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001422 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001423 }
1424}
1425
1426static void
1427com_and_expr(c, n)
1428 struct compiling *c;
1429 node *n;
1430{
1431 int i;
1432 int op;
1433 REQ(n, and_expr);
1434 com_shift_expr(c, CHILD(n, 0));
1435 for (i = 2; i < NCH(n); i += 2) {
1436 com_shift_expr(c, CHILD(n, i));
1437 if (TYPE(CHILD(n, i-1)) == AMPER) {
1438 op = BINARY_AND;
1439 }
1440 else {
Guido van Rossum452a9831996-09-17 14:32:04 +00001441 com_error(c, SystemError,
1442 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001443 op = 255;
1444 }
1445 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001446 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001447 }
1448}
1449
1450static void
1451com_xor_expr(c, n)
1452 struct compiling *c;
1453 node *n;
1454{
1455 int i;
1456 int op;
1457 REQ(n, xor_expr);
1458 com_and_expr(c, CHILD(n, 0));
1459 for (i = 2; i < NCH(n); i += 2) {
1460 com_and_expr(c, CHILD(n, i));
1461 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1462 op = BINARY_XOR;
1463 }
1464 else {
Guido van Rossum452a9831996-09-17 14:32:04 +00001465 com_error(c, SystemError,
1466 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001467 op = 255;
1468 }
1469 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001470 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001471 }
1472}
1473
1474static void
1475com_expr(c, n)
1476 struct compiling *c;
1477 node *n;
1478{
1479 int i;
1480 int op;
1481 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001482 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001483 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001484 com_xor_expr(c, CHILD(n, i));
1485 if (TYPE(CHILD(n, i-1)) == VBAR) {
1486 op = BINARY_OR;
1487 }
1488 else {
Guido van Rossum452a9831996-09-17 14:32:04 +00001489 com_error(c, SystemError,
1490 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001491 op = 255;
1492 }
1493 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001494 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001495 }
1496}
1497
1498static enum cmp_op
1499cmp_type(n)
1500 node *n;
1501{
1502 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001503 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001504 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1505 if (NCH(n) == 1) {
1506 n = CHILD(n, 0);
1507 switch (TYPE(n)) {
1508 case LESS: return LT;
1509 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001510 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001511 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001512 case LESSEQUAL: return LE;
1513 case GREATEREQUAL: return GE;
1514 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001515 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1516 if (strcmp(STR(n), "is") == 0) return IS;
1517 }
1518 }
1519 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001520 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001521 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1522 return NOT_IN;
1523 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1524 return IS_NOT;
1525 }
1526 }
1527 return BAD;
1528}
1529
1530static void
1531com_comparison(c, n)
1532 struct compiling *c;
1533 node *n;
1534{
1535 int i;
1536 enum cmp_op op;
1537 int anchor;
1538 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
1539 com_expr(c, CHILD(n, 0));
1540 if (NCH(n) == 1)
1541 return;
1542
1543 /****************************************************************
1544 The following code is generated for all but the last
1545 comparison in a chain:
1546
1547 label: on stack: opcode: jump to:
1548
1549 a <code to load b>
1550 a, b DUP_TOP
1551 a, b, b ROT_THREE
1552 b, a, b COMPARE_OP
1553 b, 0-or-1 JUMP_IF_FALSE L1
1554 b, 1 POP_TOP
1555 b
1556
1557 We are now ready to repeat this sequence for the next
1558 comparison in the chain.
1559
1560 For the last we generate:
1561
1562 b <code to load c>
1563 b, c COMPARE_OP
1564 0-or-1
1565
1566 If there were any jumps to L1 (i.e., there was more than one
1567 comparison), we generate:
1568
1569 0-or-1 JUMP_FORWARD L2
1570 L1: b, 0 ROT_TWO
1571 0, b POP_TOP
1572 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00001573 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001574 ****************************************************************/
1575
1576 anchor = 0;
1577
1578 for (i = 2; i < NCH(n); i += 2) {
1579 com_expr(c, CHILD(n, i));
1580 if (i+2 < NCH(n)) {
1581 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001582 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001583 com_addbyte(c, ROT_THREE);
1584 }
1585 op = cmp_type(CHILD(n, i-1));
1586 if (op == BAD) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001587 com_error(c, SystemError,
1588 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001589 }
1590 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001591 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001592 if (i+2 < NCH(n)) {
1593 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1594 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001595 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001596 }
1597 }
1598
1599 if (anchor) {
1600 int anchor2 = 0;
1601 com_addfwref(c, JUMP_FORWARD, &anchor2);
1602 com_backpatch(c, anchor);
1603 com_addbyte(c, ROT_TWO);
1604 com_addbyte(c, POP_TOP);
1605 com_backpatch(c, anchor2);
1606 }
1607}
1608
1609static void
1610com_not_test(c, n)
1611 struct compiling *c;
1612 node *n;
1613{
1614 REQ(n, not_test); /* 'not' not_test | comparison */
1615 if (NCH(n) == 1) {
1616 com_comparison(c, CHILD(n, 0));
1617 }
1618 else {
1619 com_not_test(c, CHILD(n, 1));
1620 com_addbyte(c, UNARY_NOT);
1621 }
1622}
1623
1624static void
1625com_and_test(c, n)
1626 struct compiling *c;
1627 node *n;
1628{
1629 int i;
1630 int anchor;
1631 REQ(n, and_test); /* not_test ('and' not_test)* */
1632 anchor = 0;
1633 i = 0;
1634 for (;;) {
1635 com_not_test(c, CHILD(n, i));
1636 if ((i += 2) >= NCH(n))
1637 break;
1638 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1639 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001640 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001641 }
1642 if (anchor)
1643 com_backpatch(c, anchor);
1644}
1645
1646static void
1647com_test(c, n)
1648 struct compiling *c;
1649 node *n;
1650{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001651 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00001652 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
1653 object *v;
1654 int i;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001655 int ndefs = com_argdefs(c, CHILD(n, 0));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001656 v = (object *) icompile(CHILD(n, 0), c);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001657 if (v == NULL) {
1658 c->c_errors++;
1659 i = 255;
1660 }
1661 else {
1662 i = com_addconst(c, v);
1663 DECREF(v);
1664 }
1665 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001666 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001667 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001668 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001669 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00001670 else {
1671 int anchor = 0;
1672 int i = 0;
1673 for (;;) {
1674 com_and_test(c, CHILD(n, i));
1675 if ((i += 2) >= NCH(n))
1676 break;
1677 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1678 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001679 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001680 }
1681 if (anchor)
1682 com_backpatch(c, anchor);
1683 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001684}
1685
1686static void
Guido van Rossum288a60f1991-12-16 13:05:10 +00001687com_list(c, n, toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001688 struct compiling *c;
1689 node *n;
Guido van Rossum288a60f1991-12-16 13:05:10 +00001690 int toplevel; /* If nonzero, *always* build a tuple */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001691{
1692 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001693 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001694 com_node(c, CHILD(n, 0));
1695 }
1696 else {
1697 int i;
1698 int len;
1699 len = (NCH(n) + 1) / 2;
1700 for (i = 0; i < NCH(n); i += 2)
1701 com_node(c, CHILD(n, i));
1702 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001703 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001704 }
1705}
1706
1707
1708/* Begin of assignment compilation */
1709
1710static void com_assign_name PROTO((struct compiling *, node *, int));
1711static void com_assign PROTO((struct compiling *, node *, int));
1712
1713static void
1714com_assign_attr(c, n, assigning)
1715 struct compiling *c;
1716 node *n;
1717 int assigning;
1718{
1719 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001720 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001721}
1722
1723static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001724com_assign_trailer(c, n, assigning)
1725 struct compiling *c;
1726 node *n;
1727 int assigning;
1728{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001729 REQ(n, trailer);
1730 switch (TYPE(CHILD(n, 0))) {
1731 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum452a9831996-09-17 14:32:04 +00001732 com_error(c, SyntaxError, "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001733 break;
1734 case DOT: /* '.' NAME */
1735 com_assign_attr(c, CHILD(n, 1), assigning);
1736 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001737 case LSQB: /* '[' subscriptlist ']' */
1738 com_subscriptlist(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001739 break;
1740 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001741 com_error(c, SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001742 }
1743}
1744
1745static void
1746com_assign_tuple(c, n, assigning)
1747 struct compiling *c;
1748 node *n;
1749 int assigning;
1750{
1751 int i;
1752 if (TYPE(n) != testlist)
1753 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001754 if (assigning) {
1755 i = (NCH(n)+1)/2;
1756 com_addoparg(c, UNPACK_TUPLE, i);
1757 com_push(c, i-1);
1758 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001759 for (i = 0; i < NCH(n); i += 2)
1760 com_assign(c, CHILD(n, i), assigning);
1761}
1762
1763static void
1764com_assign_list(c, n, assigning)
1765 struct compiling *c;
1766 node *n;
1767 int assigning;
1768{
1769 int i;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001770 if (assigning) {
1771 i = (NCH(n)+1)/2;
1772 com_addoparg(c, UNPACK_LIST, i);
1773 com_push(c, i-1);
1774 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001775 for (i = 0; i < NCH(n); i += 2)
1776 com_assign(c, CHILD(n, i), assigning);
1777}
1778
1779static void
1780com_assign_name(c, n, assigning)
1781 struct compiling *c;
1782 node *n;
1783 int assigning;
1784{
1785 REQ(n, NAME);
1786 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001787 if (assigning)
1788 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001789}
1790
1791static void
1792com_assign(c, n, assigning)
1793 struct compiling *c;
1794 node *n;
1795 int assigning;
1796{
1797 /* Loop to avoid trivial recursion */
1798 for (;;) {
1799 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001800
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001801 case exprlist:
1802 case testlist:
1803 if (NCH(n) > 1) {
1804 com_assign_tuple(c, n, assigning);
1805 return;
1806 }
1807 n = CHILD(n, 0);
1808 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001809
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001810 case test:
1811 case and_test:
1812 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001813 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001814 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001815 case xor_expr:
1816 case and_expr:
1817 case shift_expr:
1818 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001819 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00001820 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001821 if (NCH(n) > 1) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001822 com_error(c, SyntaxError,
1823 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001824 return;
1825 }
1826 n = CHILD(n, 0);
1827 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001828
Guido van Rossum50564e81996-01-12 01:13:16 +00001829 case power: /* atom trailer* ('**' power)* */
1830/* ('+'|'-'|'~') factor | atom trailer* */
1831 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001832 com_error(c, SyntaxError,
1833 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001834 return;
1835 }
Guido van Rossum50564e81996-01-12 01:13:16 +00001836 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001837 int i;
1838 com_node(c, CHILD(n, 0));
1839 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00001840 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001841 com_error(c, SyntaxError,
1842 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00001843 return;
1844 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001845 com_apply_trailer(c, CHILD(n, i));
1846 } /* NB i is still alive */
1847 com_assign_trailer(c,
1848 CHILD(n, i), assigning);
1849 return;
1850 }
1851 n = CHILD(n, 0);
1852 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001853
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001854 case atom:
1855 switch (TYPE(CHILD(n, 0))) {
1856 case LPAR:
1857 n = CHILD(n, 1);
1858 if (TYPE(n) == RPAR) {
1859 /* XXX Should allow () = () ??? */
Guido van Rossum452a9831996-09-17 14:32:04 +00001860 com_error(c, SyntaxError,
1861 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001862 return;
1863 }
1864 break;
1865 case LSQB:
1866 n = CHILD(n, 1);
1867 if (TYPE(n) == RSQB) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001868 com_error(c, SyntaxError,
1869 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001870 return;
1871 }
1872 com_assign_list(c, n, assigning);
1873 return;
1874 case NAME:
1875 com_assign_name(c, CHILD(n, 0), assigning);
1876 return;
1877 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001878 com_error(c, SyntaxError,
1879 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001880 return;
1881 }
1882 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001883
1884 case lambdef:
Guido van Rossum452a9831996-09-17 14:32:04 +00001885 com_error(c, SyntaxError, "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001886 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001887
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001888 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001889 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum452a9831996-09-17 14:32:04 +00001890 com_error(c, SystemError, "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001891 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001892
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001893 }
1894 }
1895}
Guido van Rossum7c531111997-03-11 18:42:21 +00001896
Guido van Rossum8b993a91997-01-17 21:04:03 +00001897/* Forward */ static node *get_rawdocstring PROTO((node *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001898
1899static void
1900com_expr_stmt(c, n)
1901 struct compiling *c;
1902 node *n;
1903{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001904 REQ(n, expr_stmt); /* testlist ('=' testlist)* */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001905 /* Forget it if we have just a doc string here */
1906 if (NCH(n) == 1 && get_rawdocstring(n) != NULL)
1907 return;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001908 com_node(c, CHILD(n, NCH(n)-1));
1909 if (NCH(n) == 1) {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001910 if (c->c_interactive)
1911 com_addbyte(c, PRINT_EXPR);
1912 else
1913 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001914 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001915 }
1916 else {
1917 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001918 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00001919 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001920 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001921 com_push(c, 1);
1922 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001923 com_assign(c, CHILD(n, i), OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001924 }
1925 }
1926}
1927
1928static void
Guido van Rossum228d7f31997-04-02 05:24:36 +00001929com_assert_stmt(c, n)
1930 struct compiling *c;
1931 node *n;
1932{
1933 int a = 0, b = 0;
1934 int i;
1935 REQ(n, assert_stmt); /* 'assert' test [',' test] */
1936 /* Generate code like for
1937
1938 if __debug__:
1939 if not <test>:
1940 raise AssertionError [, <message>]
1941
1942 where <message> is the second test, if present.
1943 */
1944 if (Py_OptimizeFlag)
1945 return;
1946 com_addopnamestr(c, LOAD_GLOBAL, "__debug__");
1947 com_push(c, 1);
1948 com_addfwref(c, JUMP_IF_FALSE, &a);
1949 com_addbyte(c, POP_TOP);
1950 com_pop(c, 1);
1951 com_node(c, CHILD(n, 1));
1952 com_addfwref(c, JUMP_IF_TRUE, &b);
1953 com_addbyte(c, POP_TOP);
1954 com_pop(c, 1);
1955 /* Raise that exception! */
1956 com_addopnamestr(c, LOAD_GLOBAL, "AssertionError");
1957 com_push(c, 1);
1958 i = NCH(n)/2; /* Either 2 or 4 */
1959 if (i > 1)
1960 com_node(c, CHILD(n, 3));
1961 com_addoparg(c, RAISE_VARARGS, i);
1962 com_pop(c, i);
1963 /* The interpreter does not fall through */
1964 /* All jumps converge here */
1965 com_backpatch(c, a);
1966 com_backpatch(c, b);
1967 com_addbyte(c, POP_TOP);
1968}
1969
1970static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001971com_print_stmt(c, n)
1972 struct compiling *c;
1973 node *n;
1974{
1975 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001976 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
1977 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001978 com_node(c, CHILD(n, i));
1979 com_addbyte(c, PRINT_ITEM);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001980 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001981 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001982 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001983 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001984 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001985}
1986
1987static void
1988com_return_stmt(c, n)
1989 struct compiling *c;
1990 node *n;
1991{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001992 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001993 if (!c->c_infunction) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001994 com_error(c, SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001995 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001996 if (NCH(n) < 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001997 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001998 com_push(c, 1);
1999 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002000 else
2001 com_node(c, CHILD(n, 1));
2002 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002003 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002004}
2005
2006static void
2007com_raise_stmt(c, n)
2008 struct compiling *c;
2009 node *n;
2010{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002011 int i;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002012 REQ(n, raise_stmt); /* 'raise' test [',' test [',' test]] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002013 com_node(c, CHILD(n, 1));
Guido van Rossum681d79a1995-07-18 14:51:37 +00002014 if (NCH(n) > 3) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002015 com_node(c, CHILD(n, 3));
Guido van Rossum681d79a1995-07-18 14:51:37 +00002016 if (NCH(n) > 5)
2017 com_node(c, CHILD(n, 5));
Guido van Rossumf10570b1995-07-07 22:53:21 +00002018 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002019 i = NCH(n)/2;
2020 com_addoparg(c, RAISE_VARARGS, i);
2021 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002022}
2023
2024static void
2025com_import_stmt(c, n)
2026 struct compiling *c;
2027 node *n;
2028{
2029 int i;
2030 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002031 /* 'import' dotted_name (',' dotted_name)* |
2032 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002033 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002034 /* 'from' dotted_name 'import' ... */
2035 REQ(CHILD(n, 1), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002036 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002037 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002038 for (i = 3; i < NCH(n); i += 2)
2039 com_addopname(c, IMPORT_FROM, CHILD(n, i));
2040 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002041 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002042 }
2043 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002044 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002045 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002046 REQ(CHILD(n, i), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002047 com_addopname(c, IMPORT_NAME, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002048 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002049 com_addopname(c, STORE_NAME, CHILD(CHILD(n, i), 0));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002050 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002051 }
2052 }
2053}
2054
2055static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00002056com_global_stmt(c, n)
2057 struct compiling *c;
2058 node *n;
2059{
2060 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002061 REQ(n, global_stmt);
2062 /* 'global' NAME (',' NAME)* */
2063 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002064 char *s = STR(CHILD(n, i));
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002065#ifdef PRIVATE_NAME_MANGLING
2066 char buffer[256];
2067 if (s != NULL && s[0] == '_' && s[1] == '_' &&
2068 c->c_private != NULL &&
2069 com_mangle(c, s, buffer, (int)sizeof(buffer)))
2070 s = buffer;
2071#endif
Guido van Rossum681d79a1995-07-18 14:51:37 +00002072 if (dictlookup(c->c_locals, s) != NULL) {
Guido van Rossum452a9831996-09-17 14:32:04 +00002073 com_error(c, SyntaxError, "name is local and global");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002074 }
2075 else if (dictinsert(c->c_globals, s, None) != 0)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002076 c->c_errors++;
2077 }
2078}
2079
Guido van Rossum681d79a1995-07-18 14:51:37 +00002080static int
2081com_newlocal_o(c, nameval)
2082 struct compiling *c;
2083 object *nameval;
2084{
2085 int i;
2086 object *ival;
2087 if (getlistsize(c->c_varnames) != c->c_nlocals) {
2088 /* This is usually caused by an error on a previous call */
2089 if (c->c_errors == 0) {
Guido van Rossum452a9831996-09-17 14:32:04 +00002090 com_error(c, SystemError, "mixed up var name/index");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002091 }
2092 return 0;
2093 }
2094 ival = newintobject(i = c->c_nlocals++);
2095 if (ival == NULL)
2096 c->c_errors++;
2097 else if (mappinginsert(c->c_locals, nameval, ival) != 0)
2098 c->c_errors++;
2099 else if (addlistitem(c->c_varnames, nameval) != 0)
2100 c->c_errors++;
2101 XDECREF(ival);
2102 return i;
2103}
2104
2105static int
2106com_addlocal_o(c, nameval)
2107 struct compiling *c;
2108 object *nameval;
2109{
2110 object *ival = mappinglookup(c->c_locals, nameval);
2111 if (ival != NULL)
2112 return getintvalue(ival);
2113 return com_newlocal_o(c, nameval);
2114}
2115
2116static int
2117com_newlocal(c, name)
2118 struct compiling *c;
2119 char *name;
2120{
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00002121 object *nameval = PyString_InternFromString(name);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002122 int i;
2123 if (nameval == NULL) {
2124 c->c_errors++;
2125 return 0;
2126 }
2127 i = com_newlocal_o(c, nameval);
2128 DECREF(nameval);
2129 return i;
2130}
2131
Guido van Rossum8b993a91997-01-17 21:04:03 +00002132#ifdef SUPPORT_OBSOLETE_ACCESS
2133
Guido van Rossum25831651993-05-19 14:50:45 +00002134#define strequ(a, b) (strcmp((a), (b)) == 0)
2135
2136static void
2137com_access_stmt(c, n)
2138 struct compiling *c;
2139 node *n;
2140{
2141 int i, j, k, mode, imode;
2142 object *vmode;
2143 REQ(n, access_stmt);
2144 /* 'access' NAME (',' NAME)* ':' accesstype (',' accesstype)*
2145 accesstype: NAME+ */
2146
2147 /* Find where the colon is */
2148 i = 1;
2149 while (TYPE(CHILD(n,i-1)) != COLON)
2150 i += 1;
2151
2152 /* Calculate the mode mask */
2153 mode = 0;
2154 for (j = i; j < NCH(n); j += 2) {
Guido van Rossum81daa321993-05-20 14:24:46 +00002155 int r = 0, w = 0, p = 0;
2156 for (k = 0; k < NCH(CHILD(n,j)); k++) {
Guido van Rossum25831651993-05-19 14:50:45 +00002157 if (strequ(STR(CHILD(CHILD(n,j),k)), "public"))
2158 p = 0;
2159 else if (strequ(STR(CHILD(CHILD(n,j),k)), "protected"))
2160 p = 1;
2161 else if (strequ(STR(CHILD(CHILD(n,j),k)), "private"))
2162 p = 2;
2163 else if (strequ(STR(CHILD(CHILD(n,j),k)), "read"))
2164 r = 1;
2165 else if (strequ(STR(CHILD(CHILD(n,j),k)), "write"))
2166 w = 1;
2167 else /* XXX should make this an exception */
2168 fprintf(stderr, "bad access type %s\n",
2169 STR(CHILD(CHILD(n,j),k)));
2170 }
2171 if (r == 0 && w == 0)
Guido van Rossum81daa321993-05-20 14:24:46 +00002172 r = w = 1;
Guido van Rossum25831651993-05-19 14:50:45 +00002173 if (p == 0) {
2174 if (r == 1) mode |= AC_R_PUBLIC;
2175 if (w == 1) mode |= AC_W_PUBLIC;
2176 } else if (p == 1) {
2177 if (r == 1) mode |= AC_R_PROTECTED;
2178 if (w == 1) mode |= AC_W_PROTECTED;
2179 } else {
2180 if (r == 1) mode |= AC_R_PRIVATE;
2181 if (w == 1) mode |= AC_W_PRIVATE;
2182 }
2183 }
2184 vmode = newintobject((long)mode);
2185 imode = com_addconst(c, vmode);
2186 XDECREF(vmode);
2187 for (i = 1; TYPE(CHILD(n,i-1)) != COLON; i+=2) {
2188 com_addoparg(c, LOAD_CONST, imode);
2189 com_addopname(c, ACCESS_MODE, CHILD(n, i));
2190 }
2191}
Guido van Rossum0dfcf751996-08-12 22:00:53 +00002192#endif
Guido van Rossum25831651993-05-19 14:50:45 +00002193
Guido van Rossumc5e96291991-12-10 13:53:51 +00002194static void
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002195com_exec_stmt(c, n)
2196 struct compiling *c;
2197 node *n;
2198{
2199 REQ(n, exec_stmt);
2200 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2201 com_node(c, CHILD(n, 1));
2202 if (NCH(n) >= 4)
2203 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002204 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002205 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002206 com_push(c, 1);
2207 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002208 if (NCH(n) >= 6)
2209 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002210 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002211 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002212 com_push(c, 1);
2213 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002214 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002215 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002216}
2217
Guido van Rossum7c531111997-03-11 18:42:21 +00002218static int
2219is_constant_false(c, n)
2220 struct compiling *c;
2221 node *n;
2222{
2223 object *v;
2224 int i;
2225
2226 /* Label to avoid tail recursion */
2227 next:
2228 switch (TYPE(n)) {
2229
2230 case suite:
2231 if (NCH(n) == 1) {
2232 n = CHILD(n, 0);
2233 goto next;
2234 }
2235 /* Fall through */
2236 case file_input:
2237 for (i = 0; i < NCH(n); i++) {
2238 node *ch = CHILD(n, i);
2239 if (TYPE(ch) == stmt) {
2240 n = ch;
2241 goto next;
2242 }
2243 }
2244 break;
2245
2246 case stmt:
2247 case simple_stmt:
2248 case small_stmt:
2249 n = CHILD(n, 0);
2250 goto next;
2251
2252 case expr_stmt:
2253 case testlist:
2254 case test:
2255 case and_test:
2256 case not_test:
2257 case comparison:
2258 case expr:
2259 case xor_expr:
2260 case and_expr:
2261 case shift_expr:
2262 case arith_expr:
2263 case term:
2264 case factor:
2265 case power:
2266 case atom:
2267 if (NCH(n) == 1) {
2268 n = CHILD(n, 0);
2269 goto next;
2270 }
2271 break;
2272
2273 case NAME:
2274 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2275 return 1;
2276 break;
2277
2278 case NUMBER:
2279 v = parsenumber(c, STR(n));
2280 if (v == NULL) {
2281 err_clear();
2282 break;
2283 }
2284 i = testbool(v);
2285 DECREF(v);
2286 return i == 0;
2287
2288 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002289 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002290 if (v == NULL) {
2291 err_clear();
2292 break;
2293 }
2294 i = testbool(v);
2295 DECREF(v);
2296 return i == 0;
2297
2298 }
2299 return 0;
2300}
2301
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002302static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002303com_if_stmt(c, n)
2304 struct compiling *c;
2305 node *n;
2306{
2307 int i;
2308 int anchor = 0;
2309 REQ(n, if_stmt);
2310 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2311 for (i = 0; i+3 < NCH(n); i+=4) {
2312 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002313 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002314 if (is_constant_false(c, ch))
2315 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002316 if (i > 0)
2317 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002318 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002319 com_addfwref(c, JUMP_IF_FALSE, &a);
2320 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002321 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002322 com_node(c, CHILD(n, i+3));
2323 com_addfwref(c, JUMP_FORWARD, &anchor);
2324 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002325 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002326 com_addbyte(c, POP_TOP);
2327 }
2328 if (i+2 < NCH(n))
2329 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002330 if (anchor)
2331 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002332}
2333
2334static void
2335com_while_stmt(c, n)
2336 struct compiling *c;
2337 node *n;
2338{
2339 int break_anchor = 0;
2340 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002341 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002342 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2343 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002344 block_push(c, SETUP_LOOP);
2345 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002346 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002347 com_node(c, CHILD(n, 1));
2348 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2349 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002350 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002351 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002352 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002353 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002354 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2355 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002356 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002357 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002358 com_addbyte(c, POP_TOP);
2359 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002360 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002361 if (NCH(n) > 4)
2362 com_node(c, CHILD(n, 6));
2363 com_backpatch(c, break_anchor);
2364}
2365
2366static void
2367com_for_stmt(c, n)
2368 struct compiling *c;
2369 node *n;
2370{
2371 object *v;
2372 int break_anchor = 0;
2373 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002374 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002375 REQ(n, for_stmt);
2376 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2377 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002378 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002379 com_node(c, CHILD(n, 3));
2380 v = newintobject(0L);
2381 if (v == NULL)
2382 c->c_errors++;
2383 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002384 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002385 XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002386 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002387 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002388 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002389 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002390 com_assign(c, CHILD(n, 1), OP_ASSIGN);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002391 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002392 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002393 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002394 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2395 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002396 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002397 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002398 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002399 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002400 if (NCH(n) > 8)
2401 com_node(c, CHILD(n, 8));
2402 com_backpatch(c, break_anchor);
2403}
2404
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002405/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002406
2407 SETUP_FINALLY L
2408 <code for S>
2409 POP_BLOCK
2410 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002411 L: <code for Sf>
2412 END_FINALLY
2413
2414 The special instructions use the block stack. Each block
2415 stack entry contains the instruction that created it (here
2416 SETUP_FINALLY), the level of the value stack at the time the
2417 block stack entry was created, and a label (here L).
2418
2419 SETUP_FINALLY:
2420 Pushes the current value stack level and the label
2421 onto the block stack.
2422 POP_BLOCK:
2423 Pops en entry from the block stack, and pops the value
2424 stack until its level is the same as indicated on the
2425 block stack. (The label is ignored.)
2426 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002427 Pops a variable number of entries from the *value* stack
2428 and re-raises the exception they specify. The number of
2429 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002430
2431 The block stack is unwound when an exception is raised:
2432 when a SETUP_FINALLY entry is found, the exception is pushed
2433 onto the value stack (and the exception condition is cleared),
2434 and the interpreter jumps to the label gotten from the block
2435 stack.
2436
2437 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002438 (The contents of the value stack is shown in [], with the top
2439 at the right; 'tb' is trace-back info, 'val' the exception's
2440 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002441
2442 Value stack Label Instruction Argument
2443 [] SETUP_EXCEPT L1
2444 [] <code for S>
2445 [] POP_BLOCK
2446 [] JUMP_FORWARD L0
2447
Guido van Rossum3f5da241990-12-20 15:06:42 +00002448 [tb, val, exc] L1: DUP )
2449 [tb, val, exc, exc] <evaluate E1> )
2450 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2451 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2452 [tb, val, exc, 1] POP )
2453 [tb, val, exc] POP
2454 [tb, val] <assign to V1> (or POP if no V1)
2455 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002456 [] <code for S1>
2457 JUMP_FORWARD L0
2458
Guido van Rossum3f5da241990-12-20 15:06:42 +00002459 [tb, val, exc, 0] L2: POP
2460 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002461 .............................etc.......................
2462
Guido van Rossum3f5da241990-12-20 15:06:42 +00002463 [tb, val, exc, 0] Ln+1: POP
2464 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002465
2466 [] L0: <next statement>
2467
2468 Of course, parts are not generated if Vi or Ei is not present.
2469*/
2470
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002471static void
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002472com_try_except(c, n)
2473 struct compiling *c;
2474 node *n;
2475{
2476 int except_anchor = 0;
2477 int end_anchor = 0;
2478 int else_anchor = 0;
2479 int i;
2480 node *ch;
2481
2482 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2483 block_push(c, SETUP_EXCEPT);
2484 com_node(c, CHILD(n, 2));
2485 com_addbyte(c, POP_BLOCK);
2486 block_pop(c, SETUP_EXCEPT);
2487 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2488 com_backpatch(c, except_anchor);
2489 for (i = 3;
2490 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2491 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002492 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002493 if (except_anchor == 0) {
Guido van Rossum452a9831996-09-17 14:32:04 +00002494 com_error(c, SyntaxError,
2495 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002496 break;
2497 }
2498 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002499 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002500 com_addoparg(c, SET_LINENO, ch->n_lineno);
2501 if (NCH(ch) > 1) {
2502 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002503 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002504 com_node(c, CHILD(ch, 1));
2505 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002506 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002507 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
2508 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002509 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002510 }
2511 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002512 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002513 if (NCH(ch) > 3)
Guido van Rossum8861b741996-07-30 16:49:37 +00002514 com_assign(c, CHILD(ch, 3), OP_ASSIGN);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002515 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002516 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002517 com_pop(c, 1);
2518 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002519 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002520 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002521 com_node(c, CHILD(n, i+2));
2522 com_addfwref(c, JUMP_FORWARD, &end_anchor);
2523 if (except_anchor) {
2524 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002525 /* We come in with [tb, val, exc, 0] on the
2526 stack; one pop and it's the same as
2527 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002528 com_addbyte(c, POP_TOP);
2529 }
2530 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002531 /* We actually come in here with [tb, val, exc] but the
2532 END_FINALLY will zap those and jump around.
2533 The c_stacklevel does not reflect them so we need not pop
2534 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002535 com_addbyte(c, END_FINALLY);
2536 com_backpatch(c, else_anchor);
2537 if (i < NCH(n))
2538 com_node(c, CHILD(n, i+2));
2539 com_backpatch(c, end_anchor);
2540}
2541
2542static void
2543com_try_finally(c, n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002544 struct compiling *c;
2545 node *n;
2546{
2547 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002548 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002549
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002550 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
2551 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002552 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002553 com_addbyte(c, POP_BLOCK);
2554 block_pop(c, SETUP_FINALLY);
2555 block_push(c, END_FINALLY);
2556 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002557 /* While the generated code pushes only one item,
2558 the try-finally handling can enter here with
2559 up to three items. OK, here are the details:
2560 3 for an exception, 2 for RETURN, 1 for BREAK. */
2561 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002562 com_backpatch(c, finally_anchor);
2563 ch = CHILD(n, NCH(n)-1);
2564 com_addoparg(c, SET_LINENO, ch->n_lineno);
2565 com_node(c, ch);
2566 com_addbyte(c, END_FINALLY);
2567 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002568 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002569}
2570
2571static void
2572com_try_stmt(c, n)
2573 struct compiling *c;
2574 node *n;
2575{
2576 REQ(n, try_stmt);
2577 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
2578 | 'try' ':' suite 'finally' ':' suite */
2579 if (TYPE(CHILD(n, 3)) != except_clause)
2580 com_try_finally(c, n);
2581 else
2582 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002583}
2584
Guido van Rossum8b993a91997-01-17 21:04:03 +00002585static node *
2586get_rawdocstring(n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002587 node *n;
2588{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002589 int i;
2590
Guido van Rossum8b993a91997-01-17 21:04:03 +00002591 /* Label to avoid tail recursion */
2592 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002593 switch (TYPE(n)) {
2594
2595 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002596 if (NCH(n) == 1) {
2597 n = CHILD(n, 0);
2598 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002599 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002600 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002601 case file_input:
2602 for (i = 0; i < NCH(n); i++) {
2603 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002604 if (TYPE(ch) == stmt) {
2605 n = ch;
2606 goto next;
2607 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002608 }
2609 break;
2610
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002611 case stmt:
2612 case simple_stmt:
2613 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002614 n = CHILD(n, 0);
2615 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002616
2617 case expr_stmt:
2618 case testlist:
2619 case test:
2620 case and_test:
2621 case not_test:
2622 case comparison:
2623 case expr:
2624 case xor_expr:
2625 case and_expr:
2626 case shift_expr:
2627 case arith_expr:
2628 case term:
2629 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00002630 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002631 if (NCH(n) == 1) {
2632 n = CHILD(n, 0);
2633 goto next;
2634 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002635 break;
2636
2637 case atom:
2638 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002639 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002640 break;
2641
2642 }
2643 return NULL;
2644}
2645
Guido van Rossum8b993a91997-01-17 21:04:03 +00002646static object *
2647get_docstring(n)
2648 node *n;
2649{
2650 n = get_rawdocstring(n);
2651 if (n == NULL)
2652 return NULL;
2653 return parsestrplus(n);
2654}
2655
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002656static void
2657com_suite(c, n)
2658 struct compiling *c;
2659 node *n;
2660{
2661 REQ(n, suite);
2662 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
2663 if (NCH(n) == 1) {
2664 com_node(c, CHILD(n, 0));
2665 }
2666 else {
2667 int i;
2668 for (i = 0; i < NCH(n); i++) {
2669 node *ch = CHILD(n, i);
2670 if (TYPE(ch) == stmt)
2671 com_node(c, ch);
2672 }
2673 }
2674}
2675
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002676/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002677static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002678com_continue_stmt(c, n)
2679 struct compiling *c;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002680 node *n; /* Not used, but passed for consistency */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002681{
2682 int i = c->c_nblocks;
2683 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
2684 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2685 }
2686 else {
Guido van Rossum452a9831996-09-17 14:32:04 +00002687 com_error(c, SyntaxError, "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002688 }
2689 /* XXX Could allow it inside a 'finally' clause
2690 XXX if we could pop the exception still on the stack */
2691}
2692
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002693static int
Guido van Rossum681d79a1995-07-18 14:51:37 +00002694com_argdefs(c, n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002695 struct compiling *c;
2696 node *n;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002697{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002698 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002699 if (TYPE(n) == lambdef) {
2700 /* lambdef: 'lambda' [varargslist] ':' test */
2701 n = CHILD(n, 1);
2702 }
2703 else {
2704 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
2705 n = CHILD(n, 2);
2706 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
2707 n = CHILD(n, 1);
2708 }
2709 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002710 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002711 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002712 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002713 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
2714 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002715 nargs = 0;
2716 ndefs = 0;
2717 for (i = 0; i < nch; i++) {
2718 int t;
Guido van Rossum50564e81996-01-12 01:13:16 +00002719 if (TYPE(CHILD(n, i)) == STAR || TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002720 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002721 nargs++;
2722 i++;
2723 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00002724 t = RPAR; /* Anything except EQUAL or COMMA */
2725 else
2726 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002727 if (t == EQUAL) {
2728 i++;
2729 ndefs++;
2730 com_node(c, CHILD(n, i));
2731 i++;
2732 if (i >= nch)
2733 break;
2734 t = TYPE(CHILD(n, i));
2735 }
2736 else {
2737 /* Treat "(a=1, b)" as "(a=1, b=None)" */
2738 if (ndefs) {
2739 com_addoparg(c, LOAD_CONST,
2740 com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002741 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002742 ndefs++;
2743 }
2744 }
2745 if (t != COMMA)
2746 break;
2747 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002748 return ndefs;
2749}
2750
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002751static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002752com_funcdef(c, n)
2753 struct compiling *c;
2754 node *n;
2755{
2756 object *v;
2757 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00002758 v = (object *)icompile(n, c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002759 if (v == NULL)
2760 c->c_errors++;
2761 else {
2762 int i = com_addconst(c, v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002763 int ndefs = com_argdefs(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002764 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002765 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002766 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002767 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002768 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002769 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002770 DECREF(v);
2771 }
2772}
2773
2774static void
Guido van Rossum25831651993-05-19 14:50:45 +00002775com_bases(c, n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002776 struct compiling *c;
2777 node *n;
2778{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002779 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002780 REQ(n, testlist);
2781 /* testlist: test (',' test)* [','] */
2782 for (i = 0; i < NCH(n); i += 2)
2783 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002784 i = (NCH(n)+1) / 2;
2785 com_addoparg(c, BUILD_TUPLE, i);
2786 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00002787}
2788
2789static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002790com_classdef(c, n)
2791 struct compiling *c;
2792 node *n;
2793{
Guido van Rossum25831651993-05-19 14:50:45 +00002794 int i;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002795 object *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002796 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00002797 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00002798 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00002799 c->c_errors++;
2800 return;
2801 }
2802 /* Push the class name on the stack */
2803 i = com_addconst(c, v);
2804 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002805 com_push(c, 1);
Guido van Rossum25831651993-05-19 14:50:45 +00002806 DECREF(v);
2807 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002808 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00002809 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002810 com_push(c, 1);
2811 }
Guido van Rossum25831651993-05-19 14:50:45 +00002812 else
2813 com_bases(c, CHILD(n, 3));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00002814 v = (object *)icompile(n, c);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002815 if (v == NULL)
2816 c->c_errors++;
2817 else {
Guido van Rossum25831651993-05-19 14:50:45 +00002818 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002819 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002820 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002821 com_addoparg(c, MAKE_FUNCTION, 0);
2822 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002823 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002824 com_pop(c, 2);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002825 com_addopname(c, STORE_NAME, CHILD(n, 1));
2826 DECREF(v);
2827 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002828}
2829
2830static void
2831com_node(c, n)
2832 struct compiling *c;
2833 node *n;
2834{
2835 switch (TYPE(n)) {
2836
2837 /* Definition nodes */
2838
2839 case funcdef:
2840 com_funcdef(c, n);
2841 break;
2842 case classdef:
2843 com_classdef(c, n);
2844 break;
2845
2846 /* Trivial parse tree nodes */
2847
2848 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002849 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002850 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002851 com_node(c, CHILD(n, 0));
2852 break;
2853
2854 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002855 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
2856 com_addoparg(c, SET_LINENO, n->n_lineno);
2857 {
2858 int i;
2859 for (i = 0; i < NCH(n)-1; i += 2)
2860 com_node(c, CHILD(n, i));
2861 }
2862 break;
2863
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002864 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002865 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002866 com_node(c, CHILD(n, 0));
2867 break;
2868
2869 /* Statement nodes */
2870
2871 case expr_stmt:
2872 com_expr_stmt(c, n);
2873 break;
2874 case print_stmt:
2875 com_print_stmt(c, n);
2876 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002877 case del_stmt: /* 'del' exprlist */
Guido van Rossum8861b741996-07-30 16:49:37 +00002878 com_assign(c, CHILD(n, 1), OP_DELETE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002879 break;
2880 case pass_stmt:
2881 break;
2882 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002883 if (c->c_loops == 0) {
Guido van Rossum452a9831996-09-17 14:32:04 +00002884 com_error(c, SyntaxError, "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002885 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002886 com_addbyte(c, BREAK_LOOP);
2887 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002888 case continue_stmt:
2889 com_continue_stmt(c, n);
2890 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002891 case return_stmt:
2892 com_return_stmt(c, n);
2893 break;
2894 case raise_stmt:
2895 com_raise_stmt(c, n);
2896 break;
2897 case import_stmt:
2898 com_import_stmt(c, n);
2899 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002900 case global_stmt:
2901 com_global_stmt(c, n);
2902 break;
Guido van Rossum0dfcf751996-08-12 22:00:53 +00002903#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum25831651993-05-19 14:50:45 +00002904 case access_stmt:
2905 com_access_stmt(c, n);
2906 break;
Guido van Rossum0dfcf751996-08-12 22:00:53 +00002907#endif
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002908 case exec_stmt:
2909 com_exec_stmt(c, n);
2910 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002911 case assert_stmt:
2912 com_assert_stmt(c, n);
2913 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002914 case if_stmt:
2915 com_if_stmt(c, n);
2916 break;
2917 case while_stmt:
2918 com_while_stmt(c, n);
2919 break;
2920 case for_stmt:
2921 com_for_stmt(c, n);
2922 break;
2923 case try_stmt:
2924 com_try_stmt(c, n);
2925 break;
2926 case suite:
2927 com_suite(c, n);
2928 break;
2929
2930 /* Expression nodes */
2931
2932 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002933 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002934 break;
2935 case test:
2936 com_test(c, n);
2937 break;
2938 case and_test:
2939 com_and_test(c, n);
2940 break;
2941 case not_test:
2942 com_not_test(c, n);
2943 break;
2944 case comparison:
2945 com_comparison(c, n);
2946 break;
2947 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002948 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002949 break;
2950 case expr:
2951 com_expr(c, n);
2952 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002953 case xor_expr:
2954 com_xor_expr(c, n);
2955 break;
2956 case and_expr:
2957 com_and_expr(c, n);
2958 break;
2959 case shift_expr:
2960 com_shift_expr(c, n);
2961 break;
2962 case arith_expr:
2963 com_arith_expr(c, n);
2964 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002965 case term:
2966 com_term(c, n);
2967 break;
2968 case factor:
2969 com_factor(c, n);
2970 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00002971 case power:
2972 com_power(c, n);
2973 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002974 case atom:
2975 com_atom(c, n);
2976 break;
2977
2978 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002979 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum452a9831996-09-17 14:32:04 +00002980 com_error(c, SystemError, "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002981 }
2982}
2983
2984static void com_fplist PROTO((struct compiling *, node *));
2985
2986static void
2987com_fpdef(c, n)
2988 struct compiling *c;
2989 node *n;
2990{
2991 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
2992 if (TYPE(CHILD(n, 0)) == LPAR)
2993 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002994 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002995 com_addoparg(c, STORE_FAST, com_newlocal(c, STR(CHILD(n, 0))));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002996 com_pop(c, 1);
2997 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002998}
2999
3000static void
3001com_fplist(c, n)
3002 struct compiling *c;
3003 node *n;
3004{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003005 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003006 if (NCH(n) == 1) {
3007 com_fpdef(c, CHILD(n, 0));
3008 }
3009 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003010 int i = (NCH(n)+1)/2;
3011 com_addoparg(c, UNPACK_TUPLE, i);
3012 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003013 for (i = 0; i < NCH(n); i += 2)
3014 com_fpdef(c, CHILD(n, i));
3015 }
3016}
3017
3018static void
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003019com_arglist(c, n)
3020 struct compiling *c;
3021 node *n;
3022{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003023 int nch, i;
3024 int complex = 0;
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003025 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003026 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003027 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003028 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003029 /* Enter all arguments in table of locals */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003030 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003031 node *ch = CHILD(n, i);
3032 node *fp;
3033 char *name;
Guido van Rossum50564e81996-01-12 01:13:16 +00003034 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003035 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003036 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3037 fp = CHILD(ch, 0);
3038 if (TYPE(fp) == NAME)
3039 name = STR(fp);
3040 else {
3041 name = "";
Guido van Rossum530956d1996-07-21 02:27:43 +00003042 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003043 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003044 com_newlocal(c, name);
3045 c->c_argcount++;
3046 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003047 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003048 ch = CHILD(n, i);
3049 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003050 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003051 else
3052 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003053 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003054 /* Handle *arguments */
3055 if (i < nch) {
3056 node *ch;
3057 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003058 if (TYPE(ch) != DOUBLESTAR) {
3059 REQ(ch, STAR);
3060 ch = CHILD(n, i+1);
3061 if (TYPE(ch) == NAME) {
3062 c->c_flags |= CO_VARARGS;
3063 i += 3;
3064 com_newlocal(c, STR(ch));
3065 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003066 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003067 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003068 /* Handle **keywords */
3069 if (i < nch) {
3070 node *ch;
3071 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003072 if (TYPE(ch) != DOUBLESTAR) {
3073 REQ(ch, STAR);
3074 ch = CHILD(n, i+1);
3075 REQ(ch, STAR);
3076 ch = CHILD(n, i+2);
3077 }
3078 else
3079 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003080 REQ(ch, NAME);
3081 c->c_flags |= CO_VARKEYWORDS;
3082 com_newlocal(c, STR(ch));
3083 }
3084 if (complex) {
3085 /* Generate code for complex arguments only after
3086 having counted the simple arguments */
3087 int ilocal = 0;
3088 for (i = 0; i < nch; i++) {
3089 node *ch = CHILD(n, i);
3090 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003091 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003092 break;
3093 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3094 fp = CHILD(ch, 0);
3095 if (TYPE(fp) != NAME) {
3096 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003097 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003098 com_fpdef(c, ch);
3099 }
3100 ilocal++;
3101 if (++i >= nch)
3102 break;
3103 ch = CHILD(n, i);
3104 if (TYPE(ch) == EQUAL)
3105 i += 2;
3106 else
3107 REQ(ch, COMMA);
3108 }
3109 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003110}
3111
3112static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003113com_file_input(c, n)
3114 struct compiling *c;
3115 node *n;
3116{
3117 int i;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003118 object *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003119 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003120 doc = get_docstring(n);
3121 if (doc != NULL) {
3122 int i = com_addconst(c, doc);
3123 DECREF(doc);
3124 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003125 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003126 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003127 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003128 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003129 for (i = 0; i < NCH(n); i++) {
3130 node *ch = CHILD(n, i);
3131 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3132 com_node(c, ch);
3133 }
3134}
3135
3136/* Top-level compile-node interface */
3137
3138static void
3139compile_funcdef(c, n)
3140 struct compiling *c;
3141 node *n;
3142{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003143 object *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003144 node *ch;
3145 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003146 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003147 doc = get_docstring(CHILD(n, 4));
3148 if (doc != NULL) {
3149 (void) com_addconst(c, doc);
3150 DECREF(doc);
3151 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003152 else
3153 (void) com_addconst(c, None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003154 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3155 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003156 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003157 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003158 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003159 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003160 c->c_infunction = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003161 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003162 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003163 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003164 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003165}
3166
3167static void
Guido van Rossum590baa41993-11-30 13:40:46 +00003168compile_lambdef(c, n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003169 struct compiling *c;
3170 node *n;
3171{
Guido van Rossum590baa41993-11-30 13:40:46 +00003172 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003173 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003174 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003175
3176 ch = CHILD(n, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003177 (void) com_addconst(c, None); /* No docstring */
3178 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003179 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003180 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003181 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003182 else
3183 ch = CHILD(n, 2);
3184 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003185 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003186 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003187}
3188
3189static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003190compile_classdef(c, n)
3191 struct compiling *c;
3192 node *n;
3193{
3194 node *ch;
3195 object *doc;
3196 REQ(n, classdef);
3197 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3198 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003199#ifdef PRIVATE_NAME_MANGLING
3200 c->c_private = c->c_name;
3201#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003202 ch = CHILD(n, NCH(n)-1); /* The suite */
3203 doc = get_docstring(ch);
3204 if (doc != NULL) {
3205 int i = com_addconst(c, doc);
3206 DECREF(doc);
3207 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003208 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003209 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003210 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003211 }
3212 else
3213 (void) com_addconst(c, None);
3214 com_node(c, ch);
3215 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003216 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003217 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003218 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003219}
3220
3221static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003222compile_node(c, n)
3223 struct compiling *c;
3224 node *n;
3225{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003226 com_addoparg(c, SET_LINENO, n->n_lineno);
3227
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003228 switch (TYPE(n)) {
3229
Guido van Rossum4c417781991-01-21 16:09:22 +00003230 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003231 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003232 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003233 n = CHILD(n, 0);
3234 if (TYPE(n) != NEWLINE)
3235 com_node(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003236 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003237 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003238 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003239 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003240 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003241 break;
3242
Guido van Rossum4c417781991-01-21 16:09:22 +00003243 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003244 com_file_input(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003245 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003246 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003247 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003248 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003249 break;
3250
Guido van Rossum590baa41993-11-30 13:40:46 +00003251 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003252 com_node(c, CHILD(n, 0));
3253 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003254 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003255 break;
3256
Guido van Rossum590baa41993-11-30 13:40:46 +00003257 case lambdef: /* anonymous function definition */
3258 compile_lambdef(c, n);
3259 break;
3260
Guido van Rossum4c417781991-01-21 16:09:22 +00003261 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003262 compile_funcdef(c, n);
3263 break;
3264
Guido van Rossum4c417781991-01-21 16:09:22 +00003265 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003266 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003267 break;
3268
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003269 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003270 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum452a9831996-09-17 14:32:04 +00003271 com_error(c, SystemError,
3272 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003273 }
3274}
3275
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003276/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00003277
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003278 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
3279 instructions that refer to local variables with LOAD_FAST etc.
3280 The latter instructions are much faster because they don't need to
3281 look up the variable name in a dictionary.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003282
Guido van Rossum681d79a1995-07-18 14:51:37 +00003283 To find all local variables, we check all STORE_NAME, IMPORT_FROM
3284 and DELETE_NAME instructions. This yields all local variables,
3285 function definitions, class definitions and import statements.
3286 Argument names have already been entered into the list by the
3287 special processing for the argument list.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003288
3289 All remaining LOAD_NAME instructions must refer to non-local (global
3290 or builtin) variables, so are replaced by LOAD_GLOBAL.
3291
3292 There are two problems: 'from foo import *' and 'exec' may introduce
3293 local variables that we can't know while compiling. If this is the
Guido van Rossum681d79a1995-07-18 14:51:37 +00003294 case, we can still optimize bona fide locals (since those
3295 statements will be surrounded by fast_2_locals() and
3296 locals_2_fast()), but we can't change LOAD_NAME to LOAD_GLOBAL.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003297
Guido van Rossum681d79a1995-07-18 14:51:37 +00003298 NB: this modifies the string object c->c_code! */
Guido van Rossum282914b1991-04-04 10:42:56 +00003299
3300static void
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003301optimize(c)
3302 struct compiling *c;
Guido van Rossum282914b1991-04-04 10:42:56 +00003303{
Guido van Rossum0a697f61991-04-16 08:39:12 +00003304 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00003305 int opcode;
Guido van Rossum80bb9651996-12-05 23:27:02 +00003306 int oparg = 0;
Guido van Rossum282914b1991-04-04 10:42:56 +00003307 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003308 object *error_type, *error_value, *error_traceback;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003309
Guido van Rossum282914b1991-04-04 10:42:56 +00003310#define NEXTOP() (*next_instr++)
3311#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
3312#define GETITEM(v, i) (getlistitem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003313#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
3314
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003315 err_fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003316
3317 c->c_flags |= CO_OPTIMIZED;
Guido van Rossum282914b1991-04-04 10:42:56 +00003318
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003319 next_instr = (unsigned char *) getstringvalue(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003320 for (;;) {
3321 opcode = NEXTOP();
3322 if (opcode == STOP_CODE)
3323 break;
3324 if (HAS_ARG(opcode))
3325 oparg = NEXTARG();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003326 switch (opcode) {
3327 case STORE_NAME:
3328 case DELETE_NAME:
3329 case IMPORT_FROM:
3330 com_addlocal_o(c, GETNAMEOBJ(oparg));
3331 break;
3332 case EXEC_STMT:
3333 c->c_flags &= ~CO_OPTIMIZED;
3334 break;
Guido van Rossum282914b1991-04-04 10:42:56 +00003335 }
3336 }
3337
Guido van Rossum681d79a1995-07-18 14:51:37 +00003338 if (dictlookup(c->c_locals, "*") != NULL)
3339 c->c_flags &= ~CO_OPTIMIZED;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003340
3341 next_instr = (unsigned char *) getstringvalue(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003342 for (;;) {
3343 cur_instr = next_instr;
3344 opcode = NEXTOP();
3345 if (opcode == STOP_CODE)
3346 break;
3347 if (HAS_ARG(opcode))
3348 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003349 if (opcode == LOAD_NAME ||
3350 opcode == STORE_NAME ||
3351 opcode == DELETE_NAME) {
3352 object *v;
3353 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00003354 name = GETNAMEOBJ(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003355 v = dict2lookup(c->c_locals, name);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003356 if (v == NULL) {
Guido van Rossum83163251991-08-16 08:58:43 +00003357 err_clear();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003358 if (opcode == LOAD_NAME &&
3359 (c->c_flags&CO_OPTIMIZED))
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003360 cur_instr[0] = LOAD_GLOBAL;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003361 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00003362 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003363 i = getintvalue(v);
3364 switch (opcode) {
3365 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
3366 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
3367 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
3368 }
3369 cur_instr[1] = i & 0xff;
3370 cur_instr[2] = (i>>8) & 0xff;
Guido van Rossum282914b1991-04-04 10:42:56 +00003371 }
3372 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003373
Guido van Rossum681d79a1995-07-18 14:51:37 +00003374 if (c->c_errors == 0)
3375 err_restore(error_type, error_value, error_traceback);
Guido van Rossum282914b1991-04-04 10:42:56 +00003376}
3377
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003378codeobject *
Guido van Rossum590baa41993-11-30 13:40:46 +00003379compile(n, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003380 node *n;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003381 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003382{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003383 return jcompile(n, filename, NULL);
3384}
3385
3386static codeobject *
3387icompile(n, base)
3388 node *n;
3389 struct compiling *base;
3390{
3391 return jcompile(n, base->c_filename, base);
3392}
3393
3394static codeobject *
3395jcompile(n, filename, base)
3396 node *n;
3397 char *filename;
3398 struct compiling *base;
3399{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003400 struct compiling sc;
3401 codeobject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003402 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003403 return NULL;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003404#ifdef PRIVATE_NAME_MANGLING
3405 if (base)
3406 sc.c_private = base->c_private;
3407 else
3408 sc.c_private = NULL;
3409#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003410 compile_node(&sc, n);
3411 com_done(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003412 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003413 optimize(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003414 sc.c_flags |= CO_NEWLOCALS;
3415 }
3416 else if (TYPE(n) == classdef)
3417 sc.c_flags |= CO_NEWLOCALS;
Guido van Rossum9bfef441993-03-29 10:43:31 +00003418 co = NULL;
3419 if (sc.c_errors == 0) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003420 object *consts, *names, *varnames, *filename, *name;
3421 consts = listtuple(sc.c_consts);
3422 names = listtuple(sc.c_names);
3423 varnames = listtuple(sc.c_varnames);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003424 filename = PyString_InternFromString(sc.c_filename);
3425 name = PyString_InternFromString(sc.c_name);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003426 if (!err_occurred())
3427 co = newcodeobject(sc.c_argcount,
3428 sc.c_nlocals,
Guido van Rossum8b993a91997-01-17 21:04:03 +00003429 sc.c_maxstacklevel,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003430 sc.c_flags,
3431 sc.c_code,
3432 consts,
3433 names,
3434 varnames,
3435 filename,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003436 name,
3437 sc.c_firstlineno,
3438 sc.c_lnotab);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003439 XDECREF(consts);
3440 XDECREF(names);
3441 XDECREF(varnames);
3442 XDECREF(filename);
3443 XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003444 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003445 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003446 return co;
3447}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003448
3449int
3450PyCode_Addr2Line(co, addrq)
3451 PyCodeObject *co;
3452 int addrq;
3453{
3454 int size = PyString_Size(co->co_lnotab) / 2;
3455 char *p = PyString_AsString(co->co_lnotab);
3456 int line = co->co_firstlineno;
3457 int addr = 0;
3458 while (--size >= 0) {
3459 addr += *p++;
3460 if (addr > addrq)
3461 break;
3462 line += *p++;
3463 }
3464 return line;
3465}