blob: b4377ec98a693cf264e23bc99539dc03660bec16 [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 Rossum10dc2e81990-11-18 17:27:39 +0000386
387static int
Guido van Rossum590baa41993-11-30 13:40:46 +0000388com_init(c, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000389 struct compiling *c;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000390 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000391{
Guido van Rossum62d46241991-04-03 19:00:23 +0000392 if ((c->c_code = newsizedstringobject((char *)NULL, 1000)) == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000393 goto fail_3;
394 if ((c->c_consts = newlistobject(0)) == NULL)
395 goto fail_2;
396 if ((c->c_names = newlistobject(0)) == NULL)
397 goto fail_1;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000398 if ((c->c_globals = newdictobject()) == NULL)
399 goto fail_0;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000400 if ((c->c_locals = newdictobject()) == NULL)
401 goto fail_00;
402 if ((c->c_varnames = newlistobject(0)) == NULL)
403 goto fail_000;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000404 if ((c->c_lnotab = newsizedstringobject((char *)NULL, 1000)) == NULL)
405 goto fail_0000;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000406 c->c_nlocals = 0;
407 c->c_argcount = 0;
408 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000409 c->c_nexti = 0;
410 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000411 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000412 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000413 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000414 c->c_begin = 0;
415 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000416 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000417 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000418 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000419 c->c_stacklevel = 0;
420 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000421 c->c_firstlineno = 0;
422 c->c_last_addr = 0;
423 c->c_last_line = 0;
424 c-> c_lnotab_next = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000425 return 1;
426
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000427 fail_0000:
428 DECREF(c->c_lnotab);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000429 fail_000:
430 DECREF(c->c_locals);
431 fail_00:
432 DECREF(c->c_globals);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000433 fail_0:
434 DECREF(c->c_names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000435 fail_1:
436 DECREF(c->c_consts);
437 fail_2:
438 DECREF(c->c_code);
439 fail_3:
440 return 0;
441}
442
443static void
444com_free(c)
445 struct compiling *c;
446{
447 XDECREF(c->c_code);
448 XDECREF(c->c_consts);
449 XDECREF(c->c_names);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000450 XDECREF(c->c_globals);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000451 XDECREF(c->c_locals);
452 XDECREF(c->c_varnames);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000453 XDECREF(c->c_lnotab);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000454}
455
456static void
Guido van Rossum8b993a91997-01-17 21:04:03 +0000457com_push(c, n)
458 struct compiling *c;
459 int n;
460{
461 c->c_stacklevel += n;
462 if (c->c_stacklevel > c->c_maxstacklevel)
463 c->c_maxstacklevel = c->c_stacklevel;
464}
465
466static void
467com_pop(c, n)
468 struct compiling *c;
469 int n;
470{
471 if (c->c_stacklevel < n) {
472 fprintf(stderr,
473 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
474 c->c_filename, c->c_lineno,
475 c->c_nexti, c->c_stacklevel, n);
476 c->c_stacklevel = 0;
477 }
478 else
479 c->c_stacklevel -= n;
480}
481
482static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000483com_done(c)
484 struct compiling *c;
485{
486 if (c->c_code != NULL)
487 resizestring(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000488 if (c->c_lnotab != NULL)
489 resizestring(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000490}
491
492static void
493com_addbyte(c, byte)
494 struct compiling *c;
495 int byte;
496{
497 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000498 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000499 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000500 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000501 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000502 fatal("com_addbyte: byte out of range");
Guido van Rossum01cfd441991-10-20 20:12:38 +0000503 */
Guido van Rossum452a9831996-09-17 14:32:04 +0000504 com_error(c, SystemError, "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000505 }
506 if (c->c_code == NULL)
507 return;
508 len = getstringsize(c->c_code);
509 if (c->c_nexti >= len) {
510 if (resizestring(&c->c_code, len+1000) != 0) {
511 c->c_errors++;
512 return;
513 }
514 }
515 getstringvalue(c->c_code)[c->c_nexti++] = byte;
516}
517
518static void
519com_addint(c, x)
520 struct compiling *c;
521 int x;
522{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000523 com_addbyte(c, x & 0xff);
524 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000525}
526
527static void
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000528com_add_lnotab(c, addr, line)
529 struct compiling *c;
530 int addr;
531 int line;
532{
533 int size;
534 char *p;
535 if (c->c_lnotab == NULL)
536 return;
537 size = getstringsize(c->c_lnotab);
538 if (c->c_lnotab_next+2 > size) {
539 if (resizestring(&c->c_lnotab, size + 1000) < 0) {
540 c->c_errors++;
541 return;
542 }
543 }
544 p = getstringvalue(c->c_lnotab) + c->c_lnotab_next;
545 *p++ = addr;
546 *p++ = line;
547 c->c_lnotab_next += 2;
548}
549
550static void
551com_set_lineno(c, lineno)
552 struct compiling *c;
553 int lineno;
554{
555 c->c_lineno = lineno;
556 if (c->c_firstlineno == 0) {
557 c->c_firstlineno = c->c_last_line = lineno;
558 }
559 else {
560 int incr_addr = c->c_nexti - c->c_last_addr;
561 int incr_line = lineno - c->c_last_line;
562 while (incr_addr > 0 || incr_line > 0) {
563 int trunc_addr = incr_addr;
564 int trunc_line = incr_line;
565 if (trunc_addr > 255)
566 trunc_addr = 255;
567 if (trunc_line > 255)
568 trunc_line = 255;
569 com_add_lnotab(c, trunc_addr, trunc_line);
570 incr_addr -= trunc_addr;
571 incr_line -= trunc_line;
572 }
573 c->c_last_addr = c->c_nexti;
574 c->c_last_line = lineno;
575 }
576}
577
578static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000579com_addoparg(c, op, arg)
580 struct compiling *c;
581 int op;
582 int arg;
583{
Guido van Rossum8e793d91997-03-03 19:13:14 +0000584 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000585 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000586 if (Py_OptimizeFlag)
587 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000588 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000589 com_addbyte(c, op);
590 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000591}
592
593static void
594com_addfwref(c, op, p_anchor)
595 struct compiling *c;
596 int op;
597 int *p_anchor;
598{
599 /* Compile a forward reference for backpatching */
600 int here;
601 int anchor;
602 com_addbyte(c, op);
603 here = c->c_nexti;
604 anchor = *p_anchor;
605 *p_anchor = here;
606 com_addint(c, anchor == 0 ? 0 : here - anchor);
607}
608
609static void
610com_backpatch(c, anchor)
611 struct compiling *c;
612 int anchor; /* Must be nonzero */
613{
614 unsigned char *code = (unsigned char *) getstringvalue(c->c_code);
615 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000616 int dist;
617 int prev;
618 for (;;) {
619 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000620 prev = code[anchor] + (code[anchor+1] << 8);
621 dist = target - (anchor+2);
622 code[anchor] = dist & 0xff;
623 code[anchor+1] = dist >> 8;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000624 if (!prev)
625 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000626 anchor -= prev;
627 }
628}
629
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000630/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000631
632static int
633com_add(c, list, v)
634 struct compiling *c;
635 object *list;
636 object *v;
637{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000638 int n = getlistsize(list);
639 int i;
640 for (i = n; --i >= 0; ) {
641 object *w = getlistitem(list, i);
Guido van Rossumefc0bd01991-07-01 18:44:20 +0000642 if (v->ob_type == w->ob_type && cmpobject(v, w) == 0)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000643 return i;
644 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000645 if (addlistitem(list, v) != 0)
646 c->c_errors++;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000647 return n;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000648}
649
650static int
651com_addconst(c, v)
652 struct compiling *c;
653 object *v;
654{
655 return com_add(c, c->c_consts, v);
656}
657
658static int
659com_addname(c, v)
660 struct compiling *c;
661 object *v;
662{
663 return com_add(c, c->c_names, v);
664}
665
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000666#ifdef PRIVATE_NAME_MANGLING
667static int
668com_mangle(c, name, buffer, maxlen)
669 struct compiling *c;
670 char *name;
671 char *buffer;
672 int maxlen;
673{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000674 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000675 This is independent from how the name is used. */
676 char *p;
677 int nlen, plen;
678 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000679 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000680 return 0; /* Don't mangle __extremely_long_names */
681 if (name[nlen-1] == '_' && name[nlen-2] == '_')
682 return 0; /* Don't mangle __whatever__ */
683 p = c->c_private;
684 /* Strip leading underscores from class name */
685 while (*p == '_')
686 p++;
687 if (*p == '\0')
688 return 0; /* Don't mangle if class is just underscores */
689 plen = strlen(p);
690 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000691 plen = maxlen-nlen-2; /* Truncate class name if too long */
692 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000693 buffer[0] = '_';
694 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000695 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000696 /* fprintf(stderr, "mangle %s -> %s\n", name, buffer); */
697 return 1;
698}
699#endif
700
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000701static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000702com_addopnamestr(c, op, name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000703 struct compiling *c;
704 int op;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000705 char *name;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000706{
707 object *v;
708 int i;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000709#ifdef PRIVATE_NAME_MANGLING
710 char buffer[256];
711 if (name != NULL && name[0] == '_' && name[1] == '_' &&
712 c->c_private != NULL &&
713 com_mangle(c, name, buffer, (int)sizeof(buffer)))
714 name = buffer;
715#endif
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000716 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000717 c->c_errors++;
718 i = 255;
719 }
720 else {
721 i = com_addname(c, v);
722 DECREF(v);
723 }
Guido van Rossumc5e96291991-12-10 13:53:51 +0000724 /* Hack to replace *_NAME opcodes by *_GLOBAL if necessary */
725 switch (op) {
726 case LOAD_NAME:
727 case STORE_NAME:
728 case DELETE_NAME:
729 if (dictlookup(c->c_globals, name) != NULL) {
730 switch (op) {
731 case LOAD_NAME: op = LOAD_GLOBAL; break;
732 case STORE_NAME: op = STORE_GLOBAL; break;
733 case DELETE_NAME: op = DELETE_GLOBAL; break;
734 }
735 }
736 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000737 com_addoparg(c, op, i);
738}
739
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000740static void
741com_addopname(c, op, n)
742 struct compiling *c;
743 int op;
744 node *n;
745{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000746 char *name;
747 char buffer[1000];
748 /* XXX it is possible to write this code without the 1000
749 chars on the total length of dotted names, I just can't be
750 bothered right now */
751 if (TYPE(n) == STAR)
752 name = "*";
753 else if (TYPE(n) == dotted_name) {
754 char *p = buffer;
755 int i;
756 name = buffer;
757 for (i = 0; i < NCH(n); i += 2) {
758 char *s = STR(CHILD(n, i));
759 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum452a9831996-09-17 14:32:04 +0000760 com_error(c, MemoryError,
761 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +0000762 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000763 break;
764 }
765 if (p != buffer)
766 *p++ = '.';
767 strcpy(p, s);
768 p = strchr(p, '\0');
769 }
770 }
771 else {
772 REQ(n, NAME);
773 name = STR(n);
774 }
775 com_addopnamestr(c, op, name);
776}
777
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000778static object *
Guido van Rossum452a9831996-09-17 14:32:04 +0000779parsenumber(co, s)
780 struct compiling *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000781 char *s;
782{
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000783 extern long mystrtol PROTO((const char *, char **, int));
784 extern unsigned long mystrtoul PROTO((const char *, char **, int));
785 extern double atof PROTO((const char *));
Guido van Rossumc5e96291991-12-10 13:53:51 +0000786 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000787 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000788 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +0000789#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +0000790 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +0000791 int imflag;
792#endif
793
Guido van Rossum282914b1991-04-04 10:42:56 +0000794 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000795 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +0000796#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +0000797 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +0000798#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000799 if (*end == 'l' || *end == 'L')
Guido van Rossumc5e96291991-12-10 13:53:51 +0000800 return long_scan(s, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000801 if (s[0] == '0')
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000802 x = (long) mystrtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000803 else
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000804 x = mystrtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +0000805 if (*end == '\0') {
806 if (errno != 0) {
Guido van Rossum452a9831996-09-17 14:32:04 +0000807 com_error(co, OverflowError,
808 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000809 return NULL;
810 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000811 return newintobject(x);
Guido van Rossum282914b1991-04-04 10:42:56 +0000812 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000813 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +0000814#ifndef WITHOUT_COMPLEX
815 if (imflag) {
816 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000817 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +0000818 c.imag = atof(s);
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000819 PyFPE_END_PROTECT
Guido van Rossum50564e81996-01-12 01:13:16 +0000820 return newcomplexobject(c);
821 }
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000822 else {
Guido van Rossum50564e81996-01-12 01:13:16 +0000823#endif
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000824 PyFPE_START_PROTECT("atof", return 0)
825 dx = atof(s);
826 PyFPE_END_PROTECT
827 return newfloatobject(dx);
828 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000829}
830
831static object *
832parsestr(s)
833 char *s;
834{
835 object *v;
836 int len;
837 char *buf;
838 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000839 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000840 int c;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000841 int quote = *s;
842 if (quote != '\'' && quote != '\"') {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000843 err_badcall();
844 return NULL;
845 }
846 s++;
847 len = strlen(s);
Guido van Rossum8054fad1993-10-26 15:19:44 +0000848 if (s[--len] != quote) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000849 err_badcall();
850 return NULL;
851 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000852 if (len >= 4 && s[0] == quote && s[1] == quote) {
853 s += 2;
854 len -= 2;
855 if (s[--len] != quote || s[--len] != quote) {
856 err_badcall();
857 return NULL;
858 }
859 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000860 if (strchr(s, '\\') == NULL)
861 return newsizedstringobject(s, len);
862 v = newsizedstringobject((char *)NULL, len);
863 p = buf = getstringvalue(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000864 end = s + len;
865 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000866 if (*s != '\\') {
867 *p++ = *s++;
868 continue;
869 }
870 s++;
871 switch (*s++) {
872 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000873 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000874 case '\\': *p++ = '\\'; break;
875 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000876 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000877 case 'b': *p++ = '\b'; break;
878 case 'f': *p++ = '\014'; break; /* FF */
879 case 't': *p++ = '\t'; break;
880 case 'n': *p++ = '\n'; break;
881 case 'r': *p++ = '\r'; break;
882 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000883 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
884 case '0': case '1': case '2': case '3':
885 case '4': case '5': case '6': case '7':
886 c = s[-1] - '0';
887 if ('0' <= *s && *s <= '7') {
888 c = (c<<3) + *s++ - '0';
889 if ('0' <= *s && *s <= '7')
890 c = (c<<3) + *s++ - '0';
891 }
892 *p++ = c;
893 break;
894 case 'x':
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000895 if (isxdigit(Py_CHARMASK(*s))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000896 sscanf(s, "%x", &c);
897 *p++ = c;
898 do {
899 s++;
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000900 } while (isxdigit(Py_CHARMASK(*s)));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000901 break;
902 }
903 /* FALLTHROUGH */
904 default: *p++ = '\\'; *p++ = s[-1]; break;
905 }
906 }
907 resizestring(&v, (int)(p - buf));
908 return v;
909}
910
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000911static object *
912parsestrplus(n)
913 node *n;
914{
915 object *v;
916 int i;
917 REQ(CHILD(n, 0), STRING);
918 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
919 /* String literal concatenation */
920 for (i = 1; i < NCH(n) && v != NULL; i++) {
921 joinstring_decref(&v, parsestr(STR(CHILD(n, i))));
922 }
923 }
924 return v;
925}
926
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000927static void
928com_list_constructor(c, n)
929 struct compiling *c;
930 node *n;
931{
932 int len;
933 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000934 if (TYPE(n) != testlist)
935 REQ(n, exprlist);
936 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
937 len = (NCH(n) + 1) / 2;
938 for (i = 0; i < NCH(n); i += 2)
939 com_node(c, CHILD(n, i));
940 com_addoparg(c, BUILD_LIST, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000941 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000942}
943
944static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000945com_dictmaker(c, n)
946 struct compiling *c;
947 node *n;
948{
949 int i;
950 /* dictmaker: test ':' test (',' test ':' value)* [','] */
951 for (i = 0; i+2 < NCH(n); i += 4) {
952 /* We must arrange things just right for STORE_SUBSCR.
953 It wants the stack to look like (value) (dict) (key) */
954 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000955 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000956 com_node(c, CHILD(n, i+2)); /* value */
957 com_addbyte(c, ROT_TWO);
958 com_node(c, CHILD(n, i)); /* key */
959 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000960 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000961 }
962}
963
964static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000965com_atom(c, n)
966 struct compiling *c;
967 node *n;
968{
969 node *ch;
970 object *v;
971 int i;
972 REQ(n, atom);
973 ch = CHILD(n, 0);
974 switch (TYPE(ch)) {
975 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +0000976 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000977 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000978 com_push(c, 1);
979 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000980 else
981 com_node(c, CHILD(n, 1));
982 break;
983 case LSQB:
Guido van Rossum8b993a91997-01-17 21:04:03 +0000984 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000985 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000986 com_push(c, 1);
987 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000988 else
989 com_list_constructor(c, CHILD(n, 1));
990 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000991 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000992 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +0000993 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000994 if (TYPE(CHILD(n, 1)) != RBRACE)
995 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000996 break;
997 case BACKQUOTE:
998 com_node(c, CHILD(n, 1));
999 com_addbyte(c, UNARY_CONVERT);
1000 break;
1001 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001002 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001003 i = 255;
1004 }
1005 else {
1006 i = com_addconst(c, v);
1007 DECREF(v);
1008 }
1009 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001010 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001011 break;
1012 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001013 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001014 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001015 c->c_errors++;
1016 i = 255;
1017 }
1018 else {
1019 i = com_addconst(c, v);
1020 DECREF(v);
1021 }
1022 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001023 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001024 break;
1025 case NAME:
1026 com_addopname(c, LOAD_NAME, ch);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001027 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001028 break;
1029 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001030 /* XXX fprintf(stderr, "node type %d\n", TYPE(ch)); */
Guido van Rossum452a9831996-09-17 14:32:04 +00001031 com_error(c, SystemError, "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001032 }
1033}
1034
1035static void
1036com_slice(c, n, op)
1037 struct compiling *c;
1038 node *n;
1039 int op;
1040{
1041 if (NCH(n) == 1) {
1042 com_addbyte(c, op);
1043 }
1044 else if (NCH(n) == 2) {
1045 if (TYPE(CHILD(n, 0)) != COLON) {
1046 com_node(c, CHILD(n, 0));
1047 com_addbyte(c, op+1);
1048 }
1049 else {
1050 com_node(c, CHILD(n, 1));
1051 com_addbyte(c, op+2);
1052 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001053 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001054 }
1055 else {
1056 com_node(c, CHILD(n, 0));
1057 com_node(c, CHILD(n, 2));
1058 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001059 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001060 }
1061}
1062
Guido van Rossum635abd21997-01-06 22:56:52 +00001063static void
1064com_argument(c, n, pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001065 struct compiling *c;
1066 node *n; /* argument */
Guido van Rossum635abd21997-01-06 22:56:52 +00001067 object **pkeywords;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001068{
1069 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001070 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001071 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001072 if (*pkeywords != NULL) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001073 com_error(c, SyntaxError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001074 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001075 }
1076 else {
1077 com_node(c, CHILD(n, 0));
1078 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001079 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001080 }
1081 m = n;
1082 do {
1083 m = CHILD(m, 0);
1084 } while (NCH(m) == 1);
1085 if (TYPE(m) != NAME) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001086 com_error(c, SyntaxError, "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001087 }
1088 else {
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001089 object *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001090 if (v != NULL && *pkeywords == NULL)
1091 *pkeywords = newdictobject();
1092 if (v == NULL || *pkeywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001093 c->c_errors++;
1094 else {
Guido van Rossum635abd21997-01-06 22:56:52 +00001095 if (dict2lookup(*pkeywords, v) != NULL)
1096 com_error(c, SyntaxError,
1097 "duplicate keyword argument");
1098 else
1099 if (dict2insert(*pkeywords, v, v) != 0)
1100 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001101 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001102 com_push(c, 1);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001103 DECREF(v);
1104 }
1105 }
1106 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001107}
1108
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001109static void
1110com_call_function(c, n)
1111 struct compiling *c;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001112 node *n; /* EITHER arglist OR ')' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001113{
1114 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001115 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001116 }
1117 else {
Guido van Rossum635abd21997-01-06 22:56:52 +00001118 object *keywords = NULL;
1119 int i, na, nk;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001120 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001121 na = 0;
1122 nk = 0;
1123 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001124 com_argument(c, CHILD(n, i), &keywords);
1125 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001126 na++;
1127 else
1128 nk++;
1129 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001130 XDECREF(keywords);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001131 if (na > 255 || nk > 255) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001132 com_error(c, SyntaxError, "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001133 }
1134 com_addoparg(c, CALL_FUNCTION, na | (nk << 8));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001135 com_pop(c, na + 2*nk);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001136 }
1137}
1138
1139static void
1140com_select_member(c, n)
1141 struct compiling *c;
1142 node *n;
1143{
1144 com_addopname(c, LOAD_ATTR, n);
1145}
1146
1147static void
Guido van Rossum8861b741996-07-30 16:49:37 +00001148com_sliceobj(c, n)
1149 struct compiling *c;
1150 node *n;
1151{
1152 int i=0;
1153 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001154 node *ch;
1155
1156 /* first argument */
1157 if (TYPE(CHILD(n,i)) == COLON) {
1158 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001159 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001160 i++;
1161 }
1162 else {
1163 com_node(c, CHILD(n,i));
1164 i++;
1165 REQ(CHILD(n,i),COLON);
1166 i++;
1167 }
1168 /* second argument */
1169 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1170 com_node(c, CHILD(n,i));
1171 i++;
1172 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001173 else {
1174 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1175 com_push(c, 1);
1176 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001177 /* remaining arguments */
1178 for (; i < NCH(n); i++) {
1179 ns++;
1180 ch=CHILD(n,i);
1181 REQ(ch, sliceop);
1182 if (NCH(ch) == 1) {
1183 /* right argument of ':' missing */
1184 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001185 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001186 }
1187 else
1188 com_node(c, CHILD(ch,1));
1189 }
1190 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001191 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001192}
1193
1194static void
1195com_subscript(c, n)
1196 struct compiling *c;
1197 node *n;
1198{
1199 node *ch;
1200 REQ(n, subscript);
1201 ch = CHILD(n,0);
1202 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001203 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001204 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001205 com_push(c, 1);
1206 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001207 else {
1208 /* check for slice */
1209 if ((TYPE(ch) == COLON || NCH(n) > 1))
1210 com_sliceobj(c, n);
1211 else {
1212 REQ(ch, test);
1213 com_node(c, ch);
1214 }
1215 }
1216}
1217
1218static void
1219com_subscriptlist(c, n, assigning)
1220 struct compiling *c;
1221 node *n;
1222 int assigning;
1223{
1224 int i, op;
1225 REQ(n, subscriptlist);
1226 /* Check to make backward compatible slice behavior for '[i:j]' */
1227 if (NCH(n) == 1) {
1228 node *sub = CHILD(n, 0); /* subscript */
1229 /* Make it is a simple slice.
Guido van Rossum8b993a91997-01-17 21:04:03 +00001230 Should have exactly one colon. */
Guido van Rossum8861b741996-07-30 16:49:37 +00001231 if ((TYPE(CHILD(sub, 0)) == COLON
1232 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
Guido van Rossum8b993a91997-01-17 21:04:03 +00001233 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1234 {
Guido van Rossum8861b741996-07-30 16:49:37 +00001235 if (assigning == OP_APPLY)
1236 op = SLICE;
1237 else
1238 op = ((assigning == OP_ASSIGN) ? STORE_SLICE : DELETE_SLICE);
1239 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001240 if (op == STORE_SLICE)
1241 com_pop(c, 2);
1242 else if (op == DELETE_SLICE)
1243 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001244 return;
1245 }
1246 }
1247 /* Else normal subscriptlist. Compile each subscript. */
1248 for (i = 0; i < NCH(n); i += 2)
1249 com_subscript(c, CHILD(n, i));
1250 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001251 if (NCH(n) > 1) {
1252 i = (NCH(n)+1) / 2;
1253 com_addoparg(c, BUILD_TUPLE, i);
1254 com_pop(c, i-1);
1255 }
1256 if (assigning == OP_APPLY) {
Guido van Rossum8861b741996-07-30 16:49:37 +00001257 op = BINARY_SUBSCR;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001258 i = 1;
1259 }
1260 else if (assigning == OP_ASSIGN) {
1261 op = STORE_SUBSCR;
1262 i = 3;
1263 }
1264 else {
1265 op = DELETE_SUBSCR;
1266 i = 2;
1267 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001268 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001269 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001270}
1271
1272static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001273com_apply_trailer(c, n)
1274 struct compiling *c;
1275 node *n;
1276{
1277 REQ(n, trailer);
1278 switch (TYPE(CHILD(n, 0))) {
1279 case LPAR:
1280 com_call_function(c, CHILD(n, 1));
1281 break;
1282 case DOT:
1283 com_select_member(c, CHILD(n, 1));
1284 break;
1285 case LSQB:
Guido van Rossum8861b741996-07-30 16:49:37 +00001286 com_subscriptlist(c, CHILD(n, 1), OP_APPLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001287 break;
1288 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001289 com_error(c, SystemError,
1290 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001291 }
1292}
1293
1294static void
Guido van Rossum50564e81996-01-12 01:13:16 +00001295com_power(c, n)
1296 struct compiling *c;
1297 node *n;
1298{
1299 int i;
1300 REQ(n, power);
1301 com_atom(c, CHILD(n, 0));
1302 for (i = 1; i < NCH(n); i++) {
1303 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1304 com_factor(c, CHILD(n, i+1));
1305 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001306 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001307 break;
1308 }
1309 else
1310 com_apply_trailer(c, CHILD(n, i));
1311 }
1312}
1313
1314static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001315com_factor(c, n)
1316 struct compiling *c;
1317 node *n;
1318{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001319 REQ(n, factor);
1320 if (TYPE(CHILD(n, 0)) == PLUS) {
1321 com_factor(c, CHILD(n, 1));
1322 com_addbyte(c, UNARY_POSITIVE);
1323 }
1324 else if (TYPE(CHILD(n, 0)) == MINUS) {
1325 com_factor(c, CHILD(n, 1));
1326 com_addbyte(c, UNARY_NEGATIVE);
1327 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001328 else if (TYPE(CHILD(n, 0)) == TILDE) {
1329 com_factor(c, CHILD(n, 1));
1330 com_addbyte(c, UNARY_INVERT);
1331 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001332 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001333 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001334 }
1335}
1336
1337static void
1338com_term(c, n)
1339 struct compiling *c;
1340 node *n;
1341{
1342 int i;
1343 int op;
1344 REQ(n, term);
1345 com_factor(c, CHILD(n, 0));
1346 for (i = 2; i < NCH(n); i += 2) {
1347 com_factor(c, CHILD(n, i));
1348 switch (TYPE(CHILD(n, i-1))) {
1349 case STAR:
1350 op = BINARY_MULTIPLY;
1351 break;
1352 case SLASH:
1353 op = BINARY_DIVIDE;
1354 break;
1355 case PERCENT:
1356 op = BINARY_MODULO;
1357 break;
1358 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001359 com_error(c, SystemError,
1360 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001361 op = 255;
1362 }
1363 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001364 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001365 }
1366}
1367
1368static void
1369com_arith_expr(c, n)
1370 struct compiling *c;
1371 node *n;
1372{
1373 int i;
1374 int op;
1375 REQ(n, arith_expr);
1376 com_term(c, CHILD(n, 0));
1377 for (i = 2; i < NCH(n); i += 2) {
1378 com_term(c, CHILD(n, i));
1379 switch (TYPE(CHILD(n, i-1))) {
1380 case PLUS:
1381 op = BINARY_ADD;
1382 break;
1383 case MINUS:
1384 op = BINARY_SUBTRACT;
1385 break;
1386 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001387 com_error(c, SystemError,
1388 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001389 op = 255;
1390 }
1391 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001392 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001393 }
1394}
1395
1396static void
1397com_shift_expr(c, n)
1398 struct compiling *c;
1399 node *n;
1400{
1401 int i;
1402 int op;
1403 REQ(n, shift_expr);
1404 com_arith_expr(c, CHILD(n, 0));
1405 for (i = 2; i < NCH(n); i += 2) {
1406 com_arith_expr(c, CHILD(n, i));
1407 switch (TYPE(CHILD(n, i-1))) {
1408 case LEFTSHIFT:
1409 op = BINARY_LSHIFT;
1410 break;
1411 case RIGHTSHIFT:
1412 op = BINARY_RSHIFT;
1413 break;
1414 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001415 com_error(c, SystemError,
1416 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001417 op = 255;
1418 }
1419 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001420 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001421 }
1422}
1423
1424static void
1425com_and_expr(c, n)
1426 struct compiling *c;
1427 node *n;
1428{
1429 int i;
1430 int op;
1431 REQ(n, and_expr);
1432 com_shift_expr(c, CHILD(n, 0));
1433 for (i = 2; i < NCH(n); i += 2) {
1434 com_shift_expr(c, CHILD(n, i));
1435 if (TYPE(CHILD(n, i-1)) == AMPER) {
1436 op = BINARY_AND;
1437 }
1438 else {
Guido van Rossum452a9831996-09-17 14:32:04 +00001439 com_error(c, SystemError,
1440 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001441 op = 255;
1442 }
1443 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001444 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001445 }
1446}
1447
1448static void
1449com_xor_expr(c, n)
1450 struct compiling *c;
1451 node *n;
1452{
1453 int i;
1454 int op;
1455 REQ(n, xor_expr);
1456 com_and_expr(c, CHILD(n, 0));
1457 for (i = 2; i < NCH(n); i += 2) {
1458 com_and_expr(c, CHILD(n, i));
1459 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1460 op = BINARY_XOR;
1461 }
1462 else {
Guido van Rossum452a9831996-09-17 14:32:04 +00001463 com_error(c, SystemError,
1464 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001465 op = 255;
1466 }
1467 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001468 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001469 }
1470}
1471
1472static void
1473com_expr(c, n)
1474 struct compiling *c;
1475 node *n;
1476{
1477 int i;
1478 int op;
1479 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001480 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001481 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001482 com_xor_expr(c, CHILD(n, i));
1483 if (TYPE(CHILD(n, i-1)) == VBAR) {
1484 op = BINARY_OR;
1485 }
1486 else {
Guido van Rossum452a9831996-09-17 14:32:04 +00001487 com_error(c, SystemError,
1488 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001489 op = 255;
1490 }
1491 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001492 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001493 }
1494}
1495
1496static enum cmp_op
1497cmp_type(n)
1498 node *n;
1499{
1500 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001501 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001502 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1503 if (NCH(n) == 1) {
1504 n = CHILD(n, 0);
1505 switch (TYPE(n)) {
1506 case LESS: return LT;
1507 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001508 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001509 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001510 case LESSEQUAL: return LE;
1511 case GREATEREQUAL: return GE;
1512 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001513 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1514 if (strcmp(STR(n), "is") == 0) return IS;
1515 }
1516 }
1517 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001518 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001519 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1520 return NOT_IN;
1521 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1522 return IS_NOT;
1523 }
1524 }
1525 return BAD;
1526}
1527
1528static void
1529com_comparison(c, n)
1530 struct compiling *c;
1531 node *n;
1532{
1533 int i;
1534 enum cmp_op op;
1535 int anchor;
1536 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
1537 com_expr(c, CHILD(n, 0));
1538 if (NCH(n) == 1)
1539 return;
1540
1541 /****************************************************************
1542 The following code is generated for all but the last
1543 comparison in a chain:
1544
1545 label: on stack: opcode: jump to:
1546
1547 a <code to load b>
1548 a, b DUP_TOP
1549 a, b, b ROT_THREE
1550 b, a, b COMPARE_OP
1551 b, 0-or-1 JUMP_IF_FALSE L1
1552 b, 1 POP_TOP
1553 b
1554
1555 We are now ready to repeat this sequence for the next
1556 comparison in the chain.
1557
1558 For the last we generate:
1559
1560 b <code to load c>
1561 b, c COMPARE_OP
1562 0-or-1
1563
1564 If there were any jumps to L1 (i.e., there was more than one
1565 comparison), we generate:
1566
1567 0-or-1 JUMP_FORWARD L2
1568 L1: b, 0 ROT_TWO
1569 0, b POP_TOP
1570 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00001571 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001572 ****************************************************************/
1573
1574 anchor = 0;
1575
1576 for (i = 2; i < NCH(n); i += 2) {
1577 com_expr(c, CHILD(n, i));
1578 if (i+2 < NCH(n)) {
1579 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001580 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001581 com_addbyte(c, ROT_THREE);
1582 }
1583 op = cmp_type(CHILD(n, i-1));
1584 if (op == BAD) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001585 com_error(c, SystemError,
1586 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001587 }
1588 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001589 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001590 if (i+2 < NCH(n)) {
1591 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1592 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001593 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001594 }
1595 }
1596
1597 if (anchor) {
1598 int anchor2 = 0;
1599 com_addfwref(c, JUMP_FORWARD, &anchor2);
1600 com_backpatch(c, anchor);
1601 com_addbyte(c, ROT_TWO);
1602 com_addbyte(c, POP_TOP);
1603 com_backpatch(c, anchor2);
1604 }
1605}
1606
1607static void
1608com_not_test(c, n)
1609 struct compiling *c;
1610 node *n;
1611{
1612 REQ(n, not_test); /* 'not' not_test | comparison */
1613 if (NCH(n) == 1) {
1614 com_comparison(c, CHILD(n, 0));
1615 }
1616 else {
1617 com_not_test(c, CHILD(n, 1));
1618 com_addbyte(c, UNARY_NOT);
1619 }
1620}
1621
1622static void
1623com_and_test(c, n)
1624 struct compiling *c;
1625 node *n;
1626{
1627 int i;
1628 int anchor;
1629 REQ(n, and_test); /* not_test ('and' not_test)* */
1630 anchor = 0;
1631 i = 0;
1632 for (;;) {
1633 com_not_test(c, CHILD(n, i));
1634 if ((i += 2) >= NCH(n))
1635 break;
1636 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1637 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001638 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001639 }
1640 if (anchor)
1641 com_backpatch(c, anchor);
1642}
1643
1644static void
1645com_test(c, n)
1646 struct compiling *c;
1647 node *n;
1648{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001649 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00001650 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
1651 object *v;
1652 int i;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001653 int ndefs = com_argdefs(c, CHILD(n, 0));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001654 v = (object *) icompile(CHILD(n, 0), c);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001655 if (v == NULL) {
1656 c->c_errors++;
1657 i = 255;
1658 }
1659 else {
1660 i = com_addconst(c, v);
1661 DECREF(v);
1662 }
1663 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001664 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001665 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001666 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001667 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00001668 else {
1669 int anchor = 0;
1670 int i = 0;
1671 for (;;) {
1672 com_and_test(c, CHILD(n, i));
1673 if ((i += 2) >= NCH(n))
1674 break;
1675 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1676 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001677 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001678 }
1679 if (anchor)
1680 com_backpatch(c, anchor);
1681 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001682}
1683
1684static void
Guido van Rossum288a60f1991-12-16 13:05:10 +00001685com_list(c, n, toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001686 struct compiling *c;
1687 node *n;
Guido van Rossum288a60f1991-12-16 13:05:10 +00001688 int toplevel; /* If nonzero, *always* build a tuple */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001689{
1690 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001691 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001692 com_node(c, CHILD(n, 0));
1693 }
1694 else {
1695 int i;
1696 int len;
1697 len = (NCH(n) + 1) / 2;
1698 for (i = 0; i < NCH(n); i += 2)
1699 com_node(c, CHILD(n, i));
1700 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001701 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001702 }
1703}
1704
1705
1706/* Begin of assignment compilation */
1707
1708static void com_assign_name PROTO((struct compiling *, node *, int));
1709static void com_assign PROTO((struct compiling *, node *, int));
1710
1711static void
1712com_assign_attr(c, n, assigning)
1713 struct compiling *c;
1714 node *n;
1715 int assigning;
1716{
1717 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001718 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001719}
1720
1721static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001722com_assign_trailer(c, n, assigning)
1723 struct compiling *c;
1724 node *n;
1725 int assigning;
1726{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001727 REQ(n, trailer);
1728 switch (TYPE(CHILD(n, 0))) {
1729 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum452a9831996-09-17 14:32:04 +00001730 com_error(c, SyntaxError, "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001731 break;
1732 case DOT: /* '.' NAME */
1733 com_assign_attr(c, CHILD(n, 1), assigning);
1734 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001735 case LSQB: /* '[' subscriptlist ']' */
1736 com_subscriptlist(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001737 break;
1738 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001739 com_error(c, SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001740 }
1741}
1742
1743static void
1744com_assign_tuple(c, n, assigning)
1745 struct compiling *c;
1746 node *n;
1747 int assigning;
1748{
1749 int i;
1750 if (TYPE(n) != testlist)
1751 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001752 if (assigning) {
1753 i = (NCH(n)+1)/2;
1754 com_addoparg(c, UNPACK_TUPLE, i);
1755 com_push(c, i-1);
1756 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001757 for (i = 0; i < NCH(n); i += 2)
1758 com_assign(c, CHILD(n, i), assigning);
1759}
1760
1761static void
1762com_assign_list(c, n, assigning)
1763 struct compiling *c;
1764 node *n;
1765 int assigning;
1766{
1767 int i;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001768 if (assigning) {
1769 i = (NCH(n)+1)/2;
1770 com_addoparg(c, UNPACK_LIST, i);
1771 com_push(c, i-1);
1772 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001773 for (i = 0; i < NCH(n); i += 2)
1774 com_assign(c, CHILD(n, i), assigning);
1775}
1776
1777static void
1778com_assign_name(c, n, assigning)
1779 struct compiling *c;
1780 node *n;
1781 int assigning;
1782{
1783 REQ(n, NAME);
1784 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001785 if (assigning)
1786 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001787}
1788
1789static void
1790com_assign(c, n, assigning)
1791 struct compiling *c;
1792 node *n;
1793 int assigning;
1794{
1795 /* Loop to avoid trivial recursion */
1796 for (;;) {
1797 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001798
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001799 case exprlist:
1800 case testlist:
1801 if (NCH(n) > 1) {
1802 com_assign_tuple(c, n, assigning);
1803 return;
1804 }
1805 n = CHILD(n, 0);
1806 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001807
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001808 case test:
1809 case and_test:
1810 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001811 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001812 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001813 case xor_expr:
1814 case and_expr:
1815 case shift_expr:
1816 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001817 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00001818 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001819 if (NCH(n) > 1) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001820 com_error(c, SyntaxError,
1821 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001822 return;
1823 }
1824 n = CHILD(n, 0);
1825 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001826
Guido van Rossum50564e81996-01-12 01:13:16 +00001827 case power: /* atom trailer* ('**' power)* */
1828/* ('+'|'-'|'~') factor | atom trailer* */
1829 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001830 com_error(c, SyntaxError,
1831 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001832 return;
1833 }
Guido van Rossum50564e81996-01-12 01:13:16 +00001834 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001835 int i;
1836 com_node(c, CHILD(n, 0));
1837 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00001838 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001839 com_error(c, SyntaxError,
1840 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00001841 return;
1842 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001843 com_apply_trailer(c, CHILD(n, i));
1844 } /* NB i is still alive */
1845 com_assign_trailer(c,
1846 CHILD(n, i), assigning);
1847 return;
1848 }
1849 n = CHILD(n, 0);
1850 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001851
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001852 case atom:
1853 switch (TYPE(CHILD(n, 0))) {
1854 case LPAR:
1855 n = CHILD(n, 1);
1856 if (TYPE(n) == RPAR) {
1857 /* XXX Should allow () = () ??? */
Guido van Rossum452a9831996-09-17 14:32:04 +00001858 com_error(c, SyntaxError,
1859 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001860 return;
1861 }
1862 break;
1863 case LSQB:
1864 n = CHILD(n, 1);
1865 if (TYPE(n) == RSQB) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001866 com_error(c, SyntaxError,
1867 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001868 return;
1869 }
1870 com_assign_list(c, n, assigning);
1871 return;
1872 case NAME:
1873 com_assign_name(c, CHILD(n, 0), assigning);
1874 return;
1875 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001876 com_error(c, SyntaxError,
1877 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001878 return;
1879 }
1880 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001881
1882 case lambdef:
Guido van Rossum452a9831996-09-17 14:32:04 +00001883 com_error(c, SyntaxError, "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001884 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001885
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001886 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001887 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum452a9831996-09-17 14:32:04 +00001888 com_error(c, SystemError, "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001889 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001890
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001891 }
1892 }
1893}
Guido van Rossum8b993a91997-01-17 21:04:03 +00001894/* Forward */ static node *get_rawdocstring PROTO((node *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001895
1896static void
1897com_expr_stmt(c, n)
1898 struct compiling *c;
1899 node *n;
1900{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001901 REQ(n, expr_stmt); /* testlist ('=' testlist)* */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001902 /* Forget it if we have just a doc string here */
1903 if (NCH(n) == 1 && get_rawdocstring(n) != NULL)
1904 return;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001905 com_node(c, CHILD(n, NCH(n)-1));
1906 if (NCH(n) == 1) {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001907 if (c->c_interactive)
1908 com_addbyte(c, PRINT_EXPR);
1909 else
1910 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001911 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001912 }
1913 else {
1914 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001915 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00001916 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001917 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001918 com_push(c, 1);
1919 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001920 com_assign(c, CHILD(n, i), OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001921 }
1922 }
1923}
1924
1925static void
1926com_print_stmt(c, n)
1927 struct compiling *c;
1928 node *n;
1929{
1930 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001931 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
1932 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001933 com_node(c, CHILD(n, i));
1934 com_addbyte(c, PRINT_ITEM);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001935 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001936 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001937 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001938 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001939 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001940}
1941
1942static void
1943com_return_stmt(c, n)
1944 struct compiling *c;
1945 node *n;
1946{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001947 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001948 if (!c->c_infunction) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001949 com_error(c, SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001950 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001951 if (NCH(n) < 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001952 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001953 com_push(c, 1);
1954 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001955 else
1956 com_node(c, CHILD(n, 1));
1957 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001958 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001959}
1960
1961static void
1962com_raise_stmt(c, n)
1963 struct compiling *c;
1964 node *n;
1965{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001966 int i;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001967 REQ(n, raise_stmt); /* 'raise' test [',' test [',' test]] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001968 com_node(c, CHILD(n, 1));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001969 if (NCH(n) > 3) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001970 com_node(c, CHILD(n, 3));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001971 if (NCH(n) > 5)
1972 com_node(c, CHILD(n, 5));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001973 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001974 i = NCH(n)/2;
1975 com_addoparg(c, RAISE_VARARGS, i);
1976 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001977}
1978
1979static void
1980com_import_stmt(c, n)
1981 struct compiling *c;
1982 node *n;
1983{
1984 int i;
1985 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001986 /* 'import' dotted_name (',' dotted_name)* |
1987 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001988 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001989 /* 'from' dotted_name 'import' ... */
1990 REQ(CHILD(n, 1), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001991 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001992 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001993 for (i = 3; i < NCH(n); i += 2)
1994 com_addopname(c, IMPORT_FROM, CHILD(n, i));
1995 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001996 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001997 }
1998 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001999 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002000 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002001 REQ(CHILD(n, i), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002002 com_addopname(c, IMPORT_NAME, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002003 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002004 com_addopname(c, STORE_NAME, CHILD(CHILD(n, i), 0));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002005 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002006 }
2007 }
2008}
2009
2010static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00002011com_global_stmt(c, n)
2012 struct compiling *c;
2013 node *n;
2014{
2015 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002016 REQ(n, global_stmt);
2017 /* 'global' NAME (',' NAME)* */
2018 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002019 char *s = STR(CHILD(n, i));
Guido van Rossumfe2236f1996-08-24 07:29:04 +00002020#ifdef PRIVATE_NAME_MANGLING
2021 char buffer[256];
2022 if (s != NULL && s[0] == '_' && s[1] == '_' &&
2023 c->c_private != NULL &&
2024 com_mangle(c, s, buffer, (int)sizeof(buffer)))
2025 s = buffer;
2026#endif
Guido van Rossum681d79a1995-07-18 14:51:37 +00002027 if (dictlookup(c->c_locals, s) != NULL) {
Guido van Rossum452a9831996-09-17 14:32:04 +00002028 com_error(c, SyntaxError, "name is local and global");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002029 }
2030 else if (dictinsert(c->c_globals, s, None) != 0)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002031 c->c_errors++;
2032 }
2033}
2034
Guido van Rossum681d79a1995-07-18 14:51:37 +00002035static int
2036com_newlocal_o(c, nameval)
2037 struct compiling *c;
2038 object *nameval;
2039{
2040 int i;
2041 object *ival;
2042 if (getlistsize(c->c_varnames) != c->c_nlocals) {
2043 /* This is usually caused by an error on a previous call */
2044 if (c->c_errors == 0) {
Guido van Rossum452a9831996-09-17 14:32:04 +00002045 com_error(c, SystemError, "mixed up var name/index");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002046 }
2047 return 0;
2048 }
2049 ival = newintobject(i = c->c_nlocals++);
2050 if (ival == NULL)
2051 c->c_errors++;
2052 else if (mappinginsert(c->c_locals, nameval, ival) != 0)
2053 c->c_errors++;
2054 else if (addlistitem(c->c_varnames, nameval) != 0)
2055 c->c_errors++;
2056 XDECREF(ival);
2057 return i;
2058}
2059
2060static int
2061com_addlocal_o(c, nameval)
2062 struct compiling *c;
2063 object *nameval;
2064{
2065 object *ival = mappinglookup(c->c_locals, nameval);
2066 if (ival != NULL)
2067 return getintvalue(ival);
2068 return com_newlocal_o(c, nameval);
2069}
2070
2071static int
2072com_newlocal(c, name)
2073 struct compiling *c;
2074 char *name;
2075{
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00002076 object *nameval = PyString_InternFromString(name);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002077 int i;
2078 if (nameval == NULL) {
2079 c->c_errors++;
2080 return 0;
2081 }
2082 i = com_newlocal_o(c, nameval);
2083 DECREF(nameval);
2084 return i;
2085}
2086
Guido van Rossum8b993a91997-01-17 21:04:03 +00002087#ifdef SUPPORT_OBSOLETE_ACCESS
2088
Guido van Rossum25831651993-05-19 14:50:45 +00002089#define strequ(a, b) (strcmp((a), (b)) == 0)
2090
2091static void
2092com_access_stmt(c, n)
2093 struct compiling *c;
2094 node *n;
2095{
2096 int i, j, k, mode, imode;
2097 object *vmode;
2098 REQ(n, access_stmt);
2099 /* 'access' NAME (',' NAME)* ':' accesstype (',' accesstype)*
2100 accesstype: NAME+ */
2101
2102 /* Find where the colon is */
2103 i = 1;
2104 while (TYPE(CHILD(n,i-1)) != COLON)
2105 i += 1;
2106
2107 /* Calculate the mode mask */
2108 mode = 0;
2109 for (j = i; j < NCH(n); j += 2) {
Guido van Rossum81daa321993-05-20 14:24:46 +00002110 int r = 0, w = 0, p = 0;
2111 for (k = 0; k < NCH(CHILD(n,j)); k++) {
Guido van Rossum25831651993-05-19 14:50:45 +00002112 if (strequ(STR(CHILD(CHILD(n,j),k)), "public"))
2113 p = 0;
2114 else if (strequ(STR(CHILD(CHILD(n,j),k)), "protected"))
2115 p = 1;
2116 else if (strequ(STR(CHILD(CHILD(n,j),k)), "private"))
2117 p = 2;
2118 else if (strequ(STR(CHILD(CHILD(n,j),k)), "read"))
2119 r = 1;
2120 else if (strequ(STR(CHILD(CHILD(n,j),k)), "write"))
2121 w = 1;
2122 else /* XXX should make this an exception */
2123 fprintf(stderr, "bad access type %s\n",
2124 STR(CHILD(CHILD(n,j),k)));
2125 }
2126 if (r == 0 && w == 0)
Guido van Rossum81daa321993-05-20 14:24:46 +00002127 r = w = 1;
Guido van Rossum25831651993-05-19 14:50:45 +00002128 if (p == 0) {
2129 if (r == 1) mode |= AC_R_PUBLIC;
2130 if (w == 1) mode |= AC_W_PUBLIC;
2131 } else if (p == 1) {
2132 if (r == 1) mode |= AC_R_PROTECTED;
2133 if (w == 1) mode |= AC_W_PROTECTED;
2134 } else {
2135 if (r == 1) mode |= AC_R_PRIVATE;
2136 if (w == 1) mode |= AC_W_PRIVATE;
2137 }
2138 }
2139 vmode = newintobject((long)mode);
2140 imode = com_addconst(c, vmode);
2141 XDECREF(vmode);
2142 for (i = 1; TYPE(CHILD(n,i-1)) != COLON; i+=2) {
2143 com_addoparg(c, LOAD_CONST, imode);
2144 com_addopname(c, ACCESS_MODE, CHILD(n, i));
2145 }
2146}
Guido van Rossum0dfcf751996-08-12 22:00:53 +00002147#endif
Guido van Rossum25831651993-05-19 14:50:45 +00002148
Guido van Rossumc5e96291991-12-10 13:53:51 +00002149static void
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002150com_exec_stmt(c, n)
2151 struct compiling *c;
2152 node *n;
2153{
2154 REQ(n, exec_stmt);
2155 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2156 com_node(c, CHILD(n, 1));
2157 if (NCH(n) >= 4)
2158 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002159 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002160 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002161 com_push(c, 1);
2162 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002163 if (NCH(n) >= 6)
2164 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002165 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002166 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002167 com_push(c, 1);
2168 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002169 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002170 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002171}
2172
2173static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002174com_if_stmt(c, n)
2175 struct compiling *c;
2176 node *n;
2177{
2178 int i;
2179 int anchor = 0;
2180 REQ(n, if_stmt);
2181 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2182 for (i = 0; i+3 < NCH(n); i+=4) {
2183 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002184 node *ch = CHILD(n, i+1);
2185 if (i > 0)
2186 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002187 com_node(c, CHILD(n, i+1));
2188 com_addfwref(c, JUMP_IF_FALSE, &a);
2189 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002190 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002191 com_node(c, CHILD(n, i+3));
2192 com_addfwref(c, JUMP_FORWARD, &anchor);
2193 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002194 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002195 com_addbyte(c, POP_TOP);
2196 }
2197 if (i+2 < NCH(n))
2198 com_node(c, CHILD(n, i+2));
2199 com_backpatch(c, anchor);
2200}
2201
2202static void
2203com_while_stmt(c, n)
2204 struct compiling *c;
2205 node *n;
2206{
2207 int break_anchor = 0;
2208 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002209 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002210 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2211 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002212 block_push(c, SETUP_LOOP);
2213 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002214 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002215 com_node(c, CHILD(n, 1));
2216 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2217 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002218 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002219 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002220 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002221 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002222 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2223 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002224 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002225 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002226 com_addbyte(c, POP_TOP);
2227 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002228 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002229 if (NCH(n) > 4)
2230 com_node(c, CHILD(n, 6));
2231 com_backpatch(c, break_anchor);
2232}
2233
2234static void
2235com_for_stmt(c, n)
2236 struct compiling *c;
2237 node *n;
2238{
2239 object *v;
2240 int break_anchor = 0;
2241 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002242 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002243 REQ(n, for_stmt);
2244 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2245 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002246 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002247 com_node(c, CHILD(n, 3));
2248 v = newintobject(0L);
2249 if (v == NULL)
2250 c->c_errors++;
2251 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002252 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002253 XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002254 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002255 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002256 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002257 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002258 com_assign(c, CHILD(n, 1), OP_ASSIGN);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002259 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002260 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002261 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002262 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2263 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002264 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002265 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002266 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002267 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002268 if (NCH(n) > 8)
2269 com_node(c, CHILD(n, 8));
2270 com_backpatch(c, break_anchor);
2271}
2272
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002273/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002274
2275 SETUP_FINALLY L
2276 <code for S>
2277 POP_BLOCK
2278 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002279 L: <code for Sf>
2280 END_FINALLY
2281
2282 The special instructions use the block stack. Each block
2283 stack entry contains the instruction that created it (here
2284 SETUP_FINALLY), the level of the value stack at the time the
2285 block stack entry was created, and a label (here L).
2286
2287 SETUP_FINALLY:
2288 Pushes the current value stack level and the label
2289 onto the block stack.
2290 POP_BLOCK:
2291 Pops en entry from the block stack, and pops the value
2292 stack until its level is the same as indicated on the
2293 block stack. (The label is ignored.)
2294 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002295 Pops a variable number of entries from the *value* stack
2296 and re-raises the exception they specify. The number of
2297 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002298
2299 The block stack is unwound when an exception is raised:
2300 when a SETUP_FINALLY entry is found, the exception is pushed
2301 onto the value stack (and the exception condition is cleared),
2302 and the interpreter jumps to the label gotten from the block
2303 stack.
2304
2305 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002306 (The contents of the value stack is shown in [], with the top
2307 at the right; 'tb' is trace-back info, 'val' the exception's
2308 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002309
2310 Value stack Label Instruction Argument
2311 [] SETUP_EXCEPT L1
2312 [] <code for S>
2313 [] POP_BLOCK
2314 [] JUMP_FORWARD L0
2315
Guido van Rossum3f5da241990-12-20 15:06:42 +00002316 [tb, val, exc] L1: DUP )
2317 [tb, val, exc, exc] <evaluate E1> )
2318 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2319 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2320 [tb, val, exc, 1] POP )
2321 [tb, val, exc] POP
2322 [tb, val] <assign to V1> (or POP if no V1)
2323 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002324 [] <code for S1>
2325 JUMP_FORWARD L0
2326
Guido van Rossum3f5da241990-12-20 15:06:42 +00002327 [tb, val, exc, 0] L2: POP
2328 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002329 .............................etc.......................
2330
Guido van Rossum3f5da241990-12-20 15:06:42 +00002331 [tb, val, exc, 0] Ln+1: POP
2332 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002333
2334 [] L0: <next statement>
2335
2336 Of course, parts are not generated if Vi or Ei is not present.
2337*/
2338
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002339static void
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002340com_try_except(c, n)
2341 struct compiling *c;
2342 node *n;
2343{
2344 int except_anchor = 0;
2345 int end_anchor = 0;
2346 int else_anchor = 0;
2347 int i;
2348 node *ch;
2349
2350 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2351 block_push(c, SETUP_EXCEPT);
2352 com_node(c, CHILD(n, 2));
2353 com_addbyte(c, POP_BLOCK);
2354 block_pop(c, SETUP_EXCEPT);
2355 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2356 com_backpatch(c, except_anchor);
2357 for (i = 3;
2358 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2359 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002360 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002361 if (except_anchor == 0) {
Guido van Rossum452a9831996-09-17 14:32:04 +00002362 com_error(c, SyntaxError,
2363 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002364 break;
2365 }
2366 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002367 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002368 com_addoparg(c, SET_LINENO, ch->n_lineno);
2369 if (NCH(ch) > 1) {
2370 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002371 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002372 com_node(c, CHILD(ch, 1));
2373 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002374 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002375 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
2376 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002377 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002378 }
2379 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002380 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002381 if (NCH(ch) > 3)
Guido van Rossum8861b741996-07-30 16:49:37 +00002382 com_assign(c, CHILD(ch, 3), OP_ASSIGN);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002383 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002384 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002385 com_pop(c, 1);
2386 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002387 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002388 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002389 com_node(c, CHILD(n, i+2));
2390 com_addfwref(c, JUMP_FORWARD, &end_anchor);
2391 if (except_anchor) {
2392 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002393 /* We come in with [tb, val, exc, 0] on the
2394 stack; one pop and it's the same as
2395 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002396 com_addbyte(c, POP_TOP);
2397 }
2398 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002399 /* We actually come in here with [tb, val, exc] but the
2400 END_FINALLY will zap those and jump around.
2401 The c_stacklevel does not reflect them so we need not pop
2402 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002403 com_addbyte(c, END_FINALLY);
2404 com_backpatch(c, else_anchor);
2405 if (i < NCH(n))
2406 com_node(c, CHILD(n, i+2));
2407 com_backpatch(c, end_anchor);
2408}
2409
2410static void
2411com_try_finally(c, n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002412 struct compiling *c;
2413 node *n;
2414{
2415 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002416 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002417
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002418 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
2419 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002420 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002421 com_addbyte(c, POP_BLOCK);
2422 block_pop(c, SETUP_FINALLY);
2423 block_push(c, END_FINALLY);
2424 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002425 /* While the generated code pushes only one item,
2426 the try-finally handling can enter here with
2427 up to three items. OK, here are the details:
2428 3 for an exception, 2 for RETURN, 1 for BREAK. */
2429 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002430 com_backpatch(c, finally_anchor);
2431 ch = CHILD(n, NCH(n)-1);
2432 com_addoparg(c, SET_LINENO, ch->n_lineno);
2433 com_node(c, ch);
2434 com_addbyte(c, END_FINALLY);
2435 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002436 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002437}
2438
2439static void
2440com_try_stmt(c, n)
2441 struct compiling *c;
2442 node *n;
2443{
2444 REQ(n, try_stmt);
2445 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
2446 | 'try' ':' suite 'finally' ':' suite */
2447 if (TYPE(CHILD(n, 3)) != except_clause)
2448 com_try_finally(c, n);
2449 else
2450 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002451}
2452
Guido van Rossum8b993a91997-01-17 21:04:03 +00002453static node *
2454get_rawdocstring(n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002455 node *n;
2456{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002457 int i;
2458
Guido van Rossum8b993a91997-01-17 21:04:03 +00002459 /* Label to avoid tail recursion */
2460 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002461 switch (TYPE(n)) {
2462
2463 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002464 if (NCH(n) == 1) {
2465 n = CHILD(n, 0);
2466 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002467 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002468 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002469 case file_input:
2470 for (i = 0; i < NCH(n); i++) {
2471 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002472 if (TYPE(ch) == stmt) {
2473 n = ch;
2474 goto next;
2475 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002476 }
2477 break;
2478
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002479 case stmt:
2480 case simple_stmt:
2481 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002482 n = CHILD(n, 0);
2483 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002484
2485 case expr_stmt:
2486 case testlist:
2487 case test:
2488 case and_test:
2489 case not_test:
2490 case comparison:
2491 case expr:
2492 case xor_expr:
2493 case and_expr:
2494 case shift_expr:
2495 case arith_expr:
2496 case term:
2497 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00002498 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002499 if (NCH(n) == 1) {
2500 n = CHILD(n, 0);
2501 goto next;
2502 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002503 break;
2504
2505 case atom:
2506 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002507 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002508 break;
2509
2510 }
2511 return NULL;
2512}
2513
Guido van Rossum8b993a91997-01-17 21:04:03 +00002514static object *
2515get_docstring(n)
2516 node *n;
2517{
2518 n = get_rawdocstring(n);
2519 if (n == NULL)
2520 return NULL;
2521 return parsestrplus(n);
2522}
2523
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002524static void
2525com_suite(c, n)
2526 struct compiling *c;
2527 node *n;
2528{
2529 REQ(n, suite);
2530 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
2531 if (NCH(n) == 1) {
2532 com_node(c, CHILD(n, 0));
2533 }
2534 else {
2535 int i;
2536 for (i = 0; i < NCH(n); i++) {
2537 node *ch = CHILD(n, i);
2538 if (TYPE(ch) == stmt)
2539 com_node(c, ch);
2540 }
2541 }
2542}
2543
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002544/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002545static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002546com_continue_stmt(c, n)
2547 struct compiling *c;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002548 node *n; /* Not used, but passed for consistency */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002549{
2550 int i = c->c_nblocks;
2551 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
2552 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2553 }
2554 else {
Guido van Rossum452a9831996-09-17 14:32:04 +00002555 com_error(c, SyntaxError, "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002556 }
2557 /* XXX Could allow it inside a 'finally' clause
2558 XXX if we could pop the exception still on the stack */
2559}
2560
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002561static int
Guido van Rossum681d79a1995-07-18 14:51:37 +00002562com_argdefs(c, n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002563 struct compiling *c;
2564 node *n;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002565{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002566 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002567 if (TYPE(n) == lambdef) {
2568 /* lambdef: 'lambda' [varargslist] ':' test */
2569 n = CHILD(n, 1);
2570 }
2571 else {
2572 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
2573 n = CHILD(n, 2);
2574 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
2575 n = CHILD(n, 1);
2576 }
2577 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002578 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002579 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002580 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002581 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
2582 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002583 nargs = 0;
2584 ndefs = 0;
2585 for (i = 0; i < nch; i++) {
2586 int t;
Guido van Rossum50564e81996-01-12 01:13:16 +00002587 if (TYPE(CHILD(n, i)) == STAR || TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002588 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002589 nargs++;
2590 i++;
2591 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00002592 t = RPAR; /* Anything except EQUAL or COMMA */
2593 else
2594 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002595 if (t == EQUAL) {
2596 i++;
2597 ndefs++;
2598 com_node(c, CHILD(n, i));
2599 i++;
2600 if (i >= nch)
2601 break;
2602 t = TYPE(CHILD(n, i));
2603 }
2604 else {
2605 /* Treat "(a=1, b)" as "(a=1, b=None)" */
2606 if (ndefs) {
2607 com_addoparg(c, LOAD_CONST,
2608 com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002609 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002610 ndefs++;
2611 }
2612 }
2613 if (t != COMMA)
2614 break;
2615 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002616 return ndefs;
2617}
2618
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002619static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002620com_funcdef(c, n)
2621 struct compiling *c;
2622 node *n;
2623{
2624 object *v;
2625 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00002626 v = (object *)icompile(n, c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002627 if (v == NULL)
2628 c->c_errors++;
2629 else {
2630 int i = com_addconst(c, v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002631 int ndefs = com_argdefs(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002632 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002633 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002634 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002635 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002636 com_addopname(c, STORE_NAME, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002637 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002638 DECREF(v);
2639 }
2640}
2641
2642static void
Guido van Rossum25831651993-05-19 14:50:45 +00002643com_bases(c, n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002644 struct compiling *c;
2645 node *n;
2646{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002647 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002648 REQ(n, testlist);
2649 /* testlist: test (',' test)* [','] */
2650 for (i = 0; i < NCH(n); i += 2)
2651 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002652 i = (NCH(n)+1) / 2;
2653 com_addoparg(c, BUILD_TUPLE, i);
2654 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00002655}
2656
2657static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002658com_classdef(c, n)
2659 struct compiling *c;
2660 node *n;
2661{
Guido van Rossum25831651993-05-19 14:50:45 +00002662 int i;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002663 object *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002664 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00002665 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00002666 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00002667 c->c_errors++;
2668 return;
2669 }
2670 /* Push the class name on the stack */
2671 i = com_addconst(c, v);
2672 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002673 com_push(c, 1);
Guido van Rossum25831651993-05-19 14:50:45 +00002674 DECREF(v);
2675 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002676 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00002677 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002678 com_push(c, 1);
2679 }
Guido van Rossum25831651993-05-19 14:50:45 +00002680 else
2681 com_bases(c, CHILD(n, 3));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00002682 v = (object *)icompile(n, c);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002683 if (v == NULL)
2684 c->c_errors++;
2685 else {
Guido van Rossum25831651993-05-19 14:50:45 +00002686 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002687 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002688 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002689 com_addoparg(c, MAKE_FUNCTION, 0);
2690 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002691 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002692 com_pop(c, 2);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002693 com_addopname(c, STORE_NAME, CHILD(n, 1));
2694 DECREF(v);
2695 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002696}
2697
2698static void
2699com_node(c, n)
2700 struct compiling *c;
2701 node *n;
2702{
2703 switch (TYPE(n)) {
2704
2705 /* Definition nodes */
2706
2707 case funcdef:
2708 com_funcdef(c, n);
2709 break;
2710 case classdef:
2711 com_classdef(c, n);
2712 break;
2713
2714 /* Trivial parse tree nodes */
2715
2716 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002717 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002718 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002719 com_node(c, CHILD(n, 0));
2720 break;
2721
2722 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002723 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
2724 com_addoparg(c, SET_LINENO, n->n_lineno);
2725 {
2726 int i;
2727 for (i = 0; i < NCH(n)-1; i += 2)
2728 com_node(c, CHILD(n, i));
2729 }
2730 break;
2731
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002732 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002733 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002734 com_node(c, CHILD(n, 0));
2735 break;
2736
2737 /* Statement nodes */
2738
2739 case expr_stmt:
2740 com_expr_stmt(c, n);
2741 break;
2742 case print_stmt:
2743 com_print_stmt(c, n);
2744 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002745 case del_stmt: /* 'del' exprlist */
Guido van Rossum8861b741996-07-30 16:49:37 +00002746 com_assign(c, CHILD(n, 1), OP_DELETE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002747 break;
2748 case pass_stmt:
2749 break;
2750 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002751 if (c->c_loops == 0) {
Guido van Rossum452a9831996-09-17 14:32:04 +00002752 com_error(c, SyntaxError, "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002753 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002754 com_addbyte(c, BREAK_LOOP);
2755 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002756 case continue_stmt:
2757 com_continue_stmt(c, n);
2758 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002759 case return_stmt:
2760 com_return_stmt(c, n);
2761 break;
2762 case raise_stmt:
2763 com_raise_stmt(c, n);
2764 break;
2765 case import_stmt:
2766 com_import_stmt(c, n);
2767 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002768 case global_stmt:
2769 com_global_stmt(c, n);
2770 break;
Guido van Rossum0dfcf751996-08-12 22:00:53 +00002771#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum25831651993-05-19 14:50:45 +00002772 case access_stmt:
2773 com_access_stmt(c, n);
2774 break;
Guido van Rossum0dfcf751996-08-12 22:00:53 +00002775#endif
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002776 case exec_stmt:
2777 com_exec_stmt(c, n);
2778 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002779 case if_stmt:
2780 com_if_stmt(c, n);
2781 break;
2782 case while_stmt:
2783 com_while_stmt(c, n);
2784 break;
2785 case for_stmt:
2786 com_for_stmt(c, n);
2787 break;
2788 case try_stmt:
2789 com_try_stmt(c, n);
2790 break;
2791 case suite:
2792 com_suite(c, n);
2793 break;
2794
2795 /* Expression nodes */
2796
2797 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002798 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002799 break;
2800 case test:
2801 com_test(c, n);
2802 break;
2803 case and_test:
2804 com_and_test(c, n);
2805 break;
2806 case not_test:
2807 com_not_test(c, n);
2808 break;
2809 case comparison:
2810 com_comparison(c, n);
2811 break;
2812 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002813 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002814 break;
2815 case expr:
2816 com_expr(c, n);
2817 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002818 case xor_expr:
2819 com_xor_expr(c, n);
2820 break;
2821 case and_expr:
2822 com_and_expr(c, n);
2823 break;
2824 case shift_expr:
2825 com_shift_expr(c, n);
2826 break;
2827 case arith_expr:
2828 com_arith_expr(c, n);
2829 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002830 case term:
2831 com_term(c, n);
2832 break;
2833 case factor:
2834 com_factor(c, n);
2835 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00002836 case power:
2837 com_power(c, n);
2838 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002839 case atom:
2840 com_atom(c, n);
2841 break;
2842
2843 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002844 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum452a9831996-09-17 14:32:04 +00002845 com_error(c, SystemError, "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002846 }
2847}
2848
2849static void com_fplist PROTO((struct compiling *, node *));
2850
2851static void
2852com_fpdef(c, n)
2853 struct compiling *c;
2854 node *n;
2855{
2856 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
2857 if (TYPE(CHILD(n, 0)) == LPAR)
2858 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002859 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002860 com_addoparg(c, STORE_FAST, com_newlocal(c, STR(CHILD(n, 0))));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002861 com_pop(c, 1);
2862 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002863}
2864
2865static void
2866com_fplist(c, n)
2867 struct compiling *c;
2868 node *n;
2869{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00002870 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002871 if (NCH(n) == 1) {
2872 com_fpdef(c, CHILD(n, 0));
2873 }
2874 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002875 int i = (NCH(n)+1)/2;
2876 com_addoparg(c, UNPACK_TUPLE, i);
2877 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002878 for (i = 0; i < NCH(n); i += 2)
2879 com_fpdef(c, CHILD(n, i));
2880 }
2881}
2882
2883static void
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002884com_arglist(c, n)
2885 struct compiling *c;
2886 node *n;
2887{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002888 int nch, i;
2889 int complex = 0;
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002890 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00002891 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002892 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002893 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002894 /* Enter all arguments in table of locals */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002895 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002896 node *ch = CHILD(n, i);
2897 node *fp;
2898 char *name;
Guido van Rossum50564e81996-01-12 01:13:16 +00002899 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002900 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002901 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
2902 fp = CHILD(ch, 0);
2903 if (TYPE(fp) == NAME)
2904 name = STR(fp);
2905 else {
2906 name = "";
Guido van Rossum530956d1996-07-21 02:27:43 +00002907 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002908 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002909 com_newlocal(c, name);
2910 c->c_argcount++;
2911 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002912 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002913 ch = CHILD(n, i);
2914 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002915 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002916 else
2917 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002918 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002919 /* Handle *arguments */
2920 if (i < nch) {
2921 node *ch;
2922 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00002923 if (TYPE(ch) != DOUBLESTAR) {
2924 REQ(ch, STAR);
2925 ch = CHILD(n, i+1);
2926 if (TYPE(ch) == NAME) {
2927 c->c_flags |= CO_VARARGS;
2928 i += 3;
2929 com_newlocal(c, STR(ch));
2930 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002931 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002932 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002933 /* Handle **keywords */
2934 if (i < nch) {
2935 node *ch;
2936 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00002937 if (TYPE(ch) != DOUBLESTAR) {
2938 REQ(ch, STAR);
2939 ch = CHILD(n, i+1);
2940 REQ(ch, STAR);
2941 ch = CHILD(n, i+2);
2942 }
2943 else
2944 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002945 REQ(ch, NAME);
2946 c->c_flags |= CO_VARKEYWORDS;
2947 com_newlocal(c, STR(ch));
2948 }
2949 if (complex) {
2950 /* Generate code for complex arguments only after
2951 having counted the simple arguments */
2952 int ilocal = 0;
2953 for (i = 0; i < nch; i++) {
2954 node *ch = CHILD(n, i);
2955 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00002956 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002957 break;
2958 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
2959 fp = CHILD(ch, 0);
2960 if (TYPE(fp) != NAME) {
2961 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002962 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002963 com_fpdef(c, ch);
2964 }
2965 ilocal++;
2966 if (++i >= nch)
2967 break;
2968 ch = CHILD(n, i);
2969 if (TYPE(ch) == EQUAL)
2970 i += 2;
2971 else
2972 REQ(ch, COMMA);
2973 }
2974 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002975}
2976
2977static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002978com_file_input(c, n)
2979 struct compiling *c;
2980 node *n;
2981{
2982 int i;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002983 object *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002984 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002985 doc = get_docstring(n);
2986 if (doc != NULL) {
2987 int i = com_addconst(c, doc);
2988 DECREF(doc);
2989 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002990 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002991 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00002992 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002993 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002994 for (i = 0; i < NCH(n); i++) {
2995 node *ch = CHILD(n, i);
2996 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
2997 com_node(c, ch);
2998 }
2999}
3000
3001/* Top-level compile-node interface */
3002
3003static void
3004compile_funcdef(c, n)
3005 struct compiling *c;
3006 node *n;
3007{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003008 object *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003009 node *ch;
3010 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003011 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003012 doc = get_docstring(CHILD(n, 4));
3013 if (doc != NULL) {
3014 (void) com_addconst(c, doc);
3015 DECREF(doc);
3016 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003017 else
3018 (void) com_addconst(c, None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003019 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3020 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003021 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003022 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003023 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003024 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003025 c->c_infunction = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003026 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003027 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003028 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003029 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003030}
3031
3032static void
Guido van Rossum590baa41993-11-30 13:40:46 +00003033compile_lambdef(c, n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003034 struct compiling *c;
3035 node *n;
3036{
Guido van Rossum590baa41993-11-30 13:40:46 +00003037 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003038 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003039 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003040
3041 ch = CHILD(n, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003042 (void) com_addconst(c, None); /* No docstring */
3043 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003044 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003045 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003046 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003047 else
3048 ch = CHILD(n, 2);
3049 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003050 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003051 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003052}
3053
3054static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003055compile_classdef(c, n)
3056 struct compiling *c;
3057 node *n;
3058{
3059 node *ch;
3060 object *doc;
3061 REQ(n, classdef);
3062 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3063 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003064#ifdef PRIVATE_NAME_MANGLING
3065 c->c_private = c->c_name;
3066#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003067 ch = CHILD(n, NCH(n)-1); /* The suite */
3068 doc = get_docstring(ch);
3069 if (doc != NULL) {
3070 int i = com_addconst(c, doc);
3071 DECREF(doc);
3072 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003073 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003074 com_addopnamestr(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003075 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003076 }
3077 else
3078 (void) com_addconst(c, None);
3079 com_node(c, ch);
3080 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003081 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003082 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003083 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003084}
3085
3086static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003087compile_node(c, n)
3088 struct compiling *c;
3089 node *n;
3090{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003091 com_addoparg(c, SET_LINENO, n->n_lineno);
3092
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003093 switch (TYPE(n)) {
3094
Guido van Rossum4c417781991-01-21 16:09:22 +00003095 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003096 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003097 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003098 n = CHILD(n, 0);
3099 if (TYPE(n) != NEWLINE)
3100 com_node(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003101 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003102 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003103 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003104 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003105 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003106 break;
3107
Guido van Rossum4c417781991-01-21 16:09:22 +00003108 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003109 com_file_input(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003110 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003111 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003112 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003113 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003114 break;
3115
Guido van Rossum590baa41993-11-30 13:40:46 +00003116 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003117 com_node(c, CHILD(n, 0));
3118 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003119 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003120 break;
3121
Guido van Rossum590baa41993-11-30 13:40:46 +00003122 case lambdef: /* anonymous function definition */
3123 compile_lambdef(c, n);
3124 break;
3125
Guido van Rossum4c417781991-01-21 16:09:22 +00003126 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003127 compile_funcdef(c, n);
3128 break;
3129
Guido van Rossum4c417781991-01-21 16:09:22 +00003130 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003131 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003132 break;
3133
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003134 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003135 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum452a9831996-09-17 14:32:04 +00003136 com_error(c, SystemError,
3137 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003138 }
3139}
3140
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003141/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00003142
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003143 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
3144 instructions that refer to local variables with LOAD_FAST etc.
3145 The latter instructions are much faster because they don't need to
3146 look up the variable name in a dictionary.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003147
Guido van Rossum681d79a1995-07-18 14:51:37 +00003148 To find all local variables, we check all STORE_NAME, IMPORT_FROM
3149 and DELETE_NAME instructions. This yields all local variables,
3150 function definitions, class definitions and import statements.
3151 Argument names have already been entered into the list by the
3152 special processing for the argument list.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003153
3154 All remaining LOAD_NAME instructions must refer to non-local (global
3155 or builtin) variables, so are replaced by LOAD_GLOBAL.
3156
3157 There are two problems: 'from foo import *' and 'exec' may introduce
3158 local variables that we can't know while compiling. If this is the
Guido van Rossum681d79a1995-07-18 14:51:37 +00003159 case, we can still optimize bona fide locals (since those
3160 statements will be surrounded by fast_2_locals() and
3161 locals_2_fast()), but we can't change LOAD_NAME to LOAD_GLOBAL.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003162
Guido van Rossum681d79a1995-07-18 14:51:37 +00003163 NB: this modifies the string object c->c_code! */
Guido van Rossum282914b1991-04-04 10:42:56 +00003164
3165static void
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003166optimize(c)
3167 struct compiling *c;
Guido van Rossum282914b1991-04-04 10:42:56 +00003168{
Guido van Rossum0a697f61991-04-16 08:39:12 +00003169 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00003170 int opcode;
Guido van Rossum80bb9651996-12-05 23:27:02 +00003171 int oparg = 0;
Guido van Rossum282914b1991-04-04 10:42:56 +00003172 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003173 object *error_type, *error_value, *error_traceback;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003174
Guido van Rossum282914b1991-04-04 10:42:56 +00003175#define NEXTOP() (*next_instr++)
3176#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
3177#define GETITEM(v, i) (getlistitem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003178#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
3179
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003180 err_fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003181
3182 c->c_flags |= CO_OPTIMIZED;
Guido van Rossum282914b1991-04-04 10:42:56 +00003183
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003184 next_instr = (unsigned char *) getstringvalue(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003185 for (;;) {
3186 opcode = NEXTOP();
3187 if (opcode == STOP_CODE)
3188 break;
3189 if (HAS_ARG(opcode))
3190 oparg = NEXTARG();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003191 switch (opcode) {
3192 case STORE_NAME:
3193 case DELETE_NAME:
3194 case IMPORT_FROM:
3195 com_addlocal_o(c, GETNAMEOBJ(oparg));
3196 break;
3197 case EXEC_STMT:
3198 c->c_flags &= ~CO_OPTIMIZED;
3199 break;
Guido van Rossum282914b1991-04-04 10:42:56 +00003200 }
3201 }
3202
Guido van Rossum681d79a1995-07-18 14:51:37 +00003203 if (dictlookup(c->c_locals, "*") != NULL)
3204 c->c_flags &= ~CO_OPTIMIZED;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003205
3206 next_instr = (unsigned char *) getstringvalue(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00003207 for (;;) {
3208 cur_instr = next_instr;
3209 opcode = NEXTOP();
3210 if (opcode == STOP_CODE)
3211 break;
3212 if (HAS_ARG(opcode))
3213 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003214 if (opcode == LOAD_NAME ||
3215 opcode == STORE_NAME ||
3216 opcode == DELETE_NAME) {
3217 object *v;
3218 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00003219 name = GETNAMEOBJ(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003220 v = dict2lookup(c->c_locals, name);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003221 if (v == NULL) {
Guido van Rossum83163251991-08-16 08:58:43 +00003222 err_clear();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003223 if (opcode == LOAD_NAME &&
3224 (c->c_flags&CO_OPTIMIZED))
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003225 cur_instr[0] = LOAD_GLOBAL;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003226 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00003227 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003228 i = getintvalue(v);
3229 switch (opcode) {
3230 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
3231 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
3232 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
3233 }
3234 cur_instr[1] = i & 0xff;
3235 cur_instr[2] = (i>>8) & 0xff;
Guido van Rossum282914b1991-04-04 10:42:56 +00003236 }
3237 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003238
Guido van Rossum681d79a1995-07-18 14:51:37 +00003239 if (c->c_errors == 0)
3240 err_restore(error_type, error_value, error_traceback);
Guido van Rossum282914b1991-04-04 10:42:56 +00003241}
3242
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003243codeobject *
Guido van Rossum590baa41993-11-30 13:40:46 +00003244compile(n, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003245 node *n;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003246 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003247{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003248 return jcompile(n, filename, NULL);
3249}
3250
3251static codeobject *
3252icompile(n, base)
3253 node *n;
3254 struct compiling *base;
3255{
3256 return jcompile(n, base->c_filename, base);
3257}
3258
3259static codeobject *
3260jcompile(n, filename, base)
3261 node *n;
3262 char *filename;
3263 struct compiling *base;
3264{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003265 struct compiling sc;
3266 codeobject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003267 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003268 return NULL;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003269#ifdef PRIVATE_NAME_MANGLING
3270 if (base)
3271 sc.c_private = base->c_private;
3272 else
3273 sc.c_private = NULL;
3274#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003275 compile_node(&sc, n);
3276 com_done(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003277 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00003278 optimize(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003279 sc.c_flags |= CO_NEWLOCALS;
3280 }
3281 else if (TYPE(n) == classdef)
3282 sc.c_flags |= CO_NEWLOCALS;
Guido van Rossum9bfef441993-03-29 10:43:31 +00003283 co = NULL;
3284 if (sc.c_errors == 0) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003285 object *consts, *names, *varnames, *filename, *name;
3286 consts = listtuple(sc.c_consts);
3287 names = listtuple(sc.c_names);
3288 varnames = listtuple(sc.c_varnames);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003289 filename = PyString_InternFromString(sc.c_filename);
3290 name = PyString_InternFromString(sc.c_name);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003291 if (!err_occurred())
3292 co = newcodeobject(sc.c_argcount,
3293 sc.c_nlocals,
Guido van Rossum8b993a91997-01-17 21:04:03 +00003294 sc.c_maxstacklevel,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003295 sc.c_flags,
3296 sc.c_code,
3297 consts,
3298 names,
3299 varnames,
3300 filename,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003301 name,
3302 sc.c_firstlineno,
3303 sc.c_lnotab);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003304 XDECREF(consts);
3305 XDECREF(names);
3306 XDECREF(varnames);
3307 XDECREF(filename);
3308 XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003309 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003310 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003311 return co;
3312}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003313
3314int
3315PyCode_Addr2Line(co, addrq)
3316 PyCodeObject *co;
3317 int addrq;
3318{
3319 int size = PyString_Size(co->co_lnotab) / 2;
3320 char *p = PyString_AsString(co->co_lnotab);
3321 int line = co->co_firstlineno;
3322 int addr = 0;
3323 while (--size >= 0) {
3324 addr += *p++;
3325 if (addr > addrq)
3326 break;
3327 line += *p++;
3328 }
3329 return line;
3330}