blob: 7d9a3a8921814efba80bb5628ea11a4f499f4d39 [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 Rossum5f5e8171997-04-06 03:41:40 +0000843 int first = *s;
844 int quote = first;
845 if (isalpha(quote) || quote == '_')
846 quote = *++s;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000847 if (quote != '\'' && quote != '\"') {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000848 err_badcall();
849 return NULL;
850 }
851 s++;
852 len = strlen(s);
Guido van Rossum8054fad1993-10-26 15:19:44 +0000853 if (s[--len] != quote) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000854 err_badcall();
855 return NULL;
856 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000857 if (len >= 4 && s[0] == quote && s[1] == quote) {
858 s += 2;
859 len -= 2;
860 if (s[--len] != quote || s[--len] != quote) {
861 err_badcall();
862 return NULL;
863 }
864 }
Guido van Rossum5f5e8171997-04-06 03:41:40 +0000865 if (first != quote || strchr(s, '\\') == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000866 return newsizedstringobject(s, len);
867 v = newsizedstringobject((char *)NULL, len);
868 p = buf = getstringvalue(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000869 end = s + len;
870 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000871 if (*s != '\\') {
872 *p++ = *s++;
873 continue;
874 }
875 s++;
876 switch (*s++) {
877 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000878 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000879 case '\\': *p++ = '\\'; break;
880 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000881 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000882 case 'b': *p++ = '\b'; break;
883 case 'f': *p++ = '\014'; break; /* FF */
884 case 't': *p++ = '\t'; break;
885 case 'n': *p++ = '\n'; break;
886 case 'r': *p++ = '\r'; break;
887 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000888 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
889 case '0': case '1': case '2': case '3':
890 case '4': case '5': case '6': case '7':
891 c = s[-1] - '0';
892 if ('0' <= *s && *s <= '7') {
893 c = (c<<3) + *s++ - '0';
894 if ('0' <= *s && *s <= '7')
895 c = (c<<3) + *s++ - '0';
896 }
897 *p++ = c;
898 break;
899 case 'x':
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000900 if (isxdigit(Py_CHARMASK(*s))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000901 sscanf(s, "%x", &c);
902 *p++ = c;
903 do {
904 s++;
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000905 } while (isxdigit(Py_CHARMASK(*s)));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000906 break;
907 }
908 /* FALLTHROUGH */
909 default: *p++ = '\\'; *p++ = s[-1]; break;
910 }
911 }
912 resizestring(&v, (int)(p - buf));
913 return v;
914}
915
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000916static object *
917parsestrplus(n)
918 node *n;
919{
920 object *v;
921 int i;
922 REQ(CHILD(n, 0), STRING);
923 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
924 /* String literal concatenation */
925 for (i = 1; i < NCH(n) && v != NULL; i++) {
926 joinstring_decref(&v, parsestr(STR(CHILD(n, i))));
927 }
928 }
929 return v;
930}
931
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000932static void
933com_list_constructor(c, n)
934 struct compiling *c;
935 node *n;
936{
937 int len;
938 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000939 if (TYPE(n) != testlist)
940 REQ(n, exprlist);
941 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
942 len = (NCH(n) + 1) / 2;
943 for (i = 0; i < NCH(n); i += 2)
944 com_node(c, CHILD(n, i));
945 com_addoparg(c, BUILD_LIST, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000946 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000947}
948
949static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000950com_dictmaker(c, n)
951 struct compiling *c;
952 node *n;
953{
954 int i;
955 /* dictmaker: test ':' test (',' test ':' value)* [','] */
956 for (i = 0; i+2 < NCH(n); i += 4) {
957 /* We must arrange things just right for STORE_SUBSCR.
958 It wants the stack to look like (value) (dict) (key) */
959 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000960 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000961 com_node(c, CHILD(n, i+2)); /* value */
962 com_addbyte(c, ROT_TWO);
963 com_node(c, CHILD(n, i)); /* key */
964 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000965 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000966 }
967}
968
969static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000970com_atom(c, n)
971 struct compiling *c;
972 node *n;
973{
974 node *ch;
975 object *v;
976 int i;
977 REQ(n, atom);
978 ch = CHILD(n, 0);
979 switch (TYPE(ch)) {
980 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +0000981 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000982 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000983 com_push(c, 1);
984 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000985 else
986 com_node(c, CHILD(n, 1));
987 break;
988 case LSQB:
Guido van Rossum8b993a91997-01-17 21:04:03 +0000989 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000990 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000991 com_push(c, 1);
992 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000993 else
994 com_list_constructor(c, CHILD(n, 1));
995 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000996 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000997 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000998 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000999 if (TYPE(CHILD(n, 1)) != RBRACE)
1000 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001001 break;
1002 case BACKQUOTE:
1003 com_node(c, CHILD(n, 1));
1004 com_addbyte(c, UNARY_CONVERT);
1005 break;
1006 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001007 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001008 i = 255;
1009 }
1010 else {
1011 i = com_addconst(c, v);
1012 DECREF(v);
1013 }
1014 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001015 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001016 break;
1017 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001018 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001019 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001020 c->c_errors++;
1021 i = 255;
1022 }
1023 else {
1024 i = com_addconst(c, v);
1025 DECREF(v);
1026 }
1027 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001028 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001029 break;
1030 case NAME:
1031 com_addopname(c, LOAD_NAME, ch);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001032 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001033 break;
1034 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001035 /* XXX fprintf(stderr, "node type %d\n", TYPE(ch)); */
Guido van Rossum452a9831996-09-17 14:32:04 +00001036 com_error(c, SystemError, "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001037 }
1038}
1039
1040static void
1041com_slice(c, n, op)
1042 struct compiling *c;
1043 node *n;
1044 int op;
1045{
1046 if (NCH(n) == 1) {
1047 com_addbyte(c, op);
1048 }
1049 else if (NCH(n) == 2) {
1050 if (TYPE(CHILD(n, 0)) != COLON) {
1051 com_node(c, CHILD(n, 0));
1052 com_addbyte(c, op+1);
1053 }
1054 else {
1055 com_node(c, CHILD(n, 1));
1056 com_addbyte(c, op+2);
1057 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001058 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001059 }
1060 else {
1061 com_node(c, CHILD(n, 0));
1062 com_node(c, CHILD(n, 2));
1063 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001064 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001065 }
1066}
1067
Guido van Rossum635abd21997-01-06 22:56:52 +00001068static void
1069com_argument(c, n, pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001070 struct compiling *c;
1071 node *n; /* argument */
Guido van Rossum635abd21997-01-06 22:56:52 +00001072 object **pkeywords;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001073{
1074 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001075 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001076 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001077 if (*pkeywords != NULL) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001078 com_error(c, SyntaxError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001079 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001080 }
1081 else {
1082 com_node(c, CHILD(n, 0));
1083 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001084 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001085 }
1086 m = n;
1087 do {
1088 m = CHILD(m, 0);
1089 } while (NCH(m) == 1);
1090 if (TYPE(m) != NAME) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001091 com_error(c, SyntaxError, "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001092 }
1093 else {
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001094 object *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001095 if (v != NULL && *pkeywords == NULL)
1096 *pkeywords = newdictobject();
1097 if (v == NULL || *pkeywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001098 c->c_errors++;
1099 else {
Guido van Rossum635abd21997-01-06 22:56:52 +00001100 if (dict2lookup(*pkeywords, v) != NULL)
1101 com_error(c, SyntaxError,
1102 "duplicate keyword argument");
1103 else
1104 if (dict2insert(*pkeywords, v, v) != 0)
1105 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001106 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001107 com_push(c, 1);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001108 DECREF(v);
1109 }
1110 }
1111 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001112}
1113
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001114static void
1115com_call_function(c, n)
1116 struct compiling *c;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001117 node *n; /* EITHER arglist OR ')' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001118{
1119 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001120 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001121 }
1122 else {
Guido van Rossum635abd21997-01-06 22:56:52 +00001123 object *keywords = NULL;
1124 int i, na, nk;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001125 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001126 na = 0;
1127 nk = 0;
1128 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001129 com_argument(c, CHILD(n, i), &keywords);
1130 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001131 na++;
1132 else
1133 nk++;
1134 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001135 XDECREF(keywords);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001136 if (na > 255 || nk > 255) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001137 com_error(c, SyntaxError, "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001138 }
1139 com_addoparg(c, CALL_FUNCTION, na | (nk << 8));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001140 com_pop(c, na + 2*nk);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001141 }
1142}
1143
1144static void
1145com_select_member(c, n)
1146 struct compiling *c;
1147 node *n;
1148{
1149 com_addopname(c, LOAD_ATTR, n);
1150}
1151
1152static void
Guido van Rossum8861b741996-07-30 16:49:37 +00001153com_sliceobj(c, n)
1154 struct compiling *c;
1155 node *n;
1156{
1157 int i=0;
1158 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001159 node *ch;
1160
1161 /* first argument */
1162 if (TYPE(CHILD(n,i)) == COLON) {
1163 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001164 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001165 i++;
1166 }
1167 else {
1168 com_node(c, CHILD(n,i));
1169 i++;
1170 REQ(CHILD(n,i),COLON);
1171 i++;
1172 }
1173 /* second argument */
1174 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1175 com_node(c, CHILD(n,i));
1176 i++;
1177 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001178 else {
1179 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1180 com_push(c, 1);
1181 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001182 /* remaining arguments */
1183 for (; i < NCH(n); i++) {
1184 ns++;
1185 ch=CHILD(n,i);
1186 REQ(ch, sliceop);
1187 if (NCH(ch) == 1) {
1188 /* right argument of ':' missing */
1189 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001190 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001191 }
1192 else
1193 com_node(c, CHILD(ch,1));
1194 }
1195 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001196 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001197}
1198
1199static void
1200com_subscript(c, n)
1201 struct compiling *c;
1202 node *n;
1203{
1204 node *ch;
1205 REQ(n, subscript);
1206 ch = CHILD(n,0);
1207 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001208 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001209 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001210 com_push(c, 1);
1211 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001212 else {
1213 /* check for slice */
1214 if ((TYPE(ch) == COLON || NCH(n) > 1))
1215 com_sliceobj(c, n);
1216 else {
1217 REQ(ch, test);
1218 com_node(c, ch);
1219 }
1220 }
1221}
1222
1223static void
1224com_subscriptlist(c, n, assigning)
1225 struct compiling *c;
1226 node *n;
1227 int assigning;
1228{
1229 int i, op;
1230 REQ(n, subscriptlist);
1231 /* Check to make backward compatible slice behavior for '[i:j]' */
1232 if (NCH(n) == 1) {
1233 node *sub = CHILD(n, 0); /* subscript */
1234 /* Make it is a simple slice.
Guido van Rossum8b993a91997-01-17 21:04:03 +00001235 Should have exactly one colon. */
Guido van Rossum8861b741996-07-30 16:49:37 +00001236 if ((TYPE(CHILD(sub, 0)) == COLON
1237 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
Guido van Rossum8b993a91997-01-17 21:04:03 +00001238 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1239 {
Guido van Rossum8861b741996-07-30 16:49:37 +00001240 if (assigning == OP_APPLY)
1241 op = SLICE;
1242 else
1243 op = ((assigning == OP_ASSIGN) ? STORE_SLICE : DELETE_SLICE);
1244 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001245 if (op == STORE_SLICE)
1246 com_pop(c, 2);
1247 else if (op == DELETE_SLICE)
1248 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001249 return;
1250 }
1251 }
1252 /* Else normal subscriptlist. Compile each subscript. */
1253 for (i = 0; i < NCH(n); i += 2)
1254 com_subscript(c, CHILD(n, i));
1255 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001256 if (NCH(n) > 1) {
1257 i = (NCH(n)+1) / 2;
1258 com_addoparg(c, BUILD_TUPLE, i);
1259 com_pop(c, i-1);
1260 }
1261 if (assigning == OP_APPLY) {
Guido van Rossum8861b741996-07-30 16:49:37 +00001262 op = BINARY_SUBSCR;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001263 i = 1;
1264 }
1265 else if (assigning == OP_ASSIGN) {
1266 op = STORE_SUBSCR;
1267 i = 3;
1268 }
1269 else {
1270 op = DELETE_SUBSCR;
1271 i = 2;
1272 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001273 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001274 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001275}
1276
1277static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001278com_apply_trailer(c, n)
1279 struct compiling *c;
1280 node *n;
1281{
1282 REQ(n, trailer);
1283 switch (TYPE(CHILD(n, 0))) {
1284 case LPAR:
1285 com_call_function(c, CHILD(n, 1));
1286 break;
1287 case DOT:
1288 com_select_member(c, CHILD(n, 1));
1289 break;
1290 case LSQB:
Guido van Rossum8861b741996-07-30 16:49:37 +00001291 com_subscriptlist(c, CHILD(n, 1), OP_APPLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001292 break;
1293 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001294 com_error(c, SystemError,
1295 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001296 }
1297}
1298
1299static void
Guido van Rossum50564e81996-01-12 01:13:16 +00001300com_power(c, n)
1301 struct compiling *c;
1302 node *n;
1303{
1304 int i;
1305 REQ(n, power);
1306 com_atom(c, CHILD(n, 0));
1307 for (i = 1; i < NCH(n); i++) {
1308 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1309 com_factor(c, CHILD(n, i+1));
1310 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001311 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001312 break;
1313 }
1314 else
1315 com_apply_trailer(c, CHILD(n, i));
1316 }
1317}
1318
1319static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001320com_factor(c, n)
1321 struct compiling *c;
1322 node *n;
1323{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001324 REQ(n, factor);
1325 if (TYPE(CHILD(n, 0)) == PLUS) {
1326 com_factor(c, CHILD(n, 1));
1327 com_addbyte(c, UNARY_POSITIVE);
1328 }
1329 else if (TYPE(CHILD(n, 0)) == MINUS) {
1330 com_factor(c, CHILD(n, 1));
1331 com_addbyte(c, UNARY_NEGATIVE);
1332 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001333 else if (TYPE(CHILD(n, 0)) == TILDE) {
1334 com_factor(c, CHILD(n, 1));
1335 com_addbyte(c, UNARY_INVERT);
1336 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001337 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001338 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001339 }
1340}
1341
1342static void
1343com_term(c, n)
1344 struct compiling *c;
1345 node *n;
1346{
1347 int i;
1348 int op;
1349 REQ(n, term);
1350 com_factor(c, CHILD(n, 0));
1351 for (i = 2; i < NCH(n); i += 2) {
1352 com_factor(c, CHILD(n, i));
1353 switch (TYPE(CHILD(n, i-1))) {
1354 case STAR:
1355 op = BINARY_MULTIPLY;
1356 break;
1357 case SLASH:
1358 op = BINARY_DIVIDE;
1359 break;
1360 case PERCENT:
1361 op = BINARY_MODULO;
1362 break;
1363 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001364 com_error(c, SystemError,
1365 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001366 op = 255;
1367 }
1368 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001369 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001370 }
1371}
1372
1373static void
1374com_arith_expr(c, n)
1375 struct compiling *c;
1376 node *n;
1377{
1378 int i;
1379 int op;
1380 REQ(n, arith_expr);
1381 com_term(c, CHILD(n, 0));
1382 for (i = 2; i < NCH(n); i += 2) {
1383 com_term(c, CHILD(n, i));
1384 switch (TYPE(CHILD(n, i-1))) {
1385 case PLUS:
1386 op = BINARY_ADD;
1387 break;
1388 case MINUS:
1389 op = BINARY_SUBTRACT;
1390 break;
1391 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001392 com_error(c, SystemError,
1393 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001394 op = 255;
1395 }
1396 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001397 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001398 }
1399}
1400
1401static void
1402com_shift_expr(c, n)
1403 struct compiling *c;
1404 node *n;
1405{
1406 int i;
1407 int op;
1408 REQ(n, shift_expr);
1409 com_arith_expr(c, CHILD(n, 0));
1410 for (i = 2; i < NCH(n); i += 2) {
1411 com_arith_expr(c, CHILD(n, i));
1412 switch (TYPE(CHILD(n, i-1))) {
1413 case LEFTSHIFT:
1414 op = BINARY_LSHIFT;
1415 break;
1416 case RIGHTSHIFT:
1417 op = BINARY_RSHIFT;
1418 break;
1419 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001420 com_error(c, SystemError,
1421 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001422 op = 255;
1423 }
1424 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001425 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001426 }
1427}
1428
1429static void
1430com_and_expr(c, n)
1431 struct compiling *c;
1432 node *n;
1433{
1434 int i;
1435 int op;
1436 REQ(n, and_expr);
1437 com_shift_expr(c, CHILD(n, 0));
1438 for (i = 2; i < NCH(n); i += 2) {
1439 com_shift_expr(c, CHILD(n, i));
1440 if (TYPE(CHILD(n, i-1)) == AMPER) {
1441 op = BINARY_AND;
1442 }
1443 else {
Guido van Rossum452a9831996-09-17 14:32:04 +00001444 com_error(c, SystemError,
1445 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001446 op = 255;
1447 }
1448 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001449 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001450 }
1451}
1452
1453static void
1454com_xor_expr(c, n)
1455 struct compiling *c;
1456 node *n;
1457{
1458 int i;
1459 int op;
1460 REQ(n, xor_expr);
1461 com_and_expr(c, CHILD(n, 0));
1462 for (i = 2; i < NCH(n); i += 2) {
1463 com_and_expr(c, CHILD(n, i));
1464 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1465 op = BINARY_XOR;
1466 }
1467 else {
Guido van Rossum452a9831996-09-17 14:32:04 +00001468 com_error(c, SystemError,
1469 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001470 op = 255;
1471 }
1472 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001473 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001474 }
1475}
1476
1477static void
1478com_expr(c, n)
1479 struct compiling *c;
1480 node *n;
1481{
1482 int i;
1483 int op;
1484 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001485 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001486 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001487 com_xor_expr(c, CHILD(n, i));
1488 if (TYPE(CHILD(n, i-1)) == VBAR) {
1489 op = BINARY_OR;
1490 }
1491 else {
Guido van Rossum452a9831996-09-17 14:32:04 +00001492 com_error(c, SystemError,
1493 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001494 op = 255;
1495 }
1496 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001497 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001498 }
1499}
1500
1501static enum cmp_op
1502cmp_type(n)
1503 node *n;
1504{
1505 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001506 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001507 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1508 if (NCH(n) == 1) {
1509 n = CHILD(n, 0);
1510 switch (TYPE(n)) {
1511 case LESS: return LT;
1512 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001513 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001514 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001515 case LESSEQUAL: return LE;
1516 case GREATEREQUAL: return GE;
1517 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001518 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1519 if (strcmp(STR(n), "is") == 0) return IS;
1520 }
1521 }
1522 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001523 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001524 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1525 return NOT_IN;
1526 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1527 return IS_NOT;
1528 }
1529 }
1530 return BAD;
1531}
1532
1533static void
1534com_comparison(c, n)
1535 struct compiling *c;
1536 node *n;
1537{
1538 int i;
1539 enum cmp_op op;
1540 int anchor;
1541 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
1542 com_expr(c, CHILD(n, 0));
1543 if (NCH(n) == 1)
1544 return;
1545
1546 /****************************************************************
1547 The following code is generated for all but the last
1548 comparison in a chain:
1549
1550 label: on stack: opcode: jump to:
1551
1552 a <code to load b>
1553 a, b DUP_TOP
1554 a, b, b ROT_THREE
1555 b, a, b COMPARE_OP
1556 b, 0-or-1 JUMP_IF_FALSE L1
1557 b, 1 POP_TOP
1558 b
1559
1560 We are now ready to repeat this sequence for the next
1561 comparison in the chain.
1562
1563 For the last we generate:
1564
1565 b <code to load c>
1566 b, c COMPARE_OP
1567 0-or-1
1568
1569 If there were any jumps to L1 (i.e., there was more than one
1570 comparison), we generate:
1571
1572 0-or-1 JUMP_FORWARD L2
1573 L1: b, 0 ROT_TWO
1574 0, b POP_TOP
1575 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00001576 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001577 ****************************************************************/
1578
1579 anchor = 0;
1580
1581 for (i = 2; i < NCH(n); i += 2) {
1582 com_expr(c, CHILD(n, i));
1583 if (i+2 < NCH(n)) {
1584 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001585 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001586 com_addbyte(c, ROT_THREE);
1587 }
1588 op = cmp_type(CHILD(n, i-1));
1589 if (op == BAD) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001590 com_error(c, SystemError,
1591 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001592 }
1593 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001594 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001595 if (i+2 < NCH(n)) {
1596 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1597 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001598 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001599 }
1600 }
1601
1602 if (anchor) {
1603 int anchor2 = 0;
1604 com_addfwref(c, JUMP_FORWARD, &anchor2);
1605 com_backpatch(c, anchor);
1606 com_addbyte(c, ROT_TWO);
1607 com_addbyte(c, POP_TOP);
1608 com_backpatch(c, anchor2);
1609 }
1610}
1611
1612static void
1613com_not_test(c, n)
1614 struct compiling *c;
1615 node *n;
1616{
1617 REQ(n, not_test); /* 'not' not_test | comparison */
1618 if (NCH(n) == 1) {
1619 com_comparison(c, CHILD(n, 0));
1620 }
1621 else {
1622 com_not_test(c, CHILD(n, 1));
1623 com_addbyte(c, UNARY_NOT);
1624 }
1625}
1626
1627static void
1628com_and_test(c, n)
1629 struct compiling *c;
1630 node *n;
1631{
1632 int i;
1633 int anchor;
1634 REQ(n, and_test); /* not_test ('and' not_test)* */
1635 anchor = 0;
1636 i = 0;
1637 for (;;) {
1638 com_not_test(c, CHILD(n, i));
1639 if ((i += 2) >= NCH(n))
1640 break;
1641 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1642 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001643 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001644 }
1645 if (anchor)
1646 com_backpatch(c, anchor);
1647}
1648
1649static void
1650com_test(c, n)
1651 struct compiling *c;
1652 node *n;
1653{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001654 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00001655 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
1656 object *v;
1657 int i;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001658 int ndefs = com_argdefs(c, CHILD(n, 0));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001659 v = (object *) icompile(CHILD(n, 0), c);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001660 if (v == NULL) {
1661 c->c_errors++;
1662 i = 255;
1663 }
1664 else {
1665 i = com_addconst(c, v);
1666 DECREF(v);
1667 }
1668 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001669 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001670 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001671 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001672 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00001673 else {
1674 int anchor = 0;
1675 int i = 0;
1676 for (;;) {
1677 com_and_test(c, CHILD(n, i));
1678 if ((i += 2) >= NCH(n))
1679 break;
1680 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1681 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001682 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001683 }
1684 if (anchor)
1685 com_backpatch(c, anchor);
1686 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001687}
1688
1689static void
Guido van Rossum288a60f1991-12-16 13:05:10 +00001690com_list(c, n, toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001691 struct compiling *c;
1692 node *n;
Guido van Rossum288a60f1991-12-16 13:05:10 +00001693 int toplevel; /* If nonzero, *always* build a tuple */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001694{
1695 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001696 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001697 com_node(c, CHILD(n, 0));
1698 }
1699 else {
1700 int i;
1701 int len;
1702 len = (NCH(n) + 1) / 2;
1703 for (i = 0; i < NCH(n); i += 2)
1704 com_node(c, CHILD(n, i));
1705 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001706 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001707 }
1708}
1709
1710
1711/* Begin of assignment compilation */
1712
1713static void com_assign_name PROTO((struct compiling *, node *, int));
1714static void com_assign PROTO((struct compiling *, node *, int));
1715
1716static void
1717com_assign_attr(c, n, assigning)
1718 struct compiling *c;
1719 node *n;
1720 int assigning;
1721{
1722 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001723 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001724}
1725
1726static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001727com_assign_trailer(c, n, assigning)
1728 struct compiling *c;
1729 node *n;
1730 int assigning;
1731{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001732 REQ(n, trailer);
1733 switch (TYPE(CHILD(n, 0))) {
1734 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum452a9831996-09-17 14:32:04 +00001735 com_error(c, SyntaxError, "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001736 break;
1737 case DOT: /* '.' NAME */
1738 com_assign_attr(c, CHILD(n, 1), assigning);
1739 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001740 case LSQB: /* '[' subscriptlist ']' */
1741 com_subscriptlist(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001742 break;
1743 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001744 com_error(c, SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001745 }
1746}
1747
1748static void
1749com_assign_tuple(c, n, assigning)
1750 struct compiling *c;
1751 node *n;
1752 int assigning;
1753{
1754 int i;
1755 if (TYPE(n) != testlist)
1756 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001757 if (assigning) {
1758 i = (NCH(n)+1)/2;
1759 com_addoparg(c, UNPACK_TUPLE, i);
1760 com_push(c, i-1);
1761 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001762 for (i = 0; i < NCH(n); i += 2)
1763 com_assign(c, CHILD(n, i), assigning);
1764}
1765
1766static void
1767com_assign_list(c, n, assigning)
1768 struct compiling *c;
1769 node *n;
1770 int assigning;
1771{
1772 int i;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001773 if (assigning) {
1774 i = (NCH(n)+1)/2;
1775 com_addoparg(c, UNPACK_LIST, i);
1776 com_push(c, i-1);
1777 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001778 for (i = 0; i < NCH(n); i += 2)
1779 com_assign(c, CHILD(n, i), assigning);
1780}
1781
1782static void
1783com_assign_name(c, n, assigning)
1784 struct compiling *c;
1785 node *n;
1786 int assigning;
1787{
1788 REQ(n, NAME);
1789 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001790 if (assigning)
1791 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001792}
1793
1794static void
1795com_assign(c, n, assigning)
1796 struct compiling *c;
1797 node *n;
1798 int assigning;
1799{
1800 /* Loop to avoid trivial recursion */
1801 for (;;) {
1802 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001803
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001804 case exprlist:
1805 case testlist:
1806 if (NCH(n) > 1) {
1807 com_assign_tuple(c, n, assigning);
1808 return;
1809 }
1810 n = CHILD(n, 0);
1811 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001812
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001813 case test:
1814 case and_test:
1815 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001816 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001817 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001818 case xor_expr:
1819 case and_expr:
1820 case shift_expr:
1821 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001822 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00001823 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001824 if (NCH(n) > 1) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001825 com_error(c, SyntaxError,
1826 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001827 return;
1828 }
1829 n = CHILD(n, 0);
1830 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001831
Guido van Rossum50564e81996-01-12 01:13:16 +00001832 case power: /* atom trailer* ('**' power)* */
1833/* ('+'|'-'|'~') factor | atom trailer* */
1834 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001835 com_error(c, SyntaxError,
1836 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001837 return;
1838 }
Guido van Rossum50564e81996-01-12 01:13:16 +00001839 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001840 int i;
1841 com_node(c, CHILD(n, 0));
1842 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00001843 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001844 com_error(c, SyntaxError,
1845 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00001846 return;
1847 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001848 com_apply_trailer(c, CHILD(n, i));
1849 } /* NB i is still alive */
1850 com_assign_trailer(c,
1851 CHILD(n, i), assigning);
1852 return;
1853 }
1854 n = CHILD(n, 0);
1855 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001856
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001857 case atom:
1858 switch (TYPE(CHILD(n, 0))) {
1859 case LPAR:
1860 n = CHILD(n, 1);
1861 if (TYPE(n) == RPAR) {
1862 /* XXX Should allow () = () ??? */
Guido van Rossum452a9831996-09-17 14:32:04 +00001863 com_error(c, SyntaxError,
1864 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001865 return;
1866 }
1867 break;
1868 case LSQB:
1869 n = CHILD(n, 1);
1870 if (TYPE(n) == RSQB) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001871 com_error(c, SyntaxError,
1872 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001873 return;
1874 }
1875 com_assign_list(c, n, assigning);
1876 return;
1877 case NAME:
1878 com_assign_name(c, CHILD(n, 0), assigning);
1879 return;
1880 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001881 com_error(c, SyntaxError,
1882 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001883 return;
1884 }
1885 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001886
1887 case lambdef:
Guido van Rossum452a9831996-09-17 14:32:04 +00001888 com_error(c, SyntaxError, "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001889 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001890
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001891 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001892 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum452a9831996-09-17 14:32:04 +00001893 com_error(c, SystemError, "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001894 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001895
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001896 }
1897 }
1898}
Guido van Rossum7c531111997-03-11 18:42:21 +00001899
Guido van Rossum8b993a91997-01-17 21:04:03 +00001900/* Forward */ static node *get_rawdocstring PROTO((node *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001901
1902static void
1903com_expr_stmt(c, n)
1904 struct compiling *c;
1905 node *n;
1906{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001907 REQ(n, expr_stmt); /* testlist ('=' testlist)* */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001908 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001909 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001910 return;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001911 com_node(c, CHILD(n, NCH(n)-1));
1912 if (NCH(n) == 1) {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001913 if (c->c_interactive)
1914 com_addbyte(c, PRINT_EXPR);
1915 else
1916 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001917 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001918 }
1919 else {
1920 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001921 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00001922 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001923 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001924 com_push(c, 1);
1925 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001926 com_assign(c, CHILD(n, i), OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001927 }
1928 }
1929}
1930
1931static void
Guido van Rossum228d7f31997-04-02 05:24:36 +00001932com_assert_stmt(c, n)
1933 struct compiling *c;
1934 node *n;
1935{
1936 int a = 0, b = 0;
1937 int i;
1938 REQ(n, assert_stmt); /* 'assert' test [',' test] */
1939 /* Generate code like for
1940
1941 if __debug__:
1942 if not <test>:
1943 raise AssertionError [, <message>]
1944
1945 where <message> is the second test, if present.
1946 */
1947 if (Py_OptimizeFlag)
1948 return;
1949 com_addopnamestr(c, LOAD_GLOBAL, "__debug__");
1950 com_push(c, 1);
1951 com_addfwref(c, JUMP_IF_FALSE, &a);
1952 com_addbyte(c, POP_TOP);
1953 com_pop(c, 1);
1954 com_node(c, CHILD(n, 1));
1955 com_addfwref(c, JUMP_IF_TRUE, &b);
1956 com_addbyte(c, POP_TOP);
1957 com_pop(c, 1);
1958 /* Raise that exception! */
1959 com_addopnamestr(c, LOAD_GLOBAL, "AssertionError");
1960 com_push(c, 1);
1961 i = NCH(n)/2; /* Either 2 or 4 */
1962 if (i > 1)
1963 com_node(c, CHILD(n, 3));
1964 com_addoparg(c, RAISE_VARARGS, i);
1965 com_pop(c, i);
1966 /* The interpreter does not fall through */
1967 /* All jumps converge here */
1968 com_backpatch(c, a);
1969 com_backpatch(c, b);
1970 com_addbyte(c, POP_TOP);
1971}
1972
1973static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001974com_print_stmt(c, n)
1975 struct compiling *c;
1976 node *n;
1977{
1978 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001979 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
1980 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001981 com_node(c, CHILD(n, i));
1982 com_addbyte(c, PRINT_ITEM);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001983 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001984 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001985 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001986 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001987 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001988}
1989
1990static void
1991com_return_stmt(c, n)
1992 struct compiling *c;
1993 node *n;
1994{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001995 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001996 if (!c->c_infunction) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001997 com_error(c, SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001998 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001999 if (NCH(n) < 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002000 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002001 com_push(c, 1);
2002 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002003 else
2004 com_node(c, CHILD(n, 1));
2005 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002006 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002007}
2008
2009static void
2010com_raise_stmt(c, n)
2011 struct compiling *c;
2012 node *n;
2013{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002014 int i;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002015 REQ(n, raise_stmt); /* 'raise' test [',' test [',' test]] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002016 com_node(c, CHILD(n, 1));
Guido van Rossum681d79a1995-07-18 14:51:37 +00002017 if (NCH(n) > 3) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002018 com_node(c, CHILD(n, 3));
Guido van Rossum681d79a1995-07-18 14:51:37 +00002019 if (NCH(n) > 5)
2020 com_node(c, CHILD(n, 5));
Guido van Rossumf10570b1995-07-07 22:53:21 +00002021 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002022 i = NCH(n)/2;
2023 com_addoparg(c, RAISE_VARARGS, i);
2024 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002025}
2026
2027static void
2028com_import_stmt(c, n)
2029 struct compiling *c;
2030 node *n;
2031{
2032 int i;
2033 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002034 /* 'import' dotted_name (',' dotted_name)* |
2035 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002036 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002037 /* 'from' dotted_name 'import' ... */
2038 REQ(CHILD(n, 1), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002039 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002040 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002041 for (i = 3; i < NCH(n); i += 2)
2042 com_addopname(c, IMPORT_FROM, CHILD(n, i));
2043 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002044 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002045 }
2046 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002047 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002048 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002049 REQ(CHILD(n, i), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002050 com_addopname(c, IMPORT_NAME, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002051 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002052 com_addopname(c, STORE_NAME, CHILD(CHILD(n, i), 0));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002053 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002054 }
2055 }
2056}
2057
2058static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00002059com_global_stmt(c, n)
2060 struct compiling *c;
2061 node *n;
2062{
2063 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002064 REQ(n, global_stmt);
2065 /* 'global' NAME (',' NAME)* */
2066 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002067 char *s = STR(CHILD(n, i));
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002068#ifdef PRIVATE_NAME_MANGLING
2069 char buffer[256];
2070 if (s != NULL && s[0] == '_' && s[1] == '_' &&
2071 c->c_private != NULL &&
2072 com_mangle(c, s, buffer, (int)sizeof(buffer)))
2073 s = buffer;
2074#endif
Guido van Rossum681d79a1995-07-18 14:51:37 +00002075 if (dictlookup(c->c_locals, s) != NULL) {
Guido van Rossum452a9831996-09-17 14:32:04 +00002076 com_error(c, SyntaxError, "name is local and global");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002077 }
2078 else if (dictinsert(c->c_globals, s, None) != 0)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002079 c->c_errors++;
2080 }
2081}
2082
Guido van Rossum681d79a1995-07-18 14:51:37 +00002083static int
2084com_newlocal_o(c, nameval)
2085 struct compiling *c;
2086 object *nameval;
2087{
2088 int i;
2089 object *ival;
2090 if (getlistsize(c->c_varnames) != c->c_nlocals) {
2091 /* This is usually caused by an error on a previous call */
2092 if (c->c_errors == 0) {
Guido van Rossum452a9831996-09-17 14:32:04 +00002093 com_error(c, SystemError, "mixed up var name/index");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002094 }
2095 return 0;
2096 }
2097 ival = newintobject(i = c->c_nlocals++);
2098 if (ival == NULL)
2099 c->c_errors++;
2100 else if (mappinginsert(c->c_locals, nameval, ival) != 0)
2101 c->c_errors++;
2102 else if (addlistitem(c->c_varnames, nameval) != 0)
2103 c->c_errors++;
2104 XDECREF(ival);
2105 return i;
2106}
2107
2108static int
2109com_addlocal_o(c, nameval)
2110 struct compiling *c;
2111 object *nameval;
2112{
2113 object *ival = mappinglookup(c->c_locals, nameval);
2114 if (ival != NULL)
2115 return getintvalue(ival);
2116 return com_newlocal_o(c, nameval);
2117}
2118
2119static int
2120com_newlocal(c, name)
2121 struct compiling *c;
2122 char *name;
2123{
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00002124 object *nameval = PyString_InternFromString(name);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002125 int i;
2126 if (nameval == NULL) {
2127 c->c_errors++;
2128 return 0;
2129 }
2130 i = com_newlocal_o(c, nameval);
2131 DECREF(nameval);
2132 return i;
2133}
2134
Guido van Rossum8b993a91997-01-17 21:04:03 +00002135#ifdef SUPPORT_OBSOLETE_ACCESS
2136
Guido van Rossum25831651993-05-19 14:50:45 +00002137#define strequ(a, b) (strcmp((a), (b)) == 0)
2138
2139static void
2140com_access_stmt(c, n)
2141 struct compiling *c;
2142 node *n;
2143{
2144 int i, j, k, mode, imode;
2145 object *vmode;
2146 REQ(n, access_stmt);
2147 /* 'access' NAME (',' NAME)* ':' accesstype (',' accesstype)*
2148 accesstype: NAME+ */
2149
2150 /* Find where the colon is */
2151 i = 1;
2152 while (TYPE(CHILD(n,i-1)) != COLON)
2153 i += 1;
2154
2155 /* Calculate the mode mask */
2156 mode = 0;
2157 for (j = i; j < NCH(n); j += 2) {
Guido van Rossum81daa321993-05-20 14:24:46 +00002158 int r = 0, w = 0, p = 0;
2159 for (k = 0; k < NCH(CHILD(n,j)); k++) {
Guido van Rossum25831651993-05-19 14:50:45 +00002160 if (strequ(STR(CHILD(CHILD(n,j),k)), "public"))
2161 p = 0;
2162 else if (strequ(STR(CHILD(CHILD(n,j),k)), "protected"))
2163 p = 1;
2164 else if (strequ(STR(CHILD(CHILD(n,j),k)), "private"))
2165 p = 2;
2166 else if (strequ(STR(CHILD(CHILD(n,j),k)), "read"))
2167 r = 1;
2168 else if (strequ(STR(CHILD(CHILD(n,j),k)), "write"))
2169 w = 1;
2170 else /* XXX should make this an exception */
2171 fprintf(stderr, "bad access type %s\n",
2172 STR(CHILD(CHILD(n,j),k)));
2173 }
2174 if (r == 0 && w == 0)
Guido van Rossum81daa321993-05-20 14:24:46 +00002175 r = w = 1;
Guido van Rossum25831651993-05-19 14:50:45 +00002176 if (p == 0) {
2177 if (r == 1) mode |= AC_R_PUBLIC;
2178 if (w == 1) mode |= AC_W_PUBLIC;
2179 } else if (p == 1) {
2180 if (r == 1) mode |= AC_R_PROTECTED;
2181 if (w == 1) mode |= AC_W_PROTECTED;
2182 } else {
2183 if (r == 1) mode |= AC_R_PRIVATE;
2184 if (w == 1) mode |= AC_W_PRIVATE;
2185 }
2186 }
2187 vmode = newintobject((long)mode);
2188 imode = com_addconst(c, vmode);
2189 XDECREF(vmode);
2190 for (i = 1; TYPE(CHILD(n,i-1)) != COLON; i+=2) {
2191 com_addoparg(c, LOAD_CONST, imode);
2192 com_addopname(c, ACCESS_MODE, CHILD(n, i));
2193 }
2194}
Guido van Rossum0dfcf751996-08-12 22:00:53 +00002195#endif
Guido van Rossum25831651993-05-19 14:50:45 +00002196
Guido van Rossumc5e96291991-12-10 13:53:51 +00002197static void
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002198com_exec_stmt(c, n)
2199 struct compiling *c;
2200 node *n;
2201{
2202 REQ(n, exec_stmt);
2203 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2204 com_node(c, CHILD(n, 1));
2205 if (NCH(n) >= 4)
2206 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002207 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002208 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002209 com_push(c, 1);
2210 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002211 if (NCH(n) >= 6)
2212 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002213 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002214 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002215 com_push(c, 1);
2216 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002217 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002218 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002219}
2220
Guido van Rossum7c531111997-03-11 18:42:21 +00002221static int
2222is_constant_false(c, n)
2223 struct compiling *c;
2224 node *n;
2225{
2226 object *v;
2227 int i;
2228
2229 /* Label to avoid tail recursion */
2230 next:
2231 switch (TYPE(n)) {
2232
2233 case suite:
2234 if (NCH(n) == 1) {
2235 n = CHILD(n, 0);
2236 goto next;
2237 }
2238 /* Fall through */
2239 case file_input:
2240 for (i = 0; i < NCH(n); i++) {
2241 node *ch = CHILD(n, i);
2242 if (TYPE(ch) == stmt) {
2243 n = ch;
2244 goto next;
2245 }
2246 }
2247 break;
2248
2249 case stmt:
2250 case simple_stmt:
2251 case small_stmt:
2252 n = CHILD(n, 0);
2253 goto next;
2254
2255 case expr_stmt:
2256 case testlist:
2257 case test:
2258 case and_test:
2259 case not_test:
2260 case comparison:
2261 case expr:
2262 case xor_expr:
2263 case and_expr:
2264 case shift_expr:
2265 case arith_expr:
2266 case term:
2267 case factor:
2268 case power:
2269 case atom:
2270 if (NCH(n) == 1) {
2271 n = CHILD(n, 0);
2272 goto next;
2273 }
2274 break;
2275
2276 case NAME:
2277 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2278 return 1;
2279 break;
2280
2281 case NUMBER:
2282 v = parsenumber(c, STR(n));
2283 if (v == NULL) {
2284 err_clear();
2285 break;
2286 }
2287 i = testbool(v);
2288 DECREF(v);
2289 return i == 0;
2290
2291 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002292 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002293 if (v == NULL) {
2294 err_clear();
2295 break;
2296 }
2297 i = testbool(v);
2298 DECREF(v);
2299 return i == 0;
2300
2301 }
2302 return 0;
2303}
2304
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002305static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002306com_if_stmt(c, n)
2307 struct compiling *c;
2308 node *n;
2309{
2310 int i;
2311 int anchor = 0;
2312 REQ(n, if_stmt);
2313 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2314 for (i = 0; i+3 < NCH(n); i+=4) {
2315 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002316 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002317 if (is_constant_false(c, ch))
2318 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002319 if (i > 0)
2320 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002321 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002322 com_addfwref(c, JUMP_IF_FALSE, &a);
2323 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002324 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002325 com_node(c, CHILD(n, i+3));
2326 com_addfwref(c, JUMP_FORWARD, &anchor);
2327 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002328 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002329 com_addbyte(c, POP_TOP);
2330 }
2331 if (i+2 < NCH(n))
2332 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002333 if (anchor)
2334 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002335}
2336
2337static void
2338com_while_stmt(c, n)
2339 struct compiling *c;
2340 node *n;
2341{
2342 int break_anchor = 0;
2343 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002344 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002345 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2346 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002347 block_push(c, SETUP_LOOP);
2348 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002349 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002350 com_node(c, CHILD(n, 1));
2351 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2352 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002353 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002354 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002355 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002356 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002357 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2358 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002359 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002360 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002361 com_addbyte(c, POP_TOP);
2362 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002363 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002364 if (NCH(n) > 4)
2365 com_node(c, CHILD(n, 6));
2366 com_backpatch(c, break_anchor);
2367}
2368
2369static void
2370com_for_stmt(c, n)
2371 struct compiling *c;
2372 node *n;
2373{
2374 object *v;
2375 int break_anchor = 0;
2376 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002377 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002378 REQ(n, for_stmt);
2379 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2380 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002381 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002382 com_node(c, CHILD(n, 3));
2383 v = newintobject(0L);
2384 if (v == NULL)
2385 c->c_errors++;
2386 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002387 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002388 XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002389 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002390 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002391 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002392 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002393 com_assign(c, CHILD(n, 1), OP_ASSIGN);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002394 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002395 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002396 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002397 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2398 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002399 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002400 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002401 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002402 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002403 if (NCH(n) > 8)
2404 com_node(c, CHILD(n, 8));
2405 com_backpatch(c, break_anchor);
2406}
2407
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002408/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002409
2410 SETUP_FINALLY L
2411 <code for S>
2412 POP_BLOCK
2413 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002414 L: <code for Sf>
2415 END_FINALLY
2416
2417 The special instructions use the block stack. Each block
2418 stack entry contains the instruction that created it (here
2419 SETUP_FINALLY), the level of the value stack at the time the
2420 block stack entry was created, and a label (here L).
2421
2422 SETUP_FINALLY:
2423 Pushes the current value stack level and the label
2424 onto the block stack.
2425 POP_BLOCK:
2426 Pops en entry from the block stack, and pops the value
2427 stack until its level is the same as indicated on the
2428 block stack. (The label is ignored.)
2429 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002430 Pops a variable number of entries from the *value* stack
2431 and re-raises the exception they specify. The number of
2432 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002433
2434 The block stack is unwound when an exception is raised:
2435 when a SETUP_FINALLY entry is found, the exception is pushed
2436 onto the value stack (and the exception condition is cleared),
2437 and the interpreter jumps to the label gotten from the block
2438 stack.
2439
2440 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002441 (The contents of the value stack is shown in [], with the top
2442 at the right; 'tb' is trace-back info, 'val' the exception's
2443 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002444
2445 Value stack Label Instruction Argument
2446 [] SETUP_EXCEPT L1
2447 [] <code for S>
2448 [] POP_BLOCK
2449 [] JUMP_FORWARD L0
2450
Guido van Rossum3f5da241990-12-20 15:06:42 +00002451 [tb, val, exc] L1: DUP )
2452 [tb, val, exc, exc] <evaluate E1> )
2453 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2454 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2455 [tb, val, exc, 1] POP )
2456 [tb, val, exc] POP
2457 [tb, val] <assign to V1> (or POP if no V1)
2458 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002459 [] <code for S1>
2460 JUMP_FORWARD L0
2461
Guido van Rossum3f5da241990-12-20 15:06:42 +00002462 [tb, val, exc, 0] L2: POP
2463 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002464 .............................etc.......................
2465
Guido van Rossum3f5da241990-12-20 15:06:42 +00002466 [tb, val, exc, 0] Ln+1: POP
2467 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002468
2469 [] L0: <next statement>
2470
2471 Of course, parts are not generated if Vi or Ei is not present.
2472*/
2473
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002474static void
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002475com_try_except(c, n)
2476 struct compiling *c;
2477 node *n;
2478{
2479 int except_anchor = 0;
2480 int end_anchor = 0;
2481 int else_anchor = 0;
2482 int i;
2483 node *ch;
2484
2485 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2486 block_push(c, SETUP_EXCEPT);
2487 com_node(c, CHILD(n, 2));
2488 com_addbyte(c, POP_BLOCK);
2489 block_pop(c, SETUP_EXCEPT);
2490 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2491 com_backpatch(c, except_anchor);
2492 for (i = 3;
2493 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2494 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002495 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002496 if (except_anchor == 0) {
Guido van Rossum452a9831996-09-17 14:32:04 +00002497 com_error(c, SyntaxError,
2498 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002499 break;
2500 }
2501 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002502 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002503 com_addoparg(c, SET_LINENO, ch->n_lineno);
2504 if (NCH(ch) > 1) {
2505 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002506 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002507 com_node(c, CHILD(ch, 1));
2508 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002509 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002510 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
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 }
2514 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002515 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002516 if (NCH(ch) > 3)
Guido van Rossum8861b741996-07-30 16:49:37 +00002517 com_assign(c, CHILD(ch, 3), OP_ASSIGN);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002518 else {
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);
2521 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002522 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002523 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002524 com_node(c, CHILD(n, i+2));
2525 com_addfwref(c, JUMP_FORWARD, &end_anchor);
2526 if (except_anchor) {
2527 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002528 /* We come in with [tb, val, exc, 0] on the
2529 stack; one pop and it's the same as
2530 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002531 com_addbyte(c, POP_TOP);
2532 }
2533 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002534 /* We actually come in here with [tb, val, exc] but the
2535 END_FINALLY will zap those and jump around.
2536 The c_stacklevel does not reflect them so we need not pop
2537 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002538 com_addbyte(c, END_FINALLY);
2539 com_backpatch(c, else_anchor);
2540 if (i < NCH(n))
2541 com_node(c, CHILD(n, i+2));
2542 com_backpatch(c, end_anchor);
2543}
2544
2545static void
2546com_try_finally(c, n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002547 struct compiling *c;
2548 node *n;
2549{
2550 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002551 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002552
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002553 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
2554 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002555 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002556 com_addbyte(c, POP_BLOCK);
2557 block_pop(c, SETUP_FINALLY);
2558 block_push(c, END_FINALLY);
2559 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002560 /* While the generated code pushes only one item,
2561 the try-finally handling can enter here with
2562 up to three items. OK, here are the details:
2563 3 for an exception, 2 for RETURN, 1 for BREAK. */
2564 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002565 com_backpatch(c, finally_anchor);
2566 ch = CHILD(n, NCH(n)-1);
2567 com_addoparg(c, SET_LINENO, ch->n_lineno);
2568 com_node(c, ch);
2569 com_addbyte(c, END_FINALLY);
2570 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002571 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002572}
2573
2574static void
2575com_try_stmt(c, n)
2576 struct compiling *c;
2577 node *n;
2578{
2579 REQ(n, try_stmt);
2580 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
2581 | 'try' ':' suite 'finally' ':' suite */
2582 if (TYPE(CHILD(n, 3)) != except_clause)
2583 com_try_finally(c, n);
2584 else
2585 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002586}
2587
Guido van Rossum8b993a91997-01-17 21:04:03 +00002588static node *
2589get_rawdocstring(n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002590 node *n;
2591{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002592 int i;
2593
Guido van Rossum8b993a91997-01-17 21:04:03 +00002594 /* Label to avoid tail recursion */
2595 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002596 switch (TYPE(n)) {
2597
2598 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002599 if (NCH(n) == 1) {
2600 n = CHILD(n, 0);
2601 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002602 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002603 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002604 case file_input:
2605 for (i = 0; i < NCH(n); i++) {
2606 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002607 if (TYPE(ch) == stmt) {
2608 n = ch;
2609 goto next;
2610 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002611 }
2612 break;
2613
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002614 case stmt:
2615 case simple_stmt:
2616 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002617 n = CHILD(n, 0);
2618 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002619
2620 case expr_stmt:
2621 case testlist:
2622 case test:
2623 case and_test:
2624 case not_test:
2625 case comparison:
2626 case expr:
2627 case xor_expr:
2628 case and_expr:
2629 case shift_expr:
2630 case arith_expr:
2631 case term:
2632 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00002633 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002634 if (NCH(n) == 1) {
2635 n = CHILD(n, 0);
2636 goto next;
2637 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002638 break;
2639
2640 case atom:
2641 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002642 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002643 break;
2644
2645 }
2646 return NULL;
2647}
2648
Guido van Rossum8b993a91997-01-17 21:04:03 +00002649static object *
2650get_docstring(n)
2651 node *n;
2652{
2653 n = get_rawdocstring(n);
2654 if (n == NULL)
2655 return NULL;
2656 return parsestrplus(n);
2657}
2658
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002659static void
2660com_suite(c, n)
2661 struct compiling *c;
2662 node *n;
2663{
2664 REQ(n, suite);
2665 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
2666 if (NCH(n) == 1) {
2667 com_node(c, CHILD(n, 0));
2668 }
2669 else {
2670 int i;
2671 for (i = 0; i < NCH(n); i++) {
2672 node *ch = CHILD(n, i);
2673 if (TYPE(ch) == stmt)
2674 com_node(c, ch);
2675 }
2676 }
2677}
2678
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002679/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002680static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002681com_continue_stmt(c, n)
2682 struct compiling *c;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002683 node *n; /* Not used, but passed for consistency */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002684{
2685 int i = c->c_nblocks;
2686 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
2687 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2688 }
2689 else {
Guido van Rossum452a9831996-09-17 14:32:04 +00002690 com_error(c, SyntaxError, "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002691 }
2692 /* XXX Could allow it inside a 'finally' clause
2693 XXX if we could pop the exception still on the stack */
2694}
2695
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002696static int
Guido van Rossum681d79a1995-07-18 14:51:37 +00002697com_argdefs(c, n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002698 struct compiling *c;
2699 node *n;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002700{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002701 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002702 if (TYPE(n) == lambdef) {
2703 /* lambdef: 'lambda' [varargslist] ':' test */
2704 n = CHILD(n, 1);
2705 }
2706 else {
2707 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
2708 n = CHILD(n, 2);
2709 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
2710 n = CHILD(n, 1);
2711 }
2712 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002713 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002714 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002715 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002716 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
2717 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002718 nargs = 0;
2719 ndefs = 0;
2720 for (i = 0; i < nch; i++) {
2721 int t;
Guido van Rossum50564e81996-01-12 01:13:16 +00002722 if (TYPE(CHILD(n, i)) == STAR || TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002723 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002724 nargs++;
2725 i++;
2726 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00002727 t = RPAR; /* Anything except EQUAL or COMMA */
2728 else
2729 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002730 if (t == EQUAL) {
2731 i++;
2732 ndefs++;
2733 com_node(c, CHILD(n, i));
2734 i++;
2735 if (i >= nch)
2736 break;
2737 t = TYPE(CHILD(n, i));
2738 }
2739 else {
2740 /* Treat "(a=1, b)" as "(a=1, b=None)" */
2741 if (ndefs) {
2742 com_addoparg(c, LOAD_CONST,
2743 com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002744 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002745 ndefs++;
2746 }
2747 }
2748 if (t != COMMA)
2749 break;
2750 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002751 return ndefs;
2752}
2753
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002754static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002755com_funcdef(c, n)
2756 struct compiling *c;
2757 node *n;
2758{
2759 object *v;
2760 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00002761 v = (object *)icompile(n, c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002762 if (v == NULL)
2763 c->c_errors++;
2764 else {
2765 int i = com_addconst(c, v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002766 int ndefs = com_argdefs(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002767 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002768 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002769 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002770 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002771 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002772 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002773 DECREF(v);
2774 }
2775}
2776
2777static void
Guido van Rossum25831651993-05-19 14:50:45 +00002778com_bases(c, n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002779 struct compiling *c;
2780 node *n;
2781{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002782 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002783 REQ(n, testlist);
2784 /* testlist: test (',' test)* [','] */
2785 for (i = 0; i < NCH(n); i += 2)
2786 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002787 i = (NCH(n)+1) / 2;
2788 com_addoparg(c, BUILD_TUPLE, i);
2789 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00002790}
2791
2792static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002793com_classdef(c, n)
2794 struct compiling *c;
2795 node *n;
2796{
Guido van Rossum25831651993-05-19 14:50:45 +00002797 int i;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002798 object *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002799 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00002800 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00002801 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00002802 c->c_errors++;
2803 return;
2804 }
2805 /* Push the class name on the stack */
2806 i = com_addconst(c, v);
2807 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002808 com_push(c, 1);
Guido van Rossum25831651993-05-19 14:50:45 +00002809 DECREF(v);
2810 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002811 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00002812 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002813 com_push(c, 1);
2814 }
Guido van Rossum25831651993-05-19 14:50:45 +00002815 else
2816 com_bases(c, CHILD(n, 3));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00002817 v = (object *)icompile(n, c);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002818 if (v == NULL)
2819 c->c_errors++;
2820 else {
Guido van Rossum25831651993-05-19 14:50:45 +00002821 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002822 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002823 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002824 com_addoparg(c, MAKE_FUNCTION, 0);
2825 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002826 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002827 com_pop(c, 2);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002828 com_addopname(c, STORE_NAME, CHILD(n, 1));
2829 DECREF(v);
2830 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002831}
2832
2833static void
2834com_node(c, n)
2835 struct compiling *c;
2836 node *n;
2837{
2838 switch (TYPE(n)) {
2839
2840 /* Definition nodes */
2841
2842 case funcdef:
2843 com_funcdef(c, n);
2844 break;
2845 case classdef:
2846 com_classdef(c, n);
2847 break;
2848
2849 /* Trivial parse tree nodes */
2850
2851 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002852 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002853 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002854 com_node(c, CHILD(n, 0));
2855 break;
2856
2857 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002858 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
2859 com_addoparg(c, SET_LINENO, n->n_lineno);
2860 {
2861 int i;
2862 for (i = 0; i < NCH(n)-1; i += 2)
2863 com_node(c, CHILD(n, i));
2864 }
2865 break;
2866
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002867 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002868 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002869 com_node(c, CHILD(n, 0));
2870 break;
2871
2872 /* Statement nodes */
2873
2874 case expr_stmt:
2875 com_expr_stmt(c, n);
2876 break;
2877 case print_stmt:
2878 com_print_stmt(c, n);
2879 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002880 case del_stmt: /* 'del' exprlist */
Guido van Rossum8861b741996-07-30 16:49:37 +00002881 com_assign(c, CHILD(n, 1), OP_DELETE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002882 break;
2883 case pass_stmt:
2884 break;
2885 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002886 if (c->c_loops == 0) {
Guido van Rossum452a9831996-09-17 14:32:04 +00002887 com_error(c, SyntaxError, "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002888 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002889 com_addbyte(c, BREAK_LOOP);
2890 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002891 case continue_stmt:
2892 com_continue_stmt(c, n);
2893 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002894 case return_stmt:
2895 com_return_stmt(c, n);
2896 break;
2897 case raise_stmt:
2898 com_raise_stmt(c, n);
2899 break;
2900 case import_stmt:
2901 com_import_stmt(c, n);
2902 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002903 case global_stmt:
2904 com_global_stmt(c, n);
2905 break;
Guido van Rossum0dfcf751996-08-12 22:00:53 +00002906#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum25831651993-05-19 14:50:45 +00002907 case access_stmt:
2908 com_access_stmt(c, n);
2909 break;
Guido van Rossum0dfcf751996-08-12 22:00:53 +00002910#endif
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002911 case exec_stmt:
2912 com_exec_stmt(c, n);
2913 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002914 case assert_stmt:
2915 com_assert_stmt(c, n);
2916 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002917 case if_stmt:
2918 com_if_stmt(c, n);
2919 break;
2920 case while_stmt:
2921 com_while_stmt(c, n);
2922 break;
2923 case for_stmt:
2924 com_for_stmt(c, n);
2925 break;
2926 case try_stmt:
2927 com_try_stmt(c, n);
2928 break;
2929 case suite:
2930 com_suite(c, n);
2931 break;
2932
2933 /* Expression nodes */
2934
2935 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002936 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002937 break;
2938 case test:
2939 com_test(c, n);
2940 break;
2941 case and_test:
2942 com_and_test(c, n);
2943 break;
2944 case not_test:
2945 com_not_test(c, n);
2946 break;
2947 case comparison:
2948 com_comparison(c, n);
2949 break;
2950 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002951 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002952 break;
2953 case expr:
2954 com_expr(c, n);
2955 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002956 case xor_expr:
2957 com_xor_expr(c, n);
2958 break;
2959 case and_expr:
2960 com_and_expr(c, n);
2961 break;
2962 case shift_expr:
2963 com_shift_expr(c, n);
2964 break;
2965 case arith_expr:
2966 com_arith_expr(c, n);
2967 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002968 case term:
2969 com_term(c, n);
2970 break;
2971 case factor:
2972 com_factor(c, n);
2973 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00002974 case power:
2975 com_power(c, n);
2976 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002977 case atom:
2978 com_atom(c, n);
2979 break;
2980
2981 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002982 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum452a9831996-09-17 14:32:04 +00002983 com_error(c, SystemError, "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002984 }
2985}
2986
2987static void com_fplist PROTO((struct compiling *, node *));
2988
2989static void
2990com_fpdef(c, n)
2991 struct compiling *c;
2992 node *n;
2993{
2994 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
2995 if (TYPE(CHILD(n, 0)) == LPAR)
2996 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002997 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002998 com_addoparg(c, STORE_FAST, com_newlocal(c, STR(CHILD(n, 0))));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002999 com_pop(c, 1);
3000 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003001}
3002
3003static void
3004com_fplist(c, n)
3005 struct compiling *c;
3006 node *n;
3007{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003008 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003009 if (NCH(n) == 1) {
3010 com_fpdef(c, CHILD(n, 0));
3011 }
3012 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003013 int i = (NCH(n)+1)/2;
3014 com_addoparg(c, UNPACK_TUPLE, i);
3015 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003016 for (i = 0; i < NCH(n); i += 2)
3017 com_fpdef(c, CHILD(n, i));
3018 }
3019}
3020
3021static void
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003022com_arglist(c, n)
3023 struct compiling *c;
3024 node *n;
3025{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003026 int nch, i;
3027 int complex = 0;
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003028 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003029 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003030 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003031 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003032 /* Enter all arguments in table of locals */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003033 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003034 node *ch = CHILD(n, i);
3035 node *fp;
3036 char *name;
Guido van Rossum50564e81996-01-12 01:13:16 +00003037 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003038 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003039 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3040 fp = CHILD(ch, 0);
3041 if (TYPE(fp) == NAME)
3042 name = STR(fp);
3043 else {
3044 name = "";
Guido van Rossum530956d1996-07-21 02:27:43 +00003045 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003046 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003047 com_newlocal(c, name);
3048 c->c_argcount++;
3049 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003050 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003051 ch = CHILD(n, i);
3052 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003053 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003054 else
3055 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003056 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003057 /* Handle *arguments */
3058 if (i < nch) {
3059 node *ch;
3060 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003061 if (TYPE(ch) != DOUBLESTAR) {
3062 REQ(ch, STAR);
3063 ch = CHILD(n, i+1);
3064 if (TYPE(ch) == NAME) {
3065 c->c_flags |= CO_VARARGS;
3066 i += 3;
3067 com_newlocal(c, STR(ch));
3068 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003069 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003070 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003071 /* Handle **keywords */
3072 if (i < nch) {
3073 node *ch;
3074 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003075 if (TYPE(ch) != DOUBLESTAR) {
3076 REQ(ch, STAR);
3077 ch = CHILD(n, i+1);
3078 REQ(ch, STAR);
3079 ch = CHILD(n, i+2);
3080 }
3081 else
3082 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003083 REQ(ch, NAME);
3084 c->c_flags |= CO_VARKEYWORDS;
3085 com_newlocal(c, STR(ch));
3086 }
3087 if (complex) {
3088 /* Generate code for complex arguments only after
3089 having counted the simple arguments */
3090 int ilocal = 0;
3091 for (i = 0; i < nch; i++) {
3092 node *ch = CHILD(n, i);
3093 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003094 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003095 break;
3096 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3097 fp = CHILD(ch, 0);
3098 if (TYPE(fp) != NAME) {
3099 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003100 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003101 com_fpdef(c, ch);
3102 }
3103 ilocal++;
3104 if (++i >= nch)
3105 break;
3106 ch = CHILD(n, i);
3107 if (TYPE(ch) == EQUAL)
3108 i += 2;
3109 else
3110 REQ(ch, COMMA);
3111 }
3112 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003113}
3114
3115static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003116com_file_input(c, n)
3117 struct compiling *c;
3118 node *n;
3119{
3120 int i;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003121 object *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003122 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003123 doc = get_docstring(n);
3124 if (doc != NULL) {
3125 int i = com_addconst(c, doc);
3126 DECREF(doc);
3127 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003128 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003129 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003130 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003131 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003132 for (i = 0; i < NCH(n); i++) {
3133 node *ch = CHILD(n, i);
3134 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3135 com_node(c, ch);
3136 }
3137}
3138
3139/* Top-level compile-node interface */
3140
3141static void
3142compile_funcdef(c, n)
3143 struct compiling *c;
3144 node *n;
3145{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003146 object *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003147 node *ch;
3148 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003149 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003150 doc = get_docstring(CHILD(n, 4));
3151 if (doc != NULL) {
3152 (void) com_addconst(c, doc);
3153 DECREF(doc);
3154 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003155 else
3156 (void) com_addconst(c, None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003157 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3158 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003159 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003160 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003161 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003162 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003163 c->c_infunction = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003164 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003165 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003166 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003167 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003168}
3169
3170static void
Guido van Rossum590baa41993-11-30 13:40:46 +00003171compile_lambdef(c, n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003172 struct compiling *c;
3173 node *n;
3174{
Guido van Rossum590baa41993-11-30 13:40:46 +00003175 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003176 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003177 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003178
3179 ch = CHILD(n, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003180 (void) com_addconst(c, None); /* No docstring */
3181 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003182 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003183 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003184 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003185 else
3186 ch = CHILD(n, 2);
3187 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003188 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003189 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003190}
3191
3192static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003193compile_classdef(c, n)
3194 struct compiling *c;
3195 node *n;
3196{
3197 node *ch;
3198 object *doc;
3199 REQ(n, classdef);
3200 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3201 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003202#ifdef PRIVATE_NAME_MANGLING
3203 c->c_private = c->c_name;
3204#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003205 ch = CHILD(n, NCH(n)-1); /* The suite */
3206 doc = get_docstring(ch);
3207 if (doc != NULL) {
3208 int i = com_addconst(c, doc);
3209 DECREF(doc);
3210 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003211 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003212 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003213 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003214 }
3215 else
3216 (void) com_addconst(c, None);
3217 com_node(c, ch);
3218 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003219 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003220 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003221 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003222}
3223
3224static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003225compile_node(c, n)
3226 struct compiling *c;
3227 node *n;
3228{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003229 com_addoparg(c, SET_LINENO, n->n_lineno);
3230
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003231 switch (TYPE(n)) {
3232
Guido van Rossum4c417781991-01-21 16:09:22 +00003233 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003234 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003235 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003236 n = CHILD(n, 0);
3237 if (TYPE(n) != NEWLINE)
3238 com_node(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003239 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003240 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003241 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003242 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003243 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003244 break;
3245
Guido van Rossum4c417781991-01-21 16:09:22 +00003246 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003247 com_file_input(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003248 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003249 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003250 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003251 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003252 break;
3253
Guido van Rossum590baa41993-11-30 13:40:46 +00003254 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003255 com_node(c, CHILD(n, 0));
3256 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003257 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003258 break;
3259
Guido van Rossum590baa41993-11-30 13:40:46 +00003260 case lambdef: /* anonymous function definition */
3261 compile_lambdef(c, n);
3262 break;
3263
Guido van Rossum4c417781991-01-21 16:09:22 +00003264 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003265 compile_funcdef(c, n);
3266 break;
3267
Guido van Rossum4c417781991-01-21 16:09:22 +00003268 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003269 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003270 break;
3271
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003272 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003273 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum452a9831996-09-17 14:32:04 +00003274 com_error(c, SystemError,
3275 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003276 }
3277}
3278
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003279/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00003280
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003281 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
3282 instructions that refer to local variables with LOAD_FAST etc.
3283 The latter instructions are much faster because they don't need to
3284 look up the variable name in a dictionary.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003285
Guido van Rossum681d79a1995-07-18 14:51:37 +00003286 To find all local variables, we check all STORE_NAME, IMPORT_FROM
3287 and DELETE_NAME instructions. This yields all local variables,
3288 function definitions, class definitions and import statements.
3289 Argument names have already been entered into the list by the
3290 special processing for the argument list.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003291
3292 All remaining LOAD_NAME instructions must refer to non-local (global
3293 or builtin) variables, so are replaced by LOAD_GLOBAL.
3294
3295 There are two problems: 'from foo import *' and 'exec' may introduce
3296 local variables that we can't know while compiling. If this is the
Guido van Rossum681d79a1995-07-18 14:51:37 +00003297 case, we can still optimize bona fide locals (since those
3298 statements will be surrounded by fast_2_locals() and
3299 locals_2_fast()), but we can't change LOAD_NAME to LOAD_GLOBAL.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003300
Guido van Rossum681d79a1995-07-18 14:51:37 +00003301 NB: this modifies the string object c->c_code! */
Guido van Rossum282914b1991-04-04 10:42:56 +00003302
3303static void
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003304optimize(c)
3305 struct compiling *c;
Guido van Rossum282914b1991-04-04 10:42:56 +00003306{
Guido van Rossum0a697f61991-04-16 08:39:12 +00003307 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00003308 int opcode;
Guido van Rossum80bb9651996-12-05 23:27:02 +00003309 int oparg = 0;
Guido van Rossum282914b1991-04-04 10:42:56 +00003310 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003311 object *error_type, *error_value, *error_traceback;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003312
Guido van Rossum282914b1991-04-04 10:42:56 +00003313#define NEXTOP() (*next_instr++)
3314#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
3315#define GETITEM(v, i) (getlistitem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003316#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
3317
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003318 err_fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003319
3320 c->c_flags |= CO_OPTIMIZED;
Guido van Rossum282914b1991-04-04 10:42:56 +00003321
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003322 next_instr = (unsigned char *) getstringvalue(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003323 for (;;) {
3324 opcode = NEXTOP();
3325 if (opcode == STOP_CODE)
3326 break;
3327 if (HAS_ARG(opcode))
3328 oparg = NEXTARG();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003329 switch (opcode) {
3330 case STORE_NAME:
3331 case DELETE_NAME:
3332 case IMPORT_FROM:
3333 com_addlocal_o(c, GETNAMEOBJ(oparg));
3334 break;
3335 case EXEC_STMT:
3336 c->c_flags &= ~CO_OPTIMIZED;
3337 break;
Guido van Rossum282914b1991-04-04 10:42:56 +00003338 }
3339 }
3340
Guido van Rossum681d79a1995-07-18 14:51:37 +00003341 if (dictlookup(c->c_locals, "*") != NULL)
3342 c->c_flags &= ~CO_OPTIMIZED;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003343
3344 next_instr = (unsigned char *) getstringvalue(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003345 for (;;) {
3346 cur_instr = next_instr;
3347 opcode = NEXTOP();
3348 if (opcode == STOP_CODE)
3349 break;
3350 if (HAS_ARG(opcode))
3351 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003352 if (opcode == LOAD_NAME ||
3353 opcode == STORE_NAME ||
3354 opcode == DELETE_NAME) {
3355 object *v;
3356 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00003357 name = GETNAMEOBJ(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003358 v = dict2lookup(c->c_locals, name);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003359 if (v == NULL) {
Guido van Rossum83163251991-08-16 08:58:43 +00003360 err_clear();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003361 if (opcode == LOAD_NAME &&
3362 (c->c_flags&CO_OPTIMIZED))
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003363 cur_instr[0] = LOAD_GLOBAL;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003364 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00003365 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003366 i = getintvalue(v);
3367 switch (opcode) {
3368 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
3369 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
3370 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
3371 }
3372 cur_instr[1] = i & 0xff;
3373 cur_instr[2] = (i>>8) & 0xff;
Guido van Rossum282914b1991-04-04 10:42:56 +00003374 }
3375 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003376
Guido van Rossum681d79a1995-07-18 14:51:37 +00003377 if (c->c_errors == 0)
3378 err_restore(error_type, error_value, error_traceback);
Guido van Rossum282914b1991-04-04 10:42:56 +00003379}
3380
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003381codeobject *
Guido van Rossum590baa41993-11-30 13:40:46 +00003382compile(n, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003383 node *n;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003384 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003385{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003386 return jcompile(n, filename, NULL);
3387}
3388
3389static codeobject *
3390icompile(n, base)
3391 node *n;
3392 struct compiling *base;
3393{
3394 return jcompile(n, base->c_filename, base);
3395}
3396
3397static codeobject *
3398jcompile(n, filename, base)
3399 node *n;
3400 char *filename;
3401 struct compiling *base;
3402{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003403 struct compiling sc;
3404 codeobject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003405 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003406 return NULL;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003407#ifdef PRIVATE_NAME_MANGLING
3408 if (base)
3409 sc.c_private = base->c_private;
3410 else
3411 sc.c_private = NULL;
3412#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003413 compile_node(&sc, n);
3414 com_done(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003415 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003416 optimize(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003417 sc.c_flags |= CO_NEWLOCALS;
3418 }
3419 else if (TYPE(n) == classdef)
3420 sc.c_flags |= CO_NEWLOCALS;
Guido van Rossum9bfef441993-03-29 10:43:31 +00003421 co = NULL;
3422 if (sc.c_errors == 0) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003423 object *consts, *names, *varnames, *filename, *name;
3424 consts = listtuple(sc.c_consts);
3425 names = listtuple(sc.c_names);
3426 varnames = listtuple(sc.c_varnames);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003427 filename = PyString_InternFromString(sc.c_filename);
3428 name = PyString_InternFromString(sc.c_name);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003429 if (!err_occurred())
3430 co = newcodeobject(sc.c_argcount,
3431 sc.c_nlocals,
Guido van Rossum8b993a91997-01-17 21:04:03 +00003432 sc.c_maxstacklevel,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003433 sc.c_flags,
3434 sc.c_code,
3435 consts,
3436 names,
3437 varnames,
3438 filename,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003439 name,
3440 sc.c_firstlineno,
3441 sc.c_lnotab);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003442 XDECREF(consts);
3443 XDECREF(names);
3444 XDECREF(varnames);
3445 XDECREF(filename);
3446 XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003447 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003448 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003449 return co;
3450}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003451
3452int
3453PyCode_Addr2Line(co, addrq)
3454 PyCodeObject *co;
3455 int addrq;
3456{
3457 int size = PyString_Size(co->co_lnotab) / 2;
3458 char *p = PyString_AsString(co->co_lnotab);
3459 int line = co->co_firstlineno;
3460 int addr = 0;
3461 while (--size >= 0) {
3462 addr += *p++;
3463 if (addr > addrq)
3464 break;
3465 line += *p++;
3466 }
3467 return line;
3468}