blob: f20036b811bf1fef3701bb302223b71dc88fd0e9 [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
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
Guido van Rossum10dc2e81990-11-18 17:27:39 +000025/* Compile an expression node to intermediate code */
26
Guido van Rossum3f5da241990-12-20 15:06:42 +000027/* XXX TO DO:
Guido van Rossum681d79a1995-07-18 14:51:37 +000028 XXX Compute maximum needed stack sizes while compiling;
29 XXX then frame object can be one malloc and no stack checks are needed
30 XXX add __doc__ attribute == co_doc to code object attributes
31 XXX don't execute doc string
Guido van Rossum3f5da241990-12-20 15:06:42 +000032 XXX Generate simple jump for break/return outside 'try...finally'
Guido van Rossum681d79a1995-07-18 14:51:37 +000033 XXX get rid of SET_LINENO instructions, use JAR's table trick
34 XXX (need an option to put them back in, for debugger!)
35 XXX other JAR tricks?
Guido van Rossum3f5da241990-12-20 15:06:42 +000036*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +000037
Guido van Rossum3f5da241990-12-20 15:06:42 +000038#include "allobjects.h"
39
Guido van Rossum10dc2e81990-11-18 17:27:39 +000040#include "node.h"
41#include "token.h"
42#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000043#include "compile.h"
44#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000045#include "structmember.h"
46
47#include <ctype.h>
Guido van Rossumf1dc5661993-07-05 10:31:29 +000048#include <errno.h>
Guido van Rossum282914b1991-04-04 10:42:56 +000049
Guido van Rossum8861b741996-07-30 16:49:37 +000050#define OP_DELETE 0
51#define OP_ASSIGN 1
52#define OP_APPLY 2
53
Guido van Rossum3f5da241990-12-20 15:06:42 +000054#define OFF(x) offsetof(codeobject, x)
55
56static struct memberlist code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000057 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
58 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
59 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000060 {"co_code", T_OBJECT, OFF(co_code), READONLY},
61 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
62 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000063 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000064 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000065 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000066 {NULL} /* Sentinel */
67};
68
69static object *
70code_getattr(co, name)
71 codeobject *co;
72 char *name;
73{
74 return getmember((char *)co, code_memberlist, name);
75}
Guido van Rossum10dc2e81990-11-18 17:27:39 +000076
77static void
Guido van Rossum3f5da241990-12-20 15:06:42 +000078code_dealloc(co)
79 codeobject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +000080{
Guido van Rossum3f5da241990-12-20 15:06:42 +000081 XDECREF(co->co_code);
82 XDECREF(co->co_consts);
83 XDECREF(co->co_names);
84 XDECREF(co->co_filename);
Guido van Rossum9bfef441993-03-29 10:43:31 +000085 XDECREF(co->co_name);
Guido van Rossum681d79a1995-07-18 14:51:37 +000086 XDECREF(co->co_varnames);
Guido van Rossum3f5da241990-12-20 15:06:42 +000087 DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +000088}
89
Guido van Rossum2dff9911992-09-03 20:50:59 +000090static object *
91code_repr(co)
92 codeobject *co;
93{
94 char buf[500];
95 int lineno = -1;
96 char *p = GETSTRINGVALUE(co->co_code);
97 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +000098 char *name = "???";
Guido van Rossum2dff9911992-09-03 20:50:59 +000099 if (*p == SET_LINENO)
100 lineno = (p[1] & 0xff) | ((p[2] & 0xff) << 8);
101 if (co->co_filename && is_stringobject(co->co_filename))
102 filename = getstringvalue(co->co_filename);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000103 if (co->co_name && is_stringobject(co->co_name))
104 name = getstringvalue(co->co_name);
105 sprintf(buf, "<code object %.100s at %lx, file \"%.300s\", line %d>",
106 name, (long)co, filename, lineno);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000107 return newstringobject(buf);
108}
109
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000110static int
111code_compare(co, cp)
112 codeobject *co, *cp;
113{
114 int cmp;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000115 cmp = cp->co_argcount - cp->co_argcount;
116 if (cmp) return cmp;
117 cmp = cp->co_nlocals - cp->co_nlocals;
118 if (cmp) return cmp;
119 cmp = cp->co_flags - cp->co_flags;
120 if (cmp) return cmp;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000121 cmp = cmpobject((object *)co->co_code, (object *)cp->co_code);
122 if (cmp) return cmp;
123 cmp = cmpobject(co->co_consts, cp->co_consts);
124 if (cmp) return cmp;
125 cmp = cmpobject(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000126 if (cmp) return cmp;
127 cmp = cmpobject(co->co_varnames, cp->co_varnames);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000128 return cmp;
129}
130
131static long
132code_hash(co)
133 codeobject *co;
134{
Guido van Rossum681d79a1995-07-18 14:51:37 +0000135 long h, h1, h2, h3, h4;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000136 h1 = hashobject((object *)co->co_code);
137 if (h1 == -1) return -1;
138 h2 = hashobject(co->co_consts);
139 if (h2 == -1) return -1;
140 h3 = hashobject(co->co_names);
141 if (h3 == -1) return -1;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000142 h4 = hashobject(co->co_varnames);
143 if (h4 == -1) return -1;
144 h = h1 ^ h2 ^ h3 ^ h4 ^
145 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000146 if (h == -1) h = -2;
147 return h;
148}
149
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000150typeobject Codetype = {
151 OB_HEAD_INIT(&Typetype)
152 0,
153 "code",
154 sizeof(codeobject),
155 0,
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000156 (destructor)code_dealloc, /*tp_dealloc*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000157 0, /*tp_print*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000158 (getattrfunc)code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000159 0, /*tp_setattr*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000160 (cmpfunc)code_compare, /*tp_compare*/
161 (reprfunc)code_repr, /*tp_repr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000162 0, /*tp_as_number*/
163 0, /*tp_as_sequence*/
164 0, /*tp_as_mapping*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000165 (hashfunc)code_hash, /*tp_hash*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000166};
167
Guido van Rossuma082ce41991-06-04 19:41:56 +0000168codeobject *
Guido van Rossum681d79a1995-07-18 14:51:37 +0000169newcodeobject(argcount, nlocals, flags,
170 code, consts, names, varnames, filename, name)
171 int argcount;
172 int nlocals;
173 int flags;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000174 object *code;
175 object *consts;
176 object *names;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000177 object *varnames;
Guido van Rossuma082ce41991-06-04 19:41:56 +0000178 object *filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000179 object *name;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000180{
181 codeobject *co;
182 int i;
183 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000184 if (argcount < 0 || nlocals < 0 ||
185 code == NULL || !is_stringobject(code) ||
186 consts == NULL || !is_tupleobject(consts) ||
187 names == NULL || !is_tupleobject(names) ||
188 varnames == NULL || !is_tupleobject(varnames) ||
189 name == NULL || !is_stringobject(name) ||
190 filename == NULL || !is_stringobject(filename)) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000191 err_badcall();
192 return NULL;
193 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000194 /* Make sure names and varnames are all strings */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000195 for (i = gettuplesize(names); --i >= 0; ) {
196 object *v = gettupleitem(names, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000197 if (v == NULL || !is_stringobject(v)) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000198 err_badcall();
199 return NULL;
200 }
201 }
202 for (i = gettuplesize(varnames); --i >= 0; ) {
203 object *v = gettupleitem(varnames, i);
204 if (v == NULL || !is_stringobject(v)) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000205 err_badcall();
206 return NULL;
207 }
208 }
209 co = NEWOBJ(codeobject, &Codetype);
210 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000211 co->co_argcount = argcount;
212 co->co_nlocals = nlocals;
213 co->co_flags = flags;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000214 INCREF(code);
215 co->co_code = (stringobject *)code;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000216 INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000217 co->co_consts = consts;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000218 INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000219 co->co_names = names;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000220 INCREF(varnames);
221 co->co_varnames = varnames;
Guido van Rossuma082ce41991-06-04 19:41:56 +0000222 INCREF(filename);
223 co->co_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000224 INCREF(name);
225 co->co_name = name;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000226 }
227 return co;
228}
229
230
231/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000232
233#define MAXBLOCKS 20 /* Max static block nesting within a function */
234
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000235struct compiling {
236 object *c_code; /* string */
237 object *c_consts; /* list of objects */
238 object *c_names; /* list of strings (names) */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000239 object *c_globals; /* dictionary (value=None) */
240 object *c_locals; /* dictionary (value=localID) */
241 object *c_varnames; /* list (inverse of c_locals) */
242 int c_nlocals; /* index of next local */
243 int c_argcount; /* number of top-level arguments */
244 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000245 int c_nexti; /* index into c_code */
246 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000247 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000248 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000249 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000250 int c_begin; /* begin of current loop, for 'continue' */
251 int c_block[MAXBLOCKS]; /* stack of block types */
252 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000253 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000254 char *c_name; /* name of object (e.g. function) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000255};
256
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000257
258/* Interface to the block stack */
259
260static void
261block_push(c, type)
262 struct compiling *c;
263 int type;
264{
265 if (c->c_nblocks >= MAXBLOCKS) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +0000266 err_setstr(SystemError, "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000267 c->c_errors++;
268 }
269 else {
270 c->c_block[c->c_nblocks++] = type;
271 }
272}
273
274static void
275block_pop(c, type)
276 struct compiling *c;
277 int type;
278{
279 if (c->c_nblocks > 0)
280 c->c_nblocks--;
281 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
282 err_setstr(SystemError, "bad block pop");
283 c->c_errors++;
284 }
285}
286
287
Guido van Rossum681d79a1995-07-18 14:51:37 +0000288/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000289
Guido van Rossum590baa41993-11-30 13:40:46 +0000290static int com_init PROTO((struct compiling *, char *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000291static void com_free PROTO((struct compiling *));
292static void com_done PROTO((struct compiling *));
293static void com_node PROTO((struct compiling *, struct _node *));
Guido van Rossum50564e81996-01-12 01:13:16 +0000294static void com_factor PROTO((struct compiling *, struct _node *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000295static void com_addbyte PROTO((struct compiling *, int));
296static void com_addint PROTO((struct compiling *, int));
297static void com_addoparg PROTO((struct compiling *, int, int));
298static void com_addfwref PROTO((struct compiling *, int, int *));
299static void com_backpatch PROTO((struct compiling *, int));
300static int com_add PROTO((struct compiling *, object *, object *));
301static int com_addconst PROTO((struct compiling *, object *));
302static int com_addname PROTO((struct compiling *, object *));
303static void com_addopname PROTO((struct compiling *, int, node *));
Guido van Rossum288a60f1991-12-16 13:05:10 +0000304static void com_list PROTO((struct compiling *, node *, int));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000305static int com_argdefs PROTO((struct compiling *, node *));
306static int com_newlocal PROTO((struct compiling *, char *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000307
308static int
Guido van Rossum590baa41993-11-30 13:40:46 +0000309com_init(c, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000310 struct compiling *c;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000311 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000312{
Guido van Rossum62d46241991-04-03 19:00:23 +0000313 if ((c->c_code = newsizedstringobject((char *)NULL, 1000)) == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000314 goto fail_3;
315 if ((c->c_consts = newlistobject(0)) == NULL)
316 goto fail_2;
317 if ((c->c_names = newlistobject(0)) == NULL)
318 goto fail_1;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000319 if ((c->c_globals = newdictobject()) == NULL)
320 goto fail_0;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000321 if ((c->c_locals = newdictobject()) == NULL)
322 goto fail_00;
323 if ((c->c_varnames = newlistobject(0)) == NULL)
324 goto fail_000;
325 c->c_nlocals = 0;
326 c->c_argcount = 0;
327 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000328 c->c_nexti = 0;
329 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000330 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000331 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000332 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000333 c->c_begin = 0;
334 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000335 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000336 c->c_name = "?";
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000337 return 1;
338
Guido van Rossum681d79a1995-07-18 14:51:37 +0000339 fail_000:
340 DECREF(c->c_locals);
341 fail_00:
342 DECREF(c->c_globals);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000343 fail_0:
344 DECREF(c->c_names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000345 fail_1:
346 DECREF(c->c_consts);
347 fail_2:
348 DECREF(c->c_code);
349 fail_3:
350 return 0;
351}
352
353static void
354com_free(c)
355 struct compiling *c;
356{
357 XDECREF(c->c_code);
358 XDECREF(c->c_consts);
359 XDECREF(c->c_names);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000360 XDECREF(c->c_globals);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000361 XDECREF(c->c_locals);
362 XDECREF(c->c_varnames);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000363}
364
365static void
366com_done(c)
367 struct compiling *c;
368{
369 if (c->c_code != NULL)
370 resizestring(&c->c_code, c->c_nexti);
371}
372
373static void
374com_addbyte(c, byte)
375 struct compiling *c;
376 int byte;
377{
378 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000379 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000380 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000381 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000382 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000383 fatal("com_addbyte: byte out of range");
Guido van Rossum01cfd441991-10-20 20:12:38 +0000384 */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000385 err_setstr(SystemError, "com_addbyte: byte out of range");
386 c->c_errors++;
387 }
388 if (c->c_code == NULL)
389 return;
390 len = getstringsize(c->c_code);
391 if (c->c_nexti >= len) {
392 if (resizestring(&c->c_code, len+1000) != 0) {
393 c->c_errors++;
394 return;
395 }
396 }
397 getstringvalue(c->c_code)[c->c_nexti++] = byte;
398}
399
400static void
401com_addint(c, x)
402 struct compiling *c;
403 int x;
404{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000405 com_addbyte(c, x & 0xff);
406 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000407}
408
409static void
410com_addoparg(c, op, arg)
411 struct compiling *c;
412 int op;
413 int arg;
414{
415 com_addbyte(c, op);
416 com_addint(c, arg);
417}
418
419static void
420com_addfwref(c, op, p_anchor)
421 struct compiling *c;
422 int op;
423 int *p_anchor;
424{
425 /* Compile a forward reference for backpatching */
426 int here;
427 int anchor;
428 com_addbyte(c, op);
429 here = c->c_nexti;
430 anchor = *p_anchor;
431 *p_anchor = here;
432 com_addint(c, anchor == 0 ? 0 : here - anchor);
433}
434
435static void
436com_backpatch(c, anchor)
437 struct compiling *c;
438 int anchor; /* Must be nonzero */
439{
440 unsigned char *code = (unsigned char *) getstringvalue(c->c_code);
441 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000442 int dist;
443 int prev;
444 for (;;) {
445 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000446 prev = code[anchor] + (code[anchor+1] << 8);
447 dist = target - (anchor+2);
448 code[anchor] = dist & 0xff;
449 code[anchor+1] = dist >> 8;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000450 if (!prev)
451 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000452 anchor -= prev;
453 }
454}
455
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000456/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000457
458static int
459com_add(c, list, v)
460 struct compiling *c;
461 object *list;
462 object *v;
463{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000464 int n = getlistsize(list);
465 int i;
466 for (i = n; --i >= 0; ) {
467 object *w = getlistitem(list, i);
Guido van Rossumefc0bd01991-07-01 18:44:20 +0000468 if (v->ob_type == w->ob_type && cmpobject(v, w) == 0)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000469 return i;
470 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000471 if (addlistitem(list, v) != 0)
472 c->c_errors++;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000473 return n;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000474}
475
476static int
477com_addconst(c, v)
478 struct compiling *c;
479 object *v;
480{
481 return com_add(c, c->c_consts, v);
482}
483
484static int
485com_addname(c, v)
486 struct compiling *c;
487 object *v;
488{
489 return com_add(c, c->c_names, v);
490}
491
492static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000493com_addopnamestr(c, op, name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000494 struct compiling *c;
495 int op;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000496 char *name;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000497{
498 object *v;
499 int i;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000500 if (name == NULL || (v = newstringobject(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000501 c->c_errors++;
502 i = 255;
503 }
504 else {
505 i = com_addname(c, v);
506 DECREF(v);
507 }
Guido van Rossumc5e96291991-12-10 13:53:51 +0000508 /* Hack to replace *_NAME opcodes by *_GLOBAL if necessary */
509 switch (op) {
510 case LOAD_NAME:
511 case STORE_NAME:
512 case DELETE_NAME:
513 if (dictlookup(c->c_globals, name) != NULL) {
514 switch (op) {
515 case LOAD_NAME: op = LOAD_GLOBAL; break;
516 case STORE_NAME: op = STORE_GLOBAL; break;
517 case DELETE_NAME: op = DELETE_GLOBAL; break;
518 }
519 }
520 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000521 com_addoparg(c, op, i);
522}
523
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000524static void
525com_addopname(c, op, n)
526 struct compiling *c;
527 int op;
528 node *n;
529{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000530 char *name;
531 char buffer[1000];
532 /* XXX it is possible to write this code without the 1000
533 chars on the total length of dotted names, I just can't be
534 bothered right now */
535 if (TYPE(n) == STAR)
536 name = "*";
537 else if (TYPE(n) == dotted_name) {
538 char *p = buffer;
539 int i;
540 name = buffer;
541 for (i = 0; i < NCH(n); i += 2) {
542 char *s = STR(CHILD(n, i));
543 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
544 err_setstr(MemoryError,
545 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +0000546 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000547 break;
548 }
549 if (p != buffer)
550 *p++ = '.';
551 strcpy(p, s);
552 p = strchr(p, '\0');
553 }
554 }
555 else {
556 REQ(n, NAME);
557 name = STR(n);
558 }
559 com_addopnamestr(c, op, name);
560}
561
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000562static object *
563parsenumber(s)
564 char *s;
565{
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000566 extern long mystrtol PROTO((const char *, char **, int));
567 extern unsigned long mystrtoul PROTO((const char *, char **, int));
568 extern double atof PROTO((const char *));
Guido van Rossumc5e96291991-12-10 13:53:51 +0000569 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000570 long x;
Guido van Rossum50564e81996-01-12 01:13:16 +0000571#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +0000572 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +0000573 int imflag;
574#endif
575
Guido van Rossum282914b1991-04-04 10:42:56 +0000576 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000577 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +0000578#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +0000579 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +0000580#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000581 if (*end == 'l' || *end == 'L')
Guido van Rossumc5e96291991-12-10 13:53:51 +0000582 return long_scan(s, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000583 if (s[0] == '0')
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000584 x = (long) mystrtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000585 else
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000586 x = mystrtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +0000587 if (*end == '\0') {
588 if (errno != 0) {
Guido van Rossumefb087b1991-12-16 15:41:41 +0000589 err_setstr(OverflowError,
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000590 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000591 return NULL;
592 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000593 return newintobject(x);
Guido van Rossum282914b1991-04-04 10:42:56 +0000594 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000595 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +0000596#ifndef WITHOUT_COMPLEX
597 if (imflag) {
598 c.real = 0.;
599 c.imag = atof(s);
600 return newcomplexobject(c);
601 }
602 else
603#endif
604 return newfloatobject(atof(s));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000605}
606
607static object *
608parsestr(s)
609 char *s;
610{
611 object *v;
612 int len;
613 char *buf;
614 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000615 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000616 int c;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000617 int quote = *s;
618 if (quote != '\'' && quote != '\"') {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000619 err_badcall();
620 return NULL;
621 }
622 s++;
623 len = strlen(s);
Guido van Rossum8054fad1993-10-26 15:19:44 +0000624 if (s[--len] != quote) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000625 err_badcall();
626 return NULL;
627 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000628 if (len >= 4 && s[0] == quote && s[1] == quote) {
629 s += 2;
630 len -= 2;
631 if (s[--len] != quote || s[--len] != quote) {
632 err_badcall();
633 return NULL;
634 }
635 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000636 if (strchr(s, '\\') == NULL)
637 return newsizedstringobject(s, len);
638 v = newsizedstringobject((char *)NULL, len);
639 p = buf = getstringvalue(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000640 end = s + len;
641 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000642 if (*s != '\\') {
643 *p++ = *s++;
644 continue;
645 }
646 s++;
647 switch (*s++) {
648 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000649 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000650 case '\\': *p++ = '\\'; break;
651 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000652 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000653 case 'b': *p++ = '\b'; break;
654 case 'f': *p++ = '\014'; break; /* FF */
655 case 't': *p++ = '\t'; break;
656 case 'n': *p++ = '\n'; break;
657 case 'r': *p++ = '\r'; break;
658 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000659 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
660 case '0': case '1': case '2': case '3':
661 case '4': case '5': case '6': case '7':
662 c = s[-1] - '0';
663 if ('0' <= *s && *s <= '7') {
664 c = (c<<3) + *s++ - '0';
665 if ('0' <= *s && *s <= '7')
666 c = (c<<3) + *s++ - '0';
667 }
668 *p++ = c;
669 break;
670 case 'x':
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000671 if (isxdigit(Py_CHARMASK(*s))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000672 sscanf(s, "%x", &c);
673 *p++ = c;
674 do {
675 s++;
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000676 } while (isxdigit(Py_CHARMASK(*s)));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000677 break;
678 }
679 /* FALLTHROUGH */
680 default: *p++ = '\\'; *p++ = s[-1]; break;
681 }
682 }
683 resizestring(&v, (int)(p - buf));
684 return v;
685}
686
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000687static object *
688parsestrplus(n)
689 node *n;
690{
691 object *v;
692 int i;
693 REQ(CHILD(n, 0), STRING);
694 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
695 /* String literal concatenation */
696 for (i = 1; i < NCH(n) && v != NULL; i++) {
697 joinstring_decref(&v, parsestr(STR(CHILD(n, i))));
698 }
699 }
700 return v;
701}
702
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000703static void
704com_list_constructor(c, n)
705 struct compiling *c;
706 node *n;
707{
708 int len;
709 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000710 if (TYPE(n) != testlist)
711 REQ(n, exprlist);
712 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
713 len = (NCH(n) + 1) / 2;
714 for (i = 0; i < NCH(n); i += 2)
715 com_node(c, CHILD(n, i));
716 com_addoparg(c, BUILD_LIST, len);
717}
718
719static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000720com_dictmaker(c, n)
721 struct compiling *c;
722 node *n;
723{
724 int i;
725 /* dictmaker: test ':' test (',' test ':' value)* [','] */
726 for (i = 0; i+2 < NCH(n); i += 4) {
727 /* We must arrange things just right for STORE_SUBSCR.
728 It wants the stack to look like (value) (dict) (key) */
729 com_addbyte(c, DUP_TOP);
730 com_node(c, CHILD(n, i+2)); /* value */
731 com_addbyte(c, ROT_TWO);
732 com_node(c, CHILD(n, i)); /* key */
733 com_addbyte(c, STORE_SUBSCR);
734 }
735}
736
737static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000738com_atom(c, n)
739 struct compiling *c;
740 node *n;
741{
742 node *ch;
743 object *v;
744 int i;
745 REQ(n, atom);
746 ch = CHILD(n, 0);
747 switch (TYPE(ch)) {
748 case LPAR:
749 if (TYPE(CHILD(n, 1)) == RPAR)
750 com_addoparg(c, BUILD_TUPLE, 0);
751 else
752 com_node(c, CHILD(n, 1));
753 break;
754 case LSQB:
755 if (TYPE(CHILD(n, 1)) == RSQB)
756 com_addoparg(c, BUILD_LIST, 0);
757 else
758 com_list_constructor(c, CHILD(n, 1));
759 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000760 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000761 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000762 if (TYPE(CHILD(n, 1)) != RBRACE)
763 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000764 break;
765 case BACKQUOTE:
766 com_node(c, CHILD(n, 1));
767 com_addbyte(c, UNARY_CONVERT);
768 break;
769 case NUMBER:
770 if ((v = parsenumber(STR(ch))) == NULL) {
771 c->c_errors++;
772 i = 255;
773 }
774 else {
775 i = com_addconst(c, v);
776 DECREF(v);
777 }
778 com_addoparg(c, LOAD_CONST, i);
779 break;
780 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000781 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000782 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000783 c->c_errors++;
784 i = 255;
785 }
786 else {
787 i = com_addconst(c, v);
788 DECREF(v);
789 }
790 com_addoparg(c, LOAD_CONST, i);
791 break;
792 case NAME:
793 com_addopname(c, LOAD_NAME, ch);
794 break;
795 default:
796 fprintf(stderr, "node type %d\n", TYPE(ch));
797 err_setstr(SystemError, "com_atom: unexpected node type");
798 c->c_errors++;
799 }
800}
801
802static void
803com_slice(c, n, op)
804 struct compiling *c;
805 node *n;
806 int op;
807{
808 if (NCH(n) == 1) {
809 com_addbyte(c, op);
810 }
811 else if (NCH(n) == 2) {
812 if (TYPE(CHILD(n, 0)) != COLON) {
813 com_node(c, CHILD(n, 0));
814 com_addbyte(c, op+1);
815 }
816 else {
817 com_node(c, CHILD(n, 1));
818 com_addbyte(c, op+2);
819 }
820 }
821 else {
822 com_node(c, CHILD(n, 0));
823 com_node(c, CHILD(n, 2));
824 com_addbyte(c, op+3);
825 }
826}
827
Guido van Rossumf10570b1995-07-07 22:53:21 +0000828static int
829com_argument(c, n, inkeywords)
830 struct compiling *c;
831 node *n; /* argument */
832 int inkeywords;
833{
834 node *m;
835 REQ(n, argument); /* [test '='] test; really [ keyword '='] keyword */
836 if (NCH(n) == 1) {
837 if (inkeywords) {
838 err_setstr(SyntaxError,
839 "non-keyword arg after keyword arg");
840 c->c_errors++;
841 }
842 else {
843 com_node(c, CHILD(n, 0));
844 }
845 return 0;
846 }
847 m = n;
848 do {
849 m = CHILD(m, 0);
850 } while (NCH(m) == 1);
851 if (TYPE(m) != NAME) {
852 err_setstr(SyntaxError, "keyword can't be an expression");
853 c->c_errors++;
854 }
855 else {
856 object *v = newstringobject(STR(m));
857 if (v == NULL)
858 c->c_errors++;
859 else {
860 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
861 DECREF(v);
862 }
863 }
864 com_node(c, CHILD(n, 2));
865 return 1;
866}
867
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000868static void
869com_call_function(c, n)
870 struct compiling *c;
Guido van Rossumf10570b1995-07-07 22:53:21 +0000871 node *n; /* EITHER arglist OR ')' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000872{
873 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +0000874 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000875 }
876 else {
Guido van Rossumf10570b1995-07-07 22:53:21 +0000877 int inkeywords, i, na, nk;
878 REQ(n, arglist);
879 inkeywords = 0;
880 na = 0;
881 nk = 0;
882 for (i = 0; i < NCH(n); i += 2) {
883 inkeywords = com_argument(c, CHILD(n, i), inkeywords);
884 if (!inkeywords)
885 na++;
886 else
887 nk++;
888 }
889 if (na > 255 || nk > 255) {
890 err_setstr(SyntaxError, "more than 255 arguments");
891 c->c_errors++;
892 }
893 com_addoparg(c, CALL_FUNCTION, na | (nk << 8));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000894 }
895}
896
897static void
898com_select_member(c, n)
899 struct compiling *c;
900 node *n;
901{
902 com_addopname(c, LOAD_ATTR, n);
903}
904
905static void
Guido van Rossum8861b741996-07-30 16:49:37 +0000906com_sliceobj(c, n)
907 struct compiling *c;
908 node *n;
909{
910 int i=0;
911 int ns=2; /* number of slice arguments */
912 int first_missing=0;
913 node *ch;
914
915 /* first argument */
916 if (TYPE(CHILD(n,i)) == COLON) {
917 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
918 i++;
919 }
920 else {
921 com_node(c, CHILD(n,i));
922 i++;
923 REQ(CHILD(n,i),COLON);
924 i++;
925 }
926 /* second argument */
927 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
928 com_node(c, CHILD(n,i));
929 i++;
930 }
931 else com_addoparg(c, LOAD_CONST, com_addconst(c, None));
932 /* remaining arguments */
933 for (; i < NCH(n); i++) {
934 ns++;
935 ch=CHILD(n,i);
936 REQ(ch, sliceop);
937 if (NCH(ch) == 1) {
938 /* right argument of ':' missing */
939 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
940 }
941 else
942 com_node(c, CHILD(ch,1));
943 }
944 com_addoparg(c, BUILD_SLICE, ns);
945}
946
947static void
948com_subscript(c, n)
949 struct compiling *c;
950 node *n;
951{
952 node *ch;
953 REQ(n, subscript);
954 ch = CHILD(n,0);
955 /* check for rubber index */
956 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT)
957 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipses));
958 else {
959 /* check for slice */
960 if ((TYPE(ch) == COLON || NCH(n) > 1))
961 com_sliceobj(c, n);
962 else {
963 REQ(ch, test);
964 com_node(c, ch);
965 }
966 }
967}
968
969static void
970com_subscriptlist(c, n, assigning)
971 struct compiling *c;
972 node *n;
973 int assigning;
974{
975 int i, op;
976 REQ(n, subscriptlist);
977 /* Check to make backward compatible slice behavior for '[i:j]' */
978 if (NCH(n) == 1) {
979 node *sub = CHILD(n, 0); /* subscript */
980 /* Make it is a simple slice.
981 should have exactly one colon. */
982 if ((TYPE(CHILD(sub, 0)) == COLON
983 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
984 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop)) {
985 if (assigning == OP_APPLY)
986 op = SLICE;
987 else
988 op = ((assigning == OP_ASSIGN) ? STORE_SLICE : DELETE_SLICE);
989 com_slice(c, sub, op);
990 return;
991 }
992 }
993 /* Else normal subscriptlist. Compile each subscript. */
994 for (i = 0; i < NCH(n); i += 2)
995 com_subscript(c, CHILD(n, i));
996 /* Put multiple subscripts into a tuple */
997 if (NCH(n) > 1)
998 com_addoparg(c, BUILD_TUPLE, (NCH(n)+1) / 2);
999 if (assigning == OP_APPLY)
1000 op = BINARY_SUBSCR;
1001 else
1002 op = ((assigning == OP_ASSIGN) ? STORE_SUBSCR : DELETE_SUBSCR);
1003 com_addbyte(c, op);
1004}
1005
1006static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001007com_apply_trailer(c, n)
1008 struct compiling *c;
1009 node *n;
1010{
1011 REQ(n, trailer);
1012 switch (TYPE(CHILD(n, 0))) {
1013 case LPAR:
1014 com_call_function(c, CHILD(n, 1));
1015 break;
1016 case DOT:
1017 com_select_member(c, CHILD(n, 1));
1018 break;
1019 case LSQB:
Guido van Rossum8861b741996-07-30 16:49:37 +00001020 com_subscriptlist(c, CHILD(n, 1), OP_APPLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001021 break;
1022 default:
1023 err_setstr(SystemError,
1024 "com_apply_trailer: unknown trailer type");
1025 c->c_errors++;
1026 }
1027}
1028
1029static void
Guido van Rossum50564e81996-01-12 01:13:16 +00001030com_power(c, n)
1031 struct compiling *c;
1032 node *n;
1033{
1034 int i;
1035 REQ(n, power);
1036 com_atom(c, CHILD(n, 0));
1037 for (i = 1; i < NCH(n); i++) {
1038 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1039 com_factor(c, CHILD(n, i+1));
1040 com_addbyte(c, BINARY_POWER);
1041 break;
1042 }
1043 else
1044 com_apply_trailer(c, CHILD(n, i));
1045 }
1046}
1047
1048static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001049com_factor(c, n)
1050 struct compiling *c;
1051 node *n;
1052{
Guido van Rossum8861b741996-07-30 16:49:37 +00001053 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001054 REQ(n, factor);
1055 if (TYPE(CHILD(n, 0)) == PLUS) {
1056 com_factor(c, CHILD(n, 1));
1057 com_addbyte(c, UNARY_POSITIVE);
1058 }
1059 else if (TYPE(CHILD(n, 0)) == MINUS) {
1060 com_factor(c, CHILD(n, 1));
1061 com_addbyte(c, UNARY_NEGATIVE);
1062 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001063 else if (TYPE(CHILD(n, 0)) == TILDE) {
1064 com_factor(c, CHILD(n, 1));
1065 com_addbyte(c, UNARY_INVERT);
1066 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001067 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001068 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001069 }
1070}
1071
1072static void
1073com_term(c, n)
1074 struct compiling *c;
1075 node *n;
1076{
1077 int i;
1078 int op;
1079 REQ(n, term);
1080 com_factor(c, CHILD(n, 0));
1081 for (i = 2; i < NCH(n); i += 2) {
1082 com_factor(c, CHILD(n, i));
1083 switch (TYPE(CHILD(n, i-1))) {
1084 case STAR:
1085 op = BINARY_MULTIPLY;
1086 break;
1087 case SLASH:
1088 op = BINARY_DIVIDE;
1089 break;
1090 case PERCENT:
1091 op = BINARY_MODULO;
1092 break;
1093 default:
1094 err_setstr(SystemError,
Guido van Rossum7928cd71991-10-24 14:59:31 +00001095 "com_term: operator not *, / or %");
1096 c->c_errors++;
1097 op = 255;
1098 }
1099 com_addbyte(c, op);
1100 }
1101}
1102
1103static void
1104com_arith_expr(c, n)
1105 struct compiling *c;
1106 node *n;
1107{
1108 int i;
1109 int op;
1110 REQ(n, arith_expr);
1111 com_term(c, CHILD(n, 0));
1112 for (i = 2; i < NCH(n); i += 2) {
1113 com_term(c, CHILD(n, i));
1114 switch (TYPE(CHILD(n, i-1))) {
1115 case PLUS:
1116 op = BINARY_ADD;
1117 break;
1118 case MINUS:
1119 op = BINARY_SUBTRACT;
1120 break;
1121 default:
1122 err_setstr(SystemError,
1123 "com_arith_expr: operator not + or -");
1124 c->c_errors++;
1125 op = 255;
1126 }
1127 com_addbyte(c, op);
1128 }
1129}
1130
1131static void
1132com_shift_expr(c, n)
1133 struct compiling *c;
1134 node *n;
1135{
1136 int i;
1137 int op;
1138 REQ(n, shift_expr);
1139 com_arith_expr(c, CHILD(n, 0));
1140 for (i = 2; i < NCH(n); i += 2) {
1141 com_arith_expr(c, CHILD(n, i));
1142 switch (TYPE(CHILD(n, i-1))) {
1143 case LEFTSHIFT:
1144 op = BINARY_LSHIFT;
1145 break;
1146 case RIGHTSHIFT:
1147 op = BINARY_RSHIFT;
1148 break;
1149 default:
1150 err_setstr(SystemError,
1151 "com_shift_expr: operator not << or >>");
1152 c->c_errors++;
1153 op = 255;
1154 }
1155 com_addbyte(c, op);
1156 }
1157}
1158
1159static void
1160com_and_expr(c, n)
1161 struct compiling *c;
1162 node *n;
1163{
1164 int i;
1165 int op;
1166 REQ(n, and_expr);
1167 com_shift_expr(c, CHILD(n, 0));
1168 for (i = 2; i < NCH(n); i += 2) {
1169 com_shift_expr(c, CHILD(n, i));
1170 if (TYPE(CHILD(n, i-1)) == AMPER) {
1171 op = BINARY_AND;
1172 }
1173 else {
1174 err_setstr(SystemError,
1175 "com_and_expr: operator not &");
1176 c->c_errors++;
1177 op = 255;
1178 }
1179 com_addbyte(c, op);
1180 }
1181}
1182
1183static void
1184com_xor_expr(c, n)
1185 struct compiling *c;
1186 node *n;
1187{
1188 int i;
1189 int op;
1190 REQ(n, xor_expr);
1191 com_and_expr(c, CHILD(n, 0));
1192 for (i = 2; i < NCH(n); i += 2) {
1193 com_and_expr(c, CHILD(n, i));
1194 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1195 op = BINARY_XOR;
1196 }
1197 else {
1198 err_setstr(SystemError,
1199 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001200 c->c_errors++;
1201 op = 255;
1202 }
1203 com_addbyte(c, op);
1204 }
1205}
1206
1207static void
1208com_expr(c, n)
1209 struct compiling *c;
1210 node *n;
1211{
1212 int i;
1213 int op;
1214 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001215 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001216 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001217 com_xor_expr(c, CHILD(n, i));
1218 if (TYPE(CHILD(n, i-1)) == VBAR) {
1219 op = BINARY_OR;
1220 }
1221 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001222 err_setstr(SystemError,
Guido van Rossum7928cd71991-10-24 14:59:31 +00001223 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001224 c->c_errors++;
1225 op = 255;
1226 }
1227 com_addbyte(c, op);
1228 }
1229}
1230
1231static enum cmp_op
1232cmp_type(n)
1233 node *n;
1234{
1235 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001236 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001237 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1238 if (NCH(n) == 1) {
1239 n = CHILD(n, 0);
1240 switch (TYPE(n)) {
1241 case LESS: return LT;
1242 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001243 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001244 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001245 case LESSEQUAL: return LE;
1246 case GREATEREQUAL: return GE;
1247 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001248 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1249 if (strcmp(STR(n), "is") == 0) return IS;
1250 }
1251 }
1252 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001253 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001254 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1255 return NOT_IN;
1256 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1257 return IS_NOT;
1258 }
1259 }
1260 return BAD;
1261}
1262
1263static void
1264com_comparison(c, n)
1265 struct compiling *c;
1266 node *n;
1267{
1268 int i;
1269 enum cmp_op op;
1270 int anchor;
1271 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
1272 com_expr(c, CHILD(n, 0));
1273 if (NCH(n) == 1)
1274 return;
1275
1276 /****************************************************************
1277 The following code is generated for all but the last
1278 comparison in a chain:
1279
1280 label: on stack: opcode: jump to:
1281
1282 a <code to load b>
1283 a, b DUP_TOP
1284 a, b, b ROT_THREE
1285 b, a, b COMPARE_OP
1286 b, 0-or-1 JUMP_IF_FALSE L1
1287 b, 1 POP_TOP
1288 b
1289
1290 We are now ready to repeat this sequence for the next
1291 comparison in the chain.
1292
1293 For the last we generate:
1294
1295 b <code to load c>
1296 b, c COMPARE_OP
1297 0-or-1
1298
1299 If there were any jumps to L1 (i.e., there was more than one
1300 comparison), we generate:
1301
1302 0-or-1 JUMP_FORWARD L2
1303 L1: b, 0 ROT_TWO
1304 0, b POP_TOP
1305 0
1306 L2:
1307 ****************************************************************/
1308
1309 anchor = 0;
1310
1311 for (i = 2; i < NCH(n); i += 2) {
1312 com_expr(c, CHILD(n, i));
1313 if (i+2 < NCH(n)) {
1314 com_addbyte(c, DUP_TOP);
1315 com_addbyte(c, ROT_THREE);
1316 }
1317 op = cmp_type(CHILD(n, i-1));
1318 if (op == BAD) {
1319 err_setstr(SystemError,
1320 "com_comparison: unknown comparison op");
1321 c->c_errors++;
1322 }
1323 com_addoparg(c, COMPARE_OP, op);
1324 if (i+2 < NCH(n)) {
1325 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1326 com_addbyte(c, POP_TOP);
1327 }
1328 }
1329
1330 if (anchor) {
1331 int anchor2 = 0;
1332 com_addfwref(c, JUMP_FORWARD, &anchor2);
1333 com_backpatch(c, anchor);
1334 com_addbyte(c, ROT_TWO);
1335 com_addbyte(c, POP_TOP);
1336 com_backpatch(c, anchor2);
1337 }
1338}
1339
1340static void
1341com_not_test(c, n)
1342 struct compiling *c;
1343 node *n;
1344{
1345 REQ(n, not_test); /* 'not' not_test | comparison */
1346 if (NCH(n) == 1) {
1347 com_comparison(c, CHILD(n, 0));
1348 }
1349 else {
1350 com_not_test(c, CHILD(n, 1));
1351 com_addbyte(c, UNARY_NOT);
1352 }
1353}
1354
1355static void
1356com_and_test(c, n)
1357 struct compiling *c;
1358 node *n;
1359{
1360 int i;
1361 int anchor;
1362 REQ(n, and_test); /* not_test ('and' not_test)* */
1363 anchor = 0;
1364 i = 0;
1365 for (;;) {
1366 com_not_test(c, CHILD(n, i));
1367 if ((i += 2) >= NCH(n))
1368 break;
1369 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1370 com_addbyte(c, POP_TOP);
1371 }
1372 if (anchor)
1373 com_backpatch(c, anchor);
1374}
1375
1376static void
1377com_test(c, n)
1378 struct compiling *c;
1379 node *n;
1380{
Guido van Rossum57531fe1993-11-30 14:57:42 +00001381 REQ(n, test); /* and_test ('and' and_test)* | lambdef */
1382 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
1383 object *v;
1384 int i;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001385 int ndefs = com_argdefs(c, CHILD(n, 0));
Guido van Rossum57531fe1993-11-30 14:57:42 +00001386 v = (object *) compile(CHILD(n, 0), c->c_filename);
1387 if (v == NULL) {
1388 c->c_errors++;
1389 i = 255;
1390 }
1391 else {
1392 i = com_addconst(c, v);
1393 DECREF(v);
1394 }
1395 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001396 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001397 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00001398 else {
1399 int anchor = 0;
1400 int i = 0;
1401 for (;;) {
1402 com_and_test(c, CHILD(n, i));
1403 if ((i += 2) >= NCH(n))
1404 break;
1405 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1406 com_addbyte(c, POP_TOP);
1407 }
1408 if (anchor)
1409 com_backpatch(c, anchor);
1410 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001411}
1412
1413static void
Guido van Rossum288a60f1991-12-16 13:05:10 +00001414com_list(c, n, toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001415 struct compiling *c;
1416 node *n;
Guido van Rossum288a60f1991-12-16 13:05:10 +00001417 int toplevel; /* If nonzero, *always* build a tuple */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001418{
1419 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001420 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001421 com_node(c, CHILD(n, 0));
1422 }
1423 else {
1424 int i;
1425 int len;
1426 len = (NCH(n) + 1) / 2;
1427 for (i = 0; i < NCH(n); i += 2)
1428 com_node(c, CHILD(n, i));
1429 com_addoparg(c, BUILD_TUPLE, len);
1430 }
1431}
1432
1433
1434/* Begin of assignment compilation */
1435
1436static void com_assign_name PROTO((struct compiling *, node *, int));
1437static void com_assign PROTO((struct compiling *, node *, int));
1438
1439static void
1440com_assign_attr(c, n, assigning)
1441 struct compiling *c;
1442 node *n;
1443 int assigning;
1444{
1445 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
1446}
1447
1448static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001449com_assign_trailer(c, n, assigning)
1450 struct compiling *c;
1451 node *n;
1452 int assigning;
1453{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001454 REQ(n, trailer);
1455 switch (TYPE(CHILD(n, 0))) {
1456 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001457 err_setstr(SyntaxError, "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001458 c->c_errors++;
1459 break;
1460 case DOT: /* '.' NAME */
1461 com_assign_attr(c, CHILD(n, 1), assigning);
1462 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001463 case LSQB: /* '[' subscriptlist ']' */
1464 com_subscriptlist(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001465 break;
1466 default:
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001467 err_setstr(SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001468 c->c_errors++;
1469 }
1470}
1471
1472static void
1473com_assign_tuple(c, n, assigning)
1474 struct compiling *c;
1475 node *n;
1476 int assigning;
1477{
1478 int i;
1479 if (TYPE(n) != testlist)
1480 REQ(n, exprlist);
1481 if (assigning)
1482 com_addoparg(c, UNPACK_TUPLE, (NCH(n)+1)/2);
1483 for (i = 0; i < NCH(n); i += 2)
1484 com_assign(c, CHILD(n, i), assigning);
1485}
1486
1487static void
1488com_assign_list(c, n, assigning)
1489 struct compiling *c;
1490 node *n;
1491 int assigning;
1492{
1493 int i;
1494 if (assigning)
1495 com_addoparg(c, UNPACK_LIST, (NCH(n)+1)/2);
1496 for (i = 0; i < NCH(n); i += 2)
1497 com_assign(c, CHILD(n, i), assigning);
1498}
1499
1500static void
1501com_assign_name(c, n, assigning)
1502 struct compiling *c;
1503 node *n;
1504 int assigning;
1505{
1506 REQ(n, NAME);
1507 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
1508}
1509
1510static void
1511com_assign(c, n, assigning)
1512 struct compiling *c;
1513 node *n;
1514 int assigning;
1515{
1516 /* Loop to avoid trivial recursion */
1517 for (;;) {
1518 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001519
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001520 case exprlist:
1521 case testlist:
1522 if (NCH(n) > 1) {
1523 com_assign_tuple(c, n, assigning);
1524 return;
1525 }
1526 n = CHILD(n, 0);
1527 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001528
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001529 case test:
1530 case and_test:
1531 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001532 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001533 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001534 case xor_expr:
1535 case and_expr:
1536 case shift_expr:
1537 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001538 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00001539 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001540 if (NCH(n) > 1) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001541 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001542 "can't assign to operator");
1543 c->c_errors++;
1544 return;
1545 }
1546 n = CHILD(n, 0);
1547 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001548
Guido van Rossum50564e81996-01-12 01:13:16 +00001549 case power: /* atom trailer* ('**' power)* */
1550/* ('+'|'-'|'~') factor | atom trailer* */
1551 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001552 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001553 "can't assign to operator");
1554 c->c_errors++;
1555 return;
1556 }
Guido van Rossum50564e81996-01-12 01:13:16 +00001557 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001558 int i;
1559 com_node(c, CHILD(n, 0));
1560 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00001561 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1562 err_setstr(SyntaxError,
1563 "can't assign to operator");
1564 c->c_errors++;
1565 return;
1566 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001567 com_apply_trailer(c, CHILD(n, i));
1568 } /* NB i is still alive */
1569 com_assign_trailer(c,
1570 CHILD(n, i), assigning);
1571 return;
1572 }
1573 n = CHILD(n, 0);
1574 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001575
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001576 case atom:
1577 switch (TYPE(CHILD(n, 0))) {
1578 case LPAR:
1579 n = CHILD(n, 1);
1580 if (TYPE(n) == RPAR) {
1581 /* XXX Should allow () = () ??? */
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001582 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001583 "can't assign to ()");
1584 c->c_errors++;
1585 return;
1586 }
1587 break;
1588 case LSQB:
1589 n = CHILD(n, 1);
1590 if (TYPE(n) == RSQB) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001591 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001592 "can't assign to []");
1593 c->c_errors++;
1594 return;
1595 }
1596 com_assign_list(c, n, assigning);
1597 return;
1598 case NAME:
1599 com_assign_name(c, CHILD(n, 0), assigning);
1600 return;
1601 default:
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001602 err_setstr(SyntaxError,
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001603 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001604 c->c_errors++;
1605 return;
1606 }
1607 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001608
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001609 default:
1610 fprintf(stderr, "node type %d\n", TYPE(n));
1611 err_setstr(SystemError, "com_assign: bad node");
1612 c->c_errors++;
1613 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001614
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001615 }
1616 }
1617}
1618
1619static void
1620com_expr_stmt(c, n)
1621 struct compiling *c;
1622 node *n;
1623{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001624 REQ(n, expr_stmt); /* testlist ('=' testlist)* */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001625 com_node(c, CHILD(n, NCH(n)-1));
1626 if (NCH(n) == 1) {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001627 if (c->c_interactive)
1628 com_addbyte(c, PRINT_EXPR);
1629 else
1630 com_addbyte(c, POP_TOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001631 }
1632 else {
1633 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001634 for (i = 0; i < NCH(n)-2; i+=2) {
1635 if (i+2 < NCH(n)-2)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001636 com_addbyte(c, DUP_TOP);
Guido van Rossum8861b741996-07-30 16:49:37 +00001637 com_assign(c, CHILD(n, i), OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001638 }
1639 }
1640}
1641
1642static void
1643com_print_stmt(c, n)
1644 struct compiling *c;
1645 node *n;
1646{
1647 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001648 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
1649 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001650 com_node(c, CHILD(n, i));
1651 com_addbyte(c, PRINT_ITEM);
1652 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001653 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001654 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001655 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001656}
1657
1658static void
1659com_return_stmt(c, n)
1660 struct compiling *c;
1661 node *n;
1662{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001663 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001664 if (!c->c_infunction) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001665 err_setstr(SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001666 c->c_errors++;
1667 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001668 if (NCH(n) < 2)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001669 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1670 else
1671 com_node(c, CHILD(n, 1));
1672 com_addbyte(c, RETURN_VALUE);
1673}
1674
1675static void
1676com_raise_stmt(c, n)
1677 struct compiling *c;
1678 node *n;
1679{
Guido van Rossumf10570b1995-07-07 22:53:21 +00001680 REQ(n, raise_stmt); /* 'raise' test [',' test [',' test]] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001681 com_node(c, CHILD(n, 1));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001682 if (NCH(n) > 3) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001683 com_node(c, CHILD(n, 3));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001684 if (NCH(n) > 5)
1685 com_node(c, CHILD(n, 5));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001686 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001687 com_addoparg(c, RAISE_VARARGS, NCH(n)/2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001688}
1689
1690static void
1691com_import_stmt(c, n)
1692 struct compiling *c;
1693 node *n;
1694{
1695 int i;
1696 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001697 /* 'import' dotted_name (',' dotted_name)* |
1698 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001699 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001700 /* 'from' dotted_name 'import' ... */
1701 REQ(CHILD(n, 1), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001702 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
1703 for (i = 3; i < NCH(n); i += 2)
1704 com_addopname(c, IMPORT_FROM, CHILD(n, i));
1705 com_addbyte(c, POP_TOP);
1706 }
1707 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001708 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001709 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001710 REQ(CHILD(n, i), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001711 com_addopname(c, IMPORT_NAME, CHILD(n, i));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001712 com_addopname(c, STORE_NAME, CHILD(CHILD(n, i), 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001713 }
1714 }
1715}
1716
1717static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00001718com_global_stmt(c, n)
1719 struct compiling *c;
1720 node *n;
1721{
1722 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001723 REQ(n, global_stmt);
1724 /* 'global' NAME (',' NAME)* */
1725 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001726 char *s = STR(CHILD(n, i));
1727 if (dictlookup(c->c_locals, s) != NULL) {
1728 err_setstr(SyntaxError, "name is local and global");
1729 c->c_errors++;
1730 }
1731 else if (dictinsert(c->c_globals, s, None) != 0)
Guido van Rossumc5e96291991-12-10 13:53:51 +00001732 c->c_errors++;
1733 }
1734}
1735
Guido van Rossum681d79a1995-07-18 14:51:37 +00001736static int
1737com_newlocal_o(c, nameval)
1738 struct compiling *c;
1739 object *nameval;
1740{
1741 int i;
1742 object *ival;
1743 if (getlistsize(c->c_varnames) != c->c_nlocals) {
1744 /* This is usually caused by an error on a previous call */
1745 if (c->c_errors == 0) {
1746 err_setstr(SystemError, "mixed up var name/index");
1747 c->c_errors++;
1748 }
1749 return 0;
1750 }
1751 ival = newintobject(i = c->c_nlocals++);
1752 if (ival == NULL)
1753 c->c_errors++;
1754 else if (mappinginsert(c->c_locals, nameval, ival) != 0)
1755 c->c_errors++;
1756 else if (addlistitem(c->c_varnames, nameval) != 0)
1757 c->c_errors++;
1758 XDECREF(ival);
1759 return i;
1760}
1761
1762static int
1763com_addlocal_o(c, nameval)
1764 struct compiling *c;
1765 object *nameval;
1766{
1767 object *ival = mappinglookup(c->c_locals, nameval);
1768 if (ival != NULL)
1769 return getintvalue(ival);
1770 return com_newlocal_o(c, nameval);
1771}
1772
1773static int
1774com_newlocal(c, name)
1775 struct compiling *c;
1776 char *name;
1777{
1778 object *nameval = newstringobject(name);
1779 int i;
1780 if (nameval == NULL) {
1781 c->c_errors++;
1782 return 0;
1783 }
1784 i = com_newlocal_o(c, nameval);
1785 DECREF(nameval);
1786 return i;
1787}
1788
Guido van Rossum25831651993-05-19 14:50:45 +00001789#define strequ(a, b) (strcmp((a), (b)) == 0)
1790
1791static void
1792com_access_stmt(c, n)
1793 struct compiling *c;
1794 node *n;
1795{
Guido van Rossum53f45241995-10-08 00:42:46 +00001796#if 0
Guido van Rossum25831651993-05-19 14:50:45 +00001797 int i, j, k, mode, imode;
1798 object *vmode;
1799 REQ(n, access_stmt);
1800 /* 'access' NAME (',' NAME)* ':' accesstype (',' accesstype)*
1801 accesstype: NAME+ */
1802
1803 /* Find where the colon is */
1804 i = 1;
1805 while (TYPE(CHILD(n,i-1)) != COLON)
1806 i += 1;
1807
1808 /* Calculate the mode mask */
1809 mode = 0;
1810 for (j = i; j < NCH(n); j += 2) {
Guido van Rossum81daa321993-05-20 14:24:46 +00001811 int r = 0, w = 0, p = 0;
1812 for (k = 0; k < NCH(CHILD(n,j)); k++) {
Guido van Rossum25831651993-05-19 14:50:45 +00001813 if (strequ(STR(CHILD(CHILD(n,j),k)), "public"))
1814 p = 0;
1815 else if (strequ(STR(CHILD(CHILD(n,j),k)), "protected"))
1816 p = 1;
1817 else if (strequ(STR(CHILD(CHILD(n,j),k)), "private"))
1818 p = 2;
1819 else if (strequ(STR(CHILD(CHILD(n,j),k)), "read"))
1820 r = 1;
1821 else if (strequ(STR(CHILD(CHILD(n,j),k)), "write"))
1822 w = 1;
1823 else /* XXX should make this an exception */
1824 fprintf(stderr, "bad access type %s\n",
1825 STR(CHILD(CHILD(n,j),k)));
1826 }
1827 if (r == 0 && w == 0)
Guido van Rossum81daa321993-05-20 14:24:46 +00001828 r = w = 1;
Guido van Rossum25831651993-05-19 14:50:45 +00001829 if (p == 0) {
1830 if (r == 1) mode |= AC_R_PUBLIC;
1831 if (w == 1) mode |= AC_W_PUBLIC;
1832 } else if (p == 1) {
1833 if (r == 1) mode |= AC_R_PROTECTED;
1834 if (w == 1) mode |= AC_W_PROTECTED;
1835 } else {
1836 if (r == 1) mode |= AC_R_PRIVATE;
1837 if (w == 1) mode |= AC_W_PRIVATE;
1838 }
1839 }
1840 vmode = newintobject((long)mode);
1841 imode = com_addconst(c, vmode);
1842 XDECREF(vmode);
1843 for (i = 1; TYPE(CHILD(n,i-1)) != COLON; i+=2) {
1844 com_addoparg(c, LOAD_CONST, imode);
1845 com_addopname(c, ACCESS_MODE, CHILD(n, i));
1846 }
Guido van Rossum53f45241995-10-08 00:42:46 +00001847#endif
Guido van Rossum25831651993-05-19 14:50:45 +00001848}
1849
Guido van Rossumc5e96291991-12-10 13:53:51 +00001850static void
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001851com_exec_stmt(c, n)
1852 struct compiling *c;
1853 node *n;
1854{
1855 REQ(n, exec_stmt);
1856 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
1857 com_node(c, CHILD(n, 1));
1858 if (NCH(n) >= 4)
1859 com_node(c, CHILD(n, 3));
1860 else
1861 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1862 if (NCH(n) >= 6)
1863 com_node(c, CHILD(n, 5));
1864 else
1865 com_addbyte(c, DUP_TOP);
1866 com_addbyte(c, EXEC_STMT);
1867}
1868
1869static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001870com_if_stmt(c, n)
1871 struct compiling *c;
1872 node *n;
1873{
1874 int i;
1875 int anchor = 0;
1876 REQ(n, if_stmt);
1877 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
1878 for (i = 0; i+3 < NCH(n); i+=4) {
1879 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001880 node *ch = CHILD(n, i+1);
1881 if (i > 0)
1882 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001883 com_node(c, CHILD(n, i+1));
1884 com_addfwref(c, JUMP_IF_FALSE, &a);
1885 com_addbyte(c, POP_TOP);
1886 com_node(c, CHILD(n, i+3));
1887 com_addfwref(c, JUMP_FORWARD, &anchor);
1888 com_backpatch(c, a);
1889 com_addbyte(c, POP_TOP);
1890 }
1891 if (i+2 < NCH(n))
1892 com_node(c, CHILD(n, i+2));
1893 com_backpatch(c, anchor);
1894}
1895
1896static void
1897com_while_stmt(c, n)
1898 struct compiling *c;
1899 node *n;
1900{
1901 int break_anchor = 0;
1902 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001903 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001904 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
1905 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001906 block_push(c, SETUP_LOOP);
1907 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001908 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001909 com_node(c, CHILD(n, 1));
1910 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1911 com_addbyte(c, POP_TOP);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001912 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001913 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001914 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001915 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1916 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001917 com_backpatch(c, anchor);
1918 com_addbyte(c, POP_TOP);
1919 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001920 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001921 if (NCH(n) > 4)
1922 com_node(c, CHILD(n, 6));
1923 com_backpatch(c, break_anchor);
1924}
1925
1926static void
1927com_for_stmt(c, n)
1928 struct compiling *c;
1929 node *n;
1930{
1931 object *v;
1932 int break_anchor = 0;
1933 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001934 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001935 REQ(n, for_stmt);
1936 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
1937 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001938 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001939 com_node(c, CHILD(n, 3));
1940 v = newintobject(0L);
1941 if (v == NULL)
1942 c->c_errors++;
1943 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
1944 XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001945 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001946 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001947 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8861b741996-07-30 16:49:37 +00001948 com_assign(c, CHILD(n, 1), OP_ASSIGN);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001949 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001950 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001951 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001952 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1953 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001954 com_backpatch(c, anchor);
1955 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001956 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001957 if (NCH(n) > 8)
1958 com_node(c, CHILD(n, 8));
1959 com_backpatch(c, break_anchor);
1960}
1961
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001962/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001963
1964 SETUP_FINALLY L
1965 <code for S>
1966 POP_BLOCK
1967 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001968 L: <code for Sf>
1969 END_FINALLY
1970
1971 The special instructions use the block stack. Each block
1972 stack entry contains the instruction that created it (here
1973 SETUP_FINALLY), the level of the value stack at the time the
1974 block stack entry was created, and a label (here L).
1975
1976 SETUP_FINALLY:
1977 Pushes the current value stack level and the label
1978 onto the block stack.
1979 POP_BLOCK:
1980 Pops en entry from the block stack, and pops the value
1981 stack until its level is the same as indicated on the
1982 block stack. (The label is ignored.)
1983 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001984 Pops a variable number of entries from the *value* stack
1985 and re-raises the exception they specify. The number of
1986 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001987
1988 The block stack is unwound when an exception is raised:
1989 when a SETUP_FINALLY entry is found, the exception is pushed
1990 onto the value stack (and the exception condition is cleared),
1991 and the interpreter jumps to the label gotten from the block
1992 stack.
1993
1994 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00001995 (The contents of the value stack is shown in [], with the top
1996 at the right; 'tb' is trace-back info, 'val' the exception's
1997 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001998
1999 Value stack Label Instruction Argument
2000 [] SETUP_EXCEPT L1
2001 [] <code for S>
2002 [] POP_BLOCK
2003 [] JUMP_FORWARD L0
2004
Guido van Rossum3f5da241990-12-20 15:06:42 +00002005 [tb, val, exc] L1: DUP )
2006 [tb, val, exc, exc] <evaluate E1> )
2007 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2008 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2009 [tb, val, exc, 1] POP )
2010 [tb, val, exc] POP
2011 [tb, val] <assign to V1> (or POP if no V1)
2012 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002013 [] <code for S1>
2014 JUMP_FORWARD L0
2015
Guido van Rossum3f5da241990-12-20 15:06:42 +00002016 [tb, val, exc, 0] L2: POP
2017 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002018 .............................etc.......................
2019
Guido van Rossum3f5da241990-12-20 15:06:42 +00002020 [tb, val, exc, 0] Ln+1: POP
2021 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002022
2023 [] L0: <next statement>
2024
2025 Of course, parts are not generated if Vi or Ei is not present.
2026*/
2027
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002028static void
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002029com_try_except(c, n)
2030 struct compiling *c;
2031 node *n;
2032{
2033 int except_anchor = 0;
2034 int end_anchor = 0;
2035 int else_anchor = 0;
2036 int i;
2037 node *ch;
2038
2039 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2040 block_push(c, SETUP_EXCEPT);
2041 com_node(c, CHILD(n, 2));
2042 com_addbyte(c, POP_BLOCK);
2043 block_pop(c, SETUP_EXCEPT);
2044 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2045 com_backpatch(c, except_anchor);
2046 for (i = 3;
2047 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2048 i += 3) {
2049 /* except_clause: 'except' [expr [',' expr]] */
2050 if (except_anchor == 0) {
2051 err_setstr(SyntaxError,
2052 "default 'except:' must be last");
2053 c->c_errors++;
2054 break;
2055 }
2056 except_anchor = 0;
2057 com_addoparg(c, SET_LINENO, ch->n_lineno);
2058 if (NCH(ch) > 1) {
2059 com_addbyte(c, DUP_TOP);
2060 com_node(c, CHILD(ch, 1));
2061 com_addoparg(c, COMPARE_OP, EXC_MATCH);
2062 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
2063 com_addbyte(c, POP_TOP);
2064 }
2065 com_addbyte(c, POP_TOP);
2066 if (NCH(ch) > 3)
Guido van Rossum8861b741996-07-30 16:49:37 +00002067 com_assign(c, CHILD(ch, 3), OP_ASSIGN);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002068 else
2069 com_addbyte(c, POP_TOP);
2070 com_addbyte(c, POP_TOP);
2071 com_node(c, CHILD(n, i+2));
2072 com_addfwref(c, JUMP_FORWARD, &end_anchor);
2073 if (except_anchor) {
2074 com_backpatch(c, except_anchor);
2075 com_addbyte(c, POP_TOP);
2076 }
2077 }
2078 com_addbyte(c, END_FINALLY);
2079 com_backpatch(c, else_anchor);
2080 if (i < NCH(n))
2081 com_node(c, CHILD(n, i+2));
2082 com_backpatch(c, end_anchor);
2083}
2084
2085static void
2086com_try_finally(c, n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002087 struct compiling *c;
2088 node *n;
2089{
2090 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002091 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002092
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002093 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
2094 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002095 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002096 com_addbyte(c, POP_BLOCK);
2097 block_pop(c, SETUP_FINALLY);
2098 block_push(c, END_FINALLY);
2099 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2100 com_backpatch(c, finally_anchor);
2101 ch = CHILD(n, NCH(n)-1);
2102 com_addoparg(c, SET_LINENO, ch->n_lineno);
2103 com_node(c, ch);
2104 com_addbyte(c, END_FINALLY);
2105 block_pop(c, END_FINALLY);
2106}
2107
2108static void
2109com_try_stmt(c, n)
2110 struct compiling *c;
2111 node *n;
2112{
2113 REQ(n, try_stmt);
2114 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
2115 | 'try' ':' suite 'finally' ':' suite */
2116 if (TYPE(CHILD(n, 3)) != except_clause)
2117 com_try_finally(c, n);
2118 else
2119 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002120}
2121
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002122static object *
2123get_docstring(n)
2124 node *n;
2125{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002126 int i;
2127
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002128 switch (TYPE(n)) {
2129
2130 case suite:
2131 if (NCH(n) == 1)
2132 return get_docstring(CHILD(n, 0));
2133 else {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002134 for (i = 0; i < NCH(n); i++) {
2135 node *ch = CHILD(n, i);
2136 if (TYPE(ch) == stmt)
2137 return get_docstring(ch);
2138 }
2139 }
2140 break;
2141
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002142 case file_input:
2143 for (i = 0; i < NCH(n); i++) {
2144 node *ch = CHILD(n, i);
2145 if (TYPE(ch) == stmt)
2146 return get_docstring(ch);
2147 }
2148 break;
2149
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002150 case stmt:
2151 case simple_stmt:
2152 case small_stmt:
2153 return get_docstring(CHILD(n, 0));
2154
2155 case expr_stmt:
2156 case testlist:
2157 case test:
2158 case and_test:
2159 case not_test:
2160 case comparison:
2161 case expr:
2162 case xor_expr:
2163 case and_expr:
2164 case shift_expr:
2165 case arith_expr:
2166 case term:
2167 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00002168 case power:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002169 if (NCH(n) == 1)
2170 return get_docstring(CHILD(n, 0));
2171 break;
2172
2173 case atom:
2174 if (TYPE(CHILD(n, 0)) == STRING)
2175 return parsestrplus(n);
2176 break;
2177
2178 }
2179 return NULL;
2180}
2181
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002182static void
2183com_suite(c, n)
2184 struct compiling *c;
2185 node *n;
2186{
2187 REQ(n, suite);
2188 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
2189 if (NCH(n) == 1) {
2190 com_node(c, CHILD(n, 0));
2191 }
2192 else {
2193 int i;
2194 for (i = 0; i < NCH(n); i++) {
2195 node *ch = CHILD(n, i);
2196 if (TYPE(ch) == stmt)
2197 com_node(c, ch);
2198 }
2199 }
2200}
2201
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002202/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002203static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002204com_continue_stmt(c, n)
2205 struct compiling *c;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002206 node *n; /* Not used, but passed for consistency */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002207{
2208 int i = c->c_nblocks;
2209 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
2210 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2211 }
2212 else {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00002213 err_setstr(SyntaxError, "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002214 c->c_errors++;
2215 }
2216 /* XXX Could allow it inside a 'finally' clause
2217 XXX if we could pop the exception still on the stack */
2218}
2219
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002220static int
Guido van Rossum681d79a1995-07-18 14:51:37 +00002221com_argdefs(c, n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002222 struct compiling *c;
2223 node *n;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002224{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002225 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002226 if (TYPE(n) == lambdef) {
2227 /* lambdef: 'lambda' [varargslist] ':' test */
2228 n = CHILD(n, 1);
2229 }
2230 else {
2231 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
2232 n = CHILD(n, 2);
2233 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
2234 n = CHILD(n, 1);
2235 }
2236 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002237 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002238 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002239 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002240 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
2241 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002242 nargs = 0;
2243 ndefs = 0;
2244 for (i = 0; i < nch; i++) {
2245 int t;
Guido van Rossum50564e81996-01-12 01:13:16 +00002246 if (TYPE(CHILD(n, i)) == STAR || TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002247 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002248 nargs++;
2249 i++;
2250 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00002251 t = RPAR; /* Anything except EQUAL or COMMA */
2252 else
2253 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002254 if (t == EQUAL) {
2255 i++;
2256 ndefs++;
2257 com_node(c, CHILD(n, i));
2258 i++;
2259 if (i >= nch)
2260 break;
2261 t = TYPE(CHILD(n, i));
2262 }
2263 else {
2264 /* Treat "(a=1, b)" as "(a=1, b=None)" */
2265 if (ndefs) {
2266 com_addoparg(c, LOAD_CONST,
2267 com_addconst(c, None));
2268 ndefs++;
2269 }
2270 }
2271 if (t != COMMA)
2272 break;
2273 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002274 return ndefs;
2275}
2276
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002277static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002278com_funcdef(c, n)
2279 struct compiling *c;
2280 node *n;
2281{
2282 object *v;
2283 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum590baa41993-11-30 13:40:46 +00002284 v = (object *)compile(n, c->c_filename);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002285 if (v == NULL)
2286 c->c_errors++;
2287 else {
2288 int i = com_addconst(c, v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002289 int ndefs = com_argdefs(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002290 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002291 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002292 com_addopname(c, STORE_NAME, CHILD(n, 1));
2293 DECREF(v);
2294 }
2295}
2296
2297static void
Guido van Rossum25831651993-05-19 14:50:45 +00002298com_bases(c, n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002299 struct compiling *c;
2300 node *n;
2301{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002302 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002303 REQ(n, testlist);
2304 /* testlist: test (',' test)* [','] */
2305 for (i = 0; i < NCH(n); i += 2)
2306 com_node(c, CHILD(n, i));
2307 com_addoparg(c, BUILD_TUPLE, (NCH(n)+1) / 2);
2308}
2309
2310static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002311com_classdef(c, n)
2312 struct compiling *c;
2313 node *n;
2314{
Guido van Rossum25831651993-05-19 14:50:45 +00002315 int i;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002316 object *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002317 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00002318 /* classdef: class NAME ['(' testlist ')'] ':' suite */
2319 if ((v = newstringobject(STR(CHILD(n, 1)))) == NULL) {
2320 c->c_errors++;
2321 return;
2322 }
2323 /* Push the class name on the stack */
2324 i = com_addconst(c, v);
2325 com_addoparg(c, LOAD_CONST, i);
2326 DECREF(v);
2327 /* Push the tuple of base classes on the stack */
2328 if (TYPE(CHILD(n, 2)) != LPAR)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002329 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum25831651993-05-19 14:50:45 +00002330 else
2331 com_bases(c, CHILD(n, 3));
Guido van Rossum590baa41993-11-30 13:40:46 +00002332 v = (object *)compile(n, c->c_filename);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002333 if (v == NULL)
2334 c->c_errors++;
2335 else {
Guido van Rossum25831651993-05-19 14:50:45 +00002336 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002337 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002338 com_addoparg(c, MAKE_FUNCTION, 0);
2339 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002340 com_addbyte(c, BUILD_CLASS);
2341 com_addopname(c, STORE_NAME, CHILD(n, 1));
2342 DECREF(v);
2343 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002344}
2345
2346static void
2347com_node(c, n)
2348 struct compiling *c;
2349 node *n;
2350{
2351 switch (TYPE(n)) {
2352
2353 /* Definition nodes */
2354
2355 case funcdef:
2356 com_funcdef(c, n);
2357 break;
2358 case classdef:
2359 com_classdef(c, n);
2360 break;
2361
2362 /* Trivial parse tree nodes */
2363
2364 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002365 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002366 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002367 com_node(c, CHILD(n, 0));
2368 break;
2369
2370 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002371 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
2372 com_addoparg(c, SET_LINENO, n->n_lineno);
2373 {
2374 int i;
2375 for (i = 0; i < NCH(n)-1; i += 2)
2376 com_node(c, CHILD(n, i));
2377 }
2378 break;
2379
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002380 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002381 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002382 com_node(c, CHILD(n, 0));
2383 break;
2384
2385 /* Statement nodes */
2386
2387 case expr_stmt:
2388 com_expr_stmt(c, n);
2389 break;
2390 case print_stmt:
2391 com_print_stmt(c, n);
2392 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002393 case del_stmt: /* 'del' exprlist */
Guido van Rossum8861b741996-07-30 16:49:37 +00002394 com_assign(c, CHILD(n, 1), OP_DELETE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002395 break;
2396 case pass_stmt:
2397 break;
2398 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002399 if (c->c_loops == 0) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00002400 err_setstr(SyntaxError, "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002401 c->c_errors++;
2402 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002403 com_addbyte(c, BREAK_LOOP);
2404 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002405 case continue_stmt:
2406 com_continue_stmt(c, n);
2407 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002408 case return_stmt:
2409 com_return_stmt(c, n);
2410 break;
2411 case raise_stmt:
2412 com_raise_stmt(c, n);
2413 break;
2414 case import_stmt:
2415 com_import_stmt(c, n);
2416 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002417 case global_stmt:
2418 com_global_stmt(c, n);
2419 break;
Guido van Rossum25831651993-05-19 14:50:45 +00002420 case access_stmt:
2421 com_access_stmt(c, n);
2422 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002423 case exec_stmt:
2424 com_exec_stmt(c, n);
2425 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002426 case if_stmt:
2427 com_if_stmt(c, n);
2428 break;
2429 case while_stmt:
2430 com_while_stmt(c, n);
2431 break;
2432 case for_stmt:
2433 com_for_stmt(c, n);
2434 break;
2435 case try_stmt:
2436 com_try_stmt(c, n);
2437 break;
2438 case suite:
2439 com_suite(c, n);
2440 break;
2441
2442 /* Expression nodes */
2443
2444 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002445 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002446 break;
2447 case test:
2448 com_test(c, n);
2449 break;
2450 case and_test:
2451 com_and_test(c, n);
2452 break;
2453 case not_test:
2454 com_not_test(c, n);
2455 break;
2456 case comparison:
2457 com_comparison(c, n);
2458 break;
2459 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002460 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002461 break;
2462 case expr:
2463 com_expr(c, n);
2464 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002465 case xor_expr:
2466 com_xor_expr(c, n);
2467 break;
2468 case and_expr:
2469 com_and_expr(c, n);
2470 break;
2471 case shift_expr:
2472 com_shift_expr(c, n);
2473 break;
2474 case arith_expr:
2475 com_arith_expr(c, n);
2476 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002477 case term:
2478 com_term(c, n);
2479 break;
2480 case factor:
2481 com_factor(c, n);
2482 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00002483 case power:
2484 com_power(c, n);
2485 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002486 case atom:
2487 com_atom(c, n);
2488 break;
2489
2490 default:
2491 fprintf(stderr, "node type %d\n", TYPE(n));
2492 err_setstr(SystemError, "com_node: unexpected node type");
2493 c->c_errors++;
2494 }
2495}
2496
2497static void com_fplist PROTO((struct compiling *, node *));
2498
2499static void
2500com_fpdef(c, n)
2501 struct compiling *c;
2502 node *n;
2503{
2504 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
2505 if (TYPE(CHILD(n, 0)) == LPAR)
2506 com_fplist(c, CHILD(n, 1));
2507 else
Guido van Rossum681d79a1995-07-18 14:51:37 +00002508 com_addoparg(c, STORE_FAST, com_newlocal(c, STR(CHILD(n, 0))));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002509}
2510
2511static void
2512com_fplist(c, n)
2513 struct compiling *c;
2514 node *n;
2515{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00002516 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002517 if (NCH(n) == 1) {
2518 com_fpdef(c, CHILD(n, 0));
2519 }
2520 else {
2521 int i;
2522 com_addoparg(c, UNPACK_TUPLE, (NCH(n)+1)/2);
2523 for (i = 0; i < NCH(n); i += 2)
2524 com_fpdef(c, CHILD(n, i));
2525 }
2526}
2527
2528static void
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002529com_arglist(c, n)
2530 struct compiling *c;
2531 node *n;
2532{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002533 int nch, i;
2534 int complex = 0;
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002535 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00002536 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002537 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002538 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002539 /* Enter all arguments in table of locals */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002540 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002541 node *ch = CHILD(n, i);
2542 node *fp;
2543 char *name;
Guido van Rossum50564e81996-01-12 01:13:16 +00002544 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002545 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002546 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
2547 fp = CHILD(ch, 0);
2548 if (TYPE(fp) == NAME)
2549 name = STR(fp);
2550 else {
2551 name = "";
Guido van Rossum530956d1996-07-21 02:27:43 +00002552 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002553 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002554 com_newlocal(c, name);
2555 c->c_argcount++;
2556 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002557 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002558 ch = CHILD(n, i);
2559 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002560 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002561 else
2562 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002563 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002564 /* Handle *arguments */
2565 if (i < nch) {
2566 node *ch;
2567 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00002568 if (TYPE(ch) != DOUBLESTAR) {
2569 REQ(ch, STAR);
2570 ch = CHILD(n, i+1);
2571 if (TYPE(ch) == NAME) {
2572 c->c_flags |= CO_VARARGS;
2573 i += 3;
2574 com_newlocal(c, STR(ch));
2575 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002576 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002577 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002578 /* Handle **keywords */
2579 if (i < nch) {
2580 node *ch;
2581 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00002582 if (TYPE(ch) != DOUBLESTAR) {
2583 REQ(ch, STAR);
2584 ch = CHILD(n, i+1);
2585 REQ(ch, STAR);
2586 ch = CHILD(n, i+2);
2587 }
2588 else
2589 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002590 REQ(ch, NAME);
2591 c->c_flags |= CO_VARKEYWORDS;
2592 com_newlocal(c, STR(ch));
2593 }
2594 if (complex) {
2595 /* Generate code for complex arguments only after
2596 having counted the simple arguments */
2597 int ilocal = 0;
2598 for (i = 0; i < nch; i++) {
2599 node *ch = CHILD(n, i);
2600 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00002601 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002602 break;
2603 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
2604 fp = CHILD(ch, 0);
2605 if (TYPE(fp) != NAME) {
2606 com_addoparg(c, LOAD_FAST, ilocal);
2607 com_fpdef(c, ch);
2608 }
2609 ilocal++;
2610 if (++i >= nch)
2611 break;
2612 ch = CHILD(n, i);
2613 if (TYPE(ch) == EQUAL)
2614 i += 2;
2615 else
2616 REQ(ch, COMMA);
2617 }
2618 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002619}
2620
2621static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002622com_file_input(c, n)
2623 struct compiling *c;
2624 node *n;
2625{
2626 int i;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002627 object *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002628 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002629 doc = get_docstring(n);
2630 if (doc != NULL) {
2631 int i = com_addconst(c, doc);
2632 DECREF(doc);
2633 com_addoparg(c, LOAD_CONST, i);
2634 com_addopnamestr(c, STORE_NAME, "__doc__");
2635 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002636 for (i = 0; i < NCH(n); i++) {
2637 node *ch = CHILD(n, i);
2638 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
2639 com_node(c, ch);
2640 }
2641}
2642
2643/* Top-level compile-node interface */
2644
2645static void
2646compile_funcdef(c, n)
2647 struct compiling *c;
2648 node *n;
2649{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002650 object *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002651 node *ch;
2652 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00002653 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002654 doc = get_docstring(CHILD(n, 4));
2655 if (doc != NULL) {
2656 (void) com_addconst(c, doc);
2657 DECREF(doc);
2658 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002659 else
2660 (void) com_addconst(c, None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002661 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
2662 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00002663 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002664 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002665 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002666 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002667 c->c_infunction = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002668 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2669 com_addbyte(c, RETURN_VALUE);
2670}
2671
2672static void
Guido van Rossum590baa41993-11-30 13:40:46 +00002673compile_lambdef(c, n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002674 struct compiling *c;
2675 node *n;
2676{
Guido van Rossum590baa41993-11-30 13:40:46 +00002677 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002678 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00002679 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00002680
2681 ch = CHILD(n, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002682 (void) com_addconst(c, None); /* No docstring */
2683 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00002684 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002685 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00002686 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002687 else
2688 ch = CHILD(n, 2);
2689 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002690 com_addbyte(c, RETURN_VALUE);
2691}
2692
2693static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002694compile_classdef(c, n)
2695 struct compiling *c;
2696 node *n;
2697{
2698 node *ch;
2699 object *doc;
2700 REQ(n, classdef);
2701 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
2702 c->c_name = STR(CHILD(n, 1));
2703 ch = CHILD(n, NCH(n)-1); /* The suite */
2704 doc = get_docstring(ch);
2705 if (doc != NULL) {
2706 int i = com_addconst(c, doc);
2707 DECREF(doc);
2708 com_addoparg(c, LOAD_CONST, i);
2709 com_addopnamestr(c, STORE_NAME, "__doc__");
2710 }
2711 else
2712 (void) com_addconst(c, None);
2713 com_node(c, ch);
2714 com_addbyte(c, LOAD_LOCALS);
2715 com_addbyte(c, RETURN_VALUE);
2716}
2717
2718static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002719compile_node(c, n)
2720 struct compiling *c;
2721 node *n;
2722{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002723 com_addoparg(c, SET_LINENO, n->n_lineno);
2724
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002725 switch (TYPE(n)) {
2726
Guido van Rossum4c417781991-01-21 16:09:22 +00002727 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002728 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002729 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002730 n = CHILD(n, 0);
2731 if (TYPE(n) != NEWLINE)
2732 com_node(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002733 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2734 com_addbyte(c, RETURN_VALUE);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002735 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002736 break;
2737
Guido van Rossum4c417781991-01-21 16:09:22 +00002738 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002739 com_file_input(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002740 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2741 com_addbyte(c, RETURN_VALUE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002742 break;
2743
Guido van Rossum590baa41993-11-30 13:40:46 +00002744 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00002745 com_node(c, CHILD(n, 0));
2746 com_addbyte(c, RETURN_VALUE);
2747 break;
2748
Guido van Rossum590baa41993-11-30 13:40:46 +00002749 case lambdef: /* anonymous function definition */
2750 compile_lambdef(c, n);
2751 break;
2752
Guido van Rossum4c417781991-01-21 16:09:22 +00002753 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002754 compile_funcdef(c, n);
2755 break;
2756
Guido van Rossum4c417781991-01-21 16:09:22 +00002757 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002758 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002759 break;
2760
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002761 default:
2762 fprintf(stderr, "node type %d\n", TYPE(n));
2763 err_setstr(SystemError, "compile_node: unexpected node type");
2764 c->c_errors++;
2765 }
2766}
2767
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002768/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00002769
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002770 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
2771 instructions that refer to local variables with LOAD_FAST etc.
2772 The latter instructions are much faster because they don't need to
2773 look up the variable name in a dictionary.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002774
Guido van Rossum681d79a1995-07-18 14:51:37 +00002775 To find all local variables, we check all STORE_NAME, IMPORT_FROM
2776 and DELETE_NAME instructions. This yields all local variables,
2777 function definitions, class definitions and import statements.
2778 Argument names have already been entered into the list by the
2779 special processing for the argument list.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002780
2781 All remaining LOAD_NAME instructions must refer to non-local (global
2782 or builtin) variables, so are replaced by LOAD_GLOBAL.
2783
2784 There are two problems: 'from foo import *' and 'exec' may introduce
2785 local variables that we can't know while compiling. If this is the
Guido van Rossum681d79a1995-07-18 14:51:37 +00002786 case, we can still optimize bona fide locals (since those
2787 statements will be surrounded by fast_2_locals() and
2788 locals_2_fast()), but we can't change LOAD_NAME to LOAD_GLOBAL.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002789
Guido van Rossum681d79a1995-07-18 14:51:37 +00002790 NB: this modifies the string object c->c_code! */
Guido van Rossum282914b1991-04-04 10:42:56 +00002791
2792static void
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002793optimize(c)
2794 struct compiling *c;
Guido van Rossum282914b1991-04-04 10:42:56 +00002795{
Guido van Rossum0a697f61991-04-16 08:39:12 +00002796 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00002797 int opcode;
2798 int oparg;
2799 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002800 object *error_type, *error_value, *error_traceback;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002801
Guido van Rossum282914b1991-04-04 10:42:56 +00002802#define NEXTOP() (*next_instr++)
2803#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
2804#define GETITEM(v, i) (getlistitem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002805#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
2806
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002807 err_fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002808
2809 c->c_flags |= CO_OPTIMIZED;
Guido van Rossum282914b1991-04-04 10:42:56 +00002810
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002811 next_instr = (unsigned char *) getstringvalue(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00002812 for (;;) {
2813 opcode = NEXTOP();
2814 if (opcode == STOP_CODE)
2815 break;
2816 if (HAS_ARG(opcode))
2817 oparg = NEXTARG();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002818 switch (opcode) {
2819 case STORE_NAME:
2820 case DELETE_NAME:
2821 case IMPORT_FROM:
2822 com_addlocal_o(c, GETNAMEOBJ(oparg));
2823 break;
2824 case EXEC_STMT:
2825 c->c_flags &= ~CO_OPTIMIZED;
2826 break;
Guido van Rossum282914b1991-04-04 10:42:56 +00002827 }
2828 }
2829
Guido van Rossum681d79a1995-07-18 14:51:37 +00002830 if (dictlookup(c->c_locals, "*") != NULL)
2831 c->c_flags &= ~CO_OPTIMIZED;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002832
2833 next_instr = (unsigned char *) getstringvalue(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00002834 for (;;) {
2835 cur_instr = next_instr;
2836 opcode = NEXTOP();
2837 if (opcode == STOP_CODE)
2838 break;
2839 if (HAS_ARG(opcode))
2840 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002841 if (opcode == LOAD_NAME ||
2842 opcode == STORE_NAME ||
2843 opcode == DELETE_NAME) {
2844 object *v;
2845 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00002846 name = GETNAMEOBJ(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002847 v = dict2lookup(c->c_locals, name);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002848 if (v == NULL) {
Guido van Rossum83163251991-08-16 08:58:43 +00002849 err_clear();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002850 if (opcode == LOAD_NAME &&
2851 (c->c_flags&CO_OPTIMIZED))
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002852 cur_instr[0] = LOAD_GLOBAL;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002853 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00002854 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002855 i = getintvalue(v);
2856 switch (opcode) {
2857 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
2858 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
2859 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
2860 }
2861 cur_instr[1] = i & 0xff;
2862 cur_instr[2] = (i>>8) & 0xff;
Guido van Rossum282914b1991-04-04 10:42:56 +00002863 }
2864 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002865
Guido van Rossum681d79a1995-07-18 14:51:37 +00002866 if (c->c_errors == 0)
2867 err_restore(error_type, error_value, error_traceback);
Guido van Rossum282914b1991-04-04 10:42:56 +00002868}
2869
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002870codeobject *
Guido van Rossum590baa41993-11-30 13:40:46 +00002871compile(n, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002872 node *n;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002873 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002874{
2875 struct compiling sc;
2876 codeobject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00002877 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002878 return NULL;
2879 compile_node(&sc, n);
2880 com_done(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002881 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002882 optimize(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002883 sc.c_flags |= CO_NEWLOCALS;
2884 }
2885 else if (TYPE(n) == classdef)
2886 sc.c_flags |= CO_NEWLOCALS;
Guido van Rossum9bfef441993-03-29 10:43:31 +00002887 co = NULL;
2888 if (sc.c_errors == 0) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002889 object *consts, *names, *varnames, *filename, *name;
2890 consts = listtuple(sc.c_consts);
2891 names = listtuple(sc.c_names);
2892 varnames = listtuple(sc.c_varnames);
2893 filename = newstringobject(sc.c_filename);
2894 name = newstringobject(sc.c_name);
2895 if (!err_occurred())
2896 co = newcodeobject(sc.c_argcount,
2897 sc.c_nlocals,
2898 sc.c_flags,
2899 sc.c_code,
2900 consts,
2901 names,
2902 varnames,
2903 filename,
2904 name);
2905 XDECREF(consts);
2906 XDECREF(names);
2907 XDECREF(varnames);
2908 XDECREF(filename);
2909 XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00002910 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002911 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002912 return co;
2913}