blob: 5429e8060a53e2fb28064403c484ef68fe90d87b [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum10dc2e81990-11-18 17:27:39 +000032/* Compile an expression node to intermediate code */
33
Guido van Rossum3f5da241990-12-20 15:06:42 +000034/* XXX TO DO:
Guido van Rossum681d79a1995-07-18 14:51:37 +000035 XXX Compute maximum needed stack sizes while compiling;
36 XXX then frame object can be one malloc and no stack checks are needed
37 XXX add __doc__ attribute == co_doc to code object attributes
38 XXX don't execute doc string
Guido van Rossum3f5da241990-12-20 15:06:42 +000039 XXX Generate simple jump for break/return outside 'try...finally'
Guido van Rossum681d79a1995-07-18 14:51:37 +000040 XXX get rid of SET_LINENO instructions, use JAR's table trick
41 XXX (need an option to put them back in, for debugger!)
42 XXX other JAR tricks?
Guido van Rossum3f5da241990-12-20 15:06:42 +000043*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +000044
Guido van Rossum8ff077b1996-08-24 06:21:31 +000045#ifndef NO_PRIVATE_NAME_MANGLING
46#define PRIVATE_NAME_MANGLING
47#endif
48
Guido van Rossum3f5da241990-12-20 15:06:42 +000049#include "allobjects.h"
50
Guido van Rossum10dc2e81990-11-18 17:27:39 +000051#include "node.h"
52#include "token.h"
53#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000054#include "compile.h"
55#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000056#include "structmember.h"
57
58#include <ctype.h>
Guido van Rossumf1dc5661993-07-05 10:31:29 +000059#include <errno.h>
Guido van Rossum282914b1991-04-04 10:42:56 +000060
Guido van Rossum8861b741996-07-30 16:49:37 +000061#define OP_DELETE 0
62#define OP_ASSIGN 1
63#define OP_APPLY 2
64
Guido van Rossum3f5da241990-12-20 15:06:42 +000065#define OFF(x) offsetof(codeobject, x)
66
67static struct memberlist code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000068 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
69 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
70 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000071 {"co_code", T_OBJECT, OFF(co_code), READONLY},
72 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
73 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000074 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000075 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000076 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000077 {NULL} /* Sentinel */
78};
79
80static object *
81code_getattr(co, name)
82 codeobject *co;
83 char *name;
84{
85 return getmember((char *)co, code_memberlist, name);
86}
Guido van Rossum10dc2e81990-11-18 17:27:39 +000087
88static void
Guido van Rossum3f5da241990-12-20 15:06:42 +000089code_dealloc(co)
90 codeobject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +000091{
Guido van Rossum3f5da241990-12-20 15:06:42 +000092 XDECREF(co->co_code);
93 XDECREF(co->co_consts);
94 XDECREF(co->co_names);
95 XDECREF(co->co_filename);
Guido van Rossum9bfef441993-03-29 10:43:31 +000096 XDECREF(co->co_name);
Guido van Rossum681d79a1995-07-18 14:51:37 +000097 XDECREF(co->co_varnames);
Guido van Rossum3f5da241990-12-20 15:06:42 +000098 DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +000099}
100
Guido van Rossum2dff9911992-09-03 20:50:59 +0000101static object *
102code_repr(co)
103 codeobject *co;
104{
105 char buf[500];
106 int lineno = -1;
107 char *p = GETSTRINGVALUE(co->co_code);
108 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000109 char *name = "???";
Guido van Rossum2dff9911992-09-03 20:50:59 +0000110 if (*p == SET_LINENO)
111 lineno = (p[1] & 0xff) | ((p[2] & 0xff) << 8);
112 if (co->co_filename && is_stringobject(co->co_filename))
113 filename = getstringvalue(co->co_filename);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000114 if (co->co_name && is_stringobject(co->co_name))
115 name = getstringvalue(co->co_name);
116 sprintf(buf, "<code object %.100s at %lx, file \"%.300s\", line %d>",
117 name, (long)co, filename, lineno);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000118 return newstringobject(buf);
119}
120
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000121static int
122code_compare(co, cp)
123 codeobject *co, *cp;
124{
125 int cmp;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000126 cmp = cp->co_argcount - cp->co_argcount;
127 if (cmp) return cmp;
128 cmp = cp->co_nlocals - cp->co_nlocals;
129 if (cmp) return cmp;
130 cmp = cp->co_flags - cp->co_flags;
131 if (cmp) return cmp;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000132 cmp = cmpobject((object *)co->co_code, (object *)cp->co_code);
133 if (cmp) return cmp;
134 cmp = cmpobject(co->co_consts, cp->co_consts);
135 if (cmp) return cmp;
136 cmp = cmpobject(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000137 if (cmp) return cmp;
138 cmp = cmpobject(co->co_varnames, cp->co_varnames);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000139 return cmp;
140}
141
142static long
143code_hash(co)
144 codeobject *co;
145{
Guido van Rossum681d79a1995-07-18 14:51:37 +0000146 long h, h1, h2, h3, h4;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000147 h1 = hashobject((object *)co->co_code);
148 if (h1 == -1) return -1;
149 h2 = hashobject(co->co_consts);
150 if (h2 == -1) return -1;
151 h3 = hashobject(co->co_names);
152 if (h3 == -1) return -1;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000153 h4 = hashobject(co->co_varnames);
154 if (h4 == -1) return -1;
155 h = h1 ^ h2 ^ h3 ^ h4 ^
156 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000157 if (h == -1) h = -2;
158 return h;
159}
160
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000161typeobject Codetype = {
162 OB_HEAD_INIT(&Typetype)
163 0,
164 "code",
165 sizeof(codeobject),
166 0,
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000167 (destructor)code_dealloc, /*tp_dealloc*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000168 0, /*tp_print*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000169 (getattrfunc)code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000170 0, /*tp_setattr*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000171 (cmpfunc)code_compare, /*tp_compare*/
172 (reprfunc)code_repr, /*tp_repr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000173 0, /*tp_as_number*/
174 0, /*tp_as_sequence*/
175 0, /*tp_as_mapping*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000176 (hashfunc)code_hash, /*tp_hash*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000177};
178
Guido van Rossuma082ce41991-06-04 19:41:56 +0000179codeobject *
Guido van Rossum681d79a1995-07-18 14:51:37 +0000180newcodeobject(argcount, nlocals, flags,
181 code, consts, names, varnames, filename, name)
182 int argcount;
183 int nlocals;
184 int flags;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000185 object *code;
186 object *consts;
187 object *names;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000188 object *varnames;
Guido van Rossuma082ce41991-06-04 19:41:56 +0000189 object *filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000190 object *name;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000191{
192 codeobject *co;
193 int i;
194 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000195 if (argcount < 0 || nlocals < 0 ||
196 code == NULL || !is_stringobject(code) ||
197 consts == NULL || !is_tupleobject(consts) ||
198 names == NULL || !is_tupleobject(names) ||
199 varnames == NULL || !is_tupleobject(varnames) ||
200 name == NULL || !is_stringobject(name) ||
201 filename == NULL || !is_stringobject(filename)) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000202 err_badcall();
203 return NULL;
204 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000205 /* Make sure names and varnames are all strings */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000206 for (i = gettuplesize(names); --i >= 0; ) {
207 object *v = gettupleitem(names, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000208 if (v == NULL || !is_stringobject(v)) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000209 err_badcall();
210 return NULL;
211 }
212 }
213 for (i = gettuplesize(varnames); --i >= 0; ) {
214 object *v = gettupleitem(varnames, i);
215 if (v == NULL || !is_stringobject(v)) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000216 err_badcall();
217 return NULL;
218 }
219 }
220 co = NEWOBJ(codeobject, &Codetype);
221 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000222 co->co_argcount = argcount;
223 co->co_nlocals = nlocals;
224 co->co_flags = flags;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000225 INCREF(code);
226 co->co_code = (stringobject *)code;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000227 INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000228 co->co_consts = consts;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000229 INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000230 co->co_names = names;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000231 INCREF(varnames);
232 co->co_varnames = varnames;
Guido van Rossuma082ce41991-06-04 19:41:56 +0000233 INCREF(filename);
234 co->co_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000235 INCREF(name);
236 co->co_name = name;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000237 }
238 return co;
239}
240
241
242/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000243
244#define MAXBLOCKS 20 /* Max static block nesting within a function */
245
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000246struct compiling {
247 object *c_code; /* string */
248 object *c_consts; /* list of objects */
249 object *c_names; /* list of strings (names) */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000250 object *c_globals; /* dictionary (value=None) */
251 object *c_locals; /* dictionary (value=localID) */
252 object *c_varnames; /* list (inverse of c_locals) */
253 int c_nlocals; /* index of next local */
254 int c_argcount; /* number of top-level arguments */
255 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000256 int c_nexti; /* index into c_code */
257 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000258 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000259 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000260 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000261 int c_begin; /* begin of current loop, for 'continue' */
262 int c_block[MAXBLOCKS]; /* stack of block types */
263 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000264 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000265 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000266 int c_lineno; /* Current line number */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000267#ifdef PRIVATE_NAME_MANGLING
268 char *c_private; /* for private name mangling */
269#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000270};
271
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000272
Guido van Rossum452a9831996-09-17 14:32:04 +0000273/* Error message including line number */
274
275static void
276com_error(c, exc, msg)
277 struct compiling *c;
278 object *exc;
279 char *msg;
280{
281 int n = strlen(msg);
282 object *v;
283 char buffer[30];
284 char *s;
Guido van Rossum635abd21997-01-06 22:56:52 +0000285 c->c_errors++;
Guido van Rossum452a9831996-09-17 14:32:04 +0000286 if (c->c_lineno <= 1) {
287 /* Unknown line number or single interactive command */
288 err_setstr(exc, msg);
289 return;
290 }
291 sprintf(buffer, " (line %d)", c->c_lineno);
292 v = newsizedstringobject((char *)NULL, n + strlen(buffer));
293 if (v == NULL)
294 return; /* MemoryError, too bad */
295 s = GETSTRINGVALUE((stringobject *)v);
296 strcpy(s, msg);
297 strcat(s, buffer);
298 err_setval(exc, v);
299 DECREF(v);
Guido van Rossum452a9831996-09-17 14:32:04 +0000300}
301
302
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000303/* Interface to the block stack */
304
305static void
306block_push(c, type)
307 struct compiling *c;
308 int type;
309{
310 if (c->c_nblocks >= MAXBLOCKS) {
Guido van Rossum452a9831996-09-17 14:32:04 +0000311 com_error(c, SystemError, "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000312 }
313 else {
314 c->c_block[c->c_nblocks++] = type;
315 }
316}
317
318static void
319block_pop(c, type)
320 struct compiling *c;
321 int type;
322{
323 if (c->c_nblocks > 0)
324 c->c_nblocks--;
325 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum452a9831996-09-17 14:32:04 +0000326 com_error(c, SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000327 }
328}
329
330
Guido van Rossum681d79a1995-07-18 14:51:37 +0000331/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000332
Guido van Rossum590baa41993-11-30 13:40:46 +0000333static int com_init PROTO((struct compiling *, char *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000334static void com_free PROTO((struct compiling *));
335static void com_done PROTO((struct compiling *));
336static void com_node PROTO((struct compiling *, struct _node *));
Guido van Rossum50564e81996-01-12 01:13:16 +0000337static void com_factor PROTO((struct compiling *, struct _node *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000338static void com_addbyte PROTO((struct compiling *, int));
339static void com_addint PROTO((struct compiling *, int));
340static void com_addoparg PROTO((struct compiling *, int, int));
341static void com_addfwref PROTO((struct compiling *, int, int *));
342static void com_backpatch PROTO((struct compiling *, int));
343static int com_add PROTO((struct compiling *, object *, object *));
344static int com_addconst PROTO((struct compiling *, object *));
345static int com_addname PROTO((struct compiling *, object *));
346static void com_addopname PROTO((struct compiling *, int, node *));
Guido van Rossum288a60f1991-12-16 13:05:10 +0000347static void com_list PROTO((struct compiling *, node *, int));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000348static int com_argdefs PROTO((struct compiling *, node *));
349static int com_newlocal PROTO((struct compiling *, char *));
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000350static codeobject *icompile PROTO((struct _node *, struct compiling *));
351static codeobject *jcompile PROTO((struct _node *, char *, struct compiling *));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000352
353static int
Guido van Rossum590baa41993-11-30 13:40:46 +0000354com_init(c, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000355 struct compiling *c;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000356 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000357{
Guido van Rossum62d46241991-04-03 19:00:23 +0000358 if ((c->c_code = newsizedstringobject((char *)NULL, 1000)) == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000359 goto fail_3;
360 if ((c->c_consts = newlistobject(0)) == NULL)
361 goto fail_2;
362 if ((c->c_names = newlistobject(0)) == NULL)
363 goto fail_1;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000364 if ((c->c_globals = newdictobject()) == NULL)
365 goto fail_0;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000366 if ((c->c_locals = newdictobject()) == NULL)
367 goto fail_00;
368 if ((c->c_varnames = newlistobject(0)) == NULL)
369 goto fail_000;
370 c->c_nlocals = 0;
371 c->c_argcount = 0;
372 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000373 c->c_nexti = 0;
374 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000375 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000376 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000377 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000378 c->c_begin = 0;
379 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000380 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000381 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000382 c->c_lineno = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000383 return 1;
384
Guido van Rossum681d79a1995-07-18 14:51:37 +0000385 fail_000:
386 DECREF(c->c_locals);
387 fail_00:
388 DECREF(c->c_globals);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000389 fail_0:
390 DECREF(c->c_names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000391 fail_1:
392 DECREF(c->c_consts);
393 fail_2:
394 DECREF(c->c_code);
395 fail_3:
396 return 0;
397}
398
399static void
400com_free(c)
401 struct compiling *c;
402{
403 XDECREF(c->c_code);
404 XDECREF(c->c_consts);
405 XDECREF(c->c_names);
Guido van Rossumc5e96291991-12-10 13:53:51 +0000406 XDECREF(c->c_globals);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000407 XDECREF(c->c_locals);
408 XDECREF(c->c_varnames);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000409}
410
411static void
412com_done(c)
413 struct compiling *c;
414{
415 if (c->c_code != NULL)
416 resizestring(&c->c_code, c->c_nexti);
417}
418
419static void
420com_addbyte(c, byte)
421 struct compiling *c;
422 int byte;
423{
424 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000425 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000426 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000427 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000428 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000429 fatal("com_addbyte: byte out of range");
Guido van Rossum01cfd441991-10-20 20:12:38 +0000430 */
Guido van Rossum452a9831996-09-17 14:32:04 +0000431 com_error(c, SystemError, "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000432 }
433 if (c->c_code == NULL)
434 return;
435 len = getstringsize(c->c_code);
436 if (c->c_nexti >= len) {
437 if (resizestring(&c->c_code, len+1000) != 0) {
438 c->c_errors++;
439 return;
440 }
441 }
442 getstringvalue(c->c_code)[c->c_nexti++] = byte;
443}
444
445static void
446com_addint(c, x)
447 struct compiling *c;
448 int x;
449{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000450 com_addbyte(c, x & 0xff);
451 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000452}
453
454static void
455com_addoparg(c, op, arg)
456 struct compiling *c;
457 int op;
458 int arg;
459{
Guido van Rossum452a9831996-09-17 14:32:04 +0000460 if (op == SET_LINENO)
461 c->c_lineno = arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000462 com_addbyte(c, op);
463 com_addint(c, arg);
464}
465
466static void
467com_addfwref(c, op, p_anchor)
468 struct compiling *c;
469 int op;
470 int *p_anchor;
471{
472 /* Compile a forward reference for backpatching */
473 int here;
474 int anchor;
475 com_addbyte(c, op);
476 here = c->c_nexti;
477 anchor = *p_anchor;
478 *p_anchor = here;
479 com_addint(c, anchor == 0 ? 0 : here - anchor);
480}
481
482static void
483com_backpatch(c, anchor)
484 struct compiling *c;
485 int anchor; /* Must be nonzero */
486{
487 unsigned char *code = (unsigned char *) getstringvalue(c->c_code);
488 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000489 int dist;
490 int prev;
491 for (;;) {
492 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000493 prev = code[anchor] + (code[anchor+1] << 8);
494 dist = target - (anchor+2);
495 code[anchor] = dist & 0xff;
496 code[anchor+1] = dist >> 8;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000497 if (!prev)
498 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000499 anchor -= prev;
500 }
501}
502
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000503/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000504
505static int
506com_add(c, list, v)
507 struct compiling *c;
508 object *list;
509 object *v;
510{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000511 int n = getlistsize(list);
512 int i;
513 for (i = n; --i >= 0; ) {
514 object *w = getlistitem(list, i);
Guido van Rossumefc0bd01991-07-01 18:44:20 +0000515 if (v->ob_type == w->ob_type && cmpobject(v, w) == 0)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000516 return i;
517 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000518 if (addlistitem(list, v) != 0)
519 c->c_errors++;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000520 return n;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000521}
522
523static int
524com_addconst(c, v)
525 struct compiling *c;
526 object *v;
527{
528 return com_add(c, c->c_consts, v);
529}
530
531static int
532com_addname(c, v)
533 struct compiling *c;
534 object *v;
535{
536 return com_add(c, c->c_names, v);
537}
538
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000539#ifdef PRIVATE_NAME_MANGLING
540static int
541com_mangle(c, name, buffer, maxlen)
542 struct compiling *c;
543 char *name;
544 char *buffer;
545 int maxlen;
546{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000547 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000548 This is independent from how the name is used. */
549 char *p;
550 int nlen, plen;
551 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000552 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000553 return 0; /* Don't mangle __extremely_long_names */
554 if (name[nlen-1] == '_' && name[nlen-2] == '_')
555 return 0; /* Don't mangle __whatever__ */
556 p = c->c_private;
557 /* Strip leading underscores from class name */
558 while (*p == '_')
559 p++;
560 if (*p == '\0')
561 return 0; /* Don't mangle if class is just underscores */
562 plen = strlen(p);
563 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000564 plen = maxlen-nlen-2; /* Truncate class name if too long */
565 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000566 buffer[0] = '_';
567 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000568 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000569 /* fprintf(stderr, "mangle %s -> %s\n", name, buffer); */
570 return 1;
571}
572#endif
573
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000574static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000575com_addopnamestr(c, op, name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000576 struct compiling *c;
577 int op;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000578 char *name;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000579{
580 object *v;
581 int i;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000582#ifdef PRIVATE_NAME_MANGLING
583 char buffer[256];
584 if (name != NULL && name[0] == '_' && name[1] == '_' &&
585 c->c_private != NULL &&
586 com_mangle(c, name, buffer, (int)sizeof(buffer)))
587 name = buffer;
588#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000589 if (name == NULL || (v = newstringobject(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000590 c->c_errors++;
591 i = 255;
592 }
593 else {
594 i = com_addname(c, v);
595 DECREF(v);
596 }
Guido van Rossumc5e96291991-12-10 13:53:51 +0000597 /* Hack to replace *_NAME opcodes by *_GLOBAL if necessary */
598 switch (op) {
599 case LOAD_NAME:
600 case STORE_NAME:
601 case DELETE_NAME:
602 if (dictlookup(c->c_globals, name) != NULL) {
603 switch (op) {
604 case LOAD_NAME: op = LOAD_GLOBAL; break;
605 case STORE_NAME: op = STORE_GLOBAL; break;
606 case DELETE_NAME: op = DELETE_GLOBAL; break;
607 }
608 }
609 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000610 com_addoparg(c, op, i);
611}
612
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000613static void
614com_addopname(c, op, n)
615 struct compiling *c;
616 int op;
617 node *n;
618{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000619 char *name;
620 char buffer[1000];
621 /* XXX it is possible to write this code without the 1000
622 chars on the total length of dotted names, I just can't be
623 bothered right now */
624 if (TYPE(n) == STAR)
625 name = "*";
626 else if (TYPE(n) == dotted_name) {
627 char *p = buffer;
628 int i;
629 name = buffer;
630 for (i = 0; i < NCH(n); i += 2) {
631 char *s = STR(CHILD(n, i));
632 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum452a9831996-09-17 14:32:04 +0000633 com_error(c, MemoryError,
634 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +0000635 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000636 break;
637 }
638 if (p != buffer)
639 *p++ = '.';
640 strcpy(p, s);
641 p = strchr(p, '\0');
642 }
643 }
644 else {
645 REQ(n, NAME);
646 name = STR(n);
647 }
648 com_addopnamestr(c, op, name);
649}
650
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000651static object *
Guido van Rossum452a9831996-09-17 14:32:04 +0000652parsenumber(co, s)
653 struct compiling *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000654 char *s;
655{
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000656 extern long mystrtol PROTO((const char *, char **, int));
657 extern unsigned long mystrtoul PROTO((const char *, char **, int));
658 extern double atof PROTO((const char *));
Guido van Rossumc5e96291991-12-10 13:53:51 +0000659 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000660 long x;
Guido van Rossum50564e81996-01-12 01:13:16 +0000661#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +0000662 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +0000663 int imflag;
664#endif
665
Guido van Rossum282914b1991-04-04 10:42:56 +0000666 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000667 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +0000668#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +0000669 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +0000670#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +0000671 if (*end == 'l' || *end == 'L')
Guido van Rossumc5e96291991-12-10 13:53:51 +0000672 return long_scan(s, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000673 if (s[0] == '0')
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000674 x = (long) mystrtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +0000675 else
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000676 x = mystrtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +0000677 if (*end == '\0') {
678 if (errno != 0) {
Guido van Rossum452a9831996-09-17 14:32:04 +0000679 com_error(co, OverflowError,
680 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +0000681 return NULL;
682 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000683 return newintobject(x);
Guido van Rossum282914b1991-04-04 10:42:56 +0000684 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000685 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +0000686#ifndef WITHOUT_COMPLEX
687 if (imflag) {
688 c.real = 0.;
689 c.imag = atof(s);
690 return newcomplexobject(c);
691 }
692 else
693#endif
694 return newfloatobject(atof(s));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000695}
696
697static object *
698parsestr(s)
699 char *s;
700{
701 object *v;
702 int len;
703 char *buf;
704 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000705 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000706 int c;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000707 int quote = *s;
708 if (quote != '\'' && quote != '\"') {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000709 err_badcall();
710 return NULL;
711 }
712 s++;
713 len = strlen(s);
Guido van Rossum8054fad1993-10-26 15:19:44 +0000714 if (s[--len] != quote) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000715 err_badcall();
716 return NULL;
717 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000718 if (len >= 4 && s[0] == quote && s[1] == quote) {
719 s += 2;
720 len -= 2;
721 if (s[--len] != quote || s[--len] != quote) {
722 err_badcall();
723 return NULL;
724 }
725 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000726 if (strchr(s, '\\') == NULL)
727 return newsizedstringobject(s, len);
728 v = newsizedstringobject((char *)NULL, len);
729 p = buf = getstringvalue(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000730 end = s + len;
731 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000732 if (*s != '\\') {
733 *p++ = *s++;
734 continue;
735 }
736 s++;
737 switch (*s++) {
738 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000739 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000740 case '\\': *p++ = '\\'; break;
741 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +0000742 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000743 case 'b': *p++ = '\b'; break;
744 case 'f': *p++ = '\014'; break; /* FF */
745 case 't': *p++ = '\t'; break;
746 case 'n': *p++ = '\n'; break;
747 case 'r': *p++ = '\r'; break;
748 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000749 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
750 case '0': case '1': case '2': case '3':
751 case '4': case '5': case '6': case '7':
752 c = s[-1] - '0';
753 if ('0' <= *s && *s <= '7') {
754 c = (c<<3) + *s++ - '0';
755 if ('0' <= *s && *s <= '7')
756 c = (c<<3) + *s++ - '0';
757 }
758 *p++ = c;
759 break;
760 case 'x':
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000761 if (isxdigit(Py_CHARMASK(*s))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000762 sscanf(s, "%x", &c);
763 *p++ = c;
764 do {
765 s++;
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000766 } while (isxdigit(Py_CHARMASK(*s)));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000767 break;
768 }
769 /* FALLTHROUGH */
770 default: *p++ = '\\'; *p++ = s[-1]; break;
771 }
772 }
773 resizestring(&v, (int)(p - buf));
774 return v;
775}
776
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000777static object *
778parsestrplus(n)
779 node *n;
780{
781 object *v;
782 int i;
783 REQ(CHILD(n, 0), STRING);
784 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
785 /* String literal concatenation */
786 for (i = 1; i < NCH(n) && v != NULL; i++) {
787 joinstring_decref(&v, parsestr(STR(CHILD(n, i))));
788 }
789 }
790 return v;
791}
792
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000793static void
794com_list_constructor(c, n)
795 struct compiling *c;
796 node *n;
797{
798 int len;
799 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000800 if (TYPE(n) != testlist)
801 REQ(n, exprlist);
802 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
803 len = (NCH(n) + 1) / 2;
804 for (i = 0; i < NCH(n); i += 2)
805 com_node(c, CHILD(n, i));
806 com_addoparg(c, BUILD_LIST, len);
807}
808
809static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000810com_dictmaker(c, n)
811 struct compiling *c;
812 node *n;
813{
814 int i;
815 /* dictmaker: test ':' test (',' test ':' value)* [','] */
816 for (i = 0; i+2 < NCH(n); i += 4) {
817 /* We must arrange things just right for STORE_SUBSCR.
818 It wants the stack to look like (value) (dict) (key) */
819 com_addbyte(c, DUP_TOP);
820 com_node(c, CHILD(n, i+2)); /* value */
821 com_addbyte(c, ROT_TWO);
822 com_node(c, CHILD(n, i)); /* key */
823 com_addbyte(c, STORE_SUBSCR);
824 }
825}
826
827static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000828com_atom(c, n)
829 struct compiling *c;
830 node *n;
831{
832 node *ch;
833 object *v;
834 int i;
835 REQ(n, atom);
836 ch = CHILD(n, 0);
837 switch (TYPE(ch)) {
838 case LPAR:
839 if (TYPE(CHILD(n, 1)) == RPAR)
840 com_addoparg(c, BUILD_TUPLE, 0);
841 else
842 com_node(c, CHILD(n, 1));
843 break;
844 case LSQB:
845 if (TYPE(CHILD(n, 1)) == RSQB)
846 com_addoparg(c, BUILD_LIST, 0);
847 else
848 com_list_constructor(c, CHILD(n, 1));
849 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000850 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000851 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000852 if (TYPE(CHILD(n, 1)) != RBRACE)
853 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000854 break;
855 case BACKQUOTE:
856 com_node(c, CHILD(n, 1));
857 com_addbyte(c, UNARY_CONVERT);
858 break;
859 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +0000860 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000861 i = 255;
862 }
863 else {
864 i = com_addconst(c, v);
865 DECREF(v);
866 }
867 com_addoparg(c, LOAD_CONST, i);
868 break;
869 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000870 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000871 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000872 c->c_errors++;
873 i = 255;
874 }
875 else {
876 i = com_addconst(c, v);
877 DECREF(v);
878 }
879 com_addoparg(c, LOAD_CONST, i);
880 break;
881 case NAME:
882 com_addopname(c, LOAD_NAME, ch);
883 break;
884 default:
885 fprintf(stderr, "node type %d\n", TYPE(ch));
Guido van Rossum452a9831996-09-17 14:32:04 +0000886 com_error(c, SystemError, "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000887 }
888}
889
890static void
891com_slice(c, n, op)
892 struct compiling *c;
893 node *n;
894 int op;
895{
896 if (NCH(n) == 1) {
897 com_addbyte(c, op);
898 }
899 else if (NCH(n) == 2) {
900 if (TYPE(CHILD(n, 0)) != COLON) {
901 com_node(c, CHILD(n, 0));
902 com_addbyte(c, op+1);
903 }
904 else {
905 com_node(c, CHILD(n, 1));
906 com_addbyte(c, op+2);
907 }
908 }
909 else {
910 com_node(c, CHILD(n, 0));
911 com_node(c, CHILD(n, 2));
912 com_addbyte(c, op+3);
913 }
914}
915
Guido van Rossum635abd21997-01-06 22:56:52 +0000916static void
917com_argument(c, n, pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +0000918 struct compiling *c;
919 node *n; /* argument */
Guido van Rossum635abd21997-01-06 22:56:52 +0000920 object **pkeywords;
Guido van Rossumf10570b1995-07-07 22:53:21 +0000921{
922 node *m;
923 REQ(n, argument); /* [test '='] test; really [ keyword '='] keyword */
924 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +0000925 if (*pkeywords != NULL) {
Guido van Rossum452a9831996-09-17 14:32:04 +0000926 com_error(c, SyntaxError,
Guido van Rossumf10570b1995-07-07 22:53:21 +0000927 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +0000928 }
929 else {
930 com_node(c, CHILD(n, 0));
931 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000932 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +0000933 }
934 m = n;
935 do {
936 m = CHILD(m, 0);
937 } while (NCH(m) == 1);
938 if (TYPE(m) != NAME) {
Guido van Rossum452a9831996-09-17 14:32:04 +0000939 com_error(c, SyntaxError, "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +0000940 }
941 else {
942 object *v = newstringobject(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +0000943 if (v != NULL && *pkeywords == NULL)
944 *pkeywords = newdictobject();
945 if (v == NULL || *pkeywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +0000946 c->c_errors++;
947 else {
Guido van Rossum635abd21997-01-06 22:56:52 +0000948 if (dict2lookup(*pkeywords, v) != NULL)
949 com_error(c, SyntaxError,
950 "duplicate keyword argument");
951 else
952 if (dict2insert(*pkeywords, v, v) != 0)
953 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +0000954 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
955 DECREF(v);
956 }
957 }
958 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +0000959}
960
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000961static void
962com_call_function(c, n)
963 struct compiling *c;
Guido van Rossumf10570b1995-07-07 22:53:21 +0000964 node *n; /* EITHER arglist OR ')' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000965{
966 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +0000967 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000968 }
969 else {
Guido van Rossum635abd21997-01-06 22:56:52 +0000970 object *keywords = NULL;
971 int i, na, nk;
Guido van Rossumf10570b1995-07-07 22:53:21 +0000972 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +0000973 na = 0;
974 nk = 0;
975 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossum635abd21997-01-06 22:56:52 +0000976 com_argument(c, CHILD(n, i), &keywords);
977 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +0000978 na++;
979 else
980 nk++;
981 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000982 XDECREF(keywords);
Guido van Rossumf10570b1995-07-07 22:53:21 +0000983 if (na > 255 || nk > 255) {
Guido van Rossum452a9831996-09-17 14:32:04 +0000984 com_error(c, SyntaxError, "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +0000985 }
986 com_addoparg(c, CALL_FUNCTION, na | (nk << 8));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000987 }
988}
989
990static void
991com_select_member(c, n)
992 struct compiling *c;
993 node *n;
994{
995 com_addopname(c, LOAD_ATTR, n);
996}
997
998static void
Guido van Rossum8861b741996-07-30 16:49:37 +0000999com_sliceobj(c, n)
1000 struct compiling *c;
1001 node *n;
1002{
1003 int i=0;
1004 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001005 node *ch;
1006
1007 /* first argument */
1008 if (TYPE(CHILD(n,i)) == COLON) {
1009 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1010 i++;
1011 }
1012 else {
1013 com_node(c, CHILD(n,i));
1014 i++;
1015 REQ(CHILD(n,i),COLON);
1016 i++;
1017 }
1018 /* second argument */
1019 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1020 com_node(c, CHILD(n,i));
1021 i++;
1022 }
1023 else com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1024 /* remaining arguments */
1025 for (; i < NCH(n); i++) {
1026 ns++;
1027 ch=CHILD(n,i);
1028 REQ(ch, sliceop);
1029 if (NCH(ch) == 1) {
1030 /* right argument of ':' missing */
1031 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1032 }
1033 else
1034 com_node(c, CHILD(ch,1));
1035 }
1036 com_addoparg(c, BUILD_SLICE, ns);
1037}
1038
1039static void
1040com_subscript(c, n)
1041 struct compiling *c;
1042 node *n;
1043{
1044 node *ch;
1045 REQ(n, subscript);
1046 ch = CHILD(n,0);
1047 /* check for rubber index */
1048 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT)
Guido van Rossume449af71996-10-11 16:25:41 +00001049 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8861b741996-07-30 16:49:37 +00001050 else {
1051 /* check for slice */
1052 if ((TYPE(ch) == COLON || NCH(n) > 1))
1053 com_sliceobj(c, n);
1054 else {
1055 REQ(ch, test);
1056 com_node(c, ch);
1057 }
1058 }
1059}
1060
1061static void
1062com_subscriptlist(c, n, assigning)
1063 struct compiling *c;
1064 node *n;
1065 int assigning;
1066{
1067 int i, op;
1068 REQ(n, subscriptlist);
1069 /* Check to make backward compatible slice behavior for '[i:j]' */
1070 if (NCH(n) == 1) {
1071 node *sub = CHILD(n, 0); /* subscript */
1072 /* Make it is a simple slice.
1073 should have exactly one colon. */
1074 if ((TYPE(CHILD(sub, 0)) == COLON
1075 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1076 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop)) {
1077 if (assigning == OP_APPLY)
1078 op = SLICE;
1079 else
1080 op = ((assigning == OP_ASSIGN) ? STORE_SLICE : DELETE_SLICE);
1081 com_slice(c, sub, op);
1082 return;
1083 }
1084 }
1085 /* Else normal subscriptlist. Compile each subscript. */
1086 for (i = 0; i < NCH(n); i += 2)
1087 com_subscript(c, CHILD(n, i));
1088 /* Put multiple subscripts into a tuple */
1089 if (NCH(n) > 1)
1090 com_addoparg(c, BUILD_TUPLE, (NCH(n)+1) / 2);
1091 if (assigning == OP_APPLY)
1092 op = BINARY_SUBSCR;
1093 else
1094 op = ((assigning == OP_ASSIGN) ? STORE_SUBSCR : DELETE_SUBSCR);
1095 com_addbyte(c, op);
1096}
1097
1098static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001099com_apply_trailer(c, n)
1100 struct compiling *c;
1101 node *n;
1102{
1103 REQ(n, trailer);
1104 switch (TYPE(CHILD(n, 0))) {
1105 case LPAR:
1106 com_call_function(c, CHILD(n, 1));
1107 break;
1108 case DOT:
1109 com_select_member(c, CHILD(n, 1));
1110 break;
1111 case LSQB:
Guido van Rossum8861b741996-07-30 16:49:37 +00001112 com_subscriptlist(c, CHILD(n, 1), OP_APPLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001113 break;
1114 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001115 com_error(c, SystemError,
1116 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001117 }
1118}
1119
1120static void
Guido van Rossum50564e81996-01-12 01:13:16 +00001121com_power(c, n)
1122 struct compiling *c;
1123 node *n;
1124{
1125 int i;
1126 REQ(n, power);
1127 com_atom(c, CHILD(n, 0));
1128 for (i = 1; i < NCH(n); i++) {
1129 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1130 com_factor(c, CHILD(n, i+1));
1131 com_addbyte(c, BINARY_POWER);
1132 break;
1133 }
1134 else
1135 com_apply_trailer(c, CHILD(n, i));
1136 }
1137}
1138
1139static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001140com_factor(c, n)
1141 struct compiling *c;
1142 node *n;
1143{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001144 REQ(n, factor);
1145 if (TYPE(CHILD(n, 0)) == PLUS) {
1146 com_factor(c, CHILD(n, 1));
1147 com_addbyte(c, UNARY_POSITIVE);
1148 }
1149 else if (TYPE(CHILD(n, 0)) == MINUS) {
1150 com_factor(c, CHILD(n, 1));
1151 com_addbyte(c, UNARY_NEGATIVE);
1152 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001153 else if (TYPE(CHILD(n, 0)) == TILDE) {
1154 com_factor(c, CHILD(n, 1));
1155 com_addbyte(c, UNARY_INVERT);
1156 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001157 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001158 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001159 }
1160}
1161
1162static void
1163com_term(c, n)
1164 struct compiling *c;
1165 node *n;
1166{
1167 int i;
1168 int op;
1169 REQ(n, term);
1170 com_factor(c, CHILD(n, 0));
1171 for (i = 2; i < NCH(n); i += 2) {
1172 com_factor(c, CHILD(n, i));
1173 switch (TYPE(CHILD(n, i-1))) {
1174 case STAR:
1175 op = BINARY_MULTIPLY;
1176 break;
1177 case SLASH:
1178 op = BINARY_DIVIDE;
1179 break;
1180 case PERCENT:
1181 op = BINARY_MODULO;
1182 break;
1183 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001184 com_error(c, SystemError,
1185 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001186 op = 255;
1187 }
1188 com_addbyte(c, op);
1189 }
1190}
1191
1192static void
1193com_arith_expr(c, n)
1194 struct compiling *c;
1195 node *n;
1196{
1197 int i;
1198 int op;
1199 REQ(n, arith_expr);
1200 com_term(c, CHILD(n, 0));
1201 for (i = 2; i < NCH(n); i += 2) {
1202 com_term(c, CHILD(n, i));
1203 switch (TYPE(CHILD(n, i-1))) {
1204 case PLUS:
1205 op = BINARY_ADD;
1206 break;
1207 case MINUS:
1208 op = BINARY_SUBTRACT;
1209 break;
1210 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001211 com_error(c, SystemError,
1212 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001213 op = 255;
1214 }
1215 com_addbyte(c, op);
1216 }
1217}
1218
1219static void
1220com_shift_expr(c, n)
1221 struct compiling *c;
1222 node *n;
1223{
1224 int i;
1225 int op;
1226 REQ(n, shift_expr);
1227 com_arith_expr(c, CHILD(n, 0));
1228 for (i = 2; i < NCH(n); i += 2) {
1229 com_arith_expr(c, CHILD(n, i));
1230 switch (TYPE(CHILD(n, i-1))) {
1231 case LEFTSHIFT:
1232 op = BINARY_LSHIFT;
1233 break;
1234 case RIGHTSHIFT:
1235 op = BINARY_RSHIFT;
1236 break;
1237 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001238 com_error(c, SystemError,
1239 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001240 op = 255;
1241 }
1242 com_addbyte(c, op);
1243 }
1244}
1245
1246static void
1247com_and_expr(c, n)
1248 struct compiling *c;
1249 node *n;
1250{
1251 int i;
1252 int op;
1253 REQ(n, and_expr);
1254 com_shift_expr(c, CHILD(n, 0));
1255 for (i = 2; i < NCH(n); i += 2) {
1256 com_shift_expr(c, CHILD(n, i));
1257 if (TYPE(CHILD(n, i-1)) == AMPER) {
1258 op = BINARY_AND;
1259 }
1260 else {
Guido van Rossum452a9831996-09-17 14:32:04 +00001261 com_error(c, SystemError,
1262 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001263 op = 255;
1264 }
1265 com_addbyte(c, op);
1266 }
1267}
1268
1269static void
1270com_xor_expr(c, n)
1271 struct compiling *c;
1272 node *n;
1273{
1274 int i;
1275 int op;
1276 REQ(n, xor_expr);
1277 com_and_expr(c, CHILD(n, 0));
1278 for (i = 2; i < NCH(n); i += 2) {
1279 com_and_expr(c, CHILD(n, i));
1280 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1281 op = BINARY_XOR;
1282 }
1283 else {
Guido van Rossum452a9831996-09-17 14:32:04 +00001284 com_error(c, SystemError,
1285 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001286 op = 255;
1287 }
1288 com_addbyte(c, op);
1289 }
1290}
1291
1292static void
1293com_expr(c, n)
1294 struct compiling *c;
1295 node *n;
1296{
1297 int i;
1298 int op;
1299 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001300 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001301 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001302 com_xor_expr(c, CHILD(n, i));
1303 if (TYPE(CHILD(n, i-1)) == VBAR) {
1304 op = BINARY_OR;
1305 }
1306 else {
Guido van Rossum452a9831996-09-17 14:32:04 +00001307 com_error(c, SystemError,
1308 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001309 op = 255;
1310 }
1311 com_addbyte(c, op);
1312 }
1313}
1314
1315static enum cmp_op
1316cmp_type(n)
1317 node *n;
1318{
1319 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001320 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001321 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1322 if (NCH(n) == 1) {
1323 n = CHILD(n, 0);
1324 switch (TYPE(n)) {
1325 case LESS: return LT;
1326 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001327 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001328 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001329 case LESSEQUAL: return LE;
1330 case GREATEREQUAL: return GE;
1331 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001332 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1333 if (strcmp(STR(n), "is") == 0) return IS;
1334 }
1335 }
1336 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001337 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001338 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1339 return NOT_IN;
1340 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1341 return IS_NOT;
1342 }
1343 }
1344 return BAD;
1345}
1346
1347static void
1348com_comparison(c, n)
1349 struct compiling *c;
1350 node *n;
1351{
1352 int i;
1353 enum cmp_op op;
1354 int anchor;
1355 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
1356 com_expr(c, CHILD(n, 0));
1357 if (NCH(n) == 1)
1358 return;
1359
1360 /****************************************************************
1361 The following code is generated for all but the last
1362 comparison in a chain:
1363
1364 label: on stack: opcode: jump to:
1365
1366 a <code to load b>
1367 a, b DUP_TOP
1368 a, b, b ROT_THREE
1369 b, a, b COMPARE_OP
1370 b, 0-or-1 JUMP_IF_FALSE L1
1371 b, 1 POP_TOP
1372 b
1373
1374 We are now ready to repeat this sequence for the next
1375 comparison in the chain.
1376
1377 For the last we generate:
1378
1379 b <code to load c>
1380 b, c COMPARE_OP
1381 0-or-1
1382
1383 If there were any jumps to L1 (i.e., there was more than one
1384 comparison), we generate:
1385
1386 0-or-1 JUMP_FORWARD L2
1387 L1: b, 0 ROT_TWO
1388 0, b POP_TOP
1389 0
1390 L2:
1391 ****************************************************************/
1392
1393 anchor = 0;
1394
1395 for (i = 2; i < NCH(n); i += 2) {
1396 com_expr(c, CHILD(n, i));
1397 if (i+2 < NCH(n)) {
1398 com_addbyte(c, DUP_TOP);
1399 com_addbyte(c, ROT_THREE);
1400 }
1401 op = cmp_type(CHILD(n, i-1));
1402 if (op == BAD) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001403 com_error(c, SystemError,
1404 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001405 }
1406 com_addoparg(c, COMPARE_OP, op);
1407 if (i+2 < NCH(n)) {
1408 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1409 com_addbyte(c, POP_TOP);
1410 }
1411 }
1412
1413 if (anchor) {
1414 int anchor2 = 0;
1415 com_addfwref(c, JUMP_FORWARD, &anchor2);
1416 com_backpatch(c, anchor);
1417 com_addbyte(c, ROT_TWO);
1418 com_addbyte(c, POP_TOP);
1419 com_backpatch(c, anchor2);
1420 }
1421}
1422
1423static void
1424com_not_test(c, n)
1425 struct compiling *c;
1426 node *n;
1427{
1428 REQ(n, not_test); /* 'not' not_test | comparison */
1429 if (NCH(n) == 1) {
1430 com_comparison(c, CHILD(n, 0));
1431 }
1432 else {
1433 com_not_test(c, CHILD(n, 1));
1434 com_addbyte(c, UNARY_NOT);
1435 }
1436}
1437
1438static void
1439com_and_test(c, n)
1440 struct compiling *c;
1441 node *n;
1442{
1443 int i;
1444 int anchor;
1445 REQ(n, and_test); /* not_test ('and' not_test)* */
1446 anchor = 0;
1447 i = 0;
1448 for (;;) {
1449 com_not_test(c, CHILD(n, i));
1450 if ((i += 2) >= NCH(n))
1451 break;
1452 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1453 com_addbyte(c, POP_TOP);
1454 }
1455 if (anchor)
1456 com_backpatch(c, anchor);
1457}
1458
1459static void
1460com_test(c, n)
1461 struct compiling *c;
1462 node *n;
1463{
Guido van Rossum57531fe1993-11-30 14:57:42 +00001464 REQ(n, test); /* and_test ('and' and_test)* | lambdef */
1465 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
1466 object *v;
1467 int i;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001468 int ndefs = com_argdefs(c, CHILD(n, 0));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001469 v = (object *) icompile(CHILD(n, 0), c);
Guido van Rossum57531fe1993-11-30 14:57:42 +00001470 if (v == NULL) {
1471 c->c_errors++;
1472 i = 255;
1473 }
1474 else {
1475 i = com_addconst(c, v);
1476 DECREF(v);
1477 }
1478 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001479 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001480 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00001481 else {
1482 int anchor = 0;
1483 int i = 0;
1484 for (;;) {
1485 com_and_test(c, CHILD(n, i));
1486 if ((i += 2) >= NCH(n))
1487 break;
1488 com_addfwref(c, JUMP_IF_TRUE, &anchor);
1489 com_addbyte(c, POP_TOP);
1490 }
1491 if (anchor)
1492 com_backpatch(c, anchor);
1493 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001494}
1495
1496static void
Guido van Rossum288a60f1991-12-16 13:05:10 +00001497com_list(c, n, toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001498 struct compiling *c;
1499 node *n;
Guido van Rossum288a60f1991-12-16 13:05:10 +00001500 int toplevel; /* If nonzero, *always* build a tuple */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001501{
1502 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00001503 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001504 com_node(c, CHILD(n, 0));
1505 }
1506 else {
1507 int i;
1508 int len;
1509 len = (NCH(n) + 1) / 2;
1510 for (i = 0; i < NCH(n); i += 2)
1511 com_node(c, CHILD(n, i));
1512 com_addoparg(c, BUILD_TUPLE, len);
1513 }
1514}
1515
1516
1517/* Begin of assignment compilation */
1518
1519static void com_assign_name PROTO((struct compiling *, node *, int));
1520static void com_assign PROTO((struct compiling *, node *, int));
1521
1522static void
1523com_assign_attr(c, n, assigning)
1524 struct compiling *c;
1525 node *n;
1526 int assigning;
1527{
1528 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
1529}
1530
1531static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001532com_assign_trailer(c, n, assigning)
1533 struct compiling *c;
1534 node *n;
1535 int assigning;
1536{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001537 REQ(n, trailer);
1538 switch (TYPE(CHILD(n, 0))) {
1539 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum452a9831996-09-17 14:32:04 +00001540 com_error(c, SyntaxError, "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001541 break;
1542 case DOT: /* '.' NAME */
1543 com_assign_attr(c, CHILD(n, 1), assigning);
1544 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001545 case LSQB: /* '[' subscriptlist ']' */
1546 com_subscriptlist(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001547 break;
1548 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001549 com_error(c, SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001550 }
1551}
1552
1553static void
1554com_assign_tuple(c, n, assigning)
1555 struct compiling *c;
1556 node *n;
1557 int assigning;
1558{
1559 int i;
1560 if (TYPE(n) != testlist)
1561 REQ(n, exprlist);
1562 if (assigning)
1563 com_addoparg(c, UNPACK_TUPLE, (NCH(n)+1)/2);
1564 for (i = 0; i < NCH(n); i += 2)
1565 com_assign(c, CHILD(n, i), assigning);
1566}
1567
1568static void
1569com_assign_list(c, n, assigning)
1570 struct compiling *c;
1571 node *n;
1572 int assigning;
1573{
1574 int i;
1575 if (assigning)
1576 com_addoparg(c, UNPACK_LIST, (NCH(n)+1)/2);
1577 for (i = 0; i < NCH(n); i += 2)
1578 com_assign(c, CHILD(n, i), assigning);
1579}
1580
1581static void
1582com_assign_name(c, n, assigning)
1583 struct compiling *c;
1584 node *n;
1585 int assigning;
1586{
1587 REQ(n, NAME);
1588 com_addopname(c, assigning ? STORE_NAME : DELETE_NAME, n);
1589}
1590
1591static void
1592com_assign(c, n, assigning)
1593 struct compiling *c;
1594 node *n;
1595 int assigning;
1596{
1597 /* Loop to avoid trivial recursion */
1598 for (;;) {
1599 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001600
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001601 case exprlist:
1602 case testlist:
1603 if (NCH(n) > 1) {
1604 com_assign_tuple(c, n, assigning);
1605 return;
1606 }
1607 n = CHILD(n, 0);
1608 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001609
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001610 case test:
1611 case and_test:
1612 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001613 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001614 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00001615 case xor_expr:
1616 case and_expr:
1617 case shift_expr:
1618 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001619 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00001620 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001621 if (NCH(n) > 1) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001622 com_error(c, SyntaxError,
1623 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001624 return;
1625 }
1626 n = CHILD(n, 0);
1627 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001628
Guido van Rossum50564e81996-01-12 01:13:16 +00001629 case power: /* atom trailer* ('**' power)* */
1630/* ('+'|'-'|'~') factor | atom trailer* */
1631 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001632 com_error(c, SyntaxError,
1633 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001634 return;
1635 }
Guido van Rossum50564e81996-01-12 01:13:16 +00001636 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001637 int i;
1638 com_node(c, CHILD(n, 0));
1639 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00001640 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001641 com_error(c, SyntaxError,
1642 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00001643 return;
1644 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001645 com_apply_trailer(c, CHILD(n, i));
1646 } /* NB i is still alive */
1647 com_assign_trailer(c,
1648 CHILD(n, i), assigning);
1649 return;
1650 }
1651 n = CHILD(n, 0);
1652 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001653
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001654 case atom:
1655 switch (TYPE(CHILD(n, 0))) {
1656 case LPAR:
1657 n = CHILD(n, 1);
1658 if (TYPE(n) == RPAR) {
1659 /* XXX Should allow () = () ??? */
Guido van Rossum452a9831996-09-17 14:32:04 +00001660 com_error(c, SyntaxError,
1661 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001662 return;
1663 }
1664 break;
1665 case LSQB:
1666 n = CHILD(n, 1);
1667 if (TYPE(n) == RSQB) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001668 com_error(c, SyntaxError,
1669 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001670 return;
1671 }
1672 com_assign_list(c, n, assigning);
1673 return;
1674 case NAME:
1675 com_assign_name(c, CHILD(n, 0), assigning);
1676 return;
1677 default:
Guido van Rossum452a9831996-09-17 14:32:04 +00001678 com_error(c, SyntaxError,
1679 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001680 return;
1681 }
1682 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001683
1684 case lambdef:
Guido van Rossum452a9831996-09-17 14:32:04 +00001685 com_error(c, SyntaxError, "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00001686 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001687
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001688 default:
1689 fprintf(stderr, "node type %d\n", TYPE(n));
Guido van Rossum452a9831996-09-17 14:32:04 +00001690 com_error(c, SystemError, "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001691 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001692
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001693 }
1694 }
1695}
1696
1697static void
1698com_expr_stmt(c, n)
1699 struct compiling *c;
1700 node *n;
1701{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001702 REQ(n, expr_stmt); /* testlist ('=' testlist)* */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001703 com_node(c, CHILD(n, NCH(n)-1));
1704 if (NCH(n) == 1) {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001705 if (c->c_interactive)
1706 com_addbyte(c, PRINT_EXPR);
1707 else
1708 com_addbyte(c, POP_TOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001709 }
1710 else {
1711 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001712 for (i = 0; i < NCH(n)-2; i+=2) {
1713 if (i+2 < NCH(n)-2)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001714 com_addbyte(c, DUP_TOP);
Guido van Rossum8861b741996-07-30 16:49:37 +00001715 com_assign(c, CHILD(n, i), OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001716 }
1717 }
1718}
1719
1720static void
1721com_print_stmt(c, n)
1722 struct compiling *c;
1723 node *n;
1724{
1725 int i;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001726 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
1727 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001728 com_node(c, CHILD(n, i));
1729 com_addbyte(c, PRINT_ITEM);
1730 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001731 if (TYPE(CHILD(n, NCH(n)-1)) != COMMA)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001732 com_addbyte(c, PRINT_NEWLINE);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001733 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001734}
1735
1736static void
1737com_return_stmt(c, n)
1738 struct compiling *c;
1739 node *n;
1740{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001741 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001742 if (!c->c_infunction) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001743 com_error(c, SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001744 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001745 if (NCH(n) < 2)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001746 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1747 else
1748 com_node(c, CHILD(n, 1));
1749 com_addbyte(c, RETURN_VALUE);
1750}
1751
1752static void
1753com_raise_stmt(c, n)
1754 struct compiling *c;
1755 node *n;
1756{
Guido van Rossumf10570b1995-07-07 22:53:21 +00001757 REQ(n, raise_stmt); /* 'raise' test [',' test [',' test]] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001758 com_node(c, CHILD(n, 1));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001759 if (NCH(n) > 3) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001760 com_node(c, CHILD(n, 3));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001761 if (NCH(n) > 5)
1762 com_node(c, CHILD(n, 5));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001763 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001764 com_addoparg(c, RAISE_VARARGS, NCH(n)/2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001765}
1766
1767static void
1768com_import_stmt(c, n)
1769 struct compiling *c;
1770 node *n;
1771{
1772 int i;
1773 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001774 /* 'import' dotted_name (',' dotted_name)* |
1775 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001776 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001777 /* 'from' dotted_name 'import' ... */
1778 REQ(CHILD(n, 1), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001779 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
1780 for (i = 3; i < NCH(n); i += 2)
1781 com_addopname(c, IMPORT_FROM, CHILD(n, i));
1782 com_addbyte(c, POP_TOP);
1783 }
1784 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001785 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001786 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001787 REQ(CHILD(n, i), dotted_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001788 com_addopname(c, IMPORT_NAME, CHILD(n, i));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001789 com_addopname(c, STORE_NAME, CHILD(CHILD(n, i), 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001790 }
1791 }
1792}
1793
1794static void
Guido van Rossumc5e96291991-12-10 13:53:51 +00001795com_global_stmt(c, n)
1796 struct compiling *c;
1797 node *n;
1798{
1799 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001800 REQ(n, global_stmt);
1801 /* 'global' NAME (',' NAME)* */
1802 for (i = 1; i < NCH(n); i += 2) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001803 char *s = STR(CHILD(n, i));
Guido van Rossumfe2236f1996-08-24 07:29:04 +00001804#ifdef PRIVATE_NAME_MANGLING
1805 char buffer[256];
1806 if (s != NULL && s[0] == '_' && s[1] == '_' &&
1807 c->c_private != NULL &&
1808 com_mangle(c, s, buffer, (int)sizeof(buffer)))
1809 s = buffer;
1810#endif
Guido van Rossum681d79a1995-07-18 14:51:37 +00001811 if (dictlookup(c->c_locals, s) != NULL) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001812 com_error(c, SyntaxError, "name is local and global");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001813 }
1814 else if (dictinsert(c->c_globals, s, None) != 0)
Guido van Rossumc5e96291991-12-10 13:53:51 +00001815 c->c_errors++;
1816 }
1817}
1818
Guido van Rossum681d79a1995-07-18 14:51:37 +00001819static int
1820com_newlocal_o(c, nameval)
1821 struct compiling *c;
1822 object *nameval;
1823{
1824 int i;
1825 object *ival;
1826 if (getlistsize(c->c_varnames) != c->c_nlocals) {
1827 /* This is usually caused by an error on a previous call */
1828 if (c->c_errors == 0) {
Guido van Rossum452a9831996-09-17 14:32:04 +00001829 com_error(c, SystemError, "mixed up var name/index");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001830 }
1831 return 0;
1832 }
1833 ival = newintobject(i = c->c_nlocals++);
1834 if (ival == NULL)
1835 c->c_errors++;
1836 else if (mappinginsert(c->c_locals, nameval, ival) != 0)
1837 c->c_errors++;
1838 else if (addlistitem(c->c_varnames, nameval) != 0)
1839 c->c_errors++;
1840 XDECREF(ival);
1841 return i;
1842}
1843
1844static int
1845com_addlocal_o(c, nameval)
1846 struct compiling *c;
1847 object *nameval;
1848{
1849 object *ival = mappinglookup(c->c_locals, nameval);
1850 if (ival != NULL)
1851 return getintvalue(ival);
1852 return com_newlocal_o(c, nameval);
1853}
1854
1855static int
1856com_newlocal(c, name)
1857 struct compiling *c;
1858 char *name;
1859{
1860 object *nameval = newstringobject(name);
1861 int i;
1862 if (nameval == NULL) {
1863 c->c_errors++;
1864 return 0;
1865 }
1866 i = com_newlocal_o(c, nameval);
1867 DECREF(nameval);
1868 return i;
1869}
1870
Guido van Rossum25831651993-05-19 14:50:45 +00001871#define strequ(a, b) (strcmp((a), (b)) == 0)
1872
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001873#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum25831651993-05-19 14:50:45 +00001874static void
1875com_access_stmt(c, n)
1876 struct compiling *c;
1877 node *n;
1878{
1879 int i, j, k, mode, imode;
1880 object *vmode;
1881 REQ(n, access_stmt);
1882 /* 'access' NAME (',' NAME)* ':' accesstype (',' accesstype)*
1883 accesstype: NAME+ */
1884
1885 /* Find where the colon is */
1886 i = 1;
1887 while (TYPE(CHILD(n,i-1)) != COLON)
1888 i += 1;
1889
1890 /* Calculate the mode mask */
1891 mode = 0;
1892 for (j = i; j < NCH(n); j += 2) {
Guido van Rossum81daa321993-05-20 14:24:46 +00001893 int r = 0, w = 0, p = 0;
1894 for (k = 0; k < NCH(CHILD(n,j)); k++) {
Guido van Rossum25831651993-05-19 14:50:45 +00001895 if (strequ(STR(CHILD(CHILD(n,j),k)), "public"))
1896 p = 0;
1897 else if (strequ(STR(CHILD(CHILD(n,j),k)), "protected"))
1898 p = 1;
1899 else if (strequ(STR(CHILD(CHILD(n,j),k)), "private"))
1900 p = 2;
1901 else if (strequ(STR(CHILD(CHILD(n,j),k)), "read"))
1902 r = 1;
1903 else if (strequ(STR(CHILD(CHILD(n,j),k)), "write"))
1904 w = 1;
1905 else /* XXX should make this an exception */
1906 fprintf(stderr, "bad access type %s\n",
1907 STR(CHILD(CHILD(n,j),k)));
1908 }
1909 if (r == 0 && w == 0)
Guido van Rossum81daa321993-05-20 14:24:46 +00001910 r = w = 1;
Guido van Rossum25831651993-05-19 14:50:45 +00001911 if (p == 0) {
1912 if (r == 1) mode |= AC_R_PUBLIC;
1913 if (w == 1) mode |= AC_W_PUBLIC;
1914 } else if (p == 1) {
1915 if (r == 1) mode |= AC_R_PROTECTED;
1916 if (w == 1) mode |= AC_W_PROTECTED;
1917 } else {
1918 if (r == 1) mode |= AC_R_PRIVATE;
1919 if (w == 1) mode |= AC_W_PRIVATE;
1920 }
1921 }
1922 vmode = newintobject((long)mode);
1923 imode = com_addconst(c, vmode);
1924 XDECREF(vmode);
1925 for (i = 1; TYPE(CHILD(n,i-1)) != COLON; i+=2) {
1926 com_addoparg(c, LOAD_CONST, imode);
1927 com_addopname(c, ACCESS_MODE, CHILD(n, i));
1928 }
1929}
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001930#endif
Guido van Rossum25831651993-05-19 14:50:45 +00001931
Guido van Rossumc5e96291991-12-10 13:53:51 +00001932static void
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001933com_exec_stmt(c, n)
1934 struct compiling *c;
1935 node *n;
1936{
1937 REQ(n, exec_stmt);
1938 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
1939 com_node(c, CHILD(n, 1));
1940 if (NCH(n) >= 4)
1941 com_node(c, CHILD(n, 3));
1942 else
1943 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
1944 if (NCH(n) >= 6)
1945 com_node(c, CHILD(n, 5));
1946 else
1947 com_addbyte(c, DUP_TOP);
1948 com_addbyte(c, EXEC_STMT);
1949}
1950
1951static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001952com_if_stmt(c, n)
1953 struct compiling *c;
1954 node *n;
1955{
1956 int i;
1957 int anchor = 0;
1958 REQ(n, if_stmt);
1959 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
1960 for (i = 0; i+3 < NCH(n); i+=4) {
1961 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001962 node *ch = CHILD(n, i+1);
1963 if (i > 0)
1964 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001965 com_node(c, CHILD(n, i+1));
1966 com_addfwref(c, JUMP_IF_FALSE, &a);
1967 com_addbyte(c, POP_TOP);
1968 com_node(c, CHILD(n, i+3));
1969 com_addfwref(c, JUMP_FORWARD, &anchor);
1970 com_backpatch(c, a);
1971 com_addbyte(c, POP_TOP);
1972 }
1973 if (i+2 < NCH(n))
1974 com_node(c, CHILD(n, i+2));
1975 com_backpatch(c, anchor);
1976}
1977
1978static void
1979com_while_stmt(c, n)
1980 struct compiling *c;
1981 node *n;
1982{
1983 int break_anchor = 0;
1984 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001985 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001986 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
1987 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001988 block_push(c, SETUP_LOOP);
1989 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001990 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001991 com_node(c, CHILD(n, 1));
1992 com_addfwref(c, JUMP_IF_FALSE, &anchor);
1993 com_addbyte(c, POP_TOP);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001994 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001995 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001996 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001997 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1998 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001999 com_backpatch(c, anchor);
2000 com_addbyte(c, POP_TOP);
2001 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002002 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002003 if (NCH(n) > 4)
2004 com_node(c, CHILD(n, 6));
2005 com_backpatch(c, break_anchor);
2006}
2007
2008static void
2009com_for_stmt(c, n)
2010 struct compiling *c;
2011 node *n;
2012{
2013 object *v;
2014 int break_anchor = 0;
2015 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002016 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002017 REQ(n, for_stmt);
2018 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2019 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002020 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002021 com_node(c, CHILD(n, 3));
2022 v = newintobject(0L);
2023 if (v == NULL)
2024 c->c_errors++;
2025 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
2026 XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002027 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002028 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002029 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8861b741996-07-30 16:49:37 +00002030 com_assign(c, CHILD(n, 1), OP_ASSIGN);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002031 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002032 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002033 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002034 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2035 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002036 com_backpatch(c, anchor);
2037 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002038 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002039 if (NCH(n) > 8)
2040 com_node(c, CHILD(n, 8));
2041 com_backpatch(c, break_anchor);
2042}
2043
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002044/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002045
2046 SETUP_FINALLY L
2047 <code for S>
2048 POP_BLOCK
2049 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002050 L: <code for Sf>
2051 END_FINALLY
2052
2053 The special instructions use the block stack. Each block
2054 stack entry contains the instruction that created it (here
2055 SETUP_FINALLY), the level of the value stack at the time the
2056 block stack entry was created, and a label (here L).
2057
2058 SETUP_FINALLY:
2059 Pushes the current value stack level and the label
2060 onto the block stack.
2061 POP_BLOCK:
2062 Pops en entry from the block stack, and pops the value
2063 stack until its level is the same as indicated on the
2064 block stack. (The label is ignored.)
2065 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002066 Pops a variable number of entries from the *value* stack
2067 and re-raises the exception they specify. The number of
2068 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002069
2070 The block stack is unwound when an exception is raised:
2071 when a SETUP_FINALLY entry is found, the exception is pushed
2072 onto the value stack (and the exception condition is cleared),
2073 and the interpreter jumps to the label gotten from the block
2074 stack.
2075
2076 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002077 (The contents of the value stack is shown in [], with the top
2078 at the right; 'tb' is trace-back info, 'val' the exception's
2079 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002080
2081 Value stack Label Instruction Argument
2082 [] SETUP_EXCEPT L1
2083 [] <code for S>
2084 [] POP_BLOCK
2085 [] JUMP_FORWARD L0
2086
Guido van Rossum3f5da241990-12-20 15:06:42 +00002087 [tb, val, exc] L1: DUP )
2088 [tb, val, exc, exc] <evaluate E1> )
2089 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2090 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2091 [tb, val, exc, 1] POP )
2092 [tb, val, exc] POP
2093 [tb, val] <assign to V1> (or POP if no V1)
2094 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002095 [] <code for S1>
2096 JUMP_FORWARD L0
2097
Guido van Rossum3f5da241990-12-20 15:06:42 +00002098 [tb, val, exc, 0] L2: POP
2099 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002100 .............................etc.......................
2101
Guido van Rossum3f5da241990-12-20 15:06:42 +00002102 [tb, val, exc, 0] Ln+1: POP
2103 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002104
2105 [] L0: <next statement>
2106
2107 Of course, parts are not generated if Vi or Ei is not present.
2108*/
2109
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002110static void
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002111com_try_except(c, n)
2112 struct compiling *c;
2113 node *n;
2114{
2115 int except_anchor = 0;
2116 int end_anchor = 0;
2117 int else_anchor = 0;
2118 int i;
2119 node *ch;
2120
2121 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2122 block_push(c, SETUP_EXCEPT);
2123 com_node(c, CHILD(n, 2));
2124 com_addbyte(c, POP_BLOCK);
2125 block_pop(c, SETUP_EXCEPT);
2126 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2127 com_backpatch(c, except_anchor);
2128 for (i = 3;
2129 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2130 i += 3) {
2131 /* except_clause: 'except' [expr [',' expr]] */
2132 if (except_anchor == 0) {
Guido van Rossum452a9831996-09-17 14:32:04 +00002133 com_error(c, SyntaxError,
2134 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002135 break;
2136 }
2137 except_anchor = 0;
2138 com_addoparg(c, SET_LINENO, ch->n_lineno);
2139 if (NCH(ch) > 1) {
2140 com_addbyte(c, DUP_TOP);
2141 com_node(c, CHILD(ch, 1));
2142 com_addoparg(c, COMPARE_OP, EXC_MATCH);
2143 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
2144 com_addbyte(c, POP_TOP);
2145 }
2146 com_addbyte(c, POP_TOP);
2147 if (NCH(ch) > 3)
Guido van Rossum8861b741996-07-30 16:49:37 +00002148 com_assign(c, CHILD(ch, 3), OP_ASSIGN);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002149 else
2150 com_addbyte(c, POP_TOP);
2151 com_addbyte(c, POP_TOP);
2152 com_node(c, CHILD(n, i+2));
2153 com_addfwref(c, JUMP_FORWARD, &end_anchor);
2154 if (except_anchor) {
2155 com_backpatch(c, except_anchor);
2156 com_addbyte(c, POP_TOP);
2157 }
2158 }
2159 com_addbyte(c, END_FINALLY);
2160 com_backpatch(c, else_anchor);
2161 if (i < NCH(n))
2162 com_node(c, CHILD(n, i+2));
2163 com_backpatch(c, end_anchor);
2164}
2165
2166static void
2167com_try_finally(c, n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002168 struct compiling *c;
2169 node *n;
2170{
2171 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002172 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002173
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002174 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
2175 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002176 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002177 com_addbyte(c, POP_BLOCK);
2178 block_pop(c, SETUP_FINALLY);
2179 block_push(c, END_FINALLY);
2180 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2181 com_backpatch(c, finally_anchor);
2182 ch = CHILD(n, NCH(n)-1);
2183 com_addoparg(c, SET_LINENO, ch->n_lineno);
2184 com_node(c, ch);
2185 com_addbyte(c, END_FINALLY);
2186 block_pop(c, END_FINALLY);
2187}
2188
2189static void
2190com_try_stmt(c, n)
2191 struct compiling *c;
2192 node *n;
2193{
2194 REQ(n, try_stmt);
2195 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
2196 | 'try' ':' suite 'finally' ':' suite */
2197 if (TYPE(CHILD(n, 3)) != except_clause)
2198 com_try_finally(c, n);
2199 else
2200 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002201}
2202
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002203static object *
2204get_docstring(n)
2205 node *n;
2206{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002207 int i;
2208
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002209 switch (TYPE(n)) {
2210
2211 case suite:
2212 if (NCH(n) == 1)
2213 return get_docstring(CHILD(n, 0));
2214 else {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002215 for (i = 0; i < NCH(n); i++) {
2216 node *ch = CHILD(n, i);
2217 if (TYPE(ch) == stmt)
2218 return get_docstring(ch);
2219 }
2220 }
2221 break;
2222
Guido van Rossum164d4ff1995-01-26 00:40:09 +00002223 case file_input:
2224 for (i = 0; i < NCH(n); i++) {
2225 node *ch = CHILD(n, i);
2226 if (TYPE(ch) == stmt)
2227 return get_docstring(ch);
2228 }
2229 break;
2230
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002231 case stmt:
2232 case simple_stmt:
2233 case small_stmt:
2234 return get_docstring(CHILD(n, 0));
2235
2236 case expr_stmt:
2237 case testlist:
2238 case test:
2239 case and_test:
2240 case not_test:
2241 case comparison:
2242 case expr:
2243 case xor_expr:
2244 case and_expr:
2245 case shift_expr:
2246 case arith_expr:
2247 case term:
2248 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00002249 case power:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002250 if (NCH(n) == 1)
2251 return get_docstring(CHILD(n, 0));
2252 break;
2253
2254 case atom:
2255 if (TYPE(CHILD(n, 0)) == STRING)
2256 return parsestrplus(n);
2257 break;
2258
2259 }
2260 return NULL;
2261}
2262
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002263static void
2264com_suite(c, n)
2265 struct compiling *c;
2266 node *n;
2267{
2268 REQ(n, suite);
2269 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
2270 if (NCH(n) == 1) {
2271 com_node(c, CHILD(n, 0));
2272 }
2273 else {
2274 int i;
2275 for (i = 0; i < NCH(n); i++) {
2276 node *ch = CHILD(n, i);
2277 if (TYPE(ch) == stmt)
2278 com_node(c, ch);
2279 }
2280 }
2281}
2282
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002283/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002284static void
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002285com_continue_stmt(c, n)
2286 struct compiling *c;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002287 node *n; /* Not used, but passed for consistency */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002288{
2289 int i = c->c_nblocks;
2290 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
2291 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2292 }
2293 else {
Guido van Rossum452a9831996-09-17 14:32:04 +00002294 com_error(c, SyntaxError, "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002295 }
2296 /* XXX Could allow it inside a 'finally' clause
2297 XXX if we could pop the exception still on the stack */
2298}
2299
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002300static int
Guido van Rossum681d79a1995-07-18 14:51:37 +00002301com_argdefs(c, n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002302 struct compiling *c;
2303 node *n;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002304{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002305 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002306 if (TYPE(n) == lambdef) {
2307 /* lambdef: 'lambda' [varargslist] ':' test */
2308 n = CHILD(n, 1);
2309 }
2310 else {
2311 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
2312 n = CHILD(n, 2);
2313 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
2314 n = CHILD(n, 1);
2315 }
2316 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002317 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002318 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002319 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002320 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
2321 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002322 nargs = 0;
2323 ndefs = 0;
2324 for (i = 0; i < nch; i++) {
2325 int t;
Guido van Rossum50564e81996-01-12 01:13:16 +00002326 if (TYPE(CHILD(n, i)) == STAR || TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002327 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002328 nargs++;
2329 i++;
2330 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00002331 t = RPAR; /* Anything except EQUAL or COMMA */
2332 else
2333 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002334 if (t == EQUAL) {
2335 i++;
2336 ndefs++;
2337 com_node(c, CHILD(n, i));
2338 i++;
2339 if (i >= nch)
2340 break;
2341 t = TYPE(CHILD(n, i));
2342 }
2343 else {
2344 /* Treat "(a=1, b)" as "(a=1, b=None)" */
2345 if (ndefs) {
2346 com_addoparg(c, LOAD_CONST,
2347 com_addconst(c, None));
2348 ndefs++;
2349 }
2350 }
2351 if (t != COMMA)
2352 break;
2353 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002354 return ndefs;
2355}
2356
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002357static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002358com_funcdef(c, n)
2359 struct compiling *c;
2360 node *n;
2361{
2362 object *v;
2363 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00002364 v = (object *)icompile(n, c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002365 if (v == NULL)
2366 c->c_errors++;
2367 else {
2368 int i = com_addconst(c, v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002369 int ndefs = com_argdefs(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002370 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002371 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002372 com_addopname(c, STORE_NAME, CHILD(n, 1));
2373 DECREF(v);
2374 }
2375}
2376
2377static void
Guido van Rossum25831651993-05-19 14:50:45 +00002378com_bases(c, n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002379 struct compiling *c;
2380 node *n;
2381{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00002382 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002383 REQ(n, testlist);
2384 /* testlist: test (',' test)* [','] */
2385 for (i = 0; i < NCH(n); i += 2)
2386 com_node(c, CHILD(n, i));
2387 com_addoparg(c, BUILD_TUPLE, (NCH(n)+1) / 2);
2388}
2389
2390static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002391com_classdef(c, n)
2392 struct compiling *c;
2393 node *n;
2394{
Guido van Rossum25831651993-05-19 14:50:45 +00002395 int i;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002396 object *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002397 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00002398 /* classdef: class NAME ['(' testlist ')'] ':' suite */
2399 if ((v = newstringobject(STR(CHILD(n, 1)))) == NULL) {
2400 c->c_errors++;
2401 return;
2402 }
2403 /* Push the class name on the stack */
2404 i = com_addconst(c, v);
2405 com_addoparg(c, LOAD_CONST, i);
2406 DECREF(v);
2407 /* Push the tuple of base classes on the stack */
2408 if (TYPE(CHILD(n, 2)) != LPAR)
Guido van Rossumc5e96291991-12-10 13:53:51 +00002409 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum25831651993-05-19 14:50:45 +00002410 else
2411 com_bases(c, CHILD(n, 3));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00002412 v = (object *)icompile(n, c);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002413 if (v == NULL)
2414 c->c_errors++;
2415 else {
Guido van Rossum25831651993-05-19 14:50:45 +00002416 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002417 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002418 com_addoparg(c, MAKE_FUNCTION, 0);
2419 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002420 com_addbyte(c, BUILD_CLASS);
2421 com_addopname(c, STORE_NAME, CHILD(n, 1));
2422 DECREF(v);
2423 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002424}
2425
2426static void
2427com_node(c, n)
2428 struct compiling *c;
2429 node *n;
2430{
2431 switch (TYPE(n)) {
2432
2433 /* Definition nodes */
2434
2435 case funcdef:
2436 com_funcdef(c, n);
2437 break;
2438 case classdef:
2439 com_classdef(c, n);
2440 break;
2441
2442 /* Trivial parse tree nodes */
2443
2444 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002445 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002446 case flow_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002447 com_node(c, CHILD(n, 0));
2448 break;
2449
2450 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002451 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
2452 com_addoparg(c, SET_LINENO, n->n_lineno);
2453 {
2454 int i;
2455 for (i = 0; i < NCH(n)-1; i += 2)
2456 com_node(c, CHILD(n, i));
2457 }
2458 break;
2459
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002460 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002461 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002462 com_node(c, CHILD(n, 0));
2463 break;
2464
2465 /* Statement nodes */
2466
2467 case expr_stmt:
2468 com_expr_stmt(c, n);
2469 break;
2470 case print_stmt:
2471 com_print_stmt(c, n);
2472 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002473 case del_stmt: /* 'del' exprlist */
Guido van Rossum8861b741996-07-30 16:49:37 +00002474 com_assign(c, CHILD(n, 1), OP_DELETE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002475 break;
2476 case pass_stmt:
2477 break;
2478 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002479 if (c->c_loops == 0) {
Guido van Rossum452a9831996-09-17 14:32:04 +00002480 com_error(c, SyntaxError, "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002481 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002482 com_addbyte(c, BREAK_LOOP);
2483 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002484 case continue_stmt:
2485 com_continue_stmt(c, n);
2486 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002487 case return_stmt:
2488 com_return_stmt(c, n);
2489 break;
2490 case raise_stmt:
2491 com_raise_stmt(c, n);
2492 break;
2493 case import_stmt:
2494 com_import_stmt(c, n);
2495 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00002496 case global_stmt:
2497 com_global_stmt(c, n);
2498 break;
Guido van Rossum0dfcf751996-08-12 22:00:53 +00002499#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum25831651993-05-19 14:50:45 +00002500 case access_stmt:
2501 com_access_stmt(c, n);
2502 break;
Guido van Rossum0dfcf751996-08-12 22:00:53 +00002503#endif
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002504 case exec_stmt:
2505 com_exec_stmt(c, n);
2506 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002507 case if_stmt:
2508 com_if_stmt(c, n);
2509 break;
2510 case while_stmt:
2511 com_while_stmt(c, n);
2512 break;
2513 case for_stmt:
2514 com_for_stmt(c, n);
2515 break;
2516 case try_stmt:
2517 com_try_stmt(c, n);
2518 break;
2519 case suite:
2520 com_suite(c, n);
2521 break;
2522
2523 /* Expression nodes */
2524
2525 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002526 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002527 break;
2528 case test:
2529 com_test(c, n);
2530 break;
2531 case and_test:
2532 com_and_test(c, n);
2533 break;
2534 case not_test:
2535 com_not_test(c, n);
2536 break;
2537 case comparison:
2538 com_comparison(c, n);
2539 break;
2540 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00002541 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002542 break;
2543 case expr:
2544 com_expr(c, n);
2545 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002546 case xor_expr:
2547 com_xor_expr(c, n);
2548 break;
2549 case and_expr:
2550 com_and_expr(c, n);
2551 break;
2552 case shift_expr:
2553 com_shift_expr(c, n);
2554 break;
2555 case arith_expr:
2556 com_arith_expr(c, n);
2557 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002558 case term:
2559 com_term(c, n);
2560 break;
2561 case factor:
2562 com_factor(c, n);
2563 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00002564 case power:
2565 com_power(c, n);
2566 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002567 case atom:
2568 com_atom(c, n);
2569 break;
2570
2571 default:
2572 fprintf(stderr, "node type %d\n", TYPE(n));
Guido van Rossum452a9831996-09-17 14:32:04 +00002573 com_error(c, SystemError, "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002574 }
2575}
2576
2577static void com_fplist PROTO((struct compiling *, node *));
2578
2579static void
2580com_fpdef(c, n)
2581 struct compiling *c;
2582 node *n;
2583{
2584 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
2585 if (TYPE(CHILD(n, 0)) == LPAR)
2586 com_fplist(c, CHILD(n, 1));
2587 else
Guido van Rossum681d79a1995-07-18 14:51:37 +00002588 com_addoparg(c, STORE_FAST, com_newlocal(c, STR(CHILD(n, 0))));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002589}
2590
2591static void
2592com_fplist(c, n)
2593 struct compiling *c;
2594 node *n;
2595{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00002596 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002597 if (NCH(n) == 1) {
2598 com_fpdef(c, CHILD(n, 0));
2599 }
2600 else {
2601 int i;
2602 com_addoparg(c, UNPACK_TUPLE, (NCH(n)+1)/2);
2603 for (i = 0; i < NCH(n); i += 2)
2604 com_fpdef(c, CHILD(n, i));
2605 }
2606}
2607
2608static void
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002609com_arglist(c, n)
2610 struct compiling *c;
2611 node *n;
2612{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002613 int nch, i;
2614 int complex = 0;
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002615 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00002616 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002617 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002618 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002619 /* Enter all arguments in table of locals */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002620 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002621 node *ch = CHILD(n, i);
2622 node *fp;
2623 char *name;
Guido van Rossum50564e81996-01-12 01:13:16 +00002624 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002625 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002626 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
2627 fp = CHILD(ch, 0);
2628 if (TYPE(fp) == NAME)
2629 name = STR(fp);
2630 else {
2631 name = "";
Guido van Rossum530956d1996-07-21 02:27:43 +00002632 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002633 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002634 com_newlocal(c, name);
2635 c->c_argcount++;
2636 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002637 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002638 ch = CHILD(n, i);
2639 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002640 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002641 else
2642 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002643 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002644 /* Handle *arguments */
2645 if (i < nch) {
2646 node *ch;
2647 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00002648 if (TYPE(ch) != DOUBLESTAR) {
2649 REQ(ch, STAR);
2650 ch = CHILD(n, i+1);
2651 if (TYPE(ch) == NAME) {
2652 c->c_flags |= CO_VARARGS;
2653 i += 3;
2654 com_newlocal(c, STR(ch));
2655 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002656 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002657 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002658 /* Handle **keywords */
2659 if (i < nch) {
2660 node *ch;
2661 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00002662 if (TYPE(ch) != DOUBLESTAR) {
2663 REQ(ch, STAR);
2664 ch = CHILD(n, i+1);
2665 REQ(ch, STAR);
2666 ch = CHILD(n, i+2);
2667 }
2668 else
2669 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002670 REQ(ch, NAME);
2671 c->c_flags |= CO_VARKEYWORDS;
2672 com_newlocal(c, STR(ch));
2673 }
2674 if (complex) {
2675 /* Generate code for complex arguments only after
2676 having counted the simple arguments */
2677 int ilocal = 0;
2678 for (i = 0; i < nch; i++) {
2679 node *ch = CHILD(n, i);
2680 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00002681 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002682 break;
2683 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
2684 fp = CHILD(ch, 0);
2685 if (TYPE(fp) != NAME) {
2686 com_addoparg(c, LOAD_FAST, ilocal);
2687 com_fpdef(c, ch);
2688 }
2689 ilocal++;
2690 if (++i >= nch)
2691 break;
2692 ch = CHILD(n, i);
2693 if (TYPE(ch) == EQUAL)
2694 i += 2;
2695 else
2696 REQ(ch, COMMA);
2697 }
2698 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002699}
2700
2701static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002702com_file_input(c, n)
2703 struct compiling *c;
2704 node *n;
2705{
2706 int i;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002707 object *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002708 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002709 doc = get_docstring(n);
2710 if (doc != NULL) {
2711 int i = com_addconst(c, doc);
2712 DECREF(doc);
2713 com_addoparg(c, LOAD_CONST, i);
2714 com_addopnamestr(c, STORE_NAME, "__doc__");
2715 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002716 for (i = 0; i < NCH(n); i++) {
2717 node *ch = CHILD(n, i);
2718 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
2719 com_node(c, ch);
2720 }
2721}
2722
2723/* Top-level compile-node interface */
2724
2725static void
2726compile_funcdef(c, n)
2727 struct compiling *c;
2728 node *n;
2729{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002730 object *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002731 node *ch;
2732 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00002733 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002734 doc = get_docstring(CHILD(n, 4));
2735 if (doc != NULL) {
2736 (void) com_addconst(c, doc);
2737 DECREF(doc);
2738 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002739 else
2740 (void) com_addconst(c, None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002741 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
2742 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00002743 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00002744 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002745 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002746 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002747 c->c_infunction = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002748 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2749 com_addbyte(c, RETURN_VALUE);
2750}
2751
2752static void
Guido van Rossum590baa41993-11-30 13:40:46 +00002753compile_lambdef(c, n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002754 struct compiling *c;
2755 node *n;
2756{
Guido van Rossum590baa41993-11-30 13:40:46 +00002757 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002758 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00002759 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00002760
2761 ch = CHILD(n, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002762 (void) com_addconst(c, None); /* No docstring */
2763 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00002764 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002765 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00002766 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002767 else
2768 ch = CHILD(n, 2);
2769 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002770 com_addbyte(c, RETURN_VALUE);
2771}
2772
2773static void
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002774compile_classdef(c, n)
2775 struct compiling *c;
2776 node *n;
2777{
2778 node *ch;
2779 object *doc;
2780 REQ(n, classdef);
2781 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
2782 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00002783#ifdef PRIVATE_NAME_MANGLING
2784 c->c_private = c->c_name;
2785#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002786 ch = CHILD(n, NCH(n)-1); /* The suite */
2787 doc = get_docstring(ch);
2788 if (doc != NULL) {
2789 int i = com_addconst(c, doc);
2790 DECREF(doc);
2791 com_addoparg(c, LOAD_CONST, i);
2792 com_addopnamestr(c, STORE_NAME, "__doc__");
2793 }
2794 else
2795 (void) com_addconst(c, None);
2796 com_node(c, ch);
2797 com_addbyte(c, LOAD_LOCALS);
2798 com_addbyte(c, RETURN_VALUE);
2799}
2800
2801static void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002802compile_node(c, n)
2803 struct compiling *c;
2804 node *n;
2805{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002806 com_addoparg(c, SET_LINENO, n->n_lineno);
2807
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002808 switch (TYPE(n)) {
2809
Guido van Rossum4c417781991-01-21 16:09:22 +00002810 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002811 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002812 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002813 n = CHILD(n, 0);
2814 if (TYPE(n) != NEWLINE)
2815 com_node(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002816 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2817 com_addbyte(c, RETURN_VALUE);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002818 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002819 break;
2820
Guido van Rossum4c417781991-01-21 16:09:22 +00002821 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002822 com_file_input(c, n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002823 com_addoparg(c, LOAD_CONST, com_addconst(c, None));
2824 com_addbyte(c, RETURN_VALUE);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002825 break;
2826
Guido van Rossum590baa41993-11-30 13:40:46 +00002827 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00002828 com_node(c, CHILD(n, 0));
2829 com_addbyte(c, RETURN_VALUE);
2830 break;
2831
Guido van Rossum590baa41993-11-30 13:40:46 +00002832 case lambdef: /* anonymous function definition */
2833 compile_lambdef(c, n);
2834 break;
2835
Guido van Rossum4c417781991-01-21 16:09:22 +00002836 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002837 compile_funcdef(c, n);
2838 break;
2839
Guido van Rossum4c417781991-01-21 16:09:22 +00002840 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002841 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002842 break;
2843
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002844 default:
2845 fprintf(stderr, "node type %d\n", TYPE(n));
Guido van Rossum452a9831996-09-17 14:32:04 +00002846 com_error(c, SystemError,
2847 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002848 }
2849}
2850
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002851/* Optimization for local variables in functions (and *only* functions).
Guido van Rossum282914b1991-04-04 10:42:56 +00002852
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002853 This replaces all LOAD_NAME, STORE_NAME and DELETE_NAME
2854 instructions that refer to local variables with LOAD_FAST etc.
2855 The latter instructions are much faster because they don't need to
2856 look up the variable name in a dictionary.
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002857
Guido van Rossum681d79a1995-07-18 14:51:37 +00002858 To find all local variables, we check all STORE_NAME, IMPORT_FROM
2859 and DELETE_NAME instructions. This yields all local variables,
2860 function definitions, class definitions and import statements.
2861 Argument names have already been entered into the list by the
2862 special processing for the argument list.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002863
2864 All remaining LOAD_NAME instructions must refer to non-local (global
2865 or builtin) variables, so are replaced by LOAD_GLOBAL.
2866
2867 There are two problems: 'from foo import *' and 'exec' may introduce
2868 local variables that we can't know while compiling. If this is the
Guido van Rossum681d79a1995-07-18 14:51:37 +00002869 case, we can still optimize bona fide locals (since those
2870 statements will be surrounded by fast_2_locals() and
2871 locals_2_fast()), but we can't change LOAD_NAME to LOAD_GLOBAL.
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002872
Guido van Rossum681d79a1995-07-18 14:51:37 +00002873 NB: this modifies the string object c->c_code! */
Guido van Rossum282914b1991-04-04 10:42:56 +00002874
2875static void
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002876optimize(c)
2877 struct compiling *c;
Guido van Rossum282914b1991-04-04 10:42:56 +00002878{
Guido van Rossum0a697f61991-04-16 08:39:12 +00002879 unsigned char *next_instr, *cur_instr;
Guido van Rossum282914b1991-04-04 10:42:56 +00002880 int opcode;
Guido van Rossum80bb9651996-12-05 23:27:02 +00002881 int oparg = 0;
Guido van Rossum282914b1991-04-04 10:42:56 +00002882 object *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002883 object *error_type, *error_value, *error_traceback;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002884
Guido van Rossum282914b1991-04-04 10:42:56 +00002885#define NEXTOP() (*next_instr++)
2886#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
2887#define GETITEM(v, i) (getlistitem((v), (i)))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002888#define GETNAMEOBJ(i) (GETITEM(c->c_names, (i)))
2889
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002890 err_fetch(&error_type, &error_value, &error_traceback);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002891
2892 c->c_flags |= CO_OPTIMIZED;
Guido van Rossum282914b1991-04-04 10:42:56 +00002893
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002894 next_instr = (unsigned char *) getstringvalue(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00002895 for (;;) {
2896 opcode = NEXTOP();
2897 if (opcode == STOP_CODE)
2898 break;
2899 if (HAS_ARG(opcode))
2900 oparg = NEXTARG();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002901 switch (opcode) {
2902 case STORE_NAME:
2903 case DELETE_NAME:
2904 case IMPORT_FROM:
2905 com_addlocal_o(c, GETNAMEOBJ(oparg));
2906 break;
2907 case EXEC_STMT:
2908 c->c_flags &= ~CO_OPTIMIZED;
2909 break;
Guido van Rossum282914b1991-04-04 10:42:56 +00002910 }
2911 }
2912
Guido van Rossum681d79a1995-07-18 14:51:37 +00002913 if (dictlookup(c->c_locals, "*") != NULL)
2914 c->c_flags &= ~CO_OPTIMIZED;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002915
2916 next_instr = (unsigned char *) getstringvalue(c->c_code);
Guido van Rossum282914b1991-04-04 10:42:56 +00002917 for (;;) {
2918 cur_instr = next_instr;
2919 opcode = NEXTOP();
2920 if (opcode == STOP_CODE)
2921 break;
2922 if (HAS_ARG(opcode))
2923 oparg = NEXTARG();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002924 if (opcode == LOAD_NAME ||
2925 opcode == STORE_NAME ||
2926 opcode == DELETE_NAME) {
2927 object *v;
2928 int i;
Guido van Rossum282914b1991-04-04 10:42:56 +00002929 name = GETNAMEOBJ(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002930 v = dict2lookup(c->c_locals, name);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002931 if (v == NULL) {
Guido van Rossum83163251991-08-16 08:58:43 +00002932 err_clear();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002933 if (opcode == LOAD_NAME &&
2934 (c->c_flags&CO_OPTIMIZED))
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002935 cur_instr[0] = LOAD_GLOBAL;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002936 continue;
Guido van Rossum83163251991-08-16 08:58:43 +00002937 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002938 i = getintvalue(v);
2939 switch (opcode) {
2940 case LOAD_NAME: cur_instr[0] = LOAD_FAST; break;
2941 case STORE_NAME: cur_instr[0] = STORE_FAST; break;
2942 case DELETE_NAME: cur_instr[0] = DELETE_FAST; break;
2943 }
2944 cur_instr[1] = i & 0xff;
2945 cur_instr[2] = (i>>8) & 0xff;
Guido van Rossum282914b1991-04-04 10:42:56 +00002946 }
2947 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002948
Guido van Rossum681d79a1995-07-18 14:51:37 +00002949 if (c->c_errors == 0)
2950 err_restore(error_type, error_value, error_traceback);
Guido van Rossum282914b1991-04-04 10:42:56 +00002951}
2952
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002953codeobject *
Guido van Rossum590baa41993-11-30 13:40:46 +00002954compile(n, filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002955 node *n;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002956 char *filename;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002957{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00002958 return jcompile(n, filename, NULL);
2959}
2960
2961static codeobject *
2962icompile(n, base)
2963 node *n;
2964 struct compiling *base;
2965{
2966 return jcompile(n, base->c_filename, base);
2967}
2968
2969static codeobject *
2970jcompile(n, filename, base)
2971 node *n;
2972 char *filename;
2973 struct compiling *base;
2974{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002975 struct compiling sc;
2976 codeobject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00002977 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002978 return NULL;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00002979#ifdef PRIVATE_NAME_MANGLING
2980 if (base)
2981 sc.c_private = base->c_private;
2982 else
2983 sc.c_private = NULL;
2984#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002985 compile_node(&sc, n);
2986 com_done(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002987 if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002988 optimize(&sc);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002989 sc.c_flags |= CO_NEWLOCALS;
2990 }
2991 else if (TYPE(n) == classdef)
2992 sc.c_flags |= CO_NEWLOCALS;
Guido van Rossum9bfef441993-03-29 10:43:31 +00002993 co = NULL;
2994 if (sc.c_errors == 0) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002995 object *consts, *names, *varnames, *filename, *name;
2996 consts = listtuple(sc.c_consts);
2997 names = listtuple(sc.c_names);
2998 varnames = listtuple(sc.c_varnames);
2999 filename = newstringobject(sc.c_filename);
3000 name = newstringobject(sc.c_name);
3001 if (!err_occurred())
3002 co = newcodeobject(sc.c_argcount,
3003 sc.c_nlocals,
3004 sc.c_flags,
3005 sc.c_code,
3006 consts,
3007 names,
3008 varnames,
3009 filename,
3010 name);
3011 XDECREF(consts);
3012 XDECREF(names);
3013 XDECREF(varnames);
3014 XDECREF(filename);
3015 XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003016 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003017 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003018 return co;
3019}