blob: cf2d0bba57685d7adbfb57285eb51247da4d2d73 [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 Rossum10dc2e81990-11-18 17:27:39 +00001053 REQ(n, factor);
1054 if (TYPE(CHILD(n, 0)) == PLUS) {
1055 com_factor(c, CHILD(n, 1));
1056 com_addbyte(c, UNARY_POSITIVE);
1057 }
1058 else if (TYPE(CHILD(n, 0)) == MINUS) {
1059 com_factor(c, CHILD(n, 1));
1060 com_addbyte(c, UNARY_NEGATIVE);
1061 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001062 else if (TYPE(CHILD(n, 0)) == TILDE) {
1063 com_factor(c, CHILD(n, 1));
1064 com_addbyte(c, UNARY_INVERT);
1065 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001066 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001067 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001068 }
1069}
1070
1071static void
1072com_term(c, n)
1073 struct compiling *c;
1074 node *n;
1075{
1076 int i;
1077 int op;
1078 REQ(n, term);
1079 com_factor(c, CHILD(n, 0));
1080 for (i = 2; i < NCH(n); i += 2) {
1081 com_factor(c, CHILD(n, i));
1082 switch (TYPE(CHILD(n, i-1))) {
1083 case STAR:
1084 op = BINARY_MULTIPLY;
1085 break;
1086 case SLASH:
1087 op = BINARY_DIVIDE;
1088 break;
1089 case PERCENT:
1090 op = BINARY_MODULO;
1091 break;
1092 default:
1093 err_setstr(SystemError,
Guido van Rossum7928cd71991-10-24 14:59:31 +00001094 "com_term: operator not *, / or %");
1095 c->c_errors++;
1096 op = 255;
1097 }
1098 com_addbyte(c, op);
1099 }
1100}
1101
1102static void
1103com_arith_expr(c, n)
1104 struct compiling *c;
1105 node *n;
1106{
1107 int i;
1108 int op;
1109 REQ(n, arith_expr);
1110 com_term(c, CHILD(n, 0));
1111 for (i = 2; i < NCH(n); i += 2) {
1112 com_term(c, CHILD(n, i));
1113 switch (TYPE(CHILD(n, i-1))) {
1114 case PLUS:
1115 op = BINARY_ADD;
1116 break;
1117 case MINUS:
1118 op = BINARY_SUBTRACT;
1119 break;
1120 default:
1121 err_setstr(SystemError,
1122 "com_arith_expr: operator not + or -");
1123 c->c_errors++;
1124 op = 255;
1125 }
1126 com_addbyte(c, op);
1127 }
1128}
1129
1130static void
1131com_shift_expr(c, n)
1132 struct compiling *c;
1133 node *n;
1134{
1135 int i;
1136 int op;
1137 REQ(n, shift_expr);
1138 com_arith_expr(c, CHILD(n, 0));
1139 for (i = 2; i < NCH(n); i += 2) {
1140 com_arith_expr(c, CHILD(n, i));
1141 switch (TYPE(CHILD(n, i-1))) {
1142 case LEFTSHIFT:
1143 op = BINARY_LSHIFT;
1144 break;
1145 case RIGHTSHIFT:
1146 op = BINARY_RSHIFT;
1147 break;
1148 default:
1149 err_setstr(SystemError,
1150 "com_shift_expr: operator not << or >>");
1151 c->c_errors++;
1152 op = 255;
1153 }
1154 com_addbyte(c, op);
1155 }
1156}
1157
1158static void
1159com_and_expr(c, n)
1160 struct compiling *c;
1161 node *n;
1162{
1163 int i;
1164 int op;
1165 REQ(n, and_expr);
1166 com_shift_expr(c, CHILD(n, 0));
1167 for (i = 2; i < NCH(n); i += 2) {
1168 com_shift_expr(c, CHILD(n, i));
1169 if (TYPE(CHILD(n, i-1)) == AMPER) {
1170 op = BINARY_AND;
1171 }
1172 else {
1173 err_setstr(SystemError,
1174 "com_and_expr: operator not &");
1175 c->c_errors++;
1176 op = 255;
1177 }
1178 com_addbyte(c, op);
1179 }
1180}
1181
1182static void
1183com_xor_expr(c, n)
1184 struct compiling *c;
1185 node *n;
1186{
1187 int i;
1188 int op;
1189 REQ(n, xor_expr);
1190 com_and_expr(c, CHILD(n, 0));
1191 for (i = 2; i < NCH(n); i += 2) {
1192 com_and_expr(c, CHILD(n, i));
1193 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1194 op = BINARY_XOR;
1195 }
1196 else {
1197 err_setstr(SystemError,
1198 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001199 c->c_errors++;
1200 op = 255;
1201 }
1202 com_addbyte(c, op);
1203 }
1204}
1205
1206static void
1207com_expr(c, n)
1208 struct compiling *c;
1209 node *n;
1210{
1211 int i;
1212 int op;
1213 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001214 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001215 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001216 com_xor_expr(c, CHILD(n, i));
1217 if (TYPE(CHILD(n, i-1)) == VBAR) {
1218 op = BINARY_OR;
1219 }
1220 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001221 err_setstr(SystemError,
Guido van Rossum7928cd71991-10-24 14:59:31 +00001222 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001223 c->c_errors++;
1224 op = 255;
1225 }
1226 com_addbyte(c, op);
1227 }
1228}
1229
1230static enum cmp_op
1231cmp_type(n)
1232 node *n;
1233{
1234 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001235 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001236 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1237 if (NCH(n) == 1) {
1238 n = CHILD(n, 0);
1239 switch (TYPE(n)) {
1240 case LESS: return LT;
1241 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001242 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001243 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001244 case LESSEQUAL: return LE;
1245 case GREATEREQUAL: return GE;
1246 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001247 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1248 if (strcmp(STR(n), "is") == 0) return IS;
1249 }
1250 }
1251 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001252 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001253 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1254 return NOT_IN;
1255 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1256 return IS_NOT;
1257 }
1258 }
1259 return BAD;
1260}
1261
1262static void
1263com_comparison(c, n)
1264 struct compiling *c;
1265 node *n;
1266{
1267 int i;
1268 enum cmp_op op;
1269 int anchor;
1270 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
1271 com_expr(c, CHILD(n, 0));
1272 if (NCH(n) == 1)
1273 return;
1274
1275 /****************************************************************
1276 The following code is generated for all but the last
1277 comparison in a chain:
1278
1279 label: on stack: opcode: jump to:
1280
1281 a <code to load b>
1282 a, b DUP_TOP
1283 a, b, b ROT_THREE
1284 b, a, b COMPARE_OP
1285 b, 0-or-1 JUMP_IF_FALSE L1
1286 b, 1 POP_TOP
1287 b
1288
1289 We are now ready to repeat this sequence for the next
1290 comparison in the chain.
1291
1292 For the last we generate:
1293
1294 b <code to load c>
1295 b, c COMPARE_OP
1296 0-or-1
1297
1298 If there were any jumps to L1 (i.e., there was more than one
1299 comparison), we generate:
1300
1301 0-or-1 JUMP_FORWARD L2
1302 L1: b, 0 ROT_TWO
1303 0, b POP_TOP
1304 0
1305 L2:
1306 ****************************************************************/
1307
1308 anchor = 0;
1309
1310 for (i = 2; i < NCH(n); i += 2) {
1311 com_expr(c, CHILD(n, i));
1312 if (i+2 < NCH(n)) {
1313 com_addbyte(c, DUP_TOP);
1314 com_addbyte(c, ROT_THREE);
1315 }
1316 op = cmp_type(CHILD(n, i-1));
1317 if (op == BAD) {
1318 err_setstr(SystemError,
1319 "com_comparison: unknown comparison op");
1320 c->c_errors++;
1321 }
1322 com_addoparg(c, COMPARE_OP, op);
1323 if (i+2 < NCH(n)) {
1324 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1325 com_addbyte(c, POP_TOP);
1326 }
1327 }
1328
1329 if (anchor) {
1330 int anchor2 = 0;
1331 com_addfwref(c, JUMP_FORWARD, &anchor2);
1332 com_backpatch(c, anchor);
1333 com_addbyte(c, ROT_TWO);
1334 com_addbyte(c, POP_TOP);
1335 com_backpatch(c, anchor2);
1336 }
1337}
1338
1339static void
1340com_not_test(c, n)
1341 struct compiling *c;
1342 node *n;
1343{
1344 REQ(n, not_test); /* 'not' not_test | comparison */
1345 if (NCH(n) == 1) {
1346 com_comparison(c, CHILD(n, 0));
1347 }
1348 else {
1349 com_not_test(c, CHILD(n, 1));
1350 com_addbyte(c, UNARY_NOT);
1351 }
1352}
1353
1354static void
1355com_and_test(c, n)
1356 struct compiling *c;
1357 node *n;
1358{
1359 int i;
1360 int anchor;
1361 REQ(n, and_test); /* not_test ('and' not_test)* */
1362 anchor = 0;
1363 i = 0;
1364 for (;;) {
1365 com_not_test(c, CHILD(n, i));
1366 if ((i += 2) >= NCH(n))
1367 break;
1368 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1369 com_addbyte(c, POP_TOP);
1370 }
1371 if (anchor)
1372 com_backpatch(c, anchor);
1373}
1374
1375static void
1376com_test(c, n)
1377 struct compiling *c;
1378 node *n;
1379{
Guido van Rossum57531fe1993-11-30 14:57:42 +00001380 REQ(n, test); /* and_test ('and' and_test)* | lambdef */
1381 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
1382 object *v;
1383 int i;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001384 int ndefs = com_argdefs(c, CHILD(n, 0));
Guido van Rossum57531fe1993-11-30 14:57:42 +00001385 v = (object *) compile(CHILD(n, 0), c->c_filename);
1386 if (v == NULL) {
1387 c->c_errors++;
1388 i = 255;
1389 }
1390 else {
1391 i = com_addconst(c, v);
1392 DECREF(v);
1393 }
1394 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001395 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001396 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00001397 else {
1398 int anchor = 0;
1399 int i = 0;
1400 for (;;) {
1401 com_and_test(c, CHILD(n, i));
1402 if ((i += 2) >= NCH(n))
1403 break;
1404 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1405 com_addbyte(c, POP_TOP);
1406 }
1407 if (anchor)
1408 com_backpatch(c, anchor);
1409 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001410}
1411
1412static void
Guido van Rossum288a60f1991-12-16 13:05:10 +00001413com_list(c, n, toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001414 struct compiling *c;
1415 node *n;
Guido van Rossum288a60f1991-12-16 13:05:10 +00001416 int toplevel; /* If nonzero, *always* build a tuple */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001417{
1418 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001419 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001420 com_node(c, CHILD(n, 0));
1421 }
1422 else {
1423 int i;
1424 int len;
1425 len = (NCH(n) + 1) / 2;
1426 for (i = 0; i < NCH(n); i += 2)
1427 com_node(c, CHILD(n, i));
1428 com_addoparg(c, BUILD_TUPLE, len);
1429 }
1430}
1431
1432
1433/* Begin of assignment compilation */
1434
1435static void com_assign_name PROTO((struct compiling *, node *, int));
1436static void com_assign PROTO((struct compiling *, node *, int));
1437
1438static void
1439com_assign_attr(c, n, assigning)
1440 struct compiling *c;
1441 node *n;
1442 int assigning;
1443{
1444 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
1445}
1446
1447static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001448com_assign_trailer(c, n, assigning)
1449 struct compiling *c;
1450 node *n;
1451 int assigning;
1452{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001453 REQ(n, trailer);
1454 switch (TYPE(CHILD(n, 0))) {
1455 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001456 err_setstr(SyntaxError, "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001457 c->c_errors++;
1458 break;
1459 case DOT: /* '.' NAME */
1460 com_assign_attr(c, CHILD(n, 1), assigning);
1461 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001462 case LSQB: /* '[' subscriptlist ']' */
1463 com_subscriptlist(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001464 break;
1465 default:
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001466 err_setstr(SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001467 c->c_errors++;
1468 }
1469}
1470
1471static void
1472com_assign_tuple(c, n, assigning)
1473 struct compiling *c;
1474 node *n;
1475 int assigning;
1476{
1477 int i;
1478 if (TYPE(n) != testlist)
1479 REQ(n, exprlist);
1480 if (assigning)
1481 com_addoparg(c, UNPACK_TUPLE, (NCH(n)+1)/2);
1482 for (i = 0; i < NCH(n); i += 2)
1483 com_assign(c, CHILD(n, i), assigning);
1484}
1485
1486static void
1487com_assign_list(c, n, assigning)
1488 struct compiling *c;
1489 node *n;
1490 int assigning;
1491{
1492 int i;
1493 if (assigning)
1494 com_addoparg(c, UNPACK_LIST, (NCH(n)+1)/2);
1495 for (i = 0; i < NCH(n); i += 2)
1496 com_assign(c, CHILD(n, i), assigning);
1497}
1498
1499static void
1500com_assign_name(c, n, assigning)
1501 struct compiling *c;
1502 node *n;
1503 int assigning;
1504{
1505 REQ(n, NAME);
1506 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
1507}
1508
1509static void
1510com_assign(c, n, assigning)
1511 struct compiling *c;
1512 node *n;
1513 int assigning;
1514{
1515 /* Loop to avoid trivial recursion */
1516 for (;;) {
1517 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001518
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001519 case exprlist:
1520 case testlist:
1521 if (NCH(n) > 1) {
1522 com_assign_tuple(c, n, assigning);
1523 return;
1524 }
1525 n = CHILD(n, 0);
1526 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001527
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001528 case test:
1529 case and_test:
1530 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001531 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001532 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001533 case xor_expr:
1534 case and_expr:
1535 case shift_expr:
1536 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001537 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00001538 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001539 if (NCH(n) > 1) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001540 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001541 "can't assign to operator");
1542 c->c_errors++;
1543 return;
1544 }
1545 n = CHILD(n, 0);
1546 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001547
Guido van Rossum50564e81996-01-12 01:13:16 +00001548 case power: /* atom trailer* ('**' power)* */
1549/* ('+'|'-'|'~') factor | atom trailer* */
1550 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001551 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001552 "can't assign to operator");
1553 c->c_errors++;
1554 return;
1555 }
Guido van Rossum50564e81996-01-12 01:13:16 +00001556 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001557 int i;
1558 com_node(c, CHILD(n, 0));
1559 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00001560 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1561 err_setstr(SyntaxError,
1562 "can't assign to operator");
1563 c->c_errors++;
1564 return;
1565 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001566 com_apply_trailer(c, CHILD(n, i));
1567 } /* NB i is still alive */
1568 com_assign_trailer(c,
1569 CHILD(n, i), assigning);
1570 return;
1571 }
1572 n = CHILD(n, 0);
1573 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001574
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001575 case atom:
1576 switch (TYPE(CHILD(n, 0))) {
1577 case LPAR:
1578 n = CHILD(n, 1);
1579 if (TYPE(n) == RPAR) {
1580 /* XXX Should allow () = () ??? */
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001581 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001582 "can't assign to ()");
1583 c->c_errors++;
1584 return;
1585 }
1586 break;
1587 case LSQB:
1588 n = CHILD(n, 1);
1589 if (TYPE(n) == RSQB) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001590 err_setstr(SyntaxError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001591 "can't assign to []");
1592 c->c_errors++;
1593 return;
1594 }
1595 com_assign_list(c, n, assigning);
1596 return;
1597 case NAME:
1598 com_assign_name(c, CHILD(n, 0), assigning);
1599 return;
1600 default:
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001601 err_setstr(SyntaxError,
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001602 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001603 c->c_errors++;
1604 return;
1605 }
1606 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001607
1608 case lambdef:
1609 err_setstr(SyntaxError, "can't assign to lambda");
1610 c->c_errors++;
1611 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001612
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001613 default:
1614 fprintf(stderr, "node type %d\n", TYPE(n));
1615 err_setstr(SystemError, "com_assign: bad node");
1616 c->c_errors++;
1617 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001618
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001619 }
1620 }
1621}
1622
1623static void
1624com_expr_stmt(c, n)
1625 struct compiling *c;
1626 node *n;
1627{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001628 REQ(n, expr_stmt); /* testlist ('=' testlist)* */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001629 com_node(c, CHILD(n, NCH(n)-1));
1630 if (NCH(n) == 1) {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001631 if (c->c_interactive)
1632 com_addbyte(c, PRINT_EXPR);
1633 else
1634 com_addbyte(c, POP_TOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001635 }
1636 else {
1637 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001638 for (i = 0; i < NCH(n)-2; i+=2) {
1639 if (i+2 < NCH(n)-2)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001640 com_addbyte(c, DUP_TOP);
Guido van Rossum8861b741996-07-30 16:49:37 +00001641 com_assign(c, CHILD(n, i), OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001642 }
1643 }
1644}
1645
1646static void
1647com_print_stmt(c, n)
1648 struct compiling *c;
1649 node *n;
1650{
1651 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001652 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
1653 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001654 com_node(c, CHILD(n, i));
1655 com_addbyte(c, PRINT_ITEM);
1656 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001657 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001658 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001659 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001660}
1661
1662static void
1663com_return_stmt(c, n)
1664 struct compiling *c;
1665 node *n;
1666{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001667 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001668 if (!c->c_infunction) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00001669 err_setstr(SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001670 c->c_errors++;
1671 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001672 if (NCH(n) < 2)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001673 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1674 else
1675 com_node(c, CHILD(n, 1));
1676 com_addbyte(c, RETURN_VALUE);
1677}
1678
1679static void
1680com_raise_stmt(c, n)
1681 struct compiling *c;
1682 node *n;
1683{
Guido van Rossumf10570b1995-07-07 22:53:21 +00001684 REQ(n, raise_stmt); /* 'raise' test [',' test [',' test]] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001685 com_node(c, CHILD(n, 1));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001686 if (NCH(n) > 3) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001687 com_node(c, CHILD(n, 3));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001688 if (NCH(n) > 5)
1689 com_node(c, CHILD(n, 5));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001690 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001691 com_addoparg(c, RAISE_VARARGS, NCH(n)/2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001692}
1693
1694static void
1695com_import_stmt(c, n)
1696 struct compiling *c;
1697 node *n;
1698{
1699 int i;
1700 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001701 /* 'import' dotted_name (',' dotted_name)* |
1702 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001703 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001704 /* 'from' dotted_name 'import' ... */
1705 REQ(CHILD(n, 1), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001706 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
1707 for (i = 3; i < NCH(n); i += 2)
1708 com_addopname(c, IMPORT_FROM, CHILD(n, i));
1709 com_addbyte(c, POP_TOP);
1710 }
1711 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001712 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001713 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001714 REQ(CHILD(n, i), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001715 com_addopname(c, IMPORT_NAME, CHILD(n, i));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001716 com_addopname(c, STORE_NAME, CHILD(CHILD(n, i), 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001717 }
1718 }
1719}
1720
1721static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00001722com_global_stmt(c, n)
1723 struct compiling *c;
1724 node *n;
1725{
1726 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001727 REQ(n, global_stmt);
1728 /* 'global' NAME (',' NAME)* */
1729 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001730 char *s = STR(CHILD(n, i));
1731 if (dictlookup(c->c_locals, s) != NULL) {
1732 err_setstr(SyntaxError, "name is local and global");
1733 c->c_errors++;
1734 }
1735 else if (dictinsert(c->c_globals, s, None) != 0)
Guido van Rossumc5e96291991-12-10 13:53:51 +00001736 c->c_errors++;
1737 }
1738}
1739
Guido van Rossum681d79a1995-07-18 14:51:37 +00001740static int
1741com_newlocal_o(c, nameval)
1742 struct compiling *c;
1743 object *nameval;
1744{
1745 int i;
1746 object *ival;
1747 if (getlistsize(c->c_varnames) != c->c_nlocals) {
1748 /* This is usually caused by an error on a previous call */
1749 if (c->c_errors == 0) {
1750 err_setstr(SystemError, "mixed up var name/index");
1751 c->c_errors++;
1752 }
1753 return 0;
1754 }
1755 ival = newintobject(i = c->c_nlocals++);
1756 if (ival == NULL)
1757 c->c_errors++;
1758 else if (mappinginsert(c->c_locals, nameval, ival) != 0)
1759 c->c_errors++;
1760 else if (addlistitem(c->c_varnames, nameval) != 0)
1761 c->c_errors++;
1762 XDECREF(ival);
1763 return i;
1764}
1765
1766static int
1767com_addlocal_o(c, nameval)
1768 struct compiling *c;
1769 object *nameval;
1770{
1771 object *ival = mappinglookup(c->c_locals, nameval);
1772 if (ival != NULL)
1773 return getintvalue(ival);
1774 return com_newlocal_o(c, nameval);
1775}
1776
1777static int
1778com_newlocal(c, name)
1779 struct compiling *c;
1780 char *name;
1781{
1782 object *nameval = newstringobject(name);
1783 int i;
1784 if (nameval == NULL) {
1785 c->c_errors++;
1786 return 0;
1787 }
1788 i = com_newlocal_o(c, nameval);
1789 DECREF(nameval);
1790 return i;
1791}
1792
Guido van Rossum25831651993-05-19 14:50:45 +00001793#define strequ(a, b) (strcmp((a), (b)) == 0)
1794
1795static void
1796com_access_stmt(c, n)
1797 struct compiling *c;
1798 node *n;
1799{
Guido van Rossum53f45241995-10-08 00:42:46 +00001800#if 0
Guido van Rossum25831651993-05-19 14:50:45 +00001801 int i, j, k, mode, imode;
1802 object *vmode;
1803 REQ(n, access_stmt);
1804 /* 'access' NAME (',' NAME)* ':' accesstype (',' accesstype)*
1805 accesstype: NAME+ */
1806
1807 /* Find where the colon is */
1808 i = 1;
1809 while (TYPE(CHILD(n,i-1)) != COLON)
1810 i += 1;
1811
1812 /* Calculate the mode mask */
1813 mode = 0;
1814 for (j = i; j < NCH(n); j += 2) {
Guido van Rossum81daa321993-05-20 14:24:46 +00001815 int r = 0, w = 0, p = 0;
1816 for (k = 0; k < NCH(CHILD(n,j)); k++) {
Guido van Rossum25831651993-05-19 14:50:45 +00001817 if (strequ(STR(CHILD(CHILD(n,j),k)), "public"))
1818 p = 0;
1819 else if (strequ(STR(CHILD(CHILD(n,j),k)), "protected"))
1820 p = 1;
1821 else if (strequ(STR(CHILD(CHILD(n,j),k)), "private"))
1822 p = 2;
1823 else if (strequ(STR(CHILD(CHILD(n,j),k)), "read"))
1824 r = 1;
1825 else if (strequ(STR(CHILD(CHILD(n,j),k)), "write"))
1826 w = 1;
1827 else /* XXX should make this an exception */
1828 fprintf(stderr, "bad access type %s\n",
1829 STR(CHILD(CHILD(n,j),k)));
1830 }
1831 if (r == 0 && w == 0)
Guido van Rossum81daa321993-05-20 14:24:46 +00001832 r = w = 1;
Guido van Rossum25831651993-05-19 14:50:45 +00001833 if (p == 0) {
1834 if (r == 1) mode |= AC_R_PUBLIC;
1835 if (w == 1) mode |= AC_W_PUBLIC;
1836 } else if (p == 1) {
1837 if (r == 1) mode |= AC_R_PROTECTED;
1838 if (w == 1) mode |= AC_W_PROTECTED;
1839 } else {
1840 if (r == 1) mode |= AC_R_PRIVATE;
1841 if (w == 1) mode |= AC_W_PRIVATE;
1842 }
1843 }
1844 vmode = newintobject((long)mode);
1845 imode = com_addconst(c, vmode);
1846 XDECREF(vmode);
1847 for (i = 1; TYPE(CHILD(n,i-1)) != COLON; i+=2) {
1848 com_addoparg(c, LOAD_CONST, imode);
1849 com_addopname(c, ACCESS_MODE, CHILD(n, i));
1850 }
Guido van Rossum53f45241995-10-08 00:42:46 +00001851#endif
Guido van Rossum25831651993-05-19 14:50:45 +00001852}
1853
Guido van Rossumc5e96291991-12-10 13:53:51 +00001854static void
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001855com_exec_stmt(c, n)
1856 struct compiling *c;
1857 node *n;
1858{
1859 REQ(n, exec_stmt);
1860 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
1861 com_node(c, CHILD(n, 1));
1862 if (NCH(n) >= 4)
1863 com_node(c, CHILD(n, 3));
1864 else
1865 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1866 if (NCH(n) >= 6)
1867 com_node(c, CHILD(n, 5));
1868 else
1869 com_addbyte(c, DUP_TOP);
1870 com_addbyte(c, EXEC_STMT);
1871}
1872
1873static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001874com_if_stmt(c, n)
1875 struct compiling *c;
1876 node *n;
1877{
1878 int i;
1879 int anchor = 0;
1880 REQ(n, if_stmt);
1881 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
1882 for (i = 0; i+3 < NCH(n); i+=4) {
1883 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001884 node *ch = CHILD(n, i+1);
1885 if (i > 0)
1886 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001887 com_node(c, CHILD(n, i+1));
1888 com_addfwref(c, JUMP_IF_FALSE, &a);
1889 com_addbyte(c, POP_TOP);
1890 com_node(c, CHILD(n, i+3));
1891 com_addfwref(c, JUMP_FORWARD, &anchor);
1892 com_backpatch(c, a);
1893 com_addbyte(c, POP_TOP);
1894 }
1895 if (i+2 < NCH(n))
1896 com_node(c, CHILD(n, i+2));
1897 com_backpatch(c, anchor);
1898}
1899
1900static void
1901com_while_stmt(c, n)
1902 struct compiling *c;
1903 node *n;
1904{
1905 int break_anchor = 0;
1906 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001907 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001908 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
1909 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001910 block_push(c, SETUP_LOOP);
1911 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001912 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001913 com_node(c, CHILD(n, 1));
1914 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1915 com_addbyte(c, POP_TOP);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001916 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001917 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001918 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001919 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1920 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001921 com_backpatch(c, anchor);
1922 com_addbyte(c, POP_TOP);
1923 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001924 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001925 if (NCH(n) > 4)
1926 com_node(c, CHILD(n, 6));
1927 com_backpatch(c, break_anchor);
1928}
1929
1930static void
1931com_for_stmt(c, n)
1932 struct compiling *c;
1933 node *n;
1934{
1935 object *v;
1936 int break_anchor = 0;
1937 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001938 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001939 REQ(n, for_stmt);
1940 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
1941 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001942 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001943 com_node(c, CHILD(n, 3));
1944 v = newintobject(0L);
1945 if (v == NULL)
1946 c->c_errors++;
1947 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
1948 XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001949 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001950 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001951 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8861b741996-07-30 16:49:37 +00001952 com_assign(c, CHILD(n, 1), OP_ASSIGN);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001953 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001954 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001955 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001956 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1957 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001958 com_backpatch(c, anchor);
1959 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001960 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001961 if (NCH(n) > 8)
1962 com_node(c, CHILD(n, 8));
1963 com_backpatch(c, break_anchor);
1964}
1965
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001966/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001967
1968 SETUP_FINALLY L
1969 <code for S>
1970 POP_BLOCK
1971 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001972 L: <code for Sf>
1973 END_FINALLY
1974
1975 The special instructions use the block stack. Each block
1976 stack entry contains the instruction that created it (here
1977 SETUP_FINALLY), the level of the value stack at the time the
1978 block stack entry was created, and a label (here L).
1979
1980 SETUP_FINALLY:
1981 Pushes the current value stack level and the label
1982 onto the block stack.
1983 POP_BLOCK:
1984 Pops en entry from the block stack, and pops the value
1985 stack until its level is the same as indicated on the
1986 block stack. (The label is ignored.)
1987 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001988 Pops a variable number of entries from the *value* stack
1989 and re-raises the exception they specify. The number of
1990 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001991
1992 The block stack is unwound when an exception is raised:
1993 when a SETUP_FINALLY entry is found, the exception is pushed
1994 onto the value stack (and the exception condition is cleared),
1995 and the interpreter jumps to the label gotten from the block
1996 stack.
1997
1998 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00001999 (The contents of the value stack is shown in [], with the top
2000 at the right; 'tb' is trace-back info, 'val' the exception's
2001 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002002
2003 Value stack Label Instruction Argument
2004 [] SETUP_EXCEPT L1
2005 [] <code for S>
2006 [] POP_BLOCK
2007 [] JUMP_FORWARD L0
2008
Guido van Rossum3f5da241990-12-20 15:06:42 +00002009 [tb, val, exc] L1: DUP )
2010 [tb, val, exc, exc] <evaluate E1> )
2011 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2012 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2013 [tb, val, exc, 1] POP )
2014 [tb, val, exc] POP
2015 [tb, val] <assign to V1> (or POP if no V1)
2016 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002017 [] <code for S1>
2018 JUMP_FORWARD L0
2019
Guido van Rossum3f5da241990-12-20 15:06:42 +00002020 [tb, val, exc, 0] L2: POP
2021 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002022 .............................etc.......................
2023
Guido van Rossum3f5da241990-12-20 15:06:42 +00002024 [tb, val, exc, 0] Ln+1: POP
2025 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002026
2027 [] L0: <next statement>
2028
2029 Of course, parts are not generated if Vi or Ei is not present.
2030*/
2031
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002032static void
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002033com_try_except(c, n)
2034 struct compiling *c;
2035 node *n;
2036{
2037 int except_anchor = 0;
2038 int end_anchor = 0;
2039 int else_anchor = 0;
2040 int i;
2041 node *ch;
2042
2043 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2044 block_push(c, SETUP_EXCEPT);
2045 com_node(c, CHILD(n, 2));
2046 com_addbyte(c, POP_BLOCK);
2047 block_pop(c, SETUP_EXCEPT);
2048 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2049 com_backpatch(c, except_anchor);
2050 for (i = 3;
2051 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2052 i += 3) {
2053 /* except_clause: 'except' [expr [',' expr]] */
2054 if (except_anchor == 0) {
2055 err_setstr(SyntaxError,
2056 "default 'except:' must be last");
2057 c->c_errors++;
2058 break;
2059 }
2060 except_anchor = 0;
2061 com_addoparg(c, SET_LINENO, ch->n_lineno);
2062 if (NCH(ch) > 1) {
2063 com_addbyte(c, DUP_TOP);
2064 com_node(c, CHILD(ch, 1));
2065 com_addoparg(c, COMPARE_OP, EXC_MATCH);
2066 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
2067 com_addbyte(c, POP_TOP);
2068 }
2069 com_addbyte(c, POP_TOP);
2070 if (NCH(ch) > 3)
Guido van Rossum8861b741996-07-30 16:49:37 +00002071 com_assign(c, CHILD(ch, 3), OP_ASSIGN);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002072 else
2073 com_addbyte(c, POP_TOP);
2074 com_addbyte(c, POP_TOP);
2075 com_node(c, CHILD(n, i+2));
2076 com_addfwref(c, JUMP_FORWARD, &end_anchor);
2077 if (except_anchor) {
2078 com_backpatch(c, except_anchor);
2079 com_addbyte(c, POP_TOP);
2080 }
2081 }
2082 com_addbyte(c, END_FINALLY);
2083 com_backpatch(c, else_anchor);
2084 if (i < NCH(n))
2085 com_node(c, CHILD(n, i+2));
2086 com_backpatch(c, end_anchor);
2087}
2088
2089static void
2090com_try_finally(c, n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002091 struct compiling *c;
2092 node *n;
2093{
2094 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002095 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002096
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002097 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
2098 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002099 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002100 com_addbyte(c, POP_BLOCK);
2101 block_pop(c, SETUP_FINALLY);
2102 block_push(c, END_FINALLY);
2103 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2104 com_backpatch(c, finally_anchor);
2105 ch = CHILD(n, NCH(n)-1);
2106 com_addoparg(c, SET_LINENO, ch->n_lineno);
2107 com_node(c, ch);
2108 com_addbyte(c, END_FINALLY);
2109 block_pop(c, END_FINALLY);
2110}
2111
2112static void
2113com_try_stmt(c, n)
2114 struct compiling *c;
2115 node *n;
2116{
2117 REQ(n, try_stmt);
2118 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
2119 | 'try' ':' suite 'finally' ':' suite */
2120 if (TYPE(CHILD(n, 3)) != except_clause)
2121 com_try_finally(c, n);
2122 else
2123 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002124}
2125
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002126static object *
2127get_docstring(n)
2128 node *n;
2129{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002130 int i;
2131
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002132 switch (TYPE(n)) {
2133
2134 case suite:
2135 if (NCH(n) == 1)
2136 return get_docstring(CHILD(n, 0));
2137 else {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002138 for (i = 0; i < NCH(n); i++) {
2139 node *ch = CHILD(n, i);
2140 if (TYPE(ch) == stmt)
2141 return get_docstring(ch);
2142 }
2143 }
2144 break;
2145
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002146 case file_input:
2147 for (i = 0; i < NCH(n); i++) {
2148 node *ch = CHILD(n, i);
2149 if (TYPE(ch) == stmt)
2150 return get_docstring(ch);
2151 }
2152 break;
2153
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002154 case stmt:
2155 case simple_stmt:
2156 case small_stmt:
2157 return get_docstring(CHILD(n, 0));
2158
2159 case expr_stmt:
2160 case testlist:
2161 case test:
2162 case and_test:
2163 case not_test:
2164 case comparison:
2165 case expr:
2166 case xor_expr:
2167 case and_expr:
2168 case shift_expr:
2169 case arith_expr:
2170 case term:
2171 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00002172 case power:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002173 if (NCH(n) == 1)
2174 return get_docstring(CHILD(n, 0));
2175 break;
2176
2177 case atom:
2178 if (TYPE(CHILD(n, 0)) == STRING)
2179 return parsestrplus(n);
2180 break;
2181
2182 }
2183 return NULL;
2184}
2185
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002186static void
2187com_suite(c, n)
2188 struct compiling *c;
2189 node *n;
2190{
2191 REQ(n, suite);
2192 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
2193 if (NCH(n) == 1) {
2194 com_node(c, CHILD(n, 0));
2195 }
2196 else {
2197 int i;
2198 for (i = 0; i < NCH(n); i++) {
2199 node *ch = CHILD(n, i);
2200 if (TYPE(ch) == stmt)
2201 com_node(c, ch);
2202 }
2203 }
2204}
2205
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002206/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002207static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002208com_continue_stmt(c, n)
2209 struct compiling *c;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002210 node *n; /* Not used, but passed for consistency */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002211{
2212 int i = c->c_nblocks;
2213 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
2214 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2215 }
2216 else {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00002217 err_setstr(SyntaxError, "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002218 c->c_errors++;
2219 }
2220 /* XXX Could allow it inside a 'finally' clause
2221 XXX if we could pop the exception still on the stack */
2222}
2223
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002224static int
Guido van Rossum681d79a1995-07-18 14:51:37 +00002225com_argdefs(c, n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002226 struct compiling *c;
2227 node *n;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002228{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002229 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002230 if (TYPE(n) == lambdef) {
2231 /* lambdef: 'lambda' [varargslist] ':' test */
2232 n = CHILD(n, 1);
2233 }
2234 else {
2235 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
2236 n = CHILD(n, 2);
2237 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
2238 n = CHILD(n, 1);
2239 }
2240 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002241 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002242 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002243 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002244 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
2245 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002246 nargs = 0;
2247 ndefs = 0;
2248 for (i = 0; i < nch; i++) {
2249 int t;
Guido van Rossum50564e81996-01-12 01:13:16 +00002250 if (TYPE(CHILD(n, i)) == STAR || TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002251 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002252 nargs++;
2253 i++;
2254 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00002255 t = RPAR; /* Anything except EQUAL or COMMA */
2256 else
2257 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002258 if (t == EQUAL) {
2259 i++;
2260 ndefs++;
2261 com_node(c, CHILD(n, i));
2262 i++;
2263 if (i >= nch)
2264 break;
2265 t = TYPE(CHILD(n, i));
2266 }
2267 else {
2268 /* Treat "(a=1, b)" as "(a=1, b=None)" */
2269 if (ndefs) {
2270 com_addoparg(c, LOAD_CONST,
2271 com_addconst(c, None));
2272 ndefs++;
2273 }
2274 }
2275 if (t != COMMA)
2276 break;
2277 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002278 return ndefs;
2279}
2280
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002281static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002282com_funcdef(c, n)
2283 struct compiling *c;
2284 node *n;
2285{
2286 object *v;
2287 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum590baa41993-11-30 13:40:46 +00002288 v = (object *)compile(n, c->c_filename);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002289 if (v == NULL)
2290 c->c_errors++;
2291 else {
2292 int i = com_addconst(c, v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002293 int ndefs = com_argdefs(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002294 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002295 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002296 com_addopname(c, STORE_NAME, CHILD(n, 1));
2297 DECREF(v);
2298 }
2299}
2300
2301static void
Guido van Rossum25831651993-05-19 14:50:45 +00002302com_bases(c, n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002303 struct compiling *c;
2304 node *n;
2305{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002306 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002307 REQ(n, testlist);
2308 /* testlist: test (',' test)* [','] */
2309 for (i = 0; i < NCH(n); i += 2)
2310 com_node(c, CHILD(n, i));
2311 com_addoparg(c, BUILD_TUPLE, (NCH(n)+1) / 2);
2312}
2313
2314static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002315com_classdef(c, n)
2316 struct compiling *c;
2317 node *n;
2318{
Guido van Rossum25831651993-05-19 14:50:45 +00002319 int i;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002320 object *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002321 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00002322 /* classdef: class NAME ['(' testlist ')'] ':' suite */
2323 if ((v = newstringobject(STR(CHILD(n, 1)))) == NULL) {
2324 c->c_errors++;
2325 return;
2326 }
2327 /* Push the class name on the stack */
2328 i = com_addconst(c, v);
2329 com_addoparg(c, LOAD_CONST, i);
2330 DECREF(v);
2331 /* Push the tuple of base classes on the stack */
2332 if (TYPE(CHILD(n, 2)) != LPAR)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002333 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum25831651993-05-19 14:50:45 +00002334 else
2335 com_bases(c, CHILD(n, 3));
Guido van Rossum590baa41993-11-30 13:40:46 +00002336 v = (object *)compile(n, c->c_filename);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002337 if (v == NULL)
2338 c->c_errors++;
2339 else {
Guido van Rossum25831651993-05-19 14:50:45 +00002340 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002341 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002342 com_addoparg(c, MAKE_FUNCTION, 0);
2343 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002344 com_addbyte(c, BUILD_CLASS);
2345 com_addopname(c, STORE_NAME, CHILD(n, 1));
2346 DECREF(v);
2347 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002348}
2349
2350static void
2351com_node(c, n)
2352 struct compiling *c;
2353 node *n;
2354{
2355 switch (TYPE(n)) {
2356
2357 /* Definition nodes */
2358
2359 case funcdef:
2360 com_funcdef(c, n);
2361 break;
2362 case classdef:
2363 com_classdef(c, n);
2364 break;
2365
2366 /* Trivial parse tree nodes */
2367
2368 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002369 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002370 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002371 com_node(c, CHILD(n, 0));
2372 break;
2373
2374 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002375 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
2376 com_addoparg(c, SET_LINENO, n->n_lineno);
2377 {
2378 int i;
2379 for (i = 0; i < NCH(n)-1; i += 2)
2380 com_node(c, CHILD(n, i));
2381 }
2382 break;
2383
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002384 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002385 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002386 com_node(c, CHILD(n, 0));
2387 break;
2388
2389 /* Statement nodes */
2390
2391 case expr_stmt:
2392 com_expr_stmt(c, n);
2393 break;
2394 case print_stmt:
2395 com_print_stmt(c, n);
2396 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002397 case del_stmt: /* 'del' exprlist */
Guido van Rossum8861b741996-07-30 16:49:37 +00002398 com_assign(c, CHILD(n, 1), OP_DELETE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002399 break;
2400 case pass_stmt:
2401 break;
2402 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002403 if (c->c_loops == 0) {
Guido van Rossum598fd8c1992-01-26 18:12:03 +00002404 err_setstr(SyntaxError, "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002405 c->c_errors++;
2406 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002407 com_addbyte(c, BREAK_LOOP);
2408 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002409 case continue_stmt:
2410 com_continue_stmt(c, n);
2411 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002412 case return_stmt:
2413 com_return_stmt(c, n);
2414 break;
2415 case raise_stmt:
2416 com_raise_stmt(c, n);
2417 break;
2418 case import_stmt:
2419 com_import_stmt(c, n);
2420 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002421 case global_stmt:
2422 com_global_stmt(c, n);
2423 break;
Guido van Rossum25831651993-05-19 14:50:45 +00002424 case access_stmt:
2425 com_access_stmt(c, n);
2426 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002427 case exec_stmt:
2428 com_exec_stmt(c, n);
2429 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002430 case if_stmt:
2431 com_if_stmt(c, n);
2432 break;
2433 case while_stmt:
2434 com_while_stmt(c, n);
2435 break;
2436 case for_stmt:
2437 com_for_stmt(c, n);
2438 break;
2439 case try_stmt:
2440 com_try_stmt(c, n);
2441 break;
2442 case suite:
2443 com_suite(c, n);
2444 break;
2445
2446 /* Expression nodes */
2447
2448 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002449 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002450 break;
2451 case test:
2452 com_test(c, n);
2453 break;
2454 case and_test:
2455 com_and_test(c, n);
2456 break;
2457 case not_test:
2458 com_not_test(c, n);
2459 break;
2460 case comparison:
2461 com_comparison(c, n);
2462 break;
2463 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002464 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002465 break;
2466 case expr:
2467 com_expr(c, n);
2468 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002469 case xor_expr:
2470 com_xor_expr(c, n);
2471 break;
2472 case and_expr:
2473 com_and_expr(c, n);
2474 break;
2475 case shift_expr:
2476 com_shift_expr(c, n);
2477 break;
2478 case arith_expr:
2479 com_arith_expr(c, n);
2480 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002481 case term:
2482 com_term(c, n);
2483 break;
2484 case factor:
2485 com_factor(c, n);
2486 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00002487 case power:
2488 com_power(c, n);
2489 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002490 case atom:
2491 com_atom(c, n);
2492 break;
2493
2494 default:
2495 fprintf(stderr, "node type %d\n", TYPE(n));
2496 err_setstr(SystemError, "com_node: unexpected node type");
2497 c->c_errors++;
2498 }
2499}
2500
2501static void com_fplist PROTO((struct compiling *, node *));
2502
2503static void
2504com_fpdef(c, n)
2505 struct compiling *c;
2506 node *n;
2507{
2508 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
2509 if (TYPE(CHILD(n, 0)) == LPAR)
2510 com_fplist(c, CHILD(n, 1));
2511 else
Guido van Rossum681d79a1995-07-18 14:51:37 +00002512 com_addoparg(c, STORE_FAST, com_newlocal(c, STR(CHILD(n, 0))));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002513}
2514
2515static void
2516com_fplist(c, n)
2517 struct compiling *c;
2518 node *n;
2519{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00002520 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002521 if (NCH(n) == 1) {
2522 com_fpdef(c, CHILD(n, 0));
2523 }
2524 else {
2525 int i;
2526 com_addoparg(c, UNPACK_TUPLE, (NCH(n)+1)/2);
2527 for (i = 0; i < NCH(n); i += 2)
2528 com_fpdef(c, CHILD(n, i));
2529 }
2530}
2531
2532static void
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002533com_arglist(c, n)
2534 struct compiling *c;
2535 node *n;
2536{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002537 int nch, i;
2538 int complex = 0;
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002539 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00002540 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002541 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002542 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002543 /* Enter all arguments in table of locals */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002544 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002545 node *ch = CHILD(n, i);
2546 node *fp;
2547 char *name;
Guido van Rossum50564e81996-01-12 01:13:16 +00002548 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002549 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002550 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
2551 fp = CHILD(ch, 0);
2552 if (TYPE(fp) == NAME)
2553 name = STR(fp);
2554 else {
2555 name = "";
Guido van Rossum530956d1996-07-21 02:27:43 +00002556 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002557 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002558 com_newlocal(c, name);
2559 c->c_argcount++;
2560 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002561 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002562 ch = CHILD(n, i);
2563 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002564 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002565 else
2566 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002567 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002568 /* Handle *arguments */
2569 if (i < nch) {
2570 node *ch;
2571 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00002572 if (TYPE(ch) != DOUBLESTAR) {
2573 REQ(ch, STAR);
2574 ch = CHILD(n, i+1);
2575 if (TYPE(ch) == NAME) {
2576 c->c_flags |= CO_VARARGS;
2577 i += 3;
2578 com_newlocal(c, STR(ch));
2579 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002580 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002581 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002582 /* Handle **keywords */
2583 if (i < nch) {
2584 node *ch;
2585 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00002586 if (TYPE(ch) != DOUBLESTAR) {
2587 REQ(ch, STAR);
2588 ch = CHILD(n, i+1);
2589 REQ(ch, STAR);
2590 ch = CHILD(n, i+2);
2591 }
2592 else
2593 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002594 REQ(ch, NAME);
2595 c->c_flags |= CO_VARKEYWORDS;
2596 com_newlocal(c, STR(ch));
2597 }
2598 if (complex) {
2599 /* Generate code for complex arguments only after
2600 having counted the simple arguments */
2601 int ilocal = 0;
2602 for (i = 0; i < nch; i++) {
2603 node *ch = CHILD(n, i);
2604 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00002605 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002606 break;
2607 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
2608 fp = CHILD(ch, 0);
2609 if (TYPE(fp) != NAME) {
2610 com_addoparg(c, LOAD_FAST, ilocal);
2611 com_fpdef(c, ch);
2612 }
2613 ilocal++;
2614 if (++i >= nch)
2615 break;
2616 ch = CHILD(n, i);
2617 if (TYPE(ch) == EQUAL)
2618 i += 2;
2619 else
2620 REQ(ch, COMMA);
2621 }
2622 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002623}
2624
2625static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002626com_file_input(c, n)
2627 struct compiling *c;
2628 node *n;
2629{
2630 int i;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002631 object *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002632 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002633 doc = get_docstring(n);
2634 if (doc != NULL) {
2635 int i = com_addconst(c, doc);
2636 DECREF(doc);
2637 com_addoparg(c, LOAD_CONST, i);
2638 com_addopnamestr(c, STORE_NAME, "__doc__");
2639 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002640 for (i = 0; i < NCH(n); i++) {
2641 node *ch = CHILD(n, i);
2642 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
2643 com_node(c, ch);
2644 }
2645}
2646
2647/* Top-level compile-node interface */
2648
2649static void
2650compile_funcdef(c, n)
2651 struct compiling *c;
2652 node *n;
2653{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002654 object *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002655 node *ch;
2656 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00002657 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002658 doc = get_docstring(CHILD(n, 4));
2659 if (doc != NULL) {
2660 (void) com_addconst(c, doc);
2661 DECREF(doc);
2662 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002663 else
2664 (void) com_addconst(c, None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002665 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
2666 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00002667 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002668 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002669 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002670 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002671 c->c_infunction = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002672 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2673 com_addbyte(c, RETURN_VALUE);
2674}
2675
2676static void
Guido van Rossum590baa41993-11-30 13:40:46 +00002677compile_lambdef(c, n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002678 struct compiling *c;
2679 node *n;
2680{
Guido van Rossum590baa41993-11-30 13:40:46 +00002681 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002682 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00002683 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00002684
2685 ch = CHILD(n, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002686 (void) com_addconst(c, None); /* No docstring */
2687 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00002688 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002689 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00002690 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002691 else
2692 ch = CHILD(n, 2);
2693 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002694 com_addbyte(c, RETURN_VALUE);
2695}
2696
2697static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002698compile_classdef(c, n)
2699 struct compiling *c;
2700 node *n;
2701{
2702 node *ch;
2703 object *doc;
2704 REQ(n, classdef);
2705 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
2706 c->c_name = STR(CHILD(n, 1));
2707 ch = CHILD(n, NCH(n)-1); /* The suite */
2708 doc = get_docstring(ch);
2709 if (doc != NULL) {
2710 int i = com_addconst(c, doc);
2711 DECREF(doc);
2712 com_addoparg(c, LOAD_CONST, i);
2713 com_addopnamestr(c, STORE_NAME, "__doc__");
2714 }
2715 else
2716 (void) com_addconst(c, None);
2717 com_node(c, ch);
2718 com_addbyte(c, LOAD_LOCALS);
2719 com_addbyte(c, RETURN_VALUE);
2720}
2721
2722static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002723compile_node(c, n)
2724 struct compiling *c;
2725 node *n;
2726{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002727 com_addoparg(c, SET_LINENO, n->n_lineno);
2728
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002729 switch (TYPE(n)) {
2730
Guido van Rossum4c417781991-01-21 16:09:22 +00002731 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002732 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002733 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002734 n = CHILD(n, 0);
2735 if (TYPE(n) != NEWLINE)
2736 com_node(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002737 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2738 com_addbyte(c, RETURN_VALUE);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002739 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002740 break;
2741
Guido van Rossum4c417781991-01-21 16:09:22 +00002742 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002743 com_file_input(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002744 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2745 com_addbyte(c, RETURN_VALUE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002746 break;
2747
Guido van Rossum590baa41993-11-30 13:40:46 +00002748 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00002749 com_node(c, CHILD(n, 0));
2750 com_addbyte(c, RETURN_VALUE);
2751 break;
2752
Guido van Rossum590baa41993-11-30 13:40:46 +00002753 case lambdef: /* anonymous function definition */
2754 compile_lambdef(c, n);
2755 break;
2756
Guido van Rossum4c417781991-01-21 16:09:22 +00002757 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002758 compile_funcdef(c, n);
2759 break;
2760
Guido van Rossum4c417781991-01-21 16:09:22 +00002761 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002762 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002763 break;
2764
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002765 default:
2766 fprintf(stderr, "node type %d\n", TYPE(n));
2767 err_setstr(SystemError, "compile_node: unexpected node type");
2768 c->c_errors++;
2769 }
2770}
2771
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002772/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00002773
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002774 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
2775 instructions that refer to local variables with LOAD_FAST etc.
2776 The latter instructions are much faster because they don't need to
2777 look up the variable name in a dictionary.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002778
Guido van Rossum681d79a1995-07-18 14:51:37 +00002779 To find all local variables, we check all STORE_NAME, IMPORT_FROM
2780 and DELETE_NAME instructions. This yields all local variables,
2781 function definitions, class definitions and import statements.
2782 Argument names have already been entered into the list by the
2783 special processing for the argument list.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002784
2785 All remaining LOAD_NAME instructions must refer to non-local (global
2786 or builtin) variables, so are replaced by LOAD_GLOBAL.
2787
2788 There are two problems: 'from foo import *' and 'exec' may introduce
2789 local variables that we can't know while compiling. If this is the
Guido van Rossum681d79a1995-07-18 14:51:37 +00002790 case, we can still optimize bona fide locals (since those
2791 statements will be surrounded by fast_2_locals() and
2792 locals_2_fast()), but we can't change LOAD_NAME to LOAD_GLOBAL.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002793
Guido van Rossum681d79a1995-07-18 14:51:37 +00002794 NB: this modifies the string object c->c_code! */
Guido van Rossum282914b1991-04-04 10:42:56 +00002795
2796static void
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002797optimize(c)
2798 struct compiling *c;
Guido van Rossum282914b1991-04-04 10:42:56 +00002799{
Guido van Rossum0a697f61991-04-16 08:39:12 +00002800 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00002801 int opcode;
2802 int oparg;
2803 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002804 object *error_type, *error_value, *error_traceback;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002805
Guido van Rossum282914b1991-04-04 10:42:56 +00002806#define NEXTOP() (*next_instr++)
2807#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
2808#define GETITEM(v, i) (getlistitem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002809#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
2810
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002811 err_fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002812
2813 c->c_flags |= CO_OPTIMIZED;
Guido van Rossum282914b1991-04-04 10:42:56 +00002814
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002815 next_instr = (unsigned char *) getstringvalue(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00002816 for (;;) {
2817 opcode = NEXTOP();
2818 if (opcode == STOP_CODE)
2819 break;
2820 if (HAS_ARG(opcode))
2821 oparg = NEXTARG();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002822 switch (opcode) {
2823 case STORE_NAME:
2824 case DELETE_NAME:
2825 case IMPORT_FROM:
2826 com_addlocal_o(c, GETNAMEOBJ(oparg));
2827 break;
2828 case EXEC_STMT:
2829 c->c_flags &= ~CO_OPTIMIZED;
2830 break;
Guido van Rossum282914b1991-04-04 10:42:56 +00002831 }
2832 }
2833
Guido van Rossum681d79a1995-07-18 14:51:37 +00002834 if (dictlookup(c->c_locals, "*") != NULL)
2835 c->c_flags &= ~CO_OPTIMIZED;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002836
2837 next_instr = (unsigned char *) getstringvalue(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00002838 for (;;) {
2839 cur_instr = next_instr;
2840 opcode = NEXTOP();
2841 if (opcode == STOP_CODE)
2842 break;
2843 if (HAS_ARG(opcode))
2844 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002845 if (opcode == LOAD_NAME ||
2846 opcode == STORE_NAME ||
2847 opcode == DELETE_NAME) {
2848 object *v;
2849 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00002850 name = GETNAMEOBJ(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002851 v = dict2lookup(c->c_locals, name);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002852 if (v == NULL) {
Guido van Rossum83163251991-08-16 08:58:43 +00002853 err_clear();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002854 if (opcode == LOAD_NAME &&
2855 (c->c_flags&CO_OPTIMIZED))
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002856 cur_instr[0] = LOAD_GLOBAL;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002857 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00002858 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002859 i = getintvalue(v);
2860 switch (opcode) {
2861 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
2862 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
2863 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
2864 }
2865 cur_instr[1] = i & 0xff;
2866 cur_instr[2] = (i>>8) & 0xff;
Guido van Rossum282914b1991-04-04 10:42:56 +00002867 }
2868 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002869
Guido van Rossum681d79a1995-07-18 14:51:37 +00002870 if (c->c_errors == 0)
2871 err_restore(error_type, error_value, error_traceback);
Guido van Rossum282914b1991-04-04 10:42:56 +00002872}
2873
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002874codeobject *
Guido van Rossum590baa41993-11-30 13:40:46 +00002875compile(n, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002876 node *n;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002877 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002878{
2879 struct compiling sc;
2880 codeobject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00002881 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002882 return NULL;
2883 compile_node(&sc, n);
2884 com_done(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002885 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002886 optimize(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002887 sc.c_flags |= CO_NEWLOCALS;
2888 }
2889 else if (TYPE(n) == classdef)
2890 sc.c_flags |= CO_NEWLOCALS;
Guido van Rossum9bfef441993-03-29 10:43:31 +00002891 co = NULL;
2892 if (sc.c_errors == 0) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002893 object *consts, *names, *varnames, *filename, *name;
2894 consts = listtuple(sc.c_consts);
2895 names = listtuple(sc.c_names);
2896 varnames = listtuple(sc.c_varnames);
2897 filename = newstringobject(sc.c_filename);
2898 name = newstringobject(sc.c_name);
2899 if (!err_occurred())
2900 co = newcodeobject(sc.c_argcount,
2901 sc.c_nlocals,
2902 sc.c_flags,
2903 sc.c_code,
2904 consts,
2905 names,
2906 varnames,
2907 filename,
2908 name);
2909 XDECREF(consts);
2910 XDECREF(names);
2911 XDECREF(varnames);
2912 XDECREF(filename);
2913 XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00002914 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002915 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002916 return co;
2917}