blob: 9f7d1f84019f421add9e1d16a6c3ff4d2b0cf614 [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 Rossum0ae748d1997-02-14 22:58:07 +0000821 PyFPE_END_PROTECT
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);
828 PyFPE_END_PROTECT
829 return newfloatobject(dx);
830 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000831}
832
833static object *
834parsestr(s)
835 char *s;
836{
837 object *v;
838 int len;
839 char *buf;
840 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000841 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000842 int c;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000843 int quote = *s;
844 if (quote != '\'' && quote != '\"') {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000845 err_badcall();
846 return NULL;
847 }
848 s++;
849 len = strlen(s);
Guido van Rossum8054fad1993-10-26 15:19:44 +0000850 if (s[--len] != quote) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000851 err_badcall();
852 return NULL;
853 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000854 if (len >= 4 && s[0] == quote && s[1] == quote) {
855 s += 2;
856 len -= 2;
857 if (s[--len] != quote || s[--len] != quote) {
858 err_badcall();
859 return NULL;
860 }
861 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000862 if (strchr(s, '\\') == NULL)
863 return newsizedstringobject(s, len);
864 v = newsizedstringobject((char *)NULL, len);
865 p = buf = getstringvalue(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000866 end = s + len;
867 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000868 if (*s != '\\') {
869 *p++ = *s++;
870 continue;
871 }
872 s++;
873 switch (*s++) {
874 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000875 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000876 case '\\': *p++ = '\\'; break;
877 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000878 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000879 case 'b': *p++ = '\b'; break;
880 case 'f': *p++ = '\014'; break; /* FF */
881 case 't': *p++ = '\t'; break;
882 case 'n': *p++ = '\n'; break;
883 case 'r': *p++ = '\r'; break;
884 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000885 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
886 case '0': case '1': case '2': case '3':
887 case '4': case '5': case '6': case '7':
888 c = s[-1] - '0';
889 if ('0' <= *s && *s <= '7') {
890 c = (c<<3) + *s++ - '0';
891 if ('0' <= *s && *s <= '7')
892 c = (c<<3) + *s++ - '0';
893 }
894 *p++ = c;
895 break;
896 case 'x':
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000897 if (isxdigit(Py_CHARMASK(*s))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000898 sscanf(s, "%x", &c);
899 *p++ = c;
900 do {
901 s++;
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000902 } while (isxdigit(Py_CHARMASK(*s)));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000903 break;
904 }
905 /* FALLTHROUGH */
906 default: *p++ = '\\'; *p++ = s[-1]; break;
907 }
908 }
909 resizestring(&v, (int)(p - buf));
910 return v;
911}
912
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000913static object *
914parsestrplus(n)
915 node *n;
916{
917 object *v;
918 int i;
919 REQ(CHILD(n, 0), STRING);
920 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
921 /* String literal concatenation */
922 for (i = 1; i < NCH(n) && v != NULL; i++) {
923 joinstring_decref(&v, parsestr(STR(CHILD(n, i))));
924 }
925 }
926 return v;
927}
928
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000929static void
930com_list_constructor(c, n)
931 struct compiling *c;
932 node *n;
933{
934 int len;
935 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000936 if (TYPE(n) != testlist)
937 REQ(n, exprlist);
938 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
939 len = (NCH(n) + 1) / 2;
940 for (i = 0; i < NCH(n); i += 2)
941 com_node(c, CHILD(n, i));
942 com_addoparg(c, BUILD_LIST, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000943 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000944}
945
946static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000947com_dictmaker(c, n)
948 struct compiling *c;
949 node *n;
950{
951 int i;
952 /* dictmaker: test ':' test (',' test ':' value)* [','] */
953 for (i = 0; i+2 < NCH(n); i += 4) {
954 /* We must arrange things just right for STORE_SUBSCR.
955 It wants the stack to look like (value) (dict) (key) */
956 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000957 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000958 com_node(c, CHILD(n, i+2)); /* value */
959 com_addbyte(c, ROT_TWO);
960 com_node(c, CHILD(n, i)); /* key */
961 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000962 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000963 }
964}
965
966static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000967com_atom(c, n)
968 struct compiling *c;
969 node *n;
970{
971 node *ch;
972 object *v;
973 int i;
974 REQ(n, atom);
975 ch = CHILD(n, 0);
976 switch (TYPE(ch)) {
977 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +0000978 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000979 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000980 com_push(c, 1);
981 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000982 else
983 com_node(c, CHILD(n, 1));
984 break;
985 case LSQB:
Guido van Rossum8b993a91997-01-17 21:04:03 +0000986 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000987 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000988 com_push(c, 1);
989 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000990 else
991 com_list_constructor(c, CHILD(n, 1));
992 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000993 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000994 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000995 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000996 if (TYPE(CHILD(n, 1)) != RBRACE)
997 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000998 break;
999 case BACKQUOTE:
1000 com_node(c, CHILD(n, 1));
1001 com_addbyte(c, UNARY_CONVERT);
1002 break;
1003 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001004 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001005 i = 255;
1006 }
1007 else {
1008 i = com_addconst(c, v);
1009 DECREF(v);
1010 }
1011 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001012 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001013 break;
1014 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001015 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001016 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001017 c->c_errors++;
1018 i = 255;
1019 }
1020 else {
1021 i = com_addconst(c, v);
1022 DECREF(v);
1023 }
1024 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001025 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001026 break;
1027 case NAME:
1028 com_addopname(c, LOAD_NAME, ch);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001029 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001030 break;
1031 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001032 /* XXX fprintf(stderr, "node type %d\n", TYPE(ch)); */
Guido van Rossum452a9831996-09-17 14:32:04 +00001033 com_error(c, SystemError, "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001034 }
1035}
1036
1037static void
1038com_slice(c, n, op)
1039 struct compiling *c;
1040 node *n;
1041 int op;
1042{
1043 if (NCH(n) == 1) {
1044 com_addbyte(c, op);
1045 }
1046 else if (NCH(n) == 2) {
1047 if (TYPE(CHILD(n, 0)) != COLON) {
1048 com_node(c, CHILD(n, 0));
1049 com_addbyte(c, op+1);
1050 }
1051 else {
1052 com_node(c, CHILD(n, 1));
1053 com_addbyte(c, op+2);
1054 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001055 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001056 }
1057 else {
1058 com_node(c, CHILD(n, 0));
1059 com_node(c, CHILD(n, 2));
1060 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001061 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001062 }
1063}
1064
Guido van Rossum635abd21997-01-06 22:56:52 +00001065static void
1066com_argument(c, n, pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001067 struct compiling *c;
1068 node *n; /* argument */
Guido van Rossum635abd21997-01-06 22:56:52 +00001069 object **pkeywords;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001070{
1071 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001072 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001073 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001074 if (*pkeywords != NULL) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001075 com_error(c, SyntaxError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001076 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001077 }
1078 else {
1079 com_node(c, CHILD(n, 0));
1080 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001081 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001082 }
1083 m = n;
1084 do {
1085 m = CHILD(m, 0);
1086 } while (NCH(m) == 1);
1087 if (TYPE(m) != NAME) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001088 com_error(c, SyntaxError, "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001089 }
1090 else {
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001091 object *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001092 if (v != NULL && *pkeywords == NULL)
1093 *pkeywords = newdictobject();
1094 if (v == NULL || *pkeywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001095 c->c_errors++;
1096 else {
Guido van Rossum635abd21997-01-06 22:56:52 +00001097 if (dict2lookup(*pkeywords, v) != NULL)
1098 com_error(c, SyntaxError,
1099 "duplicate keyword argument");
1100 else
1101 if (dict2insert(*pkeywords, v, v) != 0)
1102 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001103 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001104 com_push(c, 1);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001105 DECREF(v);
1106 }
1107 }
1108 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001109}
1110
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001111static void
1112com_call_function(c, n)
1113 struct compiling *c;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001114 node *n; /* EITHER arglist OR ')' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001115{
1116 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001117 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001118 }
1119 else {
Guido van Rossum635abd21997-01-06 22:56:52 +00001120 object *keywords = NULL;
1121 int i, na, nk;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001122 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001123 na = 0;
1124 nk = 0;
1125 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001126 com_argument(c, CHILD(n, i), &keywords);
1127 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001128 na++;
1129 else
1130 nk++;
1131 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001132 XDECREF(keywords);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001133 if (na > 255 || nk > 255) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001134 com_error(c, SyntaxError, "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001135 }
1136 com_addoparg(c, CALL_FUNCTION, na | (nk << 8));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001137 com_pop(c, na + 2*nk);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001138 }
1139}
1140
1141static void
1142com_select_member(c, n)
1143 struct compiling *c;
1144 node *n;
1145{
1146 com_addopname(c, LOAD_ATTR, n);
1147}
1148
1149static void
Guido van Rossum8861b741996-07-30 16:49:37 +00001150com_sliceobj(c, n)
1151 struct compiling *c;
1152 node *n;
1153{
1154 int i=0;
1155 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001156 node *ch;
1157
1158 /* first argument */
1159 if (TYPE(CHILD(n,i)) == COLON) {
1160 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001161 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001162 i++;
1163 }
1164 else {
1165 com_node(c, CHILD(n,i));
1166 i++;
1167 REQ(CHILD(n,i),COLON);
1168 i++;
1169 }
1170 /* second argument */
1171 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1172 com_node(c, CHILD(n,i));
1173 i++;
1174 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001175 else {
1176 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1177 com_push(c, 1);
1178 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001179 /* remaining arguments */
1180 for (; i < NCH(n); i++) {
1181 ns++;
1182 ch=CHILD(n,i);
1183 REQ(ch, sliceop);
1184 if (NCH(ch) == 1) {
1185 /* right argument of ':' missing */
1186 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001187 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001188 }
1189 else
1190 com_node(c, CHILD(ch,1));
1191 }
1192 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001193 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001194}
1195
1196static void
1197com_subscript(c, n)
1198 struct compiling *c;
1199 node *n;
1200{
1201 node *ch;
1202 REQ(n, subscript);
1203 ch = CHILD(n,0);
1204 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001205 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001206 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001207 com_push(c, 1);
1208 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001209 else {
1210 /* check for slice */
1211 if ((TYPE(ch) == COLON || NCH(n) > 1))
1212 com_sliceobj(c, n);
1213 else {
1214 REQ(ch, test);
1215 com_node(c, ch);
1216 }
1217 }
1218}
1219
1220static void
1221com_subscriptlist(c, n, assigning)
1222 struct compiling *c;
1223 node *n;
1224 int assigning;
1225{
1226 int i, op;
1227 REQ(n, subscriptlist);
1228 /* Check to make backward compatible slice behavior for '[i:j]' */
1229 if (NCH(n) == 1) {
1230 node *sub = CHILD(n, 0); /* subscript */
1231 /* Make it is a simple slice.
Guido van Rossum8b993a91997-01-17 21:04:03 +00001232 Should have exactly one colon. */
Guido van Rossum8861b741996-07-30 16:49:37 +00001233 if ((TYPE(CHILD(sub, 0)) == COLON
1234 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
Guido van Rossum8b993a91997-01-17 21:04:03 +00001235 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1236 {
Guido van Rossum8861b741996-07-30 16:49:37 +00001237 if (assigning == OP_APPLY)
1238 op = SLICE;
1239 else
1240 op = ((assigning == OP_ASSIGN) ? STORE_SLICE : DELETE_SLICE);
1241 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001242 if (op == STORE_SLICE)
1243 com_pop(c, 2);
1244 else if (op == DELETE_SLICE)
1245 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001246 return;
1247 }
1248 }
1249 /* Else normal subscriptlist. Compile each subscript. */
1250 for (i = 0; i < NCH(n); i += 2)
1251 com_subscript(c, CHILD(n, i));
1252 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001253 if (NCH(n) > 1) {
1254 i = (NCH(n)+1) / 2;
1255 com_addoparg(c, BUILD_TUPLE, i);
1256 com_pop(c, i-1);
1257 }
1258 if (assigning == OP_APPLY) {
Guido van Rossum8861b741996-07-30 16:49:37 +00001259 op = BINARY_SUBSCR;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001260 i = 1;
1261 }
1262 else if (assigning == OP_ASSIGN) {
1263 op = STORE_SUBSCR;
1264 i = 3;
1265 }
1266 else {
1267 op = DELETE_SUBSCR;
1268 i = 2;
1269 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001270 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001271 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001272}
1273
1274static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001275com_apply_trailer(c, n)
1276 struct compiling *c;
1277 node *n;
1278{
1279 REQ(n, trailer);
1280 switch (TYPE(CHILD(n, 0))) {
1281 case LPAR:
1282 com_call_function(c, CHILD(n, 1));
1283 break;
1284 case DOT:
1285 com_select_member(c, CHILD(n, 1));
1286 break;
1287 case LSQB:
Guido van Rossum8861b741996-07-30 16:49:37 +00001288 com_subscriptlist(c, CHILD(n, 1), OP_APPLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001289 break;
1290 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001291 com_error(c, SystemError,
1292 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001293 }
1294}
1295
1296static void
Guido van Rossum50564e81996-01-12 01:13:16 +00001297com_power(c, n)
1298 struct compiling *c;
1299 node *n;
1300{
1301 int i;
1302 REQ(n, power);
1303 com_atom(c, CHILD(n, 0));
1304 for (i = 1; i < NCH(n); i++) {
1305 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1306 com_factor(c, CHILD(n, i+1));
1307 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001308 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001309 break;
1310 }
1311 else
1312 com_apply_trailer(c, CHILD(n, i));
1313 }
1314}
1315
1316static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001317com_factor(c, n)
1318 struct compiling *c;
1319 node *n;
1320{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001321 REQ(n, factor);
1322 if (TYPE(CHILD(n, 0)) == PLUS) {
1323 com_factor(c, CHILD(n, 1));
1324 com_addbyte(c, UNARY_POSITIVE);
1325 }
1326 else if (TYPE(CHILD(n, 0)) == MINUS) {
1327 com_factor(c, CHILD(n, 1));
1328 com_addbyte(c, UNARY_NEGATIVE);
1329 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001330 else if (TYPE(CHILD(n, 0)) == TILDE) {
1331 com_factor(c, CHILD(n, 1));
1332 com_addbyte(c, UNARY_INVERT);
1333 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001334 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001335 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001336 }
1337}
1338
1339static void
1340com_term(c, n)
1341 struct compiling *c;
1342 node *n;
1343{
1344 int i;
1345 int op;
1346 REQ(n, term);
1347 com_factor(c, CHILD(n, 0));
1348 for (i = 2; i < NCH(n); i += 2) {
1349 com_factor(c, CHILD(n, i));
1350 switch (TYPE(CHILD(n, i-1))) {
1351 case STAR:
1352 op = BINARY_MULTIPLY;
1353 break;
1354 case SLASH:
1355 op = BINARY_DIVIDE;
1356 break;
1357 case PERCENT:
1358 op = BINARY_MODULO;
1359 break;
1360 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001361 com_error(c, SystemError,
1362 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001363 op = 255;
1364 }
1365 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001366 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001367 }
1368}
1369
1370static void
1371com_arith_expr(c, n)
1372 struct compiling *c;
1373 node *n;
1374{
1375 int i;
1376 int op;
1377 REQ(n, arith_expr);
1378 com_term(c, CHILD(n, 0));
1379 for (i = 2; i < NCH(n); i += 2) {
1380 com_term(c, CHILD(n, i));
1381 switch (TYPE(CHILD(n, i-1))) {
1382 case PLUS:
1383 op = BINARY_ADD;
1384 break;
1385 case MINUS:
1386 op = BINARY_SUBTRACT;
1387 break;
1388 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001389 com_error(c, SystemError,
1390 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001391 op = 255;
1392 }
1393 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001394 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001395 }
1396}
1397
1398static void
1399com_shift_expr(c, n)
1400 struct compiling *c;
1401 node *n;
1402{
1403 int i;
1404 int op;
1405 REQ(n, shift_expr);
1406 com_arith_expr(c, CHILD(n, 0));
1407 for (i = 2; i < NCH(n); i += 2) {
1408 com_arith_expr(c, CHILD(n, i));
1409 switch (TYPE(CHILD(n, i-1))) {
1410 case LEFTSHIFT:
1411 op = BINARY_LSHIFT;
1412 break;
1413 case RIGHTSHIFT:
1414 op = BINARY_RSHIFT;
1415 break;
1416 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001417 com_error(c, SystemError,
1418 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001419 op = 255;
1420 }
1421 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001422 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001423 }
1424}
1425
1426static void
1427com_and_expr(c, n)
1428 struct compiling *c;
1429 node *n;
1430{
1431 int i;
1432 int op;
1433 REQ(n, and_expr);
1434 com_shift_expr(c, CHILD(n, 0));
1435 for (i = 2; i < NCH(n); i += 2) {
1436 com_shift_expr(c, CHILD(n, i));
1437 if (TYPE(CHILD(n, i-1)) == AMPER) {
1438 op = BINARY_AND;
1439 }
1440 else {
Guido van Rossum452a9831996-09-17 14:32:04 +00001441 com_error(c, SystemError,
1442 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001443 op = 255;
1444 }
1445 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001446 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001447 }
1448}
1449
1450static void
1451com_xor_expr(c, n)
1452 struct compiling *c;
1453 node *n;
1454{
1455 int i;
1456 int op;
1457 REQ(n, xor_expr);
1458 com_and_expr(c, CHILD(n, 0));
1459 for (i = 2; i < NCH(n); i += 2) {
1460 com_and_expr(c, CHILD(n, i));
1461 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1462 op = BINARY_XOR;
1463 }
1464 else {
Guido van Rossum452a9831996-09-17 14:32:04 +00001465 com_error(c, SystemError,
1466 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001467 op = 255;
1468 }
1469 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001470 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001471 }
1472}
1473
1474static void
1475com_expr(c, n)
1476 struct compiling *c;
1477 node *n;
1478{
1479 int i;
1480 int op;
1481 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001482 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001483 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001484 com_xor_expr(c, CHILD(n, i));
1485 if (TYPE(CHILD(n, i-1)) == VBAR) {
1486 op = BINARY_OR;
1487 }
1488 else {
Guido van Rossum452a9831996-09-17 14:32:04 +00001489 com_error(c, SystemError,
1490 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001491 op = 255;
1492 }
1493 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001494 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001495 }
1496}
1497
1498static enum cmp_op
1499cmp_type(n)
1500 node *n;
1501{
1502 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001503 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001504 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1505 if (NCH(n) == 1) {
1506 n = CHILD(n, 0);
1507 switch (TYPE(n)) {
1508 case LESS: return LT;
1509 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001510 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001511 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001512 case LESSEQUAL: return LE;
1513 case GREATEREQUAL: return GE;
1514 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001515 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1516 if (strcmp(STR(n), "is") == 0) return IS;
1517 }
1518 }
1519 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001520 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001521 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1522 return NOT_IN;
1523 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1524 return IS_NOT;
1525 }
1526 }
1527 return BAD;
1528}
1529
1530static void
1531com_comparison(c, n)
1532 struct compiling *c;
1533 node *n;
1534{
1535 int i;
1536 enum cmp_op op;
1537 int anchor;
1538 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
1539 com_expr(c, CHILD(n, 0));
1540 if (NCH(n) == 1)
1541 return;
1542
1543 /****************************************************************
1544 The following code is generated for all but the last
1545 comparison in a chain:
1546
1547 label: on stack: opcode: jump to:
1548
1549 a <code to load b>
1550 a, b DUP_TOP
1551 a, b, b ROT_THREE
1552 b, a, b COMPARE_OP
1553 b, 0-or-1 JUMP_IF_FALSE L1
1554 b, 1 POP_TOP
1555 b
1556
1557 We are now ready to repeat this sequence for the next
1558 comparison in the chain.
1559
1560 For the last we generate:
1561
1562 b <code to load c>
1563 b, c COMPARE_OP
1564 0-or-1
1565
1566 If there were any jumps to L1 (i.e., there was more than one
1567 comparison), we generate:
1568
1569 0-or-1 JUMP_FORWARD L2
1570 L1: b, 0 ROT_TWO
1571 0, b POP_TOP
1572 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00001573 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001574 ****************************************************************/
1575
1576 anchor = 0;
1577
1578 for (i = 2; i < NCH(n); i += 2) {
1579 com_expr(c, CHILD(n, i));
1580 if (i+2 < NCH(n)) {
1581 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001582 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001583 com_addbyte(c, ROT_THREE);
1584 }
1585 op = cmp_type(CHILD(n, i-1));
1586 if (op == BAD) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001587 com_error(c, SystemError,
1588 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001589 }
1590 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001591 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001592 if (i+2 < NCH(n)) {
1593 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1594 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001595 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001596 }
1597 }
1598
1599 if (anchor) {
1600 int anchor2 = 0;
1601 com_addfwref(c, JUMP_FORWARD, &anchor2);
1602 com_backpatch(c, anchor);
1603 com_addbyte(c, ROT_TWO);
1604 com_addbyte(c, POP_TOP);
1605 com_backpatch(c, anchor2);
1606 }
1607}
1608
1609static void
1610com_not_test(c, n)
1611 struct compiling *c;
1612 node *n;
1613{
1614 REQ(n, not_test); /* 'not' not_test | comparison */
1615 if (NCH(n) == 1) {
1616 com_comparison(c, CHILD(n, 0));
1617 }
1618 else {
1619 com_not_test(c, CHILD(n, 1));
1620 com_addbyte(c, UNARY_NOT);
1621 }
1622}
1623
1624static void
1625com_and_test(c, n)
1626 struct compiling *c;
1627 node *n;
1628{
1629 int i;
1630 int anchor;
1631 REQ(n, and_test); /* not_test ('and' not_test)* */
1632 anchor = 0;
1633 i = 0;
1634 for (;;) {
1635 com_not_test(c, CHILD(n, i));
1636 if ((i += 2) >= NCH(n))
1637 break;
1638 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1639 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001640 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001641 }
1642 if (anchor)
1643 com_backpatch(c, anchor);
1644}
1645
1646static void
1647com_test(c, n)
1648 struct compiling *c;
1649 node *n;
1650{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001651 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00001652 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
1653 object *v;
1654 int i;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001655 int ndefs = com_argdefs(c, CHILD(n, 0));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001656 v = (object *) icompile(CHILD(n, 0), c);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001657 if (v == NULL) {
1658 c->c_errors++;
1659 i = 255;
1660 }
1661 else {
1662 i = com_addconst(c, v);
1663 DECREF(v);
1664 }
1665 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001666 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001667 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001668 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001669 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00001670 else {
1671 int anchor = 0;
1672 int i = 0;
1673 for (;;) {
1674 com_and_test(c, CHILD(n, i));
1675 if ((i += 2) >= NCH(n))
1676 break;
1677 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1678 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001679 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001680 }
1681 if (anchor)
1682 com_backpatch(c, anchor);
1683 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001684}
1685
1686static void
Guido van Rossum288a60f1991-12-16 13:05:10 +00001687com_list(c, n, toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001688 struct compiling *c;
1689 node *n;
Guido van Rossum288a60f1991-12-16 13:05:10 +00001690 int toplevel; /* If nonzero, *always* build a tuple */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001691{
1692 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001693 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001694 com_node(c, CHILD(n, 0));
1695 }
1696 else {
1697 int i;
1698 int len;
1699 len = (NCH(n) + 1) / 2;
1700 for (i = 0; i < NCH(n); i += 2)
1701 com_node(c, CHILD(n, i));
1702 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001703 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001704 }
1705}
1706
1707
1708/* Begin of assignment compilation */
1709
1710static void com_assign_name PROTO((struct compiling *, node *, int));
1711static void com_assign PROTO((struct compiling *, node *, int));
1712
1713static void
1714com_assign_attr(c, n, assigning)
1715 struct compiling *c;
1716 node *n;
1717 int assigning;
1718{
1719 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001720 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001721}
1722
1723static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001724com_assign_trailer(c, n, assigning)
1725 struct compiling *c;
1726 node *n;
1727 int assigning;
1728{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001729 REQ(n, trailer);
1730 switch (TYPE(CHILD(n, 0))) {
1731 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum452a9831996-09-17 14:32:04 +00001732 com_error(c, SyntaxError, "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001733 break;
1734 case DOT: /* '.' NAME */
1735 com_assign_attr(c, CHILD(n, 1), assigning);
1736 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001737 case LSQB: /* '[' subscriptlist ']' */
1738 com_subscriptlist(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001739 break;
1740 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001741 com_error(c, SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001742 }
1743}
1744
1745static void
1746com_assign_tuple(c, n, assigning)
1747 struct compiling *c;
1748 node *n;
1749 int assigning;
1750{
1751 int i;
1752 if (TYPE(n) != testlist)
1753 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001754 if (assigning) {
1755 i = (NCH(n)+1)/2;
1756 com_addoparg(c, UNPACK_TUPLE, i);
1757 com_push(c, i-1);
1758 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001759 for (i = 0; i < NCH(n); i += 2)
1760 com_assign(c, CHILD(n, i), assigning);
1761}
1762
1763static void
1764com_assign_list(c, n, assigning)
1765 struct compiling *c;
1766 node *n;
1767 int assigning;
1768{
1769 int i;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001770 if (assigning) {
1771 i = (NCH(n)+1)/2;
1772 com_addoparg(c, UNPACK_LIST, i);
1773 com_push(c, i-1);
1774 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001775 for (i = 0; i < NCH(n); i += 2)
1776 com_assign(c, CHILD(n, i), assigning);
1777}
1778
1779static void
1780com_assign_name(c, n, assigning)
1781 struct compiling *c;
1782 node *n;
1783 int assigning;
1784{
1785 REQ(n, NAME);
1786 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001787 if (assigning)
1788 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001789}
1790
1791static void
1792com_assign(c, n, assigning)
1793 struct compiling *c;
1794 node *n;
1795 int assigning;
1796{
1797 /* Loop to avoid trivial recursion */
1798 for (;;) {
1799 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001800
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001801 case exprlist:
1802 case testlist:
1803 if (NCH(n) > 1) {
1804 com_assign_tuple(c, n, assigning);
1805 return;
1806 }
1807 n = CHILD(n, 0);
1808 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001809
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001810 case test:
1811 case and_test:
1812 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001813 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001814 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001815 case xor_expr:
1816 case and_expr:
1817 case shift_expr:
1818 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001819 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00001820 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001821 if (NCH(n) > 1) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001822 com_error(c, SyntaxError,
1823 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001824 return;
1825 }
1826 n = CHILD(n, 0);
1827 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001828
Guido van Rossum50564e81996-01-12 01:13:16 +00001829 case power: /* atom trailer* ('**' power)* */
1830/* ('+'|'-'|'~') factor | atom trailer* */
1831 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001832 com_error(c, SyntaxError,
1833 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001834 return;
1835 }
Guido van Rossum50564e81996-01-12 01:13:16 +00001836 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001837 int i;
1838 com_node(c, CHILD(n, 0));
1839 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00001840 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001841 com_error(c, SyntaxError,
1842 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00001843 return;
1844 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001845 com_apply_trailer(c, CHILD(n, i));
1846 } /* NB i is still alive */
1847 com_assign_trailer(c,
1848 CHILD(n, i), assigning);
1849 return;
1850 }
1851 n = CHILD(n, 0);
1852 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001853
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001854 case atom:
1855 switch (TYPE(CHILD(n, 0))) {
1856 case LPAR:
1857 n = CHILD(n, 1);
1858 if (TYPE(n) == RPAR) {
1859 /* XXX Should allow () = () ??? */
Guido van Rossum452a9831996-09-17 14:32:04 +00001860 com_error(c, SyntaxError,
1861 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001862 return;
1863 }
1864 break;
1865 case LSQB:
1866 n = CHILD(n, 1);
1867 if (TYPE(n) == RSQB) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001868 com_error(c, SyntaxError,
1869 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001870 return;
1871 }
1872 com_assign_list(c, n, assigning);
1873 return;
1874 case NAME:
1875 com_assign_name(c, CHILD(n, 0), assigning);
1876 return;
1877 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001878 com_error(c, SyntaxError,
1879 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001880 return;
1881 }
1882 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001883
1884 case lambdef:
Guido van Rossum452a9831996-09-17 14:32:04 +00001885 com_error(c, SyntaxError, "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001886 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001887
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001888 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001889 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum452a9831996-09-17 14:32:04 +00001890 com_error(c, SystemError, "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001891 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001892
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001893 }
1894 }
1895}
Guido van Rossum7c531111997-03-11 18:42:21 +00001896
Guido van Rossum8b993a91997-01-17 21:04:03 +00001897/* Forward */ static node *get_rawdocstring PROTO((node *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001898
1899static void
1900com_expr_stmt(c, n)
1901 struct compiling *c;
1902 node *n;
1903{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001904 REQ(n, expr_stmt); /* testlist ('=' testlist)* */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001905 /* Forget it if we have just a doc string here */
1906 if (NCH(n) == 1 && get_rawdocstring(n) != NULL)
1907 return;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001908 com_node(c, CHILD(n, NCH(n)-1));
1909 if (NCH(n) == 1) {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001910 if (c->c_interactive)
1911 com_addbyte(c, PRINT_EXPR);
1912 else
1913 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001914 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001915 }
1916 else {
1917 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001918 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00001919 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001920 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001921 com_push(c, 1);
1922 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001923 com_assign(c, CHILD(n, i), OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001924 }
1925 }
1926}
1927
1928static void
1929com_print_stmt(c, n)
1930 struct compiling *c;
1931 node *n;
1932{
1933 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001934 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
1935 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001936 com_node(c, CHILD(n, i));
1937 com_addbyte(c, PRINT_ITEM);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001938 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001939 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001940 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001941 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001942 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001943}
1944
1945static void
1946com_return_stmt(c, n)
1947 struct compiling *c;
1948 node *n;
1949{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001950 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001951 if (!c->c_infunction) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001952 com_error(c, SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001953 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001954 if (NCH(n) < 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001955 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001956 com_push(c, 1);
1957 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001958 else
1959 com_node(c, CHILD(n, 1));
1960 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001961 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001962}
1963
1964static void
1965com_raise_stmt(c, n)
1966 struct compiling *c;
1967 node *n;
1968{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001969 int i;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001970 REQ(n, raise_stmt); /* 'raise' test [',' test [',' test]] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001971 com_node(c, CHILD(n, 1));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001972 if (NCH(n) > 3) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001973 com_node(c, CHILD(n, 3));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001974 if (NCH(n) > 5)
1975 com_node(c, CHILD(n, 5));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001976 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001977 i = NCH(n)/2;
1978 com_addoparg(c, RAISE_VARARGS, i);
1979 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001980}
1981
1982static void
1983com_import_stmt(c, n)
1984 struct compiling *c;
1985 node *n;
1986{
1987 int i;
1988 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001989 /* 'import' dotted_name (',' dotted_name)* |
1990 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001991 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001992 /* 'from' dotted_name 'import' ... */
1993 REQ(CHILD(n, 1), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001994 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001995 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001996 for (i = 3; i < NCH(n); i += 2)
1997 com_addopname(c, IMPORT_FROM, CHILD(n, i));
1998 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001999 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002000 }
2001 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002002 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002003 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002004 REQ(CHILD(n, i), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002005 com_addopname(c, IMPORT_NAME, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002006 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002007 com_addopname(c, STORE_NAME, CHILD(CHILD(n, i), 0));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002008 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002009 }
2010 }
2011}
2012
2013static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00002014com_global_stmt(c, n)
2015 struct compiling *c;
2016 node *n;
2017{
2018 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002019 REQ(n, global_stmt);
2020 /* 'global' NAME (',' NAME)* */
2021 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002022 char *s = STR(CHILD(n, i));
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002023#ifdef PRIVATE_NAME_MANGLING
2024 char buffer[256];
2025 if (s != NULL && s[0] == '_' && s[1] == '_' &&
2026 c->c_private != NULL &&
2027 com_mangle(c, s, buffer, (int)sizeof(buffer)))
2028 s = buffer;
2029#endif
Guido van Rossum681d79a1995-07-18 14:51:37 +00002030 if (dictlookup(c->c_locals, s) != NULL) {
Guido van Rossum452a9831996-09-17 14:32:04 +00002031 com_error(c, SyntaxError, "name is local and global");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002032 }
2033 else if (dictinsert(c->c_globals, s, None) != 0)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002034 c->c_errors++;
2035 }
2036}
2037
Guido van Rossum681d79a1995-07-18 14:51:37 +00002038static int
2039com_newlocal_o(c, nameval)
2040 struct compiling *c;
2041 object *nameval;
2042{
2043 int i;
2044 object *ival;
2045 if (getlistsize(c->c_varnames) != c->c_nlocals) {
2046 /* This is usually caused by an error on a previous call */
2047 if (c->c_errors == 0) {
Guido van Rossum452a9831996-09-17 14:32:04 +00002048 com_error(c, SystemError, "mixed up var name/index");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002049 }
2050 return 0;
2051 }
2052 ival = newintobject(i = c->c_nlocals++);
2053 if (ival == NULL)
2054 c->c_errors++;
2055 else if (mappinginsert(c->c_locals, nameval, ival) != 0)
2056 c->c_errors++;
2057 else if (addlistitem(c->c_varnames, nameval) != 0)
2058 c->c_errors++;
2059 XDECREF(ival);
2060 return i;
2061}
2062
2063static int
2064com_addlocal_o(c, nameval)
2065 struct compiling *c;
2066 object *nameval;
2067{
2068 object *ival = mappinglookup(c->c_locals, nameval);
2069 if (ival != NULL)
2070 return getintvalue(ival);
2071 return com_newlocal_o(c, nameval);
2072}
2073
2074static int
2075com_newlocal(c, name)
2076 struct compiling *c;
2077 char *name;
2078{
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00002079 object *nameval = PyString_InternFromString(name);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002080 int i;
2081 if (nameval == NULL) {
2082 c->c_errors++;
2083 return 0;
2084 }
2085 i = com_newlocal_o(c, nameval);
2086 DECREF(nameval);
2087 return i;
2088}
2089
Guido van Rossum8b993a91997-01-17 21:04:03 +00002090#ifdef SUPPORT_OBSOLETE_ACCESS
2091
Guido van Rossum25831651993-05-19 14:50:45 +00002092#define strequ(a, b) (strcmp((a), (b)) == 0)
2093
2094static void
2095com_access_stmt(c, n)
2096 struct compiling *c;
2097 node *n;
2098{
2099 int i, j, k, mode, imode;
2100 object *vmode;
2101 REQ(n, access_stmt);
2102 /* 'access' NAME (',' NAME)* ':' accesstype (',' accesstype)*
2103 accesstype: NAME+ */
2104
2105 /* Find where the colon is */
2106 i = 1;
2107 while (TYPE(CHILD(n,i-1)) != COLON)
2108 i += 1;
2109
2110 /* Calculate the mode mask */
2111 mode = 0;
2112 for (j = i; j < NCH(n); j += 2) {
Guido van Rossum81daa321993-05-20 14:24:46 +00002113 int r = 0, w = 0, p = 0;
2114 for (k = 0; k < NCH(CHILD(n,j)); k++) {
Guido van Rossum25831651993-05-19 14:50:45 +00002115 if (strequ(STR(CHILD(CHILD(n,j),k)), "public"))
2116 p = 0;
2117 else if (strequ(STR(CHILD(CHILD(n,j),k)), "protected"))
2118 p = 1;
2119 else if (strequ(STR(CHILD(CHILD(n,j),k)), "private"))
2120 p = 2;
2121 else if (strequ(STR(CHILD(CHILD(n,j),k)), "read"))
2122 r = 1;
2123 else if (strequ(STR(CHILD(CHILD(n,j),k)), "write"))
2124 w = 1;
2125 else /* XXX should make this an exception */
2126 fprintf(stderr, "bad access type %s\n",
2127 STR(CHILD(CHILD(n,j),k)));
2128 }
2129 if (r == 0 && w == 0)
Guido van Rossum81daa321993-05-20 14:24:46 +00002130 r = w = 1;
Guido van Rossum25831651993-05-19 14:50:45 +00002131 if (p == 0) {
2132 if (r == 1) mode |= AC_R_PUBLIC;
2133 if (w == 1) mode |= AC_W_PUBLIC;
2134 } else if (p == 1) {
2135 if (r == 1) mode |= AC_R_PROTECTED;
2136 if (w == 1) mode |= AC_W_PROTECTED;
2137 } else {
2138 if (r == 1) mode |= AC_R_PRIVATE;
2139 if (w == 1) mode |= AC_W_PRIVATE;
2140 }
2141 }
2142 vmode = newintobject((long)mode);
2143 imode = com_addconst(c, vmode);
2144 XDECREF(vmode);
2145 for (i = 1; TYPE(CHILD(n,i-1)) != COLON; i+=2) {
2146 com_addoparg(c, LOAD_CONST, imode);
2147 com_addopname(c, ACCESS_MODE, CHILD(n, i));
2148 }
2149}
Guido van Rossum0dfcf751996-08-12 22:00:53 +00002150#endif
Guido van Rossum25831651993-05-19 14:50:45 +00002151
Guido van Rossumc5e96291991-12-10 13:53:51 +00002152static void
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002153com_exec_stmt(c, n)
2154 struct compiling *c;
2155 node *n;
2156{
2157 REQ(n, exec_stmt);
2158 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2159 com_node(c, CHILD(n, 1));
2160 if (NCH(n) >= 4)
2161 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002162 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002163 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002164 com_push(c, 1);
2165 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002166 if (NCH(n) >= 6)
2167 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002168 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002169 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002170 com_push(c, 1);
2171 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002172 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002173 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002174}
2175
Guido van Rossum7c531111997-03-11 18:42:21 +00002176static int
2177is_constant_false(c, n)
2178 struct compiling *c;
2179 node *n;
2180{
2181 object *v;
2182 int i;
2183
2184 /* Label to avoid tail recursion */
2185 next:
2186 switch (TYPE(n)) {
2187
2188 case suite:
2189 if (NCH(n) == 1) {
2190 n = CHILD(n, 0);
2191 goto next;
2192 }
2193 /* Fall through */
2194 case file_input:
2195 for (i = 0; i < NCH(n); i++) {
2196 node *ch = CHILD(n, i);
2197 if (TYPE(ch) == stmt) {
2198 n = ch;
2199 goto next;
2200 }
2201 }
2202 break;
2203
2204 case stmt:
2205 case simple_stmt:
2206 case small_stmt:
2207 n = CHILD(n, 0);
2208 goto next;
2209
2210 case expr_stmt:
2211 case testlist:
2212 case test:
2213 case and_test:
2214 case not_test:
2215 case comparison:
2216 case expr:
2217 case xor_expr:
2218 case and_expr:
2219 case shift_expr:
2220 case arith_expr:
2221 case term:
2222 case factor:
2223 case power:
2224 case atom:
2225 if (NCH(n) == 1) {
2226 n = CHILD(n, 0);
2227 goto next;
2228 }
2229 break;
2230
2231 case NAME:
2232 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2233 return 1;
2234 break;
2235
2236 case NUMBER:
2237 v = parsenumber(c, STR(n));
2238 if (v == NULL) {
2239 err_clear();
2240 break;
2241 }
2242 i = testbool(v);
2243 DECREF(v);
2244 return i == 0;
2245
2246 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002247 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002248 if (v == NULL) {
2249 err_clear();
2250 break;
2251 }
2252 i = testbool(v);
2253 DECREF(v);
2254 return i == 0;
2255
2256 }
2257 return 0;
2258}
2259
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002260static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002261com_if_stmt(c, n)
2262 struct compiling *c;
2263 node *n;
2264{
2265 int i;
2266 int anchor = 0;
2267 REQ(n, if_stmt);
2268 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2269 for (i = 0; i+3 < NCH(n); i+=4) {
2270 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002271 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002272 if (is_constant_false(c, ch))
2273 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002274 if (i > 0)
2275 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002276 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002277 com_addfwref(c, JUMP_IF_FALSE, &a);
2278 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002279 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002280 com_node(c, CHILD(n, i+3));
2281 com_addfwref(c, JUMP_FORWARD, &anchor);
2282 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002283 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002284 com_addbyte(c, POP_TOP);
2285 }
2286 if (i+2 < NCH(n))
2287 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002288 if (anchor)
2289 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002290}
2291
2292static void
2293com_while_stmt(c, n)
2294 struct compiling *c;
2295 node *n;
2296{
2297 int break_anchor = 0;
2298 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002299 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002300 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2301 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002302 block_push(c, SETUP_LOOP);
2303 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002304 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002305 com_node(c, CHILD(n, 1));
2306 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2307 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002308 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002309 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002310 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002311 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002312 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2313 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002314 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002315 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002316 com_addbyte(c, POP_TOP);
2317 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002318 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002319 if (NCH(n) > 4)
2320 com_node(c, CHILD(n, 6));
2321 com_backpatch(c, break_anchor);
2322}
2323
2324static void
2325com_for_stmt(c, n)
2326 struct compiling *c;
2327 node *n;
2328{
2329 object *v;
2330 int break_anchor = 0;
2331 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002332 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002333 REQ(n, for_stmt);
2334 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2335 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002336 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002337 com_node(c, CHILD(n, 3));
2338 v = newintobject(0L);
2339 if (v == NULL)
2340 c->c_errors++;
2341 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002342 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002343 XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002344 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002345 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002346 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002347 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002348 com_assign(c, CHILD(n, 1), OP_ASSIGN);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002349 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002350 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002351 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002352 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2353 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002354 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002355 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002356 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002357 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002358 if (NCH(n) > 8)
2359 com_node(c, CHILD(n, 8));
2360 com_backpatch(c, break_anchor);
2361}
2362
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002363/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002364
2365 SETUP_FINALLY L
2366 <code for S>
2367 POP_BLOCK
2368 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002369 L: <code for Sf>
2370 END_FINALLY
2371
2372 The special instructions use the block stack. Each block
2373 stack entry contains the instruction that created it (here
2374 SETUP_FINALLY), the level of the value stack at the time the
2375 block stack entry was created, and a label (here L).
2376
2377 SETUP_FINALLY:
2378 Pushes the current value stack level and the label
2379 onto the block stack.
2380 POP_BLOCK:
2381 Pops en entry from the block stack, and pops the value
2382 stack until its level is the same as indicated on the
2383 block stack. (The label is ignored.)
2384 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002385 Pops a variable number of entries from the *value* stack
2386 and re-raises the exception they specify. The number of
2387 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002388
2389 The block stack is unwound when an exception is raised:
2390 when a SETUP_FINALLY entry is found, the exception is pushed
2391 onto the value stack (and the exception condition is cleared),
2392 and the interpreter jumps to the label gotten from the block
2393 stack.
2394
2395 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002396 (The contents of the value stack is shown in [], with the top
2397 at the right; 'tb' is trace-back info, 'val' the exception's
2398 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002399
2400 Value stack Label Instruction Argument
2401 [] SETUP_EXCEPT L1
2402 [] <code for S>
2403 [] POP_BLOCK
2404 [] JUMP_FORWARD L0
2405
Guido van Rossum3f5da241990-12-20 15:06:42 +00002406 [tb, val, exc] L1: DUP )
2407 [tb, val, exc, exc] <evaluate E1> )
2408 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2409 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2410 [tb, val, exc, 1] POP )
2411 [tb, val, exc] POP
2412 [tb, val] <assign to V1> (or POP if no V1)
2413 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002414 [] <code for S1>
2415 JUMP_FORWARD L0
2416
Guido van Rossum3f5da241990-12-20 15:06:42 +00002417 [tb, val, exc, 0] L2: POP
2418 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002419 .............................etc.......................
2420
Guido van Rossum3f5da241990-12-20 15:06:42 +00002421 [tb, val, exc, 0] Ln+1: POP
2422 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002423
2424 [] L0: <next statement>
2425
2426 Of course, parts are not generated if Vi or Ei is not present.
2427*/
2428
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002429static void
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002430com_try_except(c, n)
2431 struct compiling *c;
2432 node *n;
2433{
2434 int except_anchor = 0;
2435 int end_anchor = 0;
2436 int else_anchor = 0;
2437 int i;
2438 node *ch;
2439
2440 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2441 block_push(c, SETUP_EXCEPT);
2442 com_node(c, CHILD(n, 2));
2443 com_addbyte(c, POP_BLOCK);
2444 block_pop(c, SETUP_EXCEPT);
2445 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2446 com_backpatch(c, except_anchor);
2447 for (i = 3;
2448 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2449 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002450 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002451 if (except_anchor == 0) {
Guido van Rossum452a9831996-09-17 14:32:04 +00002452 com_error(c, SyntaxError,
2453 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002454 break;
2455 }
2456 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002457 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002458 com_addoparg(c, SET_LINENO, ch->n_lineno);
2459 if (NCH(ch) > 1) {
2460 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002461 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002462 com_node(c, CHILD(ch, 1));
2463 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002464 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002465 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
2466 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002467 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002468 }
2469 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002470 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002471 if (NCH(ch) > 3)
Guido van Rossum8861b741996-07-30 16:49:37 +00002472 com_assign(c, CHILD(ch, 3), OP_ASSIGN);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002473 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002474 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002475 com_pop(c, 1);
2476 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002477 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002478 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002479 com_node(c, CHILD(n, i+2));
2480 com_addfwref(c, JUMP_FORWARD, &end_anchor);
2481 if (except_anchor) {
2482 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002483 /* We come in with [tb, val, exc, 0] on the
2484 stack; one pop and it's the same as
2485 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002486 com_addbyte(c, POP_TOP);
2487 }
2488 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002489 /* We actually come in here with [tb, val, exc] but the
2490 END_FINALLY will zap those and jump around.
2491 The c_stacklevel does not reflect them so we need not pop
2492 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002493 com_addbyte(c, END_FINALLY);
2494 com_backpatch(c, else_anchor);
2495 if (i < NCH(n))
2496 com_node(c, CHILD(n, i+2));
2497 com_backpatch(c, end_anchor);
2498}
2499
2500static void
2501com_try_finally(c, n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002502 struct compiling *c;
2503 node *n;
2504{
2505 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002506 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002507
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002508 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
2509 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002510 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002511 com_addbyte(c, POP_BLOCK);
2512 block_pop(c, SETUP_FINALLY);
2513 block_push(c, END_FINALLY);
2514 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002515 /* While the generated code pushes only one item,
2516 the try-finally handling can enter here with
2517 up to three items. OK, here are the details:
2518 3 for an exception, 2 for RETURN, 1 for BREAK. */
2519 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002520 com_backpatch(c, finally_anchor);
2521 ch = CHILD(n, NCH(n)-1);
2522 com_addoparg(c, SET_LINENO, ch->n_lineno);
2523 com_node(c, ch);
2524 com_addbyte(c, END_FINALLY);
2525 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002526 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002527}
2528
2529static void
2530com_try_stmt(c, n)
2531 struct compiling *c;
2532 node *n;
2533{
2534 REQ(n, try_stmt);
2535 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
2536 | 'try' ':' suite 'finally' ':' suite */
2537 if (TYPE(CHILD(n, 3)) != except_clause)
2538 com_try_finally(c, n);
2539 else
2540 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002541}
2542
Guido van Rossum8b993a91997-01-17 21:04:03 +00002543static node *
2544get_rawdocstring(n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002545 node *n;
2546{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002547 int i;
2548
Guido van Rossum8b993a91997-01-17 21:04:03 +00002549 /* Label to avoid tail recursion */
2550 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002551 switch (TYPE(n)) {
2552
2553 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002554 if (NCH(n) == 1) {
2555 n = CHILD(n, 0);
2556 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002557 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002558 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002559 case file_input:
2560 for (i = 0; i < NCH(n); i++) {
2561 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002562 if (TYPE(ch) == stmt) {
2563 n = ch;
2564 goto next;
2565 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002566 }
2567 break;
2568
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002569 case stmt:
2570 case simple_stmt:
2571 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002572 n = CHILD(n, 0);
2573 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002574
2575 case expr_stmt:
2576 case testlist:
2577 case test:
2578 case and_test:
2579 case not_test:
2580 case comparison:
2581 case expr:
2582 case xor_expr:
2583 case and_expr:
2584 case shift_expr:
2585 case arith_expr:
2586 case term:
2587 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00002588 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002589 if (NCH(n) == 1) {
2590 n = CHILD(n, 0);
2591 goto next;
2592 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002593 break;
2594
2595 case atom:
2596 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002597 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002598 break;
2599
2600 }
2601 return NULL;
2602}
2603
Guido van Rossum8b993a91997-01-17 21:04:03 +00002604static object *
2605get_docstring(n)
2606 node *n;
2607{
2608 n = get_rawdocstring(n);
2609 if (n == NULL)
2610 return NULL;
2611 return parsestrplus(n);
2612}
2613
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002614static void
2615com_suite(c, n)
2616 struct compiling *c;
2617 node *n;
2618{
2619 REQ(n, suite);
2620 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
2621 if (NCH(n) == 1) {
2622 com_node(c, CHILD(n, 0));
2623 }
2624 else {
2625 int i;
2626 for (i = 0; i < NCH(n); i++) {
2627 node *ch = CHILD(n, i);
2628 if (TYPE(ch) == stmt)
2629 com_node(c, ch);
2630 }
2631 }
2632}
2633
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002634/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002635static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002636com_continue_stmt(c, n)
2637 struct compiling *c;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002638 node *n; /* Not used, but passed for consistency */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002639{
2640 int i = c->c_nblocks;
2641 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
2642 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2643 }
2644 else {
Guido van Rossum452a9831996-09-17 14:32:04 +00002645 com_error(c, SyntaxError, "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002646 }
2647 /* XXX Could allow it inside a 'finally' clause
2648 XXX if we could pop the exception still on the stack */
2649}
2650
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002651static int
Guido van Rossum681d79a1995-07-18 14:51:37 +00002652com_argdefs(c, n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002653 struct compiling *c;
2654 node *n;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002655{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002656 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002657 if (TYPE(n) == lambdef) {
2658 /* lambdef: 'lambda' [varargslist] ':' test */
2659 n = CHILD(n, 1);
2660 }
2661 else {
2662 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
2663 n = CHILD(n, 2);
2664 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
2665 n = CHILD(n, 1);
2666 }
2667 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002668 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002669 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002670 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002671 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
2672 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002673 nargs = 0;
2674 ndefs = 0;
2675 for (i = 0; i < nch; i++) {
2676 int t;
Guido van Rossum50564e81996-01-12 01:13:16 +00002677 if (TYPE(CHILD(n, i)) == STAR || TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002678 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002679 nargs++;
2680 i++;
2681 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00002682 t = RPAR; /* Anything except EQUAL or COMMA */
2683 else
2684 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002685 if (t == EQUAL) {
2686 i++;
2687 ndefs++;
2688 com_node(c, CHILD(n, i));
2689 i++;
2690 if (i >= nch)
2691 break;
2692 t = TYPE(CHILD(n, i));
2693 }
2694 else {
2695 /* Treat "(a=1, b)" as "(a=1, b=None)" */
2696 if (ndefs) {
2697 com_addoparg(c, LOAD_CONST,
2698 com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002699 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002700 ndefs++;
2701 }
2702 }
2703 if (t != COMMA)
2704 break;
2705 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002706 return ndefs;
2707}
2708
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002709static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002710com_funcdef(c, n)
2711 struct compiling *c;
2712 node *n;
2713{
2714 object *v;
2715 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00002716 v = (object *)icompile(n, c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002717 if (v == NULL)
2718 c->c_errors++;
2719 else {
2720 int i = com_addconst(c, v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002721 int ndefs = com_argdefs(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002722 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002723 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002724 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002725 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002726 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002727 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002728 DECREF(v);
2729 }
2730}
2731
2732static void
Guido van Rossum25831651993-05-19 14:50:45 +00002733com_bases(c, n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002734 struct compiling *c;
2735 node *n;
2736{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002737 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002738 REQ(n, testlist);
2739 /* testlist: test (',' test)* [','] */
2740 for (i = 0; i < NCH(n); i += 2)
2741 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002742 i = (NCH(n)+1) / 2;
2743 com_addoparg(c, BUILD_TUPLE, i);
2744 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00002745}
2746
2747static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002748com_classdef(c, n)
2749 struct compiling *c;
2750 node *n;
2751{
Guido van Rossum25831651993-05-19 14:50:45 +00002752 int i;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002753 object *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002754 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00002755 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00002756 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00002757 c->c_errors++;
2758 return;
2759 }
2760 /* Push the class name on the stack */
2761 i = com_addconst(c, v);
2762 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002763 com_push(c, 1);
Guido van Rossum25831651993-05-19 14:50:45 +00002764 DECREF(v);
2765 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002766 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00002767 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002768 com_push(c, 1);
2769 }
Guido van Rossum25831651993-05-19 14:50:45 +00002770 else
2771 com_bases(c, CHILD(n, 3));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00002772 v = (object *)icompile(n, c);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002773 if (v == NULL)
2774 c->c_errors++;
2775 else {
Guido van Rossum25831651993-05-19 14:50:45 +00002776 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002777 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002778 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002779 com_addoparg(c, MAKE_FUNCTION, 0);
2780 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002781 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002782 com_pop(c, 2);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002783 com_addopname(c, STORE_NAME, CHILD(n, 1));
2784 DECREF(v);
2785 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002786}
2787
2788static void
2789com_node(c, n)
2790 struct compiling *c;
2791 node *n;
2792{
2793 switch (TYPE(n)) {
2794
2795 /* Definition nodes */
2796
2797 case funcdef:
2798 com_funcdef(c, n);
2799 break;
2800 case classdef:
2801 com_classdef(c, n);
2802 break;
2803
2804 /* Trivial parse tree nodes */
2805
2806 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002807 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002808 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002809 com_node(c, CHILD(n, 0));
2810 break;
2811
2812 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002813 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
2814 com_addoparg(c, SET_LINENO, n->n_lineno);
2815 {
2816 int i;
2817 for (i = 0; i < NCH(n)-1; i += 2)
2818 com_node(c, CHILD(n, i));
2819 }
2820 break;
2821
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002822 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002823 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002824 com_node(c, CHILD(n, 0));
2825 break;
2826
2827 /* Statement nodes */
2828
2829 case expr_stmt:
2830 com_expr_stmt(c, n);
2831 break;
2832 case print_stmt:
2833 com_print_stmt(c, n);
2834 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002835 case del_stmt: /* 'del' exprlist */
Guido van Rossum8861b741996-07-30 16:49:37 +00002836 com_assign(c, CHILD(n, 1), OP_DELETE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002837 break;
2838 case pass_stmt:
2839 break;
2840 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002841 if (c->c_loops == 0) {
Guido van Rossum452a9831996-09-17 14:32:04 +00002842 com_error(c, SyntaxError, "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002843 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002844 com_addbyte(c, BREAK_LOOP);
2845 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002846 case continue_stmt:
2847 com_continue_stmt(c, n);
2848 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002849 case return_stmt:
2850 com_return_stmt(c, n);
2851 break;
2852 case raise_stmt:
2853 com_raise_stmt(c, n);
2854 break;
2855 case import_stmt:
2856 com_import_stmt(c, n);
2857 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002858 case global_stmt:
2859 com_global_stmt(c, n);
2860 break;
Guido van Rossum0dfcf751996-08-12 22:00:53 +00002861#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum25831651993-05-19 14:50:45 +00002862 case access_stmt:
2863 com_access_stmt(c, n);
2864 break;
Guido van Rossum0dfcf751996-08-12 22:00:53 +00002865#endif
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002866 case exec_stmt:
2867 com_exec_stmt(c, n);
2868 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002869 case if_stmt:
2870 com_if_stmt(c, n);
2871 break;
2872 case while_stmt:
2873 com_while_stmt(c, n);
2874 break;
2875 case for_stmt:
2876 com_for_stmt(c, n);
2877 break;
2878 case try_stmt:
2879 com_try_stmt(c, n);
2880 break;
2881 case suite:
2882 com_suite(c, n);
2883 break;
2884
2885 /* Expression nodes */
2886
2887 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002888 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002889 break;
2890 case test:
2891 com_test(c, n);
2892 break;
2893 case and_test:
2894 com_and_test(c, n);
2895 break;
2896 case not_test:
2897 com_not_test(c, n);
2898 break;
2899 case comparison:
2900 com_comparison(c, n);
2901 break;
2902 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002903 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002904 break;
2905 case expr:
2906 com_expr(c, n);
2907 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002908 case xor_expr:
2909 com_xor_expr(c, n);
2910 break;
2911 case and_expr:
2912 com_and_expr(c, n);
2913 break;
2914 case shift_expr:
2915 com_shift_expr(c, n);
2916 break;
2917 case arith_expr:
2918 com_arith_expr(c, n);
2919 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002920 case term:
2921 com_term(c, n);
2922 break;
2923 case factor:
2924 com_factor(c, n);
2925 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00002926 case power:
2927 com_power(c, n);
2928 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002929 case atom:
2930 com_atom(c, n);
2931 break;
2932
2933 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002934 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum452a9831996-09-17 14:32:04 +00002935 com_error(c, SystemError, "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002936 }
2937}
2938
2939static void com_fplist PROTO((struct compiling *, node *));
2940
2941static void
2942com_fpdef(c, n)
2943 struct compiling *c;
2944 node *n;
2945{
2946 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
2947 if (TYPE(CHILD(n, 0)) == LPAR)
2948 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002949 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002950 com_addoparg(c, STORE_FAST, com_newlocal(c, STR(CHILD(n, 0))));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002951 com_pop(c, 1);
2952 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002953}
2954
2955static void
2956com_fplist(c, n)
2957 struct compiling *c;
2958 node *n;
2959{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00002960 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002961 if (NCH(n) == 1) {
2962 com_fpdef(c, CHILD(n, 0));
2963 }
2964 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002965 int i = (NCH(n)+1)/2;
2966 com_addoparg(c, UNPACK_TUPLE, i);
2967 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002968 for (i = 0; i < NCH(n); i += 2)
2969 com_fpdef(c, CHILD(n, i));
2970 }
2971}
2972
2973static void
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002974com_arglist(c, n)
2975 struct compiling *c;
2976 node *n;
2977{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002978 int nch, i;
2979 int complex = 0;
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002980 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00002981 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002982 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002983 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002984 /* Enter all arguments in table of locals */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002985 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002986 node *ch = CHILD(n, i);
2987 node *fp;
2988 char *name;
Guido van Rossum50564e81996-01-12 01:13:16 +00002989 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002990 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002991 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
2992 fp = CHILD(ch, 0);
2993 if (TYPE(fp) == NAME)
2994 name = STR(fp);
2995 else {
2996 name = "";
Guido van Rossum530956d1996-07-21 02:27:43 +00002997 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002998 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002999 com_newlocal(c, name);
3000 c->c_argcount++;
3001 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003002 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003003 ch = CHILD(n, i);
3004 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003005 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003006 else
3007 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003008 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003009 /* Handle *arguments */
3010 if (i < nch) {
3011 node *ch;
3012 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003013 if (TYPE(ch) != DOUBLESTAR) {
3014 REQ(ch, STAR);
3015 ch = CHILD(n, i+1);
3016 if (TYPE(ch) == NAME) {
3017 c->c_flags |= CO_VARARGS;
3018 i += 3;
3019 com_newlocal(c, STR(ch));
3020 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003021 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003022 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003023 /* Handle **keywords */
3024 if (i < nch) {
3025 node *ch;
3026 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003027 if (TYPE(ch) != DOUBLESTAR) {
3028 REQ(ch, STAR);
3029 ch = CHILD(n, i+1);
3030 REQ(ch, STAR);
3031 ch = CHILD(n, i+2);
3032 }
3033 else
3034 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003035 REQ(ch, NAME);
3036 c->c_flags |= CO_VARKEYWORDS;
3037 com_newlocal(c, STR(ch));
3038 }
3039 if (complex) {
3040 /* Generate code for complex arguments only after
3041 having counted the simple arguments */
3042 int ilocal = 0;
3043 for (i = 0; i < nch; i++) {
3044 node *ch = CHILD(n, i);
3045 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003046 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003047 break;
3048 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3049 fp = CHILD(ch, 0);
3050 if (TYPE(fp) != NAME) {
3051 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003052 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003053 com_fpdef(c, ch);
3054 }
3055 ilocal++;
3056 if (++i >= nch)
3057 break;
3058 ch = CHILD(n, i);
3059 if (TYPE(ch) == EQUAL)
3060 i += 2;
3061 else
3062 REQ(ch, COMMA);
3063 }
3064 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003065}
3066
3067static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003068com_file_input(c, n)
3069 struct compiling *c;
3070 node *n;
3071{
3072 int i;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003073 object *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003074 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003075 doc = get_docstring(n);
3076 if (doc != NULL) {
3077 int i = com_addconst(c, doc);
3078 DECREF(doc);
3079 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003080 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003081 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003082 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003083 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003084 for (i = 0; i < NCH(n); i++) {
3085 node *ch = CHILD(n, i);
3086 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3087 com_node(c, ch);
3088 }
3089}
3090
3091/* Top-level compile-node interface */
3092
3093static void
3094compile_funcdef(c, n)
3095 struct compiling *c;
3096 node *n;
3097{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003098 object *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003099 node *ch;
3100 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003101 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003102 doc = get_docstring(CHILD(n, 4));
3103 if (doc != NULL) {
3104 (void) com_addconst(c, doc);
3105 DECREF(doc);
3106 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003107 else
3108 (void) com_addconst(c, None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003109 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3110 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003111 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003112 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003113 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003114 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003115 c->c_infunction = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003116 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003117 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003118 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003119 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003120}
3121
3122static void
Guido van Rossum590baa41993-11-30 13:40:46 +00003123compile_lambdef(c, n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003124 struct compiling *c;
3125 node *n;
3126{
Guido van Rossum590baa41993-11-30 13:40:46 +00003127 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003128 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003129 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003130
3131 ch = CHILD(n, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003132 (void) com_addconst(c, None); /* No docstring */
3133 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003134 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003135 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003136 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003137 else
3138 ch = CHILD(n, 2);
3139 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003140 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003141 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003142}
3143
3144static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003145compile_classdef(c, n)
3146 struct compiling *c;
3147 node *n;
3148{
3149 node *ch;
3150 object *doc;
3151 REQ(n, classdef);
3152 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3153 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003154#ifdef PRIVATE_NAME_MANGLING
3155 c->c_private = c->c_name;
3156#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003157 ch = CHILD(n, NCH(n)-1); /* The suite */
3158 doc = get_docstring(ch);
3159 if (doc != NULL) {
3160 int i = com_addconst(c, doc);
3161 DECREF(doc);
3162 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003163 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003164 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003165 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003166 }
3167 else
3168 (void) com_addconst(c, None);
3169 com_node(c, ch);
3170 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003171 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003172 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003173 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003174}
3175
3176static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003177compile_node(c, n)
3178 struct compiling *c;
3179 node *n;
3180{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003181 com_addoparg(c, SET_LINENO, n->n_lineno);
3182
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003183 switch (TYPE(n)) {
3184
Guido van Rossum4c417781991-01-21 16:09:22 +00003185 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003186 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003187 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003188 n = CHILD(n, 0);
3189 if (TYPE(n) != NEWLINE)
3190 com_node(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003191 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003192 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003193 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003194 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003195 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003196 break;
3197
Guido van Rossum4c417781991-01-21 16:09:22 +00003198 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003199 com_file_input(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003200 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003201 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003202 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003203 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003204 break;
3205
Guido van Rossum590baa41993-11-30 13:40:46 +00003206 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003207 com_node(c, CHILD(n, 0));
3208 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003209 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003210 break;
3211
Guido van Rossum590baa41993-11-30 13:40:46 +00003212 case lambdef: /* anonymous function definition */
3213 compile_lambdef(c, n);
3214 break;
3215
Guido van Rossum4c417781991-01-21 16:09:22 +00003216 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003217 compile_funcdef(c, n);
3218 break;
3219
Guido van Rossum4c417781991-01-21 16:09:22 +00003220 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003221 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003222 break;
3223
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003224 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003225 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum452a9831996-09-17 14:32:04 +00003226 com_error(c, SystemError,
3227 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003228 }
3229}
3230
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003231/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00003232
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003233 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
3234 instructions that refer to local variables with LOAD_FAST etc.
3235 The latter instructions are much faster because they don't need to
3236 look up the variable name in a dictionary.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003237
Guido van Rossum681d79a1995-07-18 14:51:37 +00003238 To find all local variables, we check all STORE_NAME, IMPORT_FROM
3239 and DELETE_NAME instructions. This yields all local variables,
3240 function definitions, class definitions and import statements.
3241 Argument names have already been entered into the list by the
3242 special processing for the argument list.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003243
3244 All remaining LOAD_NAME instructions must refer to non-local (global
3245 or builtin) variables, so are replaced by LOAD_GLOBAL.
3246
3247 There are two problems: 'from foo import *' and 'exec' may introduce
3248 local variables that we can't know while compiling. If this is the
Guido van Rossum681d79a1995-07-18 14:51:37 +00003249 case, we can still optimize bona fide locals (since those
3250 statements will be surrounded by fast_2_locals() and
3251 locals_2_fast()), but we can't change LOAD_NAME to LOAD_GLOBAL.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003252
Guido van Rossum681d79a1995-07-18 14:51:37 +00003253 NB: this modifies the string object c->c_code! */
Guido van Rossum282914b1991-04-04 10:42:56 +00003254
3255static void
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003256optimize(c)
3257 struct compiling *c;
Guido van Rossum282914b1991-04-04 10:42:56 +00003258{
Guido van Rossum0a697f61991-04-16 08:39:12 +00003259 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00003260 int opcode;
Guido van Rossum80bb9651996-12-05 23:27:02 +00003261 int oparg = 0;
Guido van Rossum282914b1991-04-04 10:42:56 +00003262 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003263 object *error_type, *error_value, *error_traceback;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003264
Guido van Rossum282914b1991-04-04 10:42:56 +00003265#define NEXTOP() (*next_instr++)
3266#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
3267#define GETITEM(v, i) (getlistitem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003268#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
3269
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003270 err_fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003271
3272 c->c_flags |= CO_OPTIMIZED;
Guido van Rossum282914b1991-04-04 10:42:56 +00003273
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003274 next_instr = (unsigned char *) getstringvalue(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003275 for (;;) {
3276 opcode = NEXTOP();
3277 if (opcode == STOP_CODE)
3278 break;
3279 if (HAS_ARG(opcode))
3280 oparg = NEXTARG();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003281 switch (opcode) {
3282 case STORE_NAME:
3283 case DELETE_NAME:
3284 case IMPORT_FROM:
3285 com_addlocal_o(c, GETNAMEOBJ(oparg));
3286 break;
3287 case EXEC_STMT:
3288 c->c_flags &= ~CO_OPTIMIZED;
3289 break;
Guido van Rossum282914b1991-04-04 10:42:56 +00003290 }
3291 }
3292
Guido van Rossum681d79a1995-07-18 14:51:37 +00003293 if (dictlookup(c->c_locals, "*") != NULL)
3294 c->c_flags &= ~CO_OPTIMIZED;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003295
3296 next_instr = (unsigned char *) getstringvalue(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003297 for (;;) {
3298 cur_instr = next_instr;
3299 opcode = NEXTOP();
3300 if (opcode == STOP_CODE)
3301 break;
3302 if (HAS_ARG(opcode))
3303 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003304 if (opcode == LOAD_NAME ||
3305 opcode == STORE_NAME ||
3306 opcode == DELETE_NAME) {
3307 object *v;
3308 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00003309 name = GETNAMEOBJ(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003310 v = dict2lookup(c->c_locals, name);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003311 if (v == NULL) {
Guido van Rossum83163251991-08-16 08:58:43 +00003312 err_clear();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003313 if (opcode == LOAD_NAME &&
3314 (c->c_flags&CO_OPTIMIZED))
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003315 cur_instr[0] = LOAD_GLOBAL;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003316 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00003317 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003318 i = getintvalue(v);
3319 switch (opcode) {
3320 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
3321 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
3322 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
3323 }
3324 cur_instr[1] = i & 0xff;
3325 cur_instr[2] = (i>>8) & 0xff;
Guido van Rossum282914b1991-04-04 10:42:56 +00003326 }
3327 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003328
Guido van Rossum681d79a1995-07-18 14:51:37 +00003329 if (c->c_errors == 0)
3330 err_restore(error_type, error_value, error_traceback);
Guido van Rossum282914b1991-04-04 10:42:56 +00003331}
3332
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003333codeobject *
Guido van Rossum590baa41993-11-30 13:40:46 +00003334compile(n, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003335 node *n;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003336 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003337{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003338 return jcompile(n, filename, NULL);
3339}
3340
3341static codeobject *
3342icompile(n, base)
3343 node *n;
3344 struct compiling *base;
3345{
3346 return jcompile(n, base->c_filename, base);
3347}
3348
3349static codeobject *
3350jcompile(n, filename, base)
3351 node *n;
3352 char *filename;
3353 struct compiling *base;
3354{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003355 struct compiling sc;
3356 codeobject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003357 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003358 return NULL;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003359#ifdef PRIVATE_NAME_MANGLING
3360 if (base)
3361 sc.c_private = base->c_private;
3362 else
3363 sc.c_private = NULL;
3364#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003365 compile_node(&sc, n);
3366 com_done(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003367 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003368 optimize(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003369 sc.c_flags |= CO_NEWLOCALS;
3370 }
3371 else if (TYPE(n) == classdef)
3372 sc.c_flags |= CO_NEWLOCALS;
Guido van Rossum9bfef441993-03-29 10:43:31 +00003373 co = NULL;
3374 if (sc.c_errors == 0) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003375 object *consts, *names, *varnames, *filename, *name;
3376 consts = listtuple(sc.c_consts);
3377 names = listtuple(sc.c_names);
3378 varnames = listtuple(sc.c_varnames);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003379 filename = PyString_InternFromString(sc.c_filename);
3380 name = PyString_InternFromString(sc.c_name);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003381 if (!err_occurred())
3382 co = newcodeobject(sc.c_argcount,
3383 sc.c_nlocals,
Guido van Rossum8b993a91997-01-17 21:04:03 +00003384 sc.c_maxstacklevel,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003385 sc.c_flags,
3386 sc.c_code,
3387 consts,
3388 names,
3389 varnames,
3390 filename,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003391 name,
3392 sc.c_firstlineno,
3393 sc.c_lnotab);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003394 XDECREF(consts);
3395 XDECREF(names);
3396 XDECREF(varnames);
3397 XDECREF(filename);
3398 XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003399 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003400 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003401 return co;
3402}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003403
3404int
3405PyCode_Addr2Line(co, addrq)
3406 PyCodeObject *co;
3407 int addrq;
3408{
3409 int size = PyString_Size(co->co_lnotab) / 2;
3410 char *p = PyString_AsString(co->co_lnotab);
3411 int line = co->co_firstlineno;
3412 int addr = 0;
3413 while (--size >= 0) {
3414 addr += *p++;
3415 if (addr > addrq)
3416 break;
3417 line += *p++;
3418 }
3419 return line;
3420}