blob: 8e1cfd83ae75ddec21bd23319bacce74444c1ad4 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002/* Compile an expression node to intermediate code */
3
Guido van Rossum3f5da241990-12-20 15:06:42 +00004/* XXX TO DO:
Guido van Rossum8b993a91997-01-17 21:04:03 +00005 XXX add __doc__ attribute == co_doc to code object attributes?
6 XXX (it's currently the first item of the co_const tuple)
Guido van Rossum3f5da241990-12-20 15:06:42 +00007 XXX Generate simple jump for break/return outside 'try...finally'
Guido van Rossum8b993a91997-01-17 21:04:03 +00008 XXX Allow 'continue' inside try-finally
Guido van Rossum8b993a91997-01-17 21:04:03 +00009 XXX New opcode for loading the initial index for a for loop
Guido van Rossum681d79a1995-07-18 14:51:37 +000010 XXX other JAR tricks?
Guido van Rossum3f5da241990-12-20 15:06:42 +000011*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +000012
Guido van Rossum79f25d91997-04-29 20:08:16 +000013#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000014
Guido van Rossum10dc2e81990-11-18 17:27:39 +000015#include "node.h"
16#include "token.h"
17#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000018#include "compile.h"
19#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000020#include "structmember.h"
21
22#include <ctype.h>
Guido van Rossum282914b1991-04-04 10:42:56 +000023
Guido van Rossumb05a5c71997-05-07 17:46:13 +000024/* Three symbols from graminit.h are also defined in Python.h, with
25 Py_ prefixes to their names. Python.h can't include graminit.h
26 (which defines too many confusing symbols), but we can check here
27 that they haven't changed (which is very unlikely, but possible). */
28#if Py_single_input != single_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000029 #error "single_input has changed -- update Py_single_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000030#endif
31#if Py_file_input != file_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000032 #error "file_input has changed -- update Py_file_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000033#endif
34#if Py_eval_input != eval_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000035 #error "eval_input has changed -- update Py_eval_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000036#endif
37
Guido van Rossum8e793d91997-03-03 19:13:14 +000038int Py_OptimizeFlag = 0;
39
Guido van Rossum8861b741996-07-30 16:49:37 +000040#define OP_DELETE 0
41#define OP_ASSIGN 1
42#define OP_APPLY 2
43
Jeremy Hyltone36f7782001-01-19 03:21:30 +000044#define VAR_LOAD 0
45#define VAR_STORE 1
46#define VAR_DELETE 2
47
48#define NAME_LOCAL 0
49#define NAME_GLOBAL 1
50#define NAME_DEFAULT 2
51
52#define TYPE_FUNCTION 0
53#define TYPE_CLASS 1
54#define TYPE_MODULE 2
55
56#define IMPLICIT_GLOBAL 1
57#define EXPLICIT_GLOBAL 2
58
59#define MANGLE_LEN 256
60
Guido van Rossum79f25d91997-04-29 20:08:16 +000061#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000062
63static struct memberlist code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000064 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
65 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000066 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000067 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000068 {"co_code", T_OBJECT, OFF(co_code), READONLY},
69 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
70 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000071 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000072 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000073 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000074 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
75 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000076 {NULL} /* Sentinel */
77};
78
Guido van Rossum79f25d91997-04-29 20:08:16 +000079static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000080code_getattr(PyCodeObject *co, char *name)
Guido van Rossum3f5da241990-12-20 15:06:42 +000081{
Guido van Rossum79f25d91997-04-29 20:08:16 +000082 return PyMember_Get((char *)co, code_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +000083}
Guido van Rossum10dc2e81990-11-18 17:27:39 +000084
85static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000086code_dealloc(PyCodeObject *co)
Guido van Rossum10dc2e81990-11-18 17:27:39 +000087{
Guido van Rossum79f25d91997-04-29 20:08:16 +000088 Py_XDECREF(co->co_code);
89 Py_XDECREF(co->co_consts);
90 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +000091 Py_XDECREF(co->co_varnames);
Guido van Rossum79f25d91997-04-29 20:08:16 +000092 Py_XDECREF(co->co_filename);
93 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +000094 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +000095 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +000096}
97
Guido van Rossum79f25d91997-04-29 20:08:16 +000098static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000099code_repr(PyCodeObject *co)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000100{
101 char buf[500];
102 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000103 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000104 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000105
Guido van Rossuma396a882000-04-07 01:21:36 +0000106 if (co->co_firstlineno != 0)
107 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000108 if (co->co_filename && PyString_Check(co->co_filename))
109 filename = PyString_AsString(co->co_filename);
110 if (co->co_name && PyString_Check(co->co_name))
111 name = PyString_AsString(co->co_name);
Fred Drake615ae552000-06-30 16:20:13 +0000112 sprintf(buf, "<code object %.100s at %p, file \"%.300s\", line %d>",
113 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000114 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000115}
116
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000117static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000118code_compare(PyCodeObject *co, PyCodeObject *cp)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000119{
120 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000121 cmp = PyObject_Compare(co->co_name, cp->co_name);
122 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000123 cmp = co->co_argcount - cp->co_argcount;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000124 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000125 cmp = co->co_nlocals - cp->co_nlocals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000126 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000127 cmp = co->co_flags - cp->co_flags;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000128 if (cmp) return cmp;
Guido van Rossumd076c731998-10-07 19:42:25 +0000129 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000130 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000131 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000132 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000133 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000134 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000135 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000136 return cmp;
137}
138
139static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000140code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000141{
Guido van Rossum44679592000-04-10 16:20:31 +0000142 long h, h0, h1, h2, h3, h4;
143 h0 = PyObject_Hash(co->co_name);
144 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000145 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000146 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000147 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000148 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000149 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000150 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000151 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000152 if (h4 == -1) return -1;
Guido van Rossum44679592000-04-10 16:20:31 +0000153 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000154 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000155 if (h == -1) h = -2;
156 return h;
157}
158
Guido van Rossum79f25d91997-04-29 20:08:16 +0000159PyTypeObject PyCode_Type = {
160 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000161 0,
162 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000163 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000164 0,
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000165 (destructor)code_dealloc, /*tp_dealloc*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000166 0, /*tp_print*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000167 (getattrfunc)code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000168 0, /*tp_setattr*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000169 (cmpfunc)code_compare, /*tp_compare*/
170 (reprfunc)code_repr, /*tp_repr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000171 0, /*tp_as_number*/
172 0, /*tp_as_sequence*/
173 0, /*tp_as_mapping*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000174 (hashfunc)code_hash, /*tp_hash*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000175};
176
Guido van Rossum644a12b1997-04-09 19:24:53 +0000177#define NAME_CHARS \
178 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
179
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000180/* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
181
182static int
183all_name_chars(unsigned char *s)
184{
185 static char ok_name_char[256];
186 static unsigned char *name_chars = NAME_CHARS;
187
188 if (ok_name_char[*name_chars] == 0) {
189 unsigned char *p;
190 for (p = name_chars; *p; p++)
191 ok_name_char[*p] = 1;
192 }
193 while (*s) {
194 if (ok_name_char[*s++] == 0)
195 return 0;
196 }
197 return 1;
198}
199
Guido van Rossum79f25d91997-04-29 20:08:16 +0000200PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000201PyCode_New(int argcount, int nlocals, int stacksize, int flags,
202 PyObject *code, PyObject *consts, PyObject *names,
203 PyObject *varnames, PyObject *filename, PyObject *name,
204 int firstlineno, PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000205{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000206 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000207 int i;
Guido van Rossumd076c731998-10-07 19:42:25 +0000208 PyBufferProcs *pb;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000209 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000210 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000211 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000212 consts == NULL || !PyTuple_Check(consts) ||
213 names == NULL || !PyTuple_Check(names) ||
214 varnames == NULL || !PyTuple_Check(varnames) ||
215 name == NULL || !PyString_Check(name) ||
216 filename == NULL || !PyString_Check(filename) ||
217 lnotab == NULL || !PyString_Check(lnotab)) {
218 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000219 return NULL;
220 }
Guido van Rossumd076c731998-10-07 19:42:25 +0000221 pb = code->ob_type->tp_as_buffer;
222 if (pb == NULL ||
223 pb->bf_getreadbuffer == NULL ||
224 pb->bf_getsegcount == NULL ||
225 (*pb->bf_getsegcount)(code, NULL) != 1)
226 {
227 PyErr_BadInternalCall();
228 return NULL;
229 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000230 /* Make sure names and varnames are all strings, & intern them */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000231 for (i = PyTuple_Size(names); --i >= 0; ) {
232 PyObject *v = PyTuple_GetItem(names, i);
233 if (v == NULL || !PyString_Check(v)) {
234 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000235 return NULL;
236 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000237 PyString_InternInPlace(&PyTuple_GET_ITEM(names, i));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000238 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000239 for (i = PyTuple_Size(varnames); --i >= 0; ) {
240 PyObject *v = PyTuple_GetItem(varnames, i);
241 if (v == NULL || !PyString_Check(v)) {
242 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000243 return NULL;
244 }
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000245 PyString_InternInPlace(&PyTuple_GET_ITEM(varnames, i));
246 }
247 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000248 for (i = PyTuple_Size(consts); --i >= 0; ) {
249 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000250 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000251 continue;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000252 if (!all_name_chars((unsigned char *)PyString_AsString(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000253 continue;
254 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000255 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000256 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000257 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000258 co->co_argcount = argcount;
259 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000260 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000261 co->co_flags = flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000262 Py_INCREF(code);
Guido van Rossumd076c731998-10-07 19:42:25 +0000263 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000264 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000265 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000266 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000267 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000268 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000269 co->co_varnames = varnames;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000270 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000271 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000272 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000273 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000274 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000275 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000276 co->co_lnotab = lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000277 }
278 return co;
279}
280
281
282/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000283
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000284/* The compiler uses two passes to generate bytecodes. The first pass
285 builds the symbol table. The second pass generates the bytecode.
286
287 The first pass uses a single symtable struct. The second pass uses
288 a compiling struct for each code block. The compiling structs
289 share a reference to the symtable.
290
291 The two passes communicate via symtable_load_symbols() and via
292 is_local() and is_global(). The former initializes several slots
293 in the compiling struct: c_varnames, c_locals, c_nlocals,
294 c_argcount, c_globals, and c_flags.
295*/
296
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000297struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000298 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000299 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000300 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000301 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000302 PyObject *c_name_dict; /* inverse of c_names */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000303 PyObject *c_globals; /* dictionary (value=None) */
304 PyObject *c_locals; /* dictionary (value=localID) */
305 PyObject *c_varnames; /* list (inverse of c_locals) */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000306 int c_nlocals; /* index of next local */
307 int c_argcount; /* number of top-level arguments */
308 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000309 int c_nexti; /* index into c_code */
310 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000311 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000312 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000313 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000314 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000315 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000316 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000317 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000318 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000319 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000320 int c_stacklevel; /* Current stack level */
321 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000322 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000323 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000324 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000325 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000326 int c_tmpname; /* temporary local name counter */
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000327 struct symtable *c_symtable; /* pointer to module symbol table */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000328};
329
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000330/* The symbol table is constructed each time PyNode_Compile() is
331 called. The table walks the entire parse tree and identifies each
332 use or definition of a variable.
333
334 The symbol table contains a dictionary for each code block in a
335 module: The symbol dictionary for the block. They keys of these
336 dictionaries are the name of all variables used or defined in the
337 block; the integer values are used to store several flags,
338 e.g. DEF_PARAM indicates that a variable is a parameter to a
339 function.
340
341 The slots st_cur, st_cur_id, and st_cur_type always refer to the
342 current code block. The st_cur slot is the symbol dictionary. The
343 st_cur_id slot is the id is the key in st_symbols. The st_cur_type
344 slot is one of TYPE_FUNCTION, TYPE_CLASS, or TYPE_MODULE.
345
346 The st_symbols slot is a dictionary that maps code block ids to
347 symbol dictionaries. The keys are generated by a counter that is
348 incremented each time a new code block is found. The counter is
349 identifies a specific scope, because both passes walk the parse
350 tree in the same order.
351
352 The st_varnames slot is a dictionary that maps code block ids to
353 parameter lists. The st_global slot always refers to the symbol
354 dictionary for the module.
355*/
356
357struct symtable {
358 PyObject *st_symbols; /* dictionary of symbol tables */
359 PyObject *st_varnames; /* dictionary of parameter lists */
360 PyObject *st_namespaces; /* pointer to list of namespaces */
361 PyObject *st_types; /* pointer to list of namespace types */
362 PyObject *st_cur; /* borrowed ref to dict in st_symbols */
363 PyObject *st_cur_id; /* int id of current code block */
364 int st_cur_type; /* type of current scope */
365 PyObject *st_global; /* borrowed ref to MODULE in st_symbols */
366 int st_scopes; /* number of scopes */
367 int st_errors; /* number of errors */
368 char *st_private; /* name of current class or NULL */
369 int st_tmpname; /* temporary name counter */
370};
371
372#define GLOBAL "global"
373#define NOOPT ".noopt"
374
375/* Flags for def-use information */
376
377#define DEF_GLOBAL 1
378#define DEF_LOCAL 2
379#define DEF_PARAM 2<<1
380#define USE 2<<2
381#define DEF_STAR 2<<3
382#define DEF_DOUBLESTAR 2<<4
383#define DEF_INTUPLE 2<<5
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000384
Guido van Rossum452a9831996-09-17 14:32:04 +0000385/* Error message including line number */
386
387static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000388com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000389{
Fred Drakedcf08e02000-08-15 15:49:44 +0000390 PyObject *v, *tb, *tmp;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000391 if (c == NULL) {
392 /* Error occurred via symtable call to
393 is_constant_false */
394 PyErr_SetString(exc, msg);
395 return;
396 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000397 c->c_errors++;
Guido van Rossum452a9831996-09-17 14:32:04 +0000398 if (c->c_lineno <= 1) {
399 /* Unknown line number or single interactive command */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000400 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000401 return;
402 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000403 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000404 if (v == NULL)
405 return; /* MemoryError, too bad */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000406 PyErr_SetObject(exc, v);
407 Py_DECREF(v);
Fred Drakedcf08e02000-08-15 15:49:44 +0000408
409 /* add attributes for the line number and filename for the error */
410 PyErr_Fetch(&exc, &v, &tb);
411 PyErr_NormalizeException(&exc, &v, &tb);
412 tmp = PyInt_FromLong(c->c_lineno);
413 if (tmp == NULL)
414 PyErr_Clear();
415 else {
416 if (PyObject_SetAttrString(v, "lineno", tmp))
417 PyErr_Clear();
418 Py_DECREF(tmp);
419 }
420 if (c->c_filename != NULL) {
421 tmp = PyString_FromString(c->c_filename);
422 if (tmp == NULL)
423 PyErr_Clear();
424 else {
425 if (PyObject_SetAttrString(v, "filename", tmp))
426 PyErr_Clear();
427 Py_DECREF(tmp);
428 }
429 }
430 PyErr_Restore(exc, v, tb);
Guido van Rossum452a9831996-09-17 14:32:04 +0000431}
432
433
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000434/* Interface to the block stack */
435
436static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000437block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000438{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000439 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000440 com_error(c, PyExc_SystemError,
441 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000442 }
443 else {
444 c->c_block[c->c_nblocks++] = type;
445 }
446}
447
448static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000449block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000450{
451 if (c->c_nblocks > 0)
452 c->c_nblocks--;
453 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000454 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000455 }
456}
457
458
Guido van Rossum681d79a1995-07-18 14:51:37 +0000459/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000460
Tim Petersdbd9ba62000-07-09 03:09:57 +0000461static int com_init(struct compiling *, char *);
462static void com_free(struct compiling *);
463static void com_push(struct compiling *, int);
464static void com_pop(struct compiling *, int);
465static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000466static void com_node(struct compiling *, node *);
467static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000468static void com_addbyte(struct compiling *, int);
469static void com_addint(struct compiling *, int);
470static void com_addoparg(struct compiling *, int, int);
471static void com_addfwref(struct compiling *, int, int *);
472static void com_backpatch(struct compiling *, int);
473static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
474static int com_addconst(struct compiling *, PyObject *);
475static int com_addname(struct compiling *, PyObject *);
476static void com_addopname(struct compiling *, int, node *);
477static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000478static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000479static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000480static void com_assign(struct compiling *, node *, int, node *);
481static void com_assign_name(struct compiling *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000482static PyCodeObject *icompile(node *, struct compiling *);
483static PyCodeObject *jcompile(node *, char *, struct compiling *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000484static PyObject *parsestrplus(node *);
485static PyObject *parsestr(char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000486static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000487
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000488static int is_local(struct compiling *, char *);
489static int is_global(struct compiling *, char *);
490
491/* symtable operations */
492static int symtable_build(struct compiling *, node *);
493static int symtable_load_symbols(struct compiling *);
494static struct symtable *symtable_init(void);
495static void symtable_free(struct symtable *);
496static int symtable_enter_scope(struct symtable *, char *, int);
497static int symtable_exit_scope(struct symtable *);
498static int symtable_update_cur(struct symtable *);
499static int symtable_add_def(struct symtable *, char *, int);
500static int symtable_add_use(struct symtable *, char *);
501
502static void symtable_node(struct symtable *, node *);
503static void symtable_funcdef(struct symtable *, node *);
504static void symtable_default_args(struct symtable *, node *);
505static void symtable_params(struct symtable *, node *);
506static void symtable_params_fplist(struct symtable *, node *n);
507static void symtable_global(struct symtable *, node *);
508static void symtable_import(struct symtable *, node *);
509static void symtable_assign(struct symtable *, node *);
510static void symtable_list_comprehension(struct symtable *, node *);
511
512/* helper */
513static void
514do_pad(int pad)
515{
516 int i;
517 for (i = 0; i < pad; ++i)
518 fprintf(stderr, " ");
519}
520
521static void
522dump(node *n, int pad, int depth)
523{
524 int i;
525 if (depth == 0)
526 return;
527 do_pad(pad);
528 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
529 if (depth > 0)
530 depth--;
531 for (i = 0; i < NCH(n); ++i)
532 dump(CHILD(n, i), pad + 1, depth);
533}
534
535#define DUMP(N) dump(N, 0, -1)
536
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000537static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000538com_init(struct compiling *c, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000539{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000540 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000541 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
542 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000543 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000544 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000545 goto fail;
546 if ((c->c_const_dict = PyDict_New()) == NULL)
547 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000548 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000549 goto fail;
550 if ((c->c_name_dict = PyDict_New()) == NULL)
551 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000552 if ((c->c_globals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000553 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000554 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000555 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000556 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
557 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000558 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000559 c->c_varnames = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000560 c->c_nlocals = 0;
561 c->c_argcount = 0;
562 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000563 c->c_nexti = 0;
564 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000565 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000566 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000567 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000568 c->c_begin = 0;
569 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000570 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000571 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000572 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000573 c->c_stacklevel = 0;
574 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000575 c->c_firstlineno = 0;
576 c->c_last_addr = 0;
577 c->c_last_line = 0;
578 c-> c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000579 c->c_tmpname = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000580 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000581 return 1;
582
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000583 fail:
584 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000585 return 0;
586}
587
588static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000589com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000590{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000591 Py_XDECREF(c->c_code);
592 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000593 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000594 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000595 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000596 Py_XDECREF(c->c_globals);
597 Py_XDECREF(c->c_locals);
598 Py_XDECREF(c->c_varnames);
599 Py_XDECREF(c->c_lnotab);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000600}
601
602static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000603com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000604{
605 c->c_stacklevel += n;
606 if (c->c_stacklevel > c->c_maxstacklevel)
607 c->c_maxstacklevel = c->c_stacklevel;
608}
609
610static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000611com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000612{
613 if (c->c_stacklevel < n) {
Guido van Rossum90f827c1998-08-25 18:22:17 +0000614 /* fprintf(stderr,
Guido van Rossum8b993a91997-01-17 21:04:03 +0000615 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
616 c->c_filename, c->c_lineno,
Guido van Rossum90f827c1998-08-25 18:22:17 +0000617 c->c_nexti, c->c_stacklevel, n); */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000618 c->c_stacklevel = 0;
619 }
620 else
621 c->c_stacklevel -= n;
622}
623
624static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000625com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000626{
627 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000628 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000629 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000630 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000631}
632
633static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000634com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000635{
636 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000637 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000638 assert(byte >= 0 && byte <= 255);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000639 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000640 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000641 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000642 fatal("com_addbyte: byte out of range");
Guido van Rossum01cfd441991-10-20 20:12:38 +0000643 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000644 com_error(c, PyExc_SystemError,
645 "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000646 }
647 if (c->c_code == NULL)
648 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000649 len = PyString_Size(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000650 if (c->c_nexti >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000651 if (_PyString_Resize(&c->c_code, len+1000) != 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000652 c->c_errors++;
653 return;
654 }
655 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000656 PyString_AsString(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000657}
658
659static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000660com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000661{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000662 com_addbyte(c, x & 0xff);
663 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000664}
665
666static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000667com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000668{
669 int size;
670 char *p;
671 if (c->c_lnotab == NULL)
672 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000673 size = PyString_Size(c->c_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000674 if (c->c_lnotab_next+2 > size) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000675 if (_PyString_Resize(&c->c_lnotab, size + 1000) < 0) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000676 c->c_errors++;
677 return;
678 }
679 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000680 p = PyString_AsString(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000681 *p++ = addr;
682 *p++ = line;
683 c->c_lnotab_next += 2;
684}
685
686static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000687com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000688{
689 c->c_lineno = lineno;
690 if (c->c_firstlineno == 0) {
691 c->c_firstlineno = c->c_last_line = lineno;
692 }
693 else {
694 int incr_addr = c->c_nexti - c->c_last_addr;
695 int incr_line = lineno - c->c_last_line;
696 while (incr_addr > 0 || incr_line > 0) {
697 int trunc_addr = incr_addr;
698 int trunc_line = incr_line;
699 if (trunc_addr > 255)
700 trunc_addr = 255;
701 if (trunc_line > 255)
702 trunc_line = 255;
703 com_add_lnotab(c, trunc_addr, trunc_line);
704 incr_addr -= trunc_addr;
705 incr_line -= trunc_line;
706 }
707 c->c_last_addr = c->c_nexti;
708 c->c_last_line = lineno;
709 }
710}
711
712static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000713com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000714{
Fred Drakeef8ace32000-08-24 00:32:09 +0000715 int extended_arg = arg >> 16;
Guido van Rossum8e793d91997-03-03 19:13:14 +0000716 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000717 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000718 if (Py_OptimizeFlag)
719 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000720 }
Fred Drakeef8ace32000-08-24 00:32:09 +0000721 if (extended_arg){
722 com_addbyte(c, EXTENDED_ARG);
723 com_addint(c, extended_arg);
724 arg &= 0xffff;
725 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000726 com_addbyte(c, op);
727 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000728}
729
730static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000731com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000732{
733 /* Compile a forward reference for backpatching */
734 int here;
735 int anchor;
736 com_addbyte(c, op);
737 here = c->c_nexti;
738 anchor = *p_anchor;
739 *p_anchor = here;
740 com_addint(c, anchor == 0 ? 0 : here - anchor);
741}
742
743static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000744com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000745{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000746 unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000747 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000748 int dist;
749 int prev;
750 for (;;) {
751 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000752 prev = code[anchor] + (code[anchor+1] << 8);
753 dist = target - (anchor+2);
754 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +0000755 dist >>= 8;
756 code[anchor+1] = dist;
757 dist >>= 8;
758 if (dist) {
759 com_error(c, PyExc_SystemError,
760 "com_backpatch: offset too large");
761 break;
762 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000763 if (!prev)
764 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000765 anchor -= prev;
766 }
767}
768
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000769/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000770
771static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000772com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000773{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000774 PyObject *w, *t, *np=NULL;
775 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000776
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000777 t = Py_BuildValue("(OO)", v, v->ob_type);
778 if (t == NULL)
779 goto fail;
780 w = PyDict_GetItem(dict, t);
781 if (w != NULL) {
782 n = PyInt_AsLong(w);
783 } else {
784 n = PyList_Size(list);
785 np = PyInt_FromLong(n);
786 if (np == NULL)
787 goto fail;
788 if (PyList_Append(list, v) != 0)
789 goto fail;
790 if (PyDict_SetItem(dict, t, np) != 0)
791 goto fail;
792 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000793 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000794 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000795 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000796 fail:
797 Py_XDECREF(np);
798 Py_XDECREF(t);
799 c->c_errors++;
800 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000801}
802
803static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000804com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000805{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000806 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000807}
808
809static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000810com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000811{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000812 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000813}
814
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000815static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000816mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000817{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000818 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000819 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +0000820 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000821 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
822 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000823 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000824 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000825 return 0; /* Don't mangle __extremely_long_names */
826 if (name[nlen-1] == '_' && name[nlen-2] == '_')
827 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000828 /* Strip leading underscores from class name */
829 while (*p == '_')
830 p++;
831 if (*p == '\0')
832 return 0; /* Don't mangle if class is just underscores */
833 plen = strlen(p);
834 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000835 plen = maxlen-nlen-2; /* Truncate class name if too long */
836 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000837 buffer[0] = '_';
838 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000839 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000840 /* fprintf(stderr, "mangle %s -> %s\n", name, buffer); */
841 return 1;
842}
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000843
844static int
845com_mangle(struct compiling *c, char *name, char *buffer, size_t maxlen)
846{
847 return mangle(c->c_private, name, buffer, maxlen);
848}
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000849
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000850static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000851com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000852{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000853 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000854 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000855 char buffer[MANGLE_LEN];
856/* fprintf(stderr, "com_addop_name(%s, %d, %s)\n",
857 c->c_name, op, name);
858*/
859 if (com_mangle(c, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000860 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000861 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000862 c->c_errors++;
863 i = 255;
864 }
865 else {
866 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000867 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000868 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000869 com_addoparg(c, op, i);
870}
871
872static void
873com_addop_varname(struct compiling *c, int kind, char *name)
874{
875 PyObject *v;
876 int i;
877 int scope;
878 int op = STOP_CODE;
879 char buffer[MANGLE_LEN];
880
881 if (com_mangle(c, name, buffer, sizeof(buffer)))
882 name = buffer;
883 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
884 c->c_errors++;
885 i = 255;
886 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000887 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000888 scope = NAME_DEFAULT;
889 if (c->c_symtable->st_cur_type == TYPE_FUNCTION && is_local(c, name)) {
890 scope = NAME_LOCAL;
891 } else {
892 int g = is_global(c, name);
893 if ((g & EXPLICIT_GLOBAL)
894 || ((c->c_flags & CO_OPTIMIZED) && g))
895 scope = NAME_GLOBAL;
896 }
897
898 /* XXX Test can probably be eliminated once we reach 2.1 beta 1 */
899 if (!(is_local(c, name) || is_global(c, name))) {
900 fprintf(stderr, "name: %s", name);
901 fprintf(stderr, ", in %s, file '%s', line %d\n",
902 c->c_name, c->c_filename, c->c_lineno);
903 fprintf(stderr, "locals: %s\n",
904 PyString_AS_STRING(PyObject_Repr(c->c_locals)));
905 fprintf(stderr, "globals: %s\n",
906 PyString_AS_STRING(PyObject_Repr(c->c_globals)));
907 Py_FatalError("compiler did not label name as local or global");
908 }
909
910 i = com_addname(c, v);
911 if (scope == NAME_LOCAL) {
912 PyObject *w = PyDict_GetItem(c->c_locals, v);
913 if (w == NULL) {
914 c->c_errors++;
915 i = 255;
916 goto done;
917 } else
918 i = PyInt_AsLong(w);
919 }
920 Py_DECREF(v);
921
922 switch (kind) {
923 case VAR_LOAD:
924 switch (scope) {
925 case NAME_LOCAL:
926 op = LOAD_FAST;
927 break;
928 case NAME_GLOBAL:
929 op = LOAD_GLOBAL;
930 break;
931 case NAME_DEFAULT:
932 op = LOAD_NAME;
933 }
934 break;
935 case VAR_STORE:
936 switch (scope) {
937 case NAME_LOCAL:
938 op = STORE_FAST;
939 break;
940 case NAME_GLOBAL:
941 op = STORE_GLOBAL;
942 break;
943 case NAME_DEFAULT:
944 op = STORE_NAME;
945 }
946 break;
947 case VAR_DELETE:
948 switch (scope) {
949 case NAME_LOCAL:
950 op = DELETE_FAST;
951 break;
952 case NAME_GLOBAL:
953 op = DELETE_GLOBAL;
954 break;
955 case NAME_DEFAULT:
956 op = DELETE_NAME;
957 }
958 break;
959 }
960done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000961 com_addoparg(c, op, i);
962}
963
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000964static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000965com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000966{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000967 char *name;
968 char buffer[1000];
969 /* XXX it is possible to write this code without the 1000
970 chars on the total length of dotted names, I just can't be
971 bothered right now */
972 if (TYPE(n) == STAR)
973 name = "*";
974 else if (TYPE(n) == dotted_name) {
975 char *p = buffer;
976 int i;
977 name = buffer;
978 for (i = 0; i < NCH(n); i += 2) {
979 char *s = STR(CHILD(n, i));
980 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000981 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000982 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +0000983 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000984 break;
985 }
986 if (p != buffer)
987 *p++ = '.';
988 strcpy(p, s);
989 p = strchr(p, '\0');
990 }
991 }
992 else {
993 REQ(n, NAME);
994 name = STR(n);
995 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000996 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000997}
998
Guido van Rossum79f25d91997-04-29 20:08:16 +0000999static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001000parsenumber(struct compiling *co, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001001{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001002 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001003 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001004 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001005#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +00001006 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +00001007 int imflag;
1008#endif
1009
Guido van Rossum282914b1991-04-04 10:42:56 +00001010 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001011 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001012#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001013 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001014#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001015 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001016 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001017 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001018 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001019 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001020 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001021 if (*end == '\0') {
1022 if (errno != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001023 com_error(co, PyExc_OverflowError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001024 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +00001025 return NULL;
1026 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001027 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001028 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001029 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001030#ifndef WITHOUT_COMPLEX
1031 if (imflag) {
1032 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001033 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +00001034 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001035 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001036 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +00001037 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001038 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001039#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001040 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001041 PyFPE_START_PROTECT("atof", return 0)
1042 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001043 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001044 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001045 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001046}
1047
Guido van Rossum79f25d91997-04-29 20:08:16 +00001048static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001049parsestr(char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001050{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001051 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001052 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001053 char *buf;
1054 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001055 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001056 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001057 int first = *s;
1058 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001059 int rawmode = 0;
1060 int unicode = 0;
1061 if (isalpha(quote) || quote == '_') {
1062 if (quote == 'u' || quote == 'U') {
1063 quote = *++s;
1064 unicode = 1;
1065 }
1066 if (quote == 'r' || quote == 'R') {
1067 quote = *++s;
1068 rawmode = 1;
1069 }
1070 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001071 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001072 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001073 return NULL;
1074 }
1075 s++;
1076 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001077 if (len > INT_MAX) {
1078 PyErr_SetString(PyExc_OverflowError, "string to parse is too long");
1079 return NULL;
1080 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001081 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001082 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001083 return NULL;
1084 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001085 if (len >= 4 && s[0] == quote && s[1] == quote) {
1086 s += 2;
1087 len -= 2;
1088 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001089 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001090 return NULL;
1091 }
1092 }
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001093 if (unicode || Py_UnicodeFlag) {
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001094 if (rawmode)
1095 return PyUnicode_DecodeRawUnicodeEscape(
1096 s, len, NULL);
1097 else
1098 return PyUnicode_DecodeUnicodeEscape(
1099 s, len, NULL);
1100 }
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001101 if (rawmode || strchr(s, '\\') == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001102 return PyString_FromStringAndSize(s, len);
1103 v = PyString_FromStringAndSize((char *)NULL, len);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001104 if (v == NULL)
1105 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001106 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001107 end = s + len;
1108 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001109 if (*s != '\\') {
1110 *p++ = *s++;
1111 continue;
1112 }
1113 s++;
1114 switch (*s++) {
1115 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001116 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001117 case '\\': *p++ = '\\'; break;
1118 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +00001119 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001120 case 'b': *p++ = '\b'; break;
1121 case 'f': *p++ = '\014'; break; /* FF */
1122 case 't': *p++ = '\t'; break;
1123 case 'n': *p++ = '\n'; break;
1124 case 'r': *p++ = '\r'; break;
1125 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001126 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
1127 case '0': case '1': case '2': case '3':
1128 case '4': case '5': case '6': case '7':
1129 c = s[-1] - '0';
1130 if ('0' <= *s && *s <= '7') {
1131 c = (c<<3) + *s++ - '0';
1132 if ('0' <= *s && *s <= '7')
1133 c = (c<<3) + *s++ - '0';
1134 }
1135 *p++ = c;
1136 break;
1137 case 'x':
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001138 if (isxdigit(Py_CHARMASK(s[0])) && isxdigit(Py_CHARMASK(s[1]))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +00001139 unsigned int x = 0;
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001140 c = Py_CHARMASK(*s);
1141 s++;
1142 if (isdigit(c))
1143 x = c - '0';
1144 else if (islower(c))
1145 x = 10 + c - 'a';
1146 else
1147 x = 10 + c - 'A';
1148 x = x << 4;
1149 c = Py_CHARMASK(*s);
1150 s++;
1151 if (isdigit(c))
1152 x += c - '0';
1153 else if (islower(c))
1154 x += 10 + c - 'a';
1155 else
1156 x += 10 + c - 'A';
Guido van Rossumed1100f1997-10-20 23:24:07 +00001157 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001158 break;
1159 }
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001160 PyErr_SetString(PyExc_ValueError, "invalid \\x escape");
1161 Py_DECREF(v);
1162 return NULL;
1163 default:
1164 *p++ = '\\';
1165 *p++ = s[-1];
1166 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001167 }
1168 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001169 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001170 return v;
1171}
1172
Guido van Rossum79f25d91997-04-29 20:08:16 +00001173static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001174parsestrplus(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001175{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001176 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001177 int i;
1178 REQ(CHILD(n, 0), STRING);
1179 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
1180 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001181 for (i = 1; i < NCH(n); i++) {
1182 PyObject *s;
1183 s = parsestr(STR(CHILD(n, i)));
1184 if (s == NULL)
1185 goto onError;
1186 if (PyString_Check(v) && PyString_Check(s)) {
1187 PyString_ConcatAndDel(&v, s);
1188 if (v == NULL)
1189 goto onError;
1190 }
1191 else {
1192 PyObject *temp;
1193 temp = PyUnicode_Concat(v, s);
1194 Py_DECREF(s);
1195 if (temp == NULL)
1196 goto onError;
1197 Py_DECREF(v);
1198 v = temp;
1199 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001200 }
1201 }
1202 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001203
1204 onError:
1205 Py_XDECREF(v);
1206 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001207}
1208
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001209static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001210com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001211{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001212 PyObject *v;
1213 int anchor = 0;
1214 int save_begin = c->c_begin;
1215
1216 /* list_iter: for v in expr [list_iter] */
1217 com_node(c, CHILD(n, 3)); /* expr */
1218 v = PyInt_FromLong(0L);
1219 if (v == NULL)
1220 c->c_errors++;
1221 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
1222 com_push(c, 1);
1223 Py_XDECREF(v);
1224 c->c_begin = c->c_nexti;
1225 com_addoparg(c, SET_LINENO, n->n_lineno);
1226 com_addfwref(c, FOR_LOOP, &anchor);
1227 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001228 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001229 c->c_loops++;
1230 com_list_iter(c, n, e, t);
1231 c->c_loops--;
1232 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1233 c->c_begin = save_begin;
1234 com_backpatch(c, anchor);
1235 com_pop(c, 2); /* FOR_LOOP has popped these */
1236}
1237
1238static void
1239com_list_if(struct compiling *c, node *n, node *e, char *t)
1240{
1241 int anchor = 0;
1242 int a = 0;
1243 /* list_iter: 'if' test [list_iter] */
1244 com_addoparg(c, SET_LINENO, n->n_lineno);
1245 com_node(c, CHILD(n, 1));
1246 com_addfwref(c, JUMP_IF_FALSE, &a);
1247 com_addbyte(c, POP_TOP);
1248 com_pop(c, 1);
1249 com_list_iter(c, n, e, t);
1250 com_addfwref(c, JUMP_FORWARD, &anchor);
1251 com_backpatch(c, a);
1252 /* We jump here with an extra entry which we now pop */
1253 com_addbyte(c, POP_TOP);
1254 com_backpatch(c, anchor);
1255}
1256
1257static void
1258com_list_iter(struct compiling *c,
1259 node *p, /* parent of list_iter node */
1260 node *e, /* element expression node */
1261 char *t /* name of result list temp local */)
1262{
1263 /* list_iter is the last child in a listmaker, list_for, or list_if */
1264 node *n = CHILD(p, NCH(p)-1);
1265 if (TYPE(n) == list_iter) {
1266 n = CHILD(n, 0);
1267 switch (TYPE(n)) {
1268 case list_for:
1269 com_list_for(c, n, e, t);
1270 break;
1271 case list_if:
1272 com_list_if(c, n, e, t);
1273 break;
1274 default:
1275 com_error(c, PyExc_SystemError,
1276 "invalid list_iter node type");
1277 }
1278 }
1279 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001280 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001281 com_push(c, 1);
1282 com_node(c, e);
1283 com_addoparg(c, CALL_FUNCTION, 1);
1284 com_addbyte(c, POP_TOP);
1285 com_pop(c, 2);
1286 }
1287}
1288
1289static void
1290com_list_comprehension(struct compiling *c, node *n)
1291{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001292 /* listmaker: test list_for */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001293 char tmpname[12];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001294 sprintf(tmpname, "[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001295 com_addoparg(c, BUILD_LIST, 0);
1296 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1297 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001298 com_addop_name(c, LOAD_ATTR, "append");
1299 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001300 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001301 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001302 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001303 --c->c_tmpname;
1304}
1305
1306static void
1307com_listmaker(struct compiling *c, node *n)
1308{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001309 /* listmaker: test ( list_for | (',' test)* [','] ) */
1310 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001311 com_list_comprehension(c, n);
1312 else {
1313 int len = 0;
1314 int i;
1315 for (i = 0; i < NCH(n); i += 2, len++)
1316 com_node(c, CHILD(n, i));
1317 com_addoparg(c, BUILD_LIST, len);
1318 com_pop(c, len-1);
1319 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001320}
1321
1322static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001323com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001324{
1325 int i;
1326 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1327 for (i = 0; i+2 < NCH(n); i += 4) {
1328 /* We must arrange things just right for STORE_SUBSCR.
1329 It wants the stack to look like (value) (dict) (key) */
1330 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001331 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001332 com_node(c, CHILD(n, i+2)); /* value */
1333 com_addbyte(c, ROT_TWO);
1334 com_node(c, CHILD(n, i)); /* key */
1335 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001336 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001337 }
1338}
1339
1340static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001341com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001342{
1343 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001344 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001345 int i;
1346 REQ(n, atom);
1347 ch = CHILD(n, 0);
1348 switch (TYPE(ch)) {
1349 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001350 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001351 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001352 com_push(c, 1);
1353 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001354 else
1355 com_node(c, CHILD(n, 1));
1356 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001357 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001358 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001359 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001360 com_push(c, 1);
1361 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001362 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001363 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001364 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001365 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001366 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001367 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001368 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001369 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001370 break;
1371 case BACKQUOTE:
1372 com_node(c, CHILD(n, 1));
1373 com_addbyte(c, UNARY_CONVERT);
1374 break;
1375 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001376 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001377 i = 255;
1378 }
1379 else {
1380 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001381 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001382 }
1383 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001384 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001385 break;
1386 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001387 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001388 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001389 c->c_errors++;
1390 i = 255;
1391 }
1392 else {
1393 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001394 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001395 }
1396 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001397 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001398 break;
1399 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001400 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001401 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001402 break;
1403 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001404 /* XXX fprintf(stderr, "node type %d\n", TYPE(ch)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001405 com_error(c, PyExc_SystemError,
1406 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001407 }
1408}
1409
1410static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001411com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001412{
1413 if (NCH(n) == 1) {
1414 com_addbyte(c, op);
1415 }
1416 else if (NCH(n) == 2) {
1417 if (TYPE(CHILD(n, 0)) != COLON) {
1418 com_node(c, CHILD(n, 0));
1419 com_addbyte(c, op+1);
1420 }
1421 else {
1422 com_node(c, CHILD(n, 1));
1423 com_addbyte(c, op+2);
1424 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001425 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001426 }
1427 else {
1428 com_node(c, CHILD(n, 0));
1429 com_node(c, CHILD(n, 2));
1430 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001431 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001432 }
1433}
1434
Guido van Rossum635abd21997-01-06 22:56:52 +00001435static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001436com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1437{
1438 if (NCH(n) == 1) {
1439 com_addbyte(c, DUP_TOP);
1440 com_push(c, 1);
1441 com_addbyte(c, SLICE);
1442 com_node(c, augn);
1443 com_addbyte(c, opcode);
1444 com_pop(c, 1);
1445 com_addbyte(c, ROT_TWO);
1446 com_addbyte(c, STORE_SLICE);
1447 com_pop(c, 2);
1448 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1449 com_node(c, CHILD(n, 0));
1450 com_addoparg(c, DUP_TOPX, 2);
1451 com_push(c, 2);
1452 com_addbyte(c, SLICE+1);
1453 com_pop(c, 1);
1454 com_node(c, augn);
1455 com_addbyte(c, opcode);
1456 com_pop(c, 1);
1457 com_addbyte(c, ROT_THREE);
1458 com_addbyte(c, STORE_SLICE+1);
1459 com_pop(c, 3);
1460 } else if (NCH(n) == 2) {
1461 com_node(c, CHILD(n, 1));
1462 com_addoparg(c, DUP_TOPX, 2);
1463 com_push(c, 2);
1464 com_addbyte(c, SLICE+2);
1465 com_pop(c, 1);
1466 com_node(c, augn);
1467 com_addbyte(c, opcode);
1468 com_pop(c, 1);
1469 com_addbyte(c, ROT_THREE);
1470 com_addbyte(c, STORE_SLICE+2);
1471 com_pop(c, 3);
1472 } else {
1473 com_node(c, CHILD(n, 0));
1474 com_node(c, CHILD(n, 2));
1475 com_addoparg(c, DUP_TOPX, 3);
1476 com_push(c, 3);
1477 com_addbyte(c, SLICE+3);
1478 com_pop(c, 2);
1479 com_node(c, augn);
1480 com_addbyte(c, opcode);
1481 com_pop(c, 1);
1482 com_addbyte(c, ROT_FOUR);
1483 com_addbyte(c, STORE_SLICE+3);
1484 com_pop(c, 4);
1485 }
1486}
1487
1488static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001489com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001490{
1491 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001492 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001493 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001494 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001495 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001496 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001497 }
1498 else {
1499 com_node(c, CHILD(n, 0));
1500 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001501 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001502 }
1503 m = n;
1504 do {
1505 m = CHILD(m, 0);
1506 } while (NCH(m) == 1);
1507 if (TYPE(m) != NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001508 com_error(c, PyExc_SyntaxError,
1509 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001510 }
1511 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001512 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001513 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001514 *pkeywords = PyDict_New();
Guido van Rossum635abd21997-01-06 22:56:52 +00001515 if (v == NULL || *pkeywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001516 c->c_errors++;
1517 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001518 if (PyDict_GetItem(*pkeywords, v) != NULL)
1519 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001520 "duplicate keyword argument");
1521 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001522 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001523 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001524 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001525 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001526 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001527 }
1528 }
1529 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001530}
1531
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001532static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001533com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001534{
1535 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001536 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001537 }
1538 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001539 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001540 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001541 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001542 int star_flag = 0;
1543 int starstar_flag = 0;
1544 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001545 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001546 na = 0;
1547 nk = 0;
1548 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001549 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001550 if (TYPE(ch) == STAR ||
1551 TYPE(ch) == DOUBLESTAR)
1552 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001553 if (ch->n_lineno != lineno) {
1554 lineno = ch->n_lineno;
1555 com_addoparg(c, SET_LINENO, lineno);
1556 }
1557 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001558 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001559 na++;
1560 else
1561 nk++;
1562 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001563 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001564 while (i < NCH(n)) {
1565 node *tok = CHILD(n, i);
1566 node *ch = CHILD(n, i+1);
1567 i += 3;
1568 switch (TYPE(tok)) {
1569 case STAR: star_flag = 1; break;
1570 case DOUBLESTAR: starstar_flag = 1; break;
1571 }
1572 com_node(c, ch);
1573 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001574 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001575 com_error(c, PyExc_SyntaxError,
1576 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001577 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001578 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001579 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001580 star_flag + (starstar_flag << 1);
1581 else
1582 opcode = CALL_FUNCTION;
1583 com_addoparg(c, opcode, na | (nk << 8));
1584 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001585 }
1586}
1587
1588static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001589com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001590{
1591 com_addopname(c, LOAD_ATTR, n);
1592}
1593
1594static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001595com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001596{
1597 int i=0;
1598 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001599 node *ch;
1600
1601 /* first argument */
1602 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001603 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001604 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001605 i++;
1606 }
1607 else {
1608 com_node(c, CHILD(n,i));
1609 i++;
1610 REQ(CHILD(n,i),COLON);
1611 i++;
1612 }
1613 /* second argument */
1614 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1615 com_node(c, CHILD(n,i));
1616 i++;
1617 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001618 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001619 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001620 com_push(c, 1);
1621 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001622 /* remaining arguments */
1623 for (; i < NCH(n); i++) {
1624 ns++;
1625 ch=CHILD(n,i);
1626 REQ(ch, sliceop);
1627 if (NCH(ch) == 1) {
1628 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001629 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001630 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001631 }
1632 else
1633 com_node(c, CHILD(ch,1));
1634 }
1635 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001636 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001637}
1638
1639static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001640com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001641{
1642 node *ch;
1643 REQ(n, subscript);
1644 ch = CHILD(n,0);
1645 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001646 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001647 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001648 com_push(c, 1);
1649 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001650 else {
1651 /* check for slice */
1652 if ((TYPE(ch) == COLON || NCH(n) > 1))
1653 com_sliceobj(c, n);
1654 else {
1655 REQ(ch, test);
1656 com_node(c, ch);
1657 }
1658 }
1659}
1660
1661static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001662com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001663{
1664 int i, op;
1665 REQ(n, subscriptlist);
1666 /* Check to make backward compatible slice behavior for '[i:j]' */
1667 if (NCH(n) == 1) {
1668 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001669 /* 'Basic' slice, should have exactly one colon. */
1670 if ((TYPE(CHILD(sub, 0)) == COLON
1671 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1672 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1673 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001674 switch (assigning) {
1675 case OP_DELETE:
1676 op = DELETE_SLICE;
1677 break;
1678 case OP_ASSIGN:
1679 op = STORE_SLICE;
1680 break;
1681 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001682 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001683 break;
1684 default:
1685 com_augassign_slice(c, sub, assigning, augn);
1686 return;
1687 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001688 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001689 if (op == STORE_SLICE)
1690 com_pop(c, 2);
1691 else if (op == DELETE_SLICE)
1692 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001693 return;
1694 }
1695 }
1696 /* Else normal subscriptlist. Compile each subscript. */
1697 for (i = 0; i < NCH(n); i += 2)
1698 com_subscript(c, CHILD(n, i));
1699 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001700 if (NCH(n) > 1) {
1701 i = (NCH(n)+1) / 2;
1702 com_addoparg(c, BUILD_TUPLE, i);
1703 com_pop(c, i-1);
1704 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001705 switch (assigning) {
1706 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001707 op = DELETE_SUBSCR;
1708 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00001709 break;
1710 default:
1711 case OP_ASSIGN:
1712 op = STORE_SUBSCR;
1713 i = 3;
1714 break;
1715 case OP_APPLY:
1716 op = BINARY_SUBSCR;
1717 i = 1;
1718 break;
1719 }
1720 if (assigning > OP_APPLY) {
1721 com_addoparg(c, DUP_TOPX, 2);
1722 com_push(c, 2);
1723 com_addbyte(c, BINARY_SUBSCR);
1724 com_pop(c, 1);
1725 com_node(c, augn);
1726 com_addbyte(c, assigning);
1727 com_pop(c, 1);
1728 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001729 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001730 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001731 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001732}
1733
1734static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001735com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001736{
1737 REQ(n, trailer);
1738 switch (TYPE(CHILD(n, 0))) {
1739 case LPAR:
1740 com_call_function(c, CHILD(n, 1));
1741 break;
1742 case DOT:
1743 com_select_member(c, CHILD(n, 1));
1744 break;
1745 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00001746 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001747 break;
1748 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001749 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001750 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001751 }
1752}
1753
1754static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001755com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001756{
1757 int i;
1758 REQ(n, power);
1759 com_atom(c, CHILD(n, 0));
1760 for (i = 1; i < NCH(n); i++) {
1761 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1762 com_factor(c, CHILD(n, i+1));
1763 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001764 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001765 break;
1766 }
1767 else
1768 com_apply_trailer(c, CHILD(n, i));
1769 }
1770}
1771
1772static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001773com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001774{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001775 REQ(n, factor);
1776 if (TYPE(CHILD(n, 0)) == PLUS) {
1777 com_factor(c, CHILD(n, 1));
1778 com_addbyte(c, UNARY_POSITIVE);
1779 }
1780 else if (TYPE(CHILD(n, 0)) == MINUS) {
1781 com_factor(c, CHILD(n, 1));
1782 com_addbyte(c, UNARY_NEGATIVE);
1783 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001784 else if (TYPE(CHILD(n, 0)) == TILDE) {
1785 com_factor(c, CHILD(n, 1));
1786 com_addbyte(c, UNARY_INVERT);
1787 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001788 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001789 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001790 }
1791}
1792
1793static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001794com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001795{
1796 int i;
1797 int op;
1798 REQ(n, term);
1799 com_factor(c, CHILD(n, 0));
1800 for (i = 2; i < NCH(n); i += 2) {
1801 com_factor(c, CHILD(n, i));
1802 switch (TYPE(CHILD(n, i-1))) {
1803 case STAR:
1804 op = BINARY_MULTIPLY;
1805 break;
1806 case SLASH:
1807 op = BINARY_DIVIDE;
1808 break;
1809 case PERCENT:
1810 op = BINARY_MODULO;
1811 break;
1812 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001813 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001814 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001815 op = 255;
1816 }
1817 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001818 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001819 }
1820}
1821
1822static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001823com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001824{
1825 int i;
1826 int op;
1827 REQ(n, arith_expr);
1828 com_term(c, CHILD(n, 0));
1829 for (i = 2; i < NCH(n); i += 2) {
1830 com_term(c, CHILD(n, i));
1831 switch (TYPE(CHILD(n, i-1))) {
1832 case PLUS:
1833 op = BINARY_ADD;
1834 break;
1835 case MINUS:
1836 op = BINARY_SUBTRACT;
1837 break;
1838 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001839 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001840 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001841 op = 255;
1842 }
1843 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001844 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001845 }
1846}
1847
1848static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001849com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001850{
1851 int i;
1852 int op;
1853 REQ(n, shift_expr);
1854 com_arith_expr(c, CHILD(n, 0));
1855 for (i = 2; i < NCH(n); i += 2) {
1856 com_arith_expr(c, CHILD(n, i));
1857 switch (TYPE(CHILD(n, i-1))) {
1858 case LEFTSHIFT:
1859 op = BINARY_LSHIFT;
1860 break;
1861 case RIGHTSHIFT:
1862 op = BINARY_RSHIFT;
1863 break;
1864 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001865 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001866 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001867 op = 255;
1868 }
1869 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001870 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001871 }
1872}
1873
1874static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001875com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001876{
1877 int i;
1878 int op;
1879 REQ(n, and_expr);
1880 com_shift_expr(c, CHILD(n, 0));
1881 for (i = 2; i < NCH(n); i += 2) {
1882 com_shift_expr(c, CHILD(n, i));
1883 if (TYPE(CHILD(n, i-1)) == AMPER) {
1884 op = BINARY_AND;
1885 }
1886 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001887 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001888 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001889 op = 255;
1890 }
1891 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001892 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001893 }
1894}
1895
1896static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001897com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001898{
1899 int i;
1900 int op;
1901 REQ(n, xor_expr);
1902 com_and_expr(c, CHILD(n, 0));
1903 for (i = 2; i < NCH(n); i += 2) {
1904 com_and_expr(c, CHILD(n, i));
1905 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1906 op = BINARY_XOR;
1907 }
1908 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001909 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001910 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001911 op = 255;
1912 }
1913 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001914 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001915 }
1916}
1917
1918static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001919com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001920{
1921 int i;
1922 int op;
1923 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001924 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001925 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001926 com_xor_expr(c, CHILD(n, i));
1927 if (TYPE(CHILD(n, i-1)) == VBAR) {
1928 op = BINARY_OR;
1929 }
1930 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001931 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001932 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001933 op = 255;
1934 }
1935 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001936 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001937 }
1938}
1939
1940static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001941cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001942{
1943 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001944 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001945 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1946 if (NCH(n) == 1) {
1947 n = CHILD(n, 0);
1948 switch (TYPE(n)) {
1949 case LESS: return LT;
1950 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001951 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001952 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001953 case LESSEQUAL: return LE;
1954 case GREATEREQUAL: return GE;
1955 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001956 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1957 if (strcmp(STR(n), "is") == 0) return IS;
1958 }
1959 }
1960 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001961 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001962 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1963 return NOT_IN;
1964 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1965 return IS_NOT;
1966 }
1967 }
1968 return BAD;
1969}
1970
1971static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001972com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001973{
1974 int i;
1975 enum cmp_op op;
1976 int anchor;
1977 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
1978 com_expr(c, CHILD(n, 0));
1979 if (NCH(n) == 1)
1980 return;
1981
1982 /****************************************************************
1983 The following code is generated for all but the last
1984 comparison in a chain:
1985
1986 label: on stack: opcode: jump to:
1987
1988 a <code to load b>
1989 a, b DUP_TOP
1990 a, b, b ROT_THREE
1991 b, a, b COMPARE_OP
1992 b, 0-or-1 JUMP_IF_FALSE L1
1993 b, 1 POP_TOP
1994 b
1995
1996 We are now ready to repeat this sequence for the next
1997 comparison in the chain.
1998
1999 For the last we generate:
2000
2001 b <code to load c>
2002 b, c COMPARE_OP
2003 0-or-1
2004
2005 If there were any jumps to L1 (i.e., there was more than one
2006 comparison), we generate:
2007
2008 0-or-1 JUMP_FORWARD L2
2009 L1: b, 0 ROT_TWO
2010 0, b POP_TOP
2011 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002012 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002013 ****************************************************************/
2014
2015 anchor = 0;
2016
2017 for (i = 2; i < NCH(n); i += 2) {
2018 com_expr(c, CHILD(n, i));
2019 if (i+2 < NCH(n)) {
2020 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002021 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002022 com_addbyte(c, ROT_THREE);
2023 }
2024 op = cmp_type(CHILD(n, i-1));
2025 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002026 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002027 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002028 }
2029 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002030 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002031 if (i+2 < NCH(n)) {
2032 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2033 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002034 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002035 }
2036 }
2037
2038 if (anchor) {
2039 int anchor2 = 0;
2040 com_addfwref(c, JUMP_FORWARD, &anchor2);
2041 com_backpatch(c, anchor);
2042 com_addbyte(c, ROT_TWO);
2043 com_addbyte(c, POP_TOP);
2044 com_backpatch(c, anchor2);
2045 }
2046}
2047
2048static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002049com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002050{
2051 REQ(n, not_test); /* 'not' not_test | comparison */
2052 if (NCH(n) == 1) {
2053 com_comparison(c, CHILD(n, 0));
2054 }
2055 else {
2056 com_not_test(c, CHILD(n, 1));
2057 com_addbyte(c, UNARY_NOT);
2058 }
2059}
2060
2061static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002062com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002063{
2064 int i;
2065 int anchor;
2066 REQ(n, and_test); /* not_test ('and' not_test)* */
2067 anchor = 0;
2068 i = 0;
2069 for (;;) {
2070 com_not_test(c, CHILD(n, i));
2071 if ((i += 2) >= NCH(n))
2072 break;
2073 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2074 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002075 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002076 }
2077 if (anchor)
2078 com_backpatch(c, anchor);
2079}
2080
2081static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002082com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002083{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002084 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002085 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002086 PyObject *v;
Guido van Rossum57531fe1993-11-30 14:57:42 +00002087 int i;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002088 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002089 symtable_enter_scope(c->c_symtable, "lambda", lambdef);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002090 v = (PyObject *) icompile(CHILD(n, 0), c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002091 symtable_exit_scope(c->c_symtable);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002092 if (v == NULL) {
2093 c->c_errors++;
2094 i = 255;
2095 }
2096 else {
2097 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002098 Py_DECREF(v);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002099 }
2100 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002101 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002102 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002103 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002104 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002105 else {
2106 int anchor = 0;
2107 int i = 0;
2108 for (;;) {
2109 com_and_test(c, CHILD(n, i));
2110 if ((i += 2) >= NCH(n))
2111 break;
2112 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2113 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002114 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002115 }
2116 if (anchor)
2117 com_backpatch(c, anchor);
2118 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002119}
2120
2121static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002122com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002123{
2124 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002125 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002126 com_node(c, CHILD(n, 0));
2127 }
2128 else {
2129 int i;
2130 int len;
2131 len = (NCH(n) + 1) / 2;
2132 for (i = 0; i < NCH(n); i += 2)
2133 com_node(c, CHILD(n, i));
2134 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002135 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002136 }
2137}
2138
2139
2140/* Begin of assignment compilation */
2141
Thomas Wouters434d0822000-08-24 20:11:32 +00002142
2143static void
2144com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2145{
2146 com_addbyte(c, DUP_TOP);
2147 com_push(c, 1);
2148 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002149 com_node(c, augn);
2150 com_addbyte(c, opcode);
2151 com_pop(c, 1);
2152 com_addbyte(c, ROT_TWO);
2153 com_addopname(c, STORE_ATTR, n);
2154 com_pop(c, 2);
2155}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002156
2157static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002158com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002159{
2160 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002161 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002162}
2163
2164static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002165com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002166{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002167 REQ(n, trailer);
2168 switch (TYPE(CHILD(n, 0))) {
2169 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002170 com_error(c, PyExc_SyntaxError,
2171 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002172 break;
2173 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002174 if (assigning > OP_APPLY)
2175 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2176 else
2177 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002178 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002179 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002180 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002181 break;
2182 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002183 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002184 }
2185}
2186
2187static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002188com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002189{
2190 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002191 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002192 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002193 if (assigning) {
2194 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002195 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002196 com_push(c, i-1);
2197 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002198 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002199 com_assign(c, CHILD(n, i), assigning, NULL);
2200}
2201
2202static void
2203com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2204{
2205 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002206 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002207 com_push(c, 1);
2208 com_node(c, augn);
2209 com_addbyte(c, opcode);
2210 com_pop(c, 1);
2211 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002212}
2213
2214static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002215com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002216{
2217 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002218 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002219 if (assigning)
2220 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002221}
2222
2223static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002224com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002225{
2226 /* Loop to avoid trivial recursion */
2227 for (;;) {
2228 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002229
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002230 case exprlist:
2231 case testlist:
2232 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002233 if (assigning > OP_APPLY) {
2234 com_error(c, PyExc_SyntaxError,
2235 "augmented assign to tuple not possible");
2236 return;
2237 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002238 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002239 return;
2240 }
2241 n = CHILD(n, 0);
2242 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002243
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002244 case test:
2245 case and_test:
2246 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002247 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002248 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002249 case xor_expr:
2250 case and_expr:
2251 case shift_expr:
2252 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002253 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002254 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002255 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002256 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002257 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002258 return;
2259 }
2260 n = CHILD(n, 0);
2261 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002262
Guido van Rossum50564e81996-01-12 01:13:16 +00002263 case power: /* atom trailer* ('**' power)* */
2264/* ('+'|'-'|'~') factor | atom trailer* */
2265 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002266 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002267 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002268 return;
2269 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002270 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002271 int i;
2272 com_node(c, CHILD(n, 0));
2273 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002274 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002275 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002276 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002277 return;
2278 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002279 com_apply_trailer(c, CHILD(n, i));
2280 } /* NB i is still alive */
2281 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002282 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002283 return;
2284 }
2285 n = CHILD(n, 0);
2286 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002287
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002288 case atom:
2289 switch (TYPE(CHILD(n, 0))) {
2290 case LPAR:
2291 n = CHILD(n, 1);
2292 if (TYPE(n) == RPAR) {
2293 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002294 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002295 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002296 return;
2297 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002298 if (assigning > OP_APPLY) {
2299 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002300 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002301 return;
2302 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002303 break;
2304 case LSQB:
2305 n = CHILD(n, 1);
2306 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002307 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002308 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002309 return;
2310 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002311 if (assigning > OP_APPLY) {
2312 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002313 "augmented assign to list not possible");
2314 return;
2315 }
2316 if (NCH(n) > 1
2317 && TYPE(CHILD(n, 1)) == list_for) {
2318 com_error(c, PyExc_SyntaxError,
2319 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002320 return;
2321 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002322 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002323 return;
2324 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002325 if (assigning > OP_APPLY)
2326 com_augassign_name(c, CHILD(n, 0),
2327 assigning, augn);
2328 else
2329 com_assign_name(c, CHILD(n, 0),
2330 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002331 return;
2332 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002333 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002334 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002335 return;
2336 }
2337 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002338
2339 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002340 com_error(c, PyExc_SyntaxError,
2341 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002342 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002343
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002344 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002345 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002346 com_error(c, PyExc_SystemError,
2347 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002348 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002349
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002350 }
2351 }
2352}
Guido van Rossum7c531111997-03-11 18:42:21 +00002353
Thomas Wouters434d0822000-08-24 20:11:32 +00002354static void
2355com_augassign(struct compiling *c, node *n)
2356{
2357 int opcode;
2358
2359 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2360 case '+': opcode = INPLACE_ADD; break;
2361 case '-': opcode = INPLACE_SUBTRACT; break;
2362 case '/': opcode = INPLACE_DIVIDE; break;
2363 case '%': opcode = INPLACE_MODULO; break;
2364 case '<': opcode = INPLACE_LSHIFT; break;
2365 case '>': opcode = INPLACE_RSHIFT; break;
2366 case '&': opcode = INPLACE_AND; break;
2367 case '^': opcode = INPLACE_XOR; break;
2368 case '|': opcode = INPLACE_OR; break;
2369 case '*':
2370 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2371 opcode = INPLACE_POWER;
2372 else
2373 opcode = INPLACE_MULTIPLY;
2374 break;
2375 default:
2376 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2377 return;
2378 }
2379 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2380}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002381
2382static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002383com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002384{
Thomas Wouters434d0822000-08-24 20:11:32 +00002385 REQ(n, expr_stmt);
2386 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002387 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002388 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002389 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002390 if (NCH(n) == 1) {
2391 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002392 if (c->c_interactive)
2393 com_addbyte(c, PRINT_EXPR);
2394 else
2395 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002396 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002397 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002398 else if (TYPE(CHILD(n,1)) == augassign)
2399 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002400 else {
2401 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002402 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002403 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002404 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002405 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002406 com_push(c, 1);
2407 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002408 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002409 }
2410 }
2411}
2412
2413static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002414com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002415{
2416 int a = 0, b = 0;
2417 int i;
2418 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2419 /* Generate code like for
2420
2421 if __debug__:
2422 if not <test>:
2423 raise AssertionError [, <message>]
2424
2425 where <message> is the second test, if present.
2426 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002427
2428 /* XXX should __debug__ and AssertionError get inserted into
2429 the symbol table? they don't follow the normal rules
2430 because they are always loaded as globals */
2431
Guido van Rossum228d7f31997-04-02 05:24:36 +00002432 if (Py_OptimizeFlag)
2433 return;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002434 com_addop_name(c, LOAD_GLOBAL, "__debug__");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002435 com_push(c, 1);
2436 com_addfwref(c, JUMP_IF_FALSE, &a);
2437 com_addbyte(c, POP_TOP);
2438 com_pop(c, 1);
2439 com_node(c, CHILD(n, 1));
2440 com_addfwref(c, JUMP_IF_TRUE, &b);
2441 com_addbyte(c, POP_TOP);
2442 com_pop(c, 1);
2443 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002444 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002445 com_push(c, 1);
2446 i = NCH(n)/2; /* Either 2 or 4 */
2447 if (i > 1)
2448 com_node(c, CHILD(n, 3));
2449 com_addoparg(c, RAISE_VARARGS, i);
2450 com_pop(c, i);
2451 /* The interpreter does not fall through */
2452 /* All jumps converge here */
2453 com_backpatch(c, a);
2454 com_backpatch(c, b);
2455 com_addbyte(c, POP_TOP);
2456}
2457
2458static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002459com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002460{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002461 int i = 1;
2462 node* stream = NULL;
2463
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002464 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002465
2466 /* are we using the extended print form? */
2467 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2468 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002469 com_node(c, stream);
2470 /* stack: [...] => [... stream] */
2471 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002472 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2473 i = 4;
2474 else
2475 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002476 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002477 for (; i < NCH(n); i += 2) {
2478 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002479 com_addbyte(c, DUP_TOP);
2480 /* stack: [stream] => [stream stream] */
2481 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002482 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002483 /* stack: [stream stream] => [stream stream obj] */
2484 com_addbyte(c, ROT_TWO);
2485 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002486 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002487 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002488 com_pop(c, 2);
2489 }
2490 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002491 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002492 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002493 com_addbyte(c, PRINT_ITEM);
2494 com_pop(c, 1);
2495 }
2496 }
2497 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002498 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002499 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002500 /* must pop the extra stream object off the stack */
2501 com_addbyte(c, POP_TOP);
2502 /* stack: [... stream] => [...] */
2503 com_pop(c, 1);
2504 }
2505 }
2506 else {
2507 if (stream != NULL) {
2508 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002509 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002510 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002511 com_pop(c, 1);
2512 }
2513 else
2514 com_addbyte(c, PRINT_NEWLINE);
2515 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002516}
2517
2518static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002519com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002520{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002521 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002522 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002523 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002524 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002525 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002526 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002527 com_push(c, 1);
2528 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002529 else
2530 com_node(c, CHILD(n, 1));
2531 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002532 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002533}
2534
2535static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002536com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002537{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002538 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002539 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2540 if (NCH(n) > 1) {
2541 com_node(c, CHILD(n, 1));
2542 if (NCH(n) > 3) {
2543 com_node(c, CHILD(n, 3));
2544 if (NCH(n) > 5)
2545 com_node(c, CHILD(n, 5));
2546 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002547 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002548 i = NCH(n)/2;
2549 com_addoparg(c, RAISE_VARARGS, i);
2550 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002551}
2552
2553static void
Thomas Wouters52152252000-08-17 22:55:00 +00002554com_from_import(struct compiling *c, node *n)
2555{
2556 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2557 com_push(c, 1);
2558 if (NCH(n) > 1) {
2559 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2560 com_error(c, PyExc_SyntaxError, "invalid syntax");
2561 return;
2562 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002563 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002564 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002565 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00002566 com_pop(c, 1);
2567}
2568
2569static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002570com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002571{
2572 int i;
2573 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002574 /* 'import' dotted_name (',' dotted_name)* |
2575 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002576 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00002577 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002578 /* 'from' dotted_name 'import' ... */
2579 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002580
2581 if (TYPE(CHILD(n, 3)) == STAR) {
2582 tup = Py_BuildValue("(s)", "*");
2583 } else {
2584 tup = PyTuple_New((NCH(n) - 2)/2);
2585 for (i = 3; i < NCH(n); i += 2) {
2586 PyTuple_SET_ITEM(tup, (i-3)/2,
2587 PyString_FromString(STR(
2588 CHILD(CHILD(n, i), 0))));
2589 }
2590 }
2591 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00002592 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002593 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002594 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00002595 if (TYPE(CHILD(n, 3)) == STAR)
2596 com_addbyte(c, IMPORT_STAR);
2597 else {
2598 for (i = 3; i < NCH(n); i += 2)
2599 com_from_import(c, CHILD(n, i));
2600 com_addbyte(c, POP_TOP);
2601 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002602 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002603 }
2604 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002605 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002606 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00002607 node *subn = CHILD(n, i);
2608 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002609 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002610 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002611 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00002612 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00002613 int j;
2614 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00002615 com_error(c, PyExc_SyntaxError,
2616 "invalid syntax");
2617 return;
2618 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00002619 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
2620 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002621 CHILD(CHILD(subn, 0),
2622 j));
2623 com_addop_varname(c, VAR_STORE,
2624 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002625 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002626 com_addop_varname(c, VAR_STORE,
2627 STR(CHILD(CHILD(subn, 0),
2628 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002629 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002630 }
2631 }
2632}
2633
2634static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002635com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002636{
2637 REQ(n, exec_stmt);
2638 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2639 com_node(c, CHILD(n, 1));
2640 if (NCH(n) >= 4)
2641 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002642 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002643 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002644 com_push(c, 1);
2645 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002646 if (NCH(n) >= 6)
2647 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002648 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002649 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002650 com_push(c, 1);
2651 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002652 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002653 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002654}
2655
Guido van Rossum7c531111997-03-11 18:42:21 +00002656static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002657is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002658{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002659 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002660 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002661 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00002662
2663 /* Label to avoid tail recursion */
2664 next:
2665 switch (TYPE(n)) {
2666
2667 case suite:
2668 if (NCH(n) == 1) {
2669 n = CHILD(n, 0);
2670 goto next;
2671 }
2672 /* Fall through */
2673 case file_input:
2674 for (i = 0; i < NCH(n); i++) {
2675 node *ch = CHILD(n, i);
2676 if (TYPE(ch) == stmt) {
2677 n = ch;
2678 goto next;
2679 }
2680 }
2681 break;
2682
2683 case stmt:
2684 case simple_stmt:
2685 case small_stmt:
2686 n = CHILD(n, 0);
2687 goto next;
2688
2689 case expr_stmt:
2690 case testlist:
2691 case test:
2692 case and_test:
2693 case not_test:
2694 case comparison:
2695 case expr:
2696 case xor_expr:
2697 case and_expr:
2698 case shift_expr:
2699 case arith_expr:
2700 case term:
2701 case factor:
2702 case power:
2703 case atom:
2704 if (NCH(n) == 1) {
2705 n = CHILD(n, 0);
2706 goto next;
2707 }
2708 break;
2709
2710 case NAME:
2711 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2712 return 1;
2713 break;
2714
2715 case NUMBER:
2716 v = parsenumber(c, STR(n));
2717 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002718 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002719 break;
2720 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002721 i = PyObject_IsTrue(v);
2722 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002723 return i == 0;
2724
2725 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002726 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002727 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002728 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002729 break;
2730 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002731 i = PyObject_IsTrue(v);
2732 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002733 return i == 0;
2734
2735 }
2736 return 0;
2737}
2738
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002739static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002740com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002741{
2742 int i;
2743 int anchor = 0;
2744 REQ(n, if_stmt);
2745 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2746 for (i = 0; i+3 < NCH(n); i+=4) {
2747 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002748 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002749 if (is_constant_false(c, ch))
2750 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002751 if (i > 0)
2752 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002753 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002754 com_addfwref(c, JUMP_IF_FALSE, &a);
2755 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002756 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002757 com_node(c, CHILD(n, i+3));
2758 com_addfwref(c, JUMP_FORWARD, &anchor);
2759 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002760 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002761 com_addbyte(c, POP_TOP);
2762 }
2763 if (i+2 < NCH(n))
2764 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002765 if (anchor)
2766 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002767}
2768
2769static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002770com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002771{
2772 int break_anchor = 0;
2773 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002774 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002775 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2776 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002777 block_push(c, SETUP_LOOP);
2778 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002779 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002780 com_node(c, CHILD(n, 1));
2781 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2782 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002783 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002784 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002785 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002786 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002787 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2788 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002789 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002790 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002791 com_addbyte(c, POP_TOP);
2792 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002793 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002794 if (NCH(n) > 4)
2795 com_node(c, CHILD(n, 6));
2796 com_backpatch(c, break_anchor);
2797}
2798
2799static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002800com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002801{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002802 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002803 int break_anchor = 0;
2804 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002805 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002806 REQ(n, for_stmt);
2807 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2808 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002809 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002810 com_node(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002811 v = PyInt_FromLong(0L);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002812 if (v == NULL)
2813 c->c_errors++;
2814 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002815 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002816 Py_XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002817 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002818 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002819 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002820 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00002821 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002822 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002823 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002824 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002825 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2826 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002827 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002828 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002829 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002830 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002831 if (NCH(n) > 8)
2832 com_node(c, CHILD(n, 8));
2833 com_backpatch(c, break_anchor);
2834}
2835
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002836/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002837
2838 SETUP_FINALLY L
2839 <code for S>
2840 POP_BLOCK
2841 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002842 L: <code for Sf>
2843 END_FINALLY
2844
2845 The special instructions use the block stack. Each block
2846 stack entry contains the instruction that created it (here
2847 SETUP_FINALLY), the level of the value stack at the time the
2848 block stack entry was created, and a label (here L).
2849
2850 SETUP_FINALLY:
2851 Pushes the current value stack level and the label
2852 onto the block stack.
2853 POP_BLOCK:
2854 Pops en entry from the block stack, and pops the value
2855 stack until its level is the same as indicated on the
2856 block stack. (The label is ignored.)
2857 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002858 Pops a variable number of entries from the *value* stack
2859 and re-raises the exception they specify. The number of
2860 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002861
2862 The block stack is unwound when an exception is raised:
2863 when a SETUP_FINALLY entry is found, the exception is pushed
2864 onto the value stack (and the exception condition is cleared),
2865 and the interpreter jumps to the label gotten from the block
2866 stack.
2867
2868 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002869 (The contents of the value stack is shown in [], with the top
2870 at the right; 'tb' is trace-back info, 'val' the exception's
2871 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002872
2873 Value stack Label Instruction Argument
2874 [] SETUP_EXCEPT L1
2875 [] <code for S>
2876 [] POP_BLOCK
2877 [] JUMP_FORWARD L0
2878
Guido van Rossum3f5da241990-12-20 15:06:42 +00002879 [tb, val, exc] L1: DUP )
2880 [tb, val, exc, exc] <evaluate E1> )
2881 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2882 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2883 [tb, val, exc, 1] POP )
2884 [tb, val, exc] POP
2885 [tb, val] <assign to V1> (or POP if no V1)
2886 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002887 [] <code for S1>
2888 JUMP_FORWARD L0
2889
Guido van Rossum3f5da241990-12-20 15:06:42 +00002890 [tb, val, exc, 0] L2: POP
2891 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002892 .............................etc.......................
2893
Guido van Rossum3f5da241990-12-20 15:06:42 +00002894 [tb, val, exc, 0] Ln+1: POP
2895 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002896
2897 [] L0: <next statement>
2898
2899 Of course, parts are not generated if Vi or Ei is not present.
2900*/
2901
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002902static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002903com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002904{
2905 int except_anchor = 0;
2906 int end_anchor = 0;
2907 int else_anchor = 0;
2908 int i;
2909 node *ch;
2910
2911 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2912 block_push(c, SETUP_EXCEPT);
2913 com_node(c, CHILD(n, 2));
2914 com_addbyte(c, POP_BLOCK);
2915 block_pop(c, SETUP_EXCEPT);
2916 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2917 com_backpatch(c, except_anchor);
2918 for (i = 3;
2919 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2920 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002921 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002922 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002923 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002924 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002925 break;
2926 }
2927 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002928 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002929 com_addoparg(c, SET_LINENO, ch->n_lineno);
2930 if (NCH(ch) > 1) {
2931 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002932 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002933 com_node(c, CHILD(ch, 1));
2934 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002935 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002936 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
2937 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002938 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002939 }
2940 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002941 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002942 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00002943 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002944 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002945 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002946 com_pop(c, 1);
2947 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002948 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002949 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002950 com_node(c, CHILD(n, i+2));
2951 com_addfwref(c, JUMP_FORWARD, &end_anchor);
2952 if (except_anchor) {
2953 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002954 /* We come in with [tb, val, exc, 0] on the
2955 stack; one pop and it's the same as
2956 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002957 com_addbyte(c, POP_TOP);
2958 }
2959 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002960 /* We actually come in here with [tb, val, exc] but the
2961 END_FINALLY will zap those and jump around.
2962 The c_stacklevel does not reflect them so we need not pop
2963 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002964 com_addbyte(c, END_FINALLY);
2965 com_backpatch(c, else_anchor);
2966 if (i < NCH(n))
2967 com_node(c, CHILD(n, i+2));
2968 com_backpatch(c, end_anchor);
2969}
2970
2971static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002972com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002973{
2974 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002975 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00002976
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002977 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
2978 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002979 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002980 com_addbyte(c, POP_BLOCK);
2981 block_pop(c, SETUP_FINALLY);
2982 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002983 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002984 /* While the generated code pushes only one item,
2985 the try-finally handling can enter here with
2986 up to three items. OK, here are the details:
2987 3 for an exception, 2 for RETURN, 1 for BREAK. */
2988 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002989 com_backpatch(c, finally_anchor);
2990 ch = CHILD(n, NCH(n)-1);
2991 com_addoparg(c, SET_LINENO, ch->n_lineno);
2992 com_node(c, ch);
2993 com_addbyte(c, END_FINALLY);
2994 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002995 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002996}
2997
2998static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002999com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003000{
3001 REQ(n, try_stmt);
3002 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3003 | 'try' ':' suite 'finally' ':' suite */
3004 if (TYPE(CHILD(n, 3)) != except_clause)
3005 com_try_finally(c, n);
3006 else
3007 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003008}
3009
Guido van Rossum8b993a91997-01-17 21:04:03 +00003010static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003011get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003012{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003013 int i;
3014
Guido van Rossum8b993a91997-01-17 21:04:03 +00003015 /* Label to avoid tail recursion */
3016 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003017 switch (TYPE(n)) {
3018
3019 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003020 if (NCH(n) == 1) {
3021 n = CHILD(n, 0);
3022 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003023 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003024 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003025 case file_input:
3026 for (i = 0; i < NCH(n); i++) {
3027 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003028 if (TYPE(ch) == stmt) {
3029 n = ch;
3030 goto next;
3031 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003032 }
3033 break;
3034
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003035 case stmt:
3036 case simple_stmt:
3037 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003038 n = CHILD(n, 0);
3039 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003040
3041 case expr_stmt:
3042 case testlist:
3043 case test:
3044 case and_test:
3045 case not_test:
3046 case comparison:
3047 case expr:
3048 case xor_expr:
3049 case and_expr:
3050 case shift_expr:
3051 case arith_expr:
3052 case term:
3053 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003054 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003055 if (NCH(n) == 1) {
3056 n = CHILD(n, 0);
3057 goto next;
3058 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003059 break;
3060
3061 case atom:
3062 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003063 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003064 break;
3065
3066 }
3067 return NULL;
3068}
3069
Guido van Rossum79f25d91997-04-29 20:08:16 +00003070static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003071get_docstring(node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003072{
Guido van Rossum541563e1999-01-28 15:08:09 +00003073 /* Don't generate doc-strings if run with -OO */
3074 if (Py_OptimizeFlag > 1)
3075 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003076 n = get_rawdocstring(n);
3077 if (n == NULL)
3078 return NULL;
3079 return parsestrplus(n);
3080}
3081
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003082static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003083com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003084{
3085 REQ(n, suite);
3086 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3087 if (NCH(n) == 1) {
3088 com_node(c, CHILD(n, 0));
3089 }
3090 else {
3091 int i;
3092 for (i = 0; i < NCH(n); i++) {
3093 node *ch = CHILD(n, i);
3094 if (TYPE(ch) == stmt)
3095 com_node(c, ch);
3096 }
3097 }
3098}
3099
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003100/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003101static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003102com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003103{
3104 int i = c->c_nblocks;
3105 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3106 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3107 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003108 else if (i <= 0) {
3109 /* at the outer level */
3110 com_error(c, PyExc_SyntaxError,
3111 "'continue' not properly in loop");
3112 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003113 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003114 int j;
3115 for (j = 0; j <= i; ++j) {
3116 if (c->c_block[j] == SETUP_LOOP)
3117 break;
3118 }
3119 if (j < i+1) {
3120 /* there is a loop, but something interferes */
3121 for (++j; j <= i; ++j) {
3122 if (c->c_block[i] == SETUP_EXCEPT
3123 || c->c_block[i] == SETUP_FINALLY) {
3124 com_error(c, PyExc_SyntaxError,
3125 "'continue' not supported inside 'try' clause");
3126 return;
3127 }
3128 }
3129 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003130 com_error(c, PyExc_SyntaxError,
3131 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003132 }
3133 /* XXX Could allow it inside a 'finally' clause
3134 XXX if we could pop the exception still on the stack */
3135}
3136
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003137static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003138com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003139{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003140 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003141 if (TYPE(n) == lambdef) {
3142 /* lambdef: 'lambda' [varargslist] ':' test */
3143 n = CHILD(n, 1);
3144 }
3145 else {
3146 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3147 n = CHILD(n, 2);
3148 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3149 n = CHILD(n, 1);
3150 }
3151 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003152 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003153 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003154 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003155 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3156 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003157 nargs = 0;
3158 ndefs = 0;
3159 for (i = 0; i < nch; i++) {
3160 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003161 if (TYPE(CHILD(n, i)) == STAR ||
3162 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003163 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003164 nargs++;
3165 i++;
3166 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003167 t = RPAR; /* Anything except EQUAL or COMMA */
3168 else
3169 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003170 if (t == EQUAL) {
3171 i++;
3172 ndefs++;
3173 com_node(c, CHILD(n, i));
3174 i++;
3175 if (i >= nch)
3176 break;
3177 t = TYPE(CHILD(n, i));
3178 }
3179 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003180 /* Treat "(a=1, b)" as an error */
3181 if (ndefs)
3182 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003183 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003184 }
3185 if (t != COMMA)
3186 break;
3187 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003188 return ndefs;
3189}
3190
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003191static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003192com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003193{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003194 PyObject *v;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003195 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003196 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003197 ndefs = com_argdefs(c, n);
3198 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n));
Guido van Rossum79f25d91997-04-29 20:08:16 +00003199 v = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003200 symtable_exit_scope(c->c_symtable);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003201 if (v == NULL)
3202 c->c_errors++;
3203 else {
3204 int i = com_addconst(c, v);
3205 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003206 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003207 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003208 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003209 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003210 com_pop(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003211 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003212 }
3213}
3214
3215static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003216com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003217{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003218 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003219 REQ(n, testlist);
3220 /* testlist: test (',' test)* [','] */
3221 for (i = 0; i < NCH(n); i += 2)
3222 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003223 i = (NCH(n)+1) / 2;
3224 com_addoparg(c, BUILD_TUPLE, i);
3225 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003226}
3227
3228static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003229com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003230{
Guido van Rossum25831651993-05-19 14:50:45 +00003231 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003232 PyObject *v;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003233 char *name;
3234
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003235 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003236 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003237 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003238 c->c_errors++;
3239 return;
3240 }
3241 /* Push the class name on the stack */
3242 i = com_addconst(c, v);
3243 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003244 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003245 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003246 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003247 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003248 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003249 com_push(c, 1);
3250 }
Guido van Rossum25831651993-05-19 14:50:45 +00003251 else
3252 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003253 name = STR(CHILD(n, 1));
3254 symtable_enter_scope(c->c_symtable, name, TYPE(n));
Guido van Rossum79f25d91997-04-29 20:08:16 +00003255 v = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003256 symtable_exit_scope(c->c_symtable);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003257 if (v == NULL)
3258 c->c_errors++;
3259 else {
Guido van Rossum25831651993-05-19 14:50:45 +00003260 i = com_addconst(c, v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003261 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003262 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003263 com_addoparg(c, MAKE_FUNCTION, 0);
3264 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003265 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003266 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003267 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum79f25d91997-04-29 20:08:16 +00003268 Py_DECREF(v);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003269 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003270}
3271
3272static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003273com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003274{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003275 loop:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003276 switch (TYPE(n)) {
3277
3278 /* Definition nodes */
3279
3280 case funcdef:
3281 com_funcdef(c, n);
3282 break;
3283 case classdef:
3284 com_classdef(c, n);
3285 break;
3286
3287 /* Trivial parse tree nodes */
3288
3289 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003290 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003291 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003292 n = CHILD(n, 0);
3293 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003294
3295 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003296 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
3297 com_addoparg(c, SET_LINENO, n->n_lineno);
3298 {
3299 int i;
3300 for (i = 0; i < NCH(n)-1; i += 2)
3301 com_node(c, CHILD(n, i));
3302 }
3303 break;
3304
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003305 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003306 com_addoparg(c, SET_LINENO, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003307 n = CHILD(n, 0);
3308 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003309
3310 /* Statement nodes */
3311
3312 case expr_stmt:
3313 com_expr_stmt(c, n);
3314 break;
3315 case print_stmt:
3316 com_print_stmt(c, n);
3317 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003318 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003319 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003320 break;
3321 case pass_stmt:
3322 break;
3323 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003324 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003325 com_error(c, PyExc_SyntaxError,
3326 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003327 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003328 com_addbyte(c, BREAK_LOOP);
3329 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003330 case continue_stmt:
3331 com_continue_stmt(c, n);
3332 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003333 case return_stmt:
3334 com_return_stmt(c, n);
3335 break;
3336 case raise_stmt:
3337 com_raise_stmt(c, n);
3338 break;
3339 case import_stmt:
3340 com_import_stmt(c, n);
3341 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003342 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003343 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003344 case exec_stmt:
3345 com_exec_stmt(c, n);
3346 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003347 case assert_stmt:
3348 com_assert_stmt(c, n);
3349 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003350 case if_stmt:
3351 com_if_stmt(c, n);
3352 break;
3353 case while_stmt:
3354 com_while_stmt(c, n);
3355 break;
3356 case for_stmt:
3357 com_for_stmt(c, n);
3358 break;
3359 case try_stmt:
3360 com_try_stmt(c, n);
3361 break;
3362 case suite:
3363 com_suite(c, n);
3364 break;
3365
3366 /* Expression nodes */
3367
3368 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003369 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003370 break;
3371 case test:
3372 com_test(c, n);
3373 break;
3374 case and_test:
3375 com_and_test(c, n);
3376 break;
3377 case not_test:
3378 com_not_test(c, n);
3379 break;
3380 case comparison:
3381 com_comparison(c, n);
3382 break;
3383 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003384 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003385 break;
3386 case expr:
3387 com_expr(c, n);
3388 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003389 case xor_expr:
3390 com_xor_expr(c, n);
3391 break;
3392 case and_expr:
3393 com_and_expr(c, n);
3394 break;
3395 case shift_expr:
3396 com_shift_expr(c, n);
3397 break;
3398 case arith_expr:
3399 com_arith_expr(c, n);
3400 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003401 case term:
3402 com_term(c, n);
3403 break;
3404 case factor:
3405 com_factor(c, n);
3406 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003407 case power:
3408 com_power(c, n);
3409 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003410 case atom:
3411 com_atom(c, n);
3412 break;
3413
3414 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003415 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003416 com_error(c, PyExc_SystemError,
3417 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003418 }
3419}
3420
Tim Petersdbd9ba62000-07-09 03:09:57 +00003421static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003422
3423static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003424com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003425{
3426 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3427 if (TYPE(CHILD(n, 0)) == LPAR)
3428 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003429 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003430 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003431 com_pop(c, 1);
3432 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003433}
3434
3435static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003436com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003437{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003438 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003439 if (NCH(n) == 1) {
3440 com_fpdef(c, CHILD(n, 0));
3441 }
3442 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003443 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003444 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003445 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003446 for (i = 0; i < NCH(n); i += 2)
3447 com_fpdef(c, CHILD(n, i));
3448 }
3449}
3450
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003451/* XXX This function could probably be made simpler, because it
3452 doesn't do anything except generate code for complex arguments.
3453*/
3454
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003455static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003456com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003457{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003458 int nch, i;
3459 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003460 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003461 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003462 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003463 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003464 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003465 /* Enter all arguments in table of locals */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003466 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003467 node *ch = CHILD(n, i);
3468 node *fp;
3469 char *name;
Guido van Rossum50564e81996-01-12 01:13:16 +00003470 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003471 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003472 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3473 fp = CHILD(ch, 0);
3474 if (TYPE(fp) == NAME)
3475 name = STR(fp);
3476 else {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003477 name = nbuf;
3478 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003479 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003480 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003481 /* all name updates handled by symtable */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003482 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003483 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003484 ch = CHILD(n, i);
3485 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003486 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003487 else
3488 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003489 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003490 /* Handle *arguments */
3491 if (i < nch) {
3492 node *ch;
3493 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003494 if (TYPE(ch) != DOUBLESTAR) {
3495 REQ(ch, STAR);
3496 ch = CHILD(n, i+1);
3497 if (TYPE(ch) == NAME) {
Guido van Rossum50564e81996-01-12 01:13:16 +00003498 i += 3;
Guido van Rossum50564e81996-01-12 01:13:16 +00003499 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003500 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003501 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003502 /* Handle **keywords */
3503 if (i < nch) {
3504 node *ch;
3505 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003506 if (TYPE(ch) != DOUBLESTAR) {
3507 REQ(ch, STAR);
3508 ch = CHILD(n, i+1);
3509 REQ(ch, STAR);
3510 ch = CHILD(n, i+2);
3511 }
3512 else
3513 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003514 REQ(ch, NAME);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003515 }
3516 if (complex) {
3517 /* Generate code for complex arguments only after
3518 having counted the simple arguments */
3519 int ilocal = 0;
3520 for (i = 0; i < nch; i++) {
3521 node *ch = CHILD(n, i);
3522 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003523 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003524 break;
3525 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3526 fp = CHILD(ch, 0);
3527 if (TYPE(fp) != NAME) {
3528 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003529 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003530 com_fpdef(c, ch);
3531 }
3532 ilocal++;
3533 if (++i >= nch)
3534 break;
3535 ch = CHILD(n, i);
3536 if (TYPE(ch) == EQUAL)
3537 i += 2;
3538 else
3539 REQ(ch, COMMA);
3540 }
3541 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003542}
3543
3544static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003545com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003546{
3547 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003548 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003549 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003550 doc = get_docstring(n);
3551 if (doc != NULL) {
3552 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003553 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003554 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003555 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003556 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003557 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003558 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003559 for (i = 0; i < NCH(n); i++) {
3560 node *ch = CHILD(n, i);
3561 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3562 com_node(c, ch);
3563 }
3564}
3565
3566/* Top-level compile-node interface */
3567
3568static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003569compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003570{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003571 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003572 node *ch;
3573 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003574 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003575 doc = get_docstring(CHILD(n, 4));
3576 if (doc != NULL) {
3577 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003578 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003579 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003580 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003581 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003582 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3583 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003584 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003585 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003586 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003587 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003588 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003589 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003590 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003591 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003592 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003593}
3594
3595static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003596compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003597{
Guido van Rossum590baa41993-11-30 13:40:46 +00003598 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003599 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003600 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003601
3602 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003603 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003604 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003605 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003606 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003607 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003608 else
3609 ch = CHILD(n, 2);
3610 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003611 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003612 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003613}
3614
3615static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003616compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003617{
3618 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003619 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003620 REQ(n, classdef);
3621 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3622 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003623 c->c_private = c->c_name;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003624 ch = CHILD(n, NCH(n)-1); /* The suite */
3625 doc = get_docstring(ch);
3626 if (doc != NULL) {
3627 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003628 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003629 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003630 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003631 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003632 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003633 }
3634 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003635 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003636 com_node(c, ch);
3637 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003638 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003639 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003640 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003641}
3642
3643static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003644compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003645{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003646 com_addoparg(c, SET_LINENO, n->n_lineno);
3647
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003648 switch (TYPE(n)) {
3649
Guido van Rossum4c417781991-01-21 16:09:22 +00003650 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003651 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003652 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003653 n = CHILD(n, 0);
3654 if (TYPE(n) != NEWLINE)
3655 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003656 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003657 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003658 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003659 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003660 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003661 break;
3662
Guido van Rossum4c417781991-01-21 16:09:22 +00003663 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003664 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003665 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003666 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003667 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003668 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003669 break;
3670
Guido van Rossum590baa41993-11-30 13:40:46 +00003671 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003672 com_node(c, CHILD(n, 0));
3673 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003674 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003675 break;
3676
Guido van Rossum590baa41993-11-30 13:40:46 +00003677 case lambdef: /* anonymous function definition */
3678 compile_lambdef(c, n);
3679 break;
3680
Guido van Rossum4c417781991-01-21 16:09:22 +00003681 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003682 compile_funcdef(c, n);
3683 break;
3684
Guido van Rossum4c417781991-01-21 16:09:22 +00003685 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003686 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003687 break;
3688
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003689 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003690 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003691 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003692 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003693 }
3694}
3695
Guido van Rossum79f25d91997-04-29 20:08:16 +00003696PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003697PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003698{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003699 return jcompile(n, filename, NULL);
3700}
3701
Guido van Rossum79f25d91997-04-29 20:08:16 +00003702static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003703icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003704{
3705 return jcompile(n, base->c_filename, base);
3706}
3707
Guido van Rossum79f25d91997-04-29 20:08:16 +00003708static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003709jcompile(node *n, char *filename, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003710{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003711 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003712 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003713 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003714 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003715 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003716 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003717 sc.c_symtable = base->c_symtable;
3718 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003719 sc.c_private = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003720 if (symtable_build(&sc, n) < 0) {
3721 com_free(&sc);
3722 return NULL;
3723 }
3724 }
3725 co = NULL;
3726 if (symtable_load_symbols(&sc) < 0)
3727 goto exit;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003728 compile_node(&sc, n);
3729 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00003730 if (sc.c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003731 PyObject *consts, *names, *varnames, *filename, *name;
3732 consts = PyList_AsTuple(sc.c_consts);
3733 names = PyList_AsTuple(sc.c_names);
3734 varnames = PyList_AsTuple(sc.c_varnames);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003735 filename = PyString_InternFromString(sc.c_filename);
3736 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003737 if (!PyErr_Occurred())
3738 co = PyCode_New(sc.c_argcount,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003739 sc.c_nlocals,
Guido van Rossum8b993a91997-01-17 21:04:03 +00003740 sc.c_maxstacklevel,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003741 sc.c_flags,
3742 sc.c_code,
3743 consts,
3744 names,
3745 varnames,
3746 filename,
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003747 name,
3748 sc.c_firstlineno,
3749 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003750 Py_XDECREF(consts);
3751 Py_XDECREF(names);
3752 Py_XDECREF(varnames);
3753 Py_XDECREF(filename);
3754 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003755 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00003756 else if (!PyErr_Occurred()) {
3757 /* This could happen if someone called PyErr_Clear() after an
3758 error was reported above. That's not supposed to happen,
3759 but I just plugged one case and I'm not sure there can't be
3760 others. In that case, raise SystemError so that at least
3761 it gets reported instead dumping core. */
3762 PyErr_SetString(PyExc_SystemError, "lost syntax error");
3763 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003764 exit:
3765 if (base == NULL)
3766 symtable_free(sc.c_symtable);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003767 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003768 return co;
3769}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003770
3771int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003772PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003773{
3774 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003775 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003776 int line = co->co_firstlineno;
3777 int addr = 0;
3778 while (--size >= 0) {
3779 addr += *p++;
3780 if (addr > addrq)
3781 break;
3782 line += *p++;
3783 }
3784 return line;
3785}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003786
3787static int
3788is_local(struct compiling *c, char *name)
3789{
3790 if (PyDict_GetItemString(c->c_locals, name) != NULL)
3791 return 1;
3792 else
3793 return 0;
3794}
3795
3796static int
3797is_global(struct compiling *c, char *name)
3798{
3799 PyObject *v;
3800 v = PyDict_GetItemString(c->c_globals, name);
3801 if (v == NULL)
3802 return 0;
3803 else if (v == Py_None)
3804 return IMPLICIT_GLOBAL;
3805 else
3806 return EXPLICIT_GLOBAL;
3807}
3808
3809static int
3810symtable_build(struct compiling *c, node *n)
3811{
3812 if ((c->c_symtable = symtable_init()) == NULL)
3813 return -1;
3814 if (symtable_enter_scope(c->c_symtable, GLOBAL, TYPE(n)) < 0)
3815 return -1;
3816 symtable_node(c->c_symtable, n);
3817 /* reset for second pass */
3818 c->c_symtable->st_scopes = 1;
3819 return 0;
3820}
3821
3822static int
3823symtable_load_symbols(struct compiling *c)
3824{
3825 static PyObject *global = NULL;
3826 PyObject *name, *v, *varnames;
3827 int i, info, count, pos;
3828 struct symtable *st = c->c_symtable;
3829
3830 varnames = PyDict_GetItem(st->st_varnames, st->st_cur_id);
3831 if (varnames == NULL) {
3832 varnames = PyList_New(0);
3833 if (varnames == NULL)
3834 return -1;
3835 } else
3836 Py_INCREF(varnames);
3837
3838 c->c_varnames = varnames;
3839 count = PyList_GET_SIZE(varnames);
3840 c->c_argcount = count;
3841 for (i = 0; i < count; ++i) {
3842 v = PyInt_FromLong(i);
3843 if (PyDict_SetItem(c->c_locals,
3844 PyList_GET_ITEM(varnames, i), v) < 0)
3845 return -1;
3846 }
3847
3848 /* XXX The cases below define the rules for whether a name is
3849 local or global. The logic could probably be clearer. */
3850 pos = 0;
3851 while (PyDict_Next(st->st_cur, &pos, &name, &v)) {
3852 info = PyInt_AS_LONG(v);
3853 if (info & DEF_STAR) {
3854 c->c_argcount--;
3855 c->c_flags |= CO_VARARGS;
3856 } else if (info & DEF_DOUBLESTAR) {
3857 c->c_argcount--;
3858 c->c_flags |= CO_VARKEYWORDS;
3859 } else if (info & DEF_INTUPLE)
3860 c->c_argcount--;
3861 else if (info & DEF_GLOBAL) {
3862 if ((info & DEF_PARAM)
3863 && (PyString_AS_STRING(name)[0] != '.')){
3864 char buf[500];
3865 sprintf(buf,
3866 "name '%.400s' is local and global",
3867 PyString_AS_STRING(name));
3868 com_error(c, PyExc_SyntaxError, buf);
3869 return -1;
3870 }
3871 if (global == NULL) {
3872 global = PyInt_FromLong(1);
3873 if (global == NULL) {
3874 return -1;
3875 }
3876 }
3877 if (PyDict_SetItem(c->c_globals, name, global) < 0)
3878 return -1;
3879 } else if ((info & USE) && !(info & (DEF_LOCAL | DEF_PARAM))) {
3880 if (PyDict_SetItem(c->c_globals, name,
3881 Py_None) < 0)
3882 return -1;
3883 } else if ((info & DEF_LOCAL) && !(info & DEF_PARAM)) {
3884 v = PyInt_FromLong(count++);
3885 if (PyDict_SetItem(c->c_locals, name, v) < 0)
3886 return -1;
3887 if (st->st_cur_type != TYPE_CLASS)
3888 if (PyList_Append(c->c_varnames, name) < 0)
3889 return -1;
3890 }
3891 }
3892
3893 if (st->st_cur_type == TYPE_FUNCTION)
3894 c->c_nlocals = count;
3895
3896 if (st->st_cur_type != TYPE_MODULE)
3897 c->c_flags |= CO_NEWLOCALS;
3898 if ((st->st_cur_type == TYPE_FUNCTION)
3899 && (PyDict_GetItemString(st->st_cur, NOOPT) == NULL))
3900 c->c_flags |= CO_OPTIMIZED;
3901
3902 return 0;
3903}
3904
3905static struct symtable *
3906symtable_init()
3907{
3908 struct symtable *st;
3909 PyObject *d;
3910
3911 st = (struct symtable *)PyMem_Malloc(sizeof(struct symtable));
3912 if (st == NULL)
3913 return NULL;
3914 if ((st->st_namespaces = PyList_New(0)) == NULL)
3915 goto fail;
3916 if ((st->st_types = PyList_New(0)) == NULL)
3917 goto fail;
3918 if ((st->st_symbols = PyDict_New()) == NULL)
3919 goto fail;
3920 if ((st->st_varnames = PyDict_New()) == NULL)
3921 goto fail;
3922 if ((d = PyDict_New()) == NULL)
3923 goto fail;
3924 if (PyDict_SetItemString(st->st_symbols, GLOBAL, d) < 0)
3925 goto fail;
3926 st->st_global = d;
3927 st->st_cur = NULL;
3928 st->st_cur_id = NULL;
3929 st->st_cur_type = 0;
3930 st->st_scopes = 0;
3931 st->st_errors = 0;
3932 st->st_tmpname = 0;
3933 st->st_private = NULL;
3934 return st;
3935 fail:
3936 symtable_free(st);
3937 return NULL;
3938}
3939
3940static void
3941symtable_free(struct symtable *st)
3942{
3943 Py_XDECREF(st->st_symbols);
3944 Py_XDECREF(st->st_varnames);
3945 Py_XDECREF(st->st_namespaces);
3946 Py_XDECREF(st->st_types);
3947 Py_XDECREF(st->st_cur_id);
3948 PyMem_Free((void *)st);
3949}
3950
3951/* XXX name isn't used ... */
3952
3953static int
3954symtable_enter_scope(struct symtable *st, char *name, int type)
3955{
3956 PyObject *o;
3957
3958 o = PyInt_FromLong(st->st_scopes++);
3959 if (o == NULL)
3960 return -1;
3961 if (PyList_Append(st->st_namespaces, o) < 0)
3962 return -1;
3963 switch (type) {
3964 case funcdef:
3965 case lambdef:
3966 st->st_cur_type = TYPE_FUNCTION;
3967 break;
3968 case classdef:
3969 st->st_cur_type = TYPE_CLASS;
3970 break;
3971 case single_input:
3972 case eval_input:
3973 case file_input:
3974 st->st_cur_type = TYPE_MODULE;
3975 break;
3976 default:
3977 fprintf(stderr, "invalid symtable scope: %d\n", type);
3978 }
3979 o = PyInt_FromLong(st->st_cur_type);
3980 if (o == NULL)
3981 return -1;
3982 if (PyList_Append(st->st_types, o) < 0)
3983 return -1;
3984 return symtable_update_cur(st);
3985}
3986
3987static int
3988symtable_exit_scope(struct symtable *st)
3989{
3990 PyObject *o;
3991 int end;
3992
3993 end = PyList_GET_SIZE(st->st_namespaces) - 1;
3994 if (PySequence_DelItem(st->st_namespaces, end) < 0)
3995 return -1;
3996 if (PySequence_DelItem(st->st_types, end) < 0)
3997 return -1;
3998 o = PyList_GET_ITEM(st->st_types, end - 1);
3999 st->st_cur_type = PyInt_AS_LONG(o);
4000 return symtable_update_cur(st);
4001}
4002
4003static int
4004symtable_update_cur(struct symtable *st)
4005{
4006 PyObject *s, *d, *l;
4007 int end;
4008
4009 end = PyList_GET_SIZE(st->st_namespaces) - 1;
4010 s = PyList_GET_ITEM(st->st_namespaces, end);
4011 st->st_cur_id = s;
4012 d = PyDict_GetItem(st->st_symbols, s);
4013 if (d == NULL) {
4014 if ((d = PyDict_New()) == NULL)
4015 return -1;
4016 if (PyObject_SetItem(st->st_symbols, s, d) < 0) {
4017 Py_DECREF(d);
4018 return -1;
4019 }
4020 if (st->st_cur_type == TYPE_FUNCTION) {
4021 if ((l = PyList_New(0)) == NULL)
4022 return -1;
4023 if (PyDict_SetItem(st->st_varnames, s, l) < 0)
4024 return -1;
4025 }
4026 }
4027
4028 st->st_cur = d;
4029 return 0;
4030}
4031
4032static int
4033symtable_mangle(struct symtable *st, char *name, char *buffer, size_t maxlen)
4034{
4035 return mangle(st->st_private, name, buffer, maxlen);
4036}
4037
4038static int
4039symtable_add_def(struct symtable *st, char *name, int scope)
4040{
4041 PyObject *s, *o;
4042 int val;
4043 char buffer[MANGLE_LEN];
4044
4045 if (symtable_mangle(st, name, buffer, sizeof(buffer)))
4046 name = buffer;
4047 if ((s = PyString_InternFromString(name)) == NULL)
4048 return -1;
4049 if ((o = PyDict_GetItem(st->st_cur, s))) {
4050 val = PyInt_AS_LONG(o);
4051 if ((scope & DEF_PARAM) && (val & DEF_PARAM)) {
4052 PyErr_Format(PyExc_SyntaxError,
4053 "duplicate argument '%s' in function definition",
4054 name);
4055 return -1;
4056 }
4057 val |= scope;
4058 } else
4059 val = scope;
4060 o = PyInt_FromLong(val);
4061 if (PyDict_SetItem(st->st_cur, s, o) < 0) {
4062 Py_DECREF(o);
4063 return -1;
4064 }
4065 Py_DECREF(o);
4066
4067 if (scope & DEF_PARAM) {
4068 PyObject *l = PyDict_GetItem(st->st_varnames,
4069 st->st_cur_id);
4070 if (l == NULL)
4071 return -1;
4072 if (PyList_Append(l, s) < 0)
4073 return -1;
4074 } else if (scope & DEF_GLOBAL) {
4075 if ((o = PyDict_GetItem(st->st_global, s))) {
4076 val = PyInt_AS_LONG(o);
4077 val |= scope;
4078 } else
4079 val = scope;
4080 o = PyInt_FromLong(val);
4081 if (PyDict_SetItem(st->st_global, s, o) < 0) {
4082 Py_DECREF(o);
4083 return -1;
4084 }
4085 Py_DECREF(o);
4086 }
4087 return 0;
4088}
4089
4090static int
4091symtable_add_use(struct symtable *st, char *name)
4092{
4093 PyObject *s, *o;
4094 int val;
4095 char buffer[MANGLE_LEN];
4096
4097 if (symtable_mangle(st, name, buffer, sizeof(buffer)))
4098 name = buffer;
4099/* fprintf(stderr, "add_use(%s)\n", name); */
4100 if ((s = PyString_InternFromString(name)) == NULL)
4101 return -1;
4102 if ((o = PyDict_GetItem(st->st_cur, s))) {
4103 val = PyInt_AS_LONG(o);
4104 val |= USE;
4105 } else
4106 val = USE;
4107 o = PyInt_FromLong(val);
4108 if (PyDict_SetItem(st->st_cur, s, o) < 0) {
4109 Py_DECREF(o);
4110 return -1;
4111 }
4112 Py_DECREF(o);
4113 return 0;
4114}
4115
4116static void
4117symtable_node(struct symtable *st, node *n)
4118{
4119 int i, start = 0;
4120
4121 loop:
4122 switch (TYPE(n)) {
4123 case funcdef: {
4124 char *func_name = STR(CHILD(n, 1));
4125 symtable_add_def(st, func_name, DEF_LOCAL);
4126 symtable_default_args(st, CHILD(n, 2));
4127 symtable_enter_scope(st, func_name, TYPE(n));
4128 symtable_funcdef(st, n);
4129 symtable_exit_scope(st);
4130 break;
4131 }
4132 case lambdef:
4133 if (NCH(n) == 4)
4134 symtable_default_args(st, CHILD(n, 1));
4135 symtable_enter_scope(st, "lambda", TYPE(n));
4136 symtable_funcdef(st, n);
4137 symtable_exit_scope(st);
4138 break;
4139 case classdef: {
4140 char *tmp, *class_name = STR(CHILD(n, 1));
4141 symtable_add_def(st, class_name, DEF_LOCAL);
4142 if (TYPE(CHILD(n, 2)) == LPAR) {
4143 node *bases = CHILD(n, 3);
4144 int i;
4145 for (i = 0; i < NCH(bases); i += 2) {
4146 symtable_node(st, CHILD(bases, i));
4147 }
4148 }
4149 symtable_enter_scope(st, class_name, TYPE(n));
4150 tmp = st->st_private;
4151 st->st_private = class_name;
4152 symtable_node(st, CHILD(n, NCH(n) - 1));
4153 st->st_private = tmp;
4154 symtable_exit_scope(st);
4155 break;
4156 }
4157 case if_stmt:
4158 for (i = 0; i + 3 < NCH(n); i += 4) {
4159 if (is_constant_false(NULL, (CHILD(n, i + 1))))
4160 continue;
4161 symtable_node(st, CHILD(n, i + 1));
4162 symtable_node(st, CHILD(n, i + 3));
4163 }
4164 if (i + 2 < NCH(n))
4165 symtable_node(st, CHILD(n, i + 2));
4166 break;
4167 case global_stmt:
4168 symtable_global(st, n);
4169 break;
4170 case import_stmt:
4171 symtable_import(st, n);
4172 break;
4173 case exec_stmt:
4174 if (PyDict_SetItemString(st->st_cur, NOOPT, Py_None) < 0)
4175 st->st_errors++;
4176 symtable_node(st, CHILD(n, 1));
4177 if (NCH(n) > 2)
4178 symtable_node(st, CHILD(n, 3));
4179 if (NCH(n) > 4)
4180 symtable_node(st, CHILD(n, 5));
4181 break;
4182 case except_clause:
4183 if (NCH(n) == 4)
4184 symtable_assign(st, CHILD(n, 3));
4185 if (NCH(n) > 1) {
4186 n = CHILD(n, 1);
4187 goto loop;
4188 }
4189 break;
4190 case del_stmt:
4191 symtable_assign(st, CHILD(n, 1));
4192 break;
4193 case expr_stmt:
4194 if (NCH(n) == 1)
4195 n = CHILD(n, 0);
4196 else {
4197 if (TYPE(CHILD(n, 1)) == augassign) {
4198 symtable_assign(st, CHILD(n, 0));
4199 symtable_node(st, CHILD(n, 2));
4200 break;
4201 } else {
4202 int i;
4203 for (i = 0; i < NCH(n) - 2; i += 2)
4204 symtable_assign(st, CHILD(n, i));
4205 n = CHILD(n, NCH(n) - 1);
4206 }
4207 }
4208 goto loop;
4209 /* watchout for fall-through logic below */
4210 case listmaker:
4211 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
4212 symtable_list_comprehension(st, CHILD(n, 1));
4213 break;
4214 }
4215 case atom:
4216 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
4217 symtable_add_use(st, STR(CHILD(n, 0)));
4218 break;
4219 }
4220 case for_stmt:
4221 if (TYPE(n) == for_stmt) {
4222 symtable_assign(st, CHILD(n, 1));
4223 start = 3;
4224 }
4225 default:
4226 if (NCH(n) == 1) {
4227 n = CHILD(n, 0);
4228 goto loop;
4229 }
4230 for (i = start; i < NCH(n); ++i)
4231 if (TYPE(CHILD(n, i)) >= single_input)
4232 symtable_node(st, CHILD(n, i));
4233 }
4234}
4235
4236static void
4237symtable_funcdef(struct symtable *st, node *n)
4238{
4239 node *body;
4240
4241 if (TYPE(n) == lambdef) {
4242 if (NCH(n) == 4)
4243 symtable_params(st, CHILD(n, 1));
4244 } else
4245 symtable_params(st, CHILD(n, 2));
4246 body = CHILD(n, NCH(n) - 1);
4247 symtable_node(st, body);
4248}
4249
4250/* The next two functions parse the argument tuple.
4251 symtable_default_arg() checks for names in the default arguments,
4252 which are references in the defining scope. symtable_params()
4253 parses the parameter names, which are defined in the function's
4254 body.
4255
4256 varargslist:
4257 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
4258 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
4259*/
4260
4261static void
4262symtable_default_args(struct symtable *st, node *n)
4263{
4264 node *c;
4265 int i;
4266
4267 if (TYPE(n) == parameters) {
4268 n = CHILD(n, 1);
4269 if (TYPE(n) == RPAR)
4270 return;
4271 }
4272 REQ(n, varargslist);
4273 for (i = 0; i < NCH(n); i += 2) {
4274 c = CHILD(n, i);
4275 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
4276 break;
4277 }
4278 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
4279 symtable_node(st, CHILD(n, i));
4280 }
4281}
4282
4283static void
4284symtable_params(struct symtable *st, node *n)
4285{
4286 int i, complex = 0, ext = 0;
4287 node *c = NULL;
4288
4289 if (TYPE(n) == parameters) {
4290 n = CHILD(n, 1);
4291 if (TYPE(n) == RPAR)
4292 return;
4293 }
4294 REQ(n, varargslist);
4295 for (i = 0; i < NCH(n); i += 2) {
4296 c = CHILD(n, i);
4297 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
4298 ext = 1;
4299 break;
4300 }
4301 if (TYPE(c) == test) {
4302 continue;
4303 }
4304 if (TYPE(CHILD(c, 0)) == NAME)
4305 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
4306 else {
4307 char nbuf[10];
4308 sprintf(nbuf, ".%d", i);
4309 symtable_add_def(st, nbuf, DEF_PARAM);
4310 complex = 1;
4311 }
4312 }
4313 if (complex) {
4314 int j;
4315 for (j = 0; j < i; j += 2) {
4316 c = CHILD(n, j);
4317 if (TYPE(CHILD(c, 0)) == LPAR)
4318 symtable_params_fplist(st, CHILD(c, 1));
4319 }
4320 }
4321 if (ext) {
4322 c = CHILD(n, i);
4323 if (TYPE(c) == STAR) {
4324 i++;
4325 symtable_add_def(st, STR(CHILD(n, i)),
4326 DEF_PARAM | DEF_STAR);
4327 i += 2;
4328 c = CHILD(n, i);
4329 }
4330 if (TYPE(c) == DOUBLESTAR) {
4331 i++;
4332 symtable_add_def(st, STR(CHILD(n, i)),
4333 DEF_PARAM | DEF_DOUBLESTAR);
4334 }
4335 }
4336}
4337
4338static void
4339symtable_params_fplist(struct symtable *st, node *n)
4340{
4341 int i;
4342 node *c;
4343
4344 REQ(n, fplist);
4345 for (i = 0; i < NCH(n); i += 2) {
4346 c = CHILD(n, i);
4347 REQ(c, fpdef);
4348 if (NCH(c) == 1)
4349 symtable_add_def(st, STR(CHILD(c, 0)),
4350 DEF_PARAM | DEF_INTUPLE);
4351 else
4352 symtable_params_fplist(st, CHILD(c, 1));
4353 }
4354
4355}
4356
4357static void
4358symtable_global(struct symtable *st, node *n)
4359{
4360 int i;
4361
4362 for (i = 1; i < NCH(n); i += 2)
4363 symtable_add_def(st, STR(CHILD(n, i)), DEF_GLOBAL);
4364}
4365
4366static void
4367symtable_list_comprehension(struct symtable *st, node *n)
4368{
4369 char tmpname[12];
4370
4371 sprintf(tmpname, "[%d]", ++st->st_tmpname);
4372 symtable_add_def(st, tmpname, DEF_LOCAL);
4373 symtable_assign(st, CHILD(n, 1));
4374 symtable_node(st, CHILD(n, 3));
4375 if (NCH(n) == 5)
4376 symtable_node(st, CHILD(n, 4));
4377 --st->st_tmpname;
4378}
4379
4380static void
4381symtable_import(struct symtable *st, node *n)
4382{
4383 int i;
4384 /*
4385 import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
4386 | 'from' dotted_name 'import'
4387 ('*' | import_as_name (',' import_as_name)*)
4388 import_as_name: NAME [NAME NAME]
4389 */
4390
4391 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
4392 if (TYPE(CHILD(n, 3)) == STAR) {
4393 if (PyDict_SetItemString(st->st_cur, NOOPT,
4394 Py_None) < 0)
4395 st->st_errors++;
4396 } else {
4397 for (i = 3; i < NCH(n); i += 2) {
4398 node *c = CHILD(n, i);
4399 if (NCH(c) > 1) /* import as */
4400 symtable_assign(st, CHILD(c, 2));
4401 else
4402 symtable_assign(st, CHILD(c, 0));
4403 }
4404 }
4405 } else {
4406 for (i = 1; i < NCH(n); i += 2) {
4407 symtable_assign(st, CHILD(n, i));
4408 }
4409 }
4410}
4411
4412static void
4413symtable_assign(struct symtable *st, node *n)
4414{
4415 node *tmp;
4416 int i;
4417
4418 for (;;) {
4419/* fprintf(stderr, "symtable_assign(%d, %d)\n",
4420 TYPE(n), NCH(n));
4421*/
4422
4423 switch (TYPE(n)) {
4424 case power:
4425 /* not sure that NCH(n) > 1 always means that
4426 none of the left-hand side names are
4427 targets of assignments */
4428 if (NCH(n) > 2) {
4429 for (i = 2; i < NCH(n); ++i)
4430 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
4431 symtable_node(st, CHILD(n, i));
4432 }
4433 if (NCH(n) > 1) {
4434 symtable_node(st, CHILD(n, 0));
4435 symtable_node(st, CHILD(n, 1));
4436 } else {
4437 n = CHILD(n, 0);
4438 continue;
4439 }
4440 return;
4441 case listmaker:
4442 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
4443 symtable_list_comprehension(st, CHILD(n, 1));
4444 else {
4445 for (i = 0; i < NCH(n); i += 2)
4446 symtable_assign(st, CHILD(n, i));
4447 }
4448 return;
4449 case exprlist:
4450 case testlist:
4451 if (NCH(n) == 1) {
4452 n = CHILD(n, 0);
4453 break;
4454 }
4455 else {
4456 int i;
4457 for (i = 0; i < NCH(n); i += 2)
4458 symtable_assign(st, CHILD(n, i));
4459 return;
4460 }
4461 break;
4462 case atom:
4463 tmp = CHILD(n, 0);
4464 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
4465 n = CHILD(n, 1);
4466 continue;
4467 } else if (TYPE(tmp) == NAME)
4468 symtable_add_def(st, STR(tmp), DEF_LOCAL);
4469 return;
4470 case dotted_as_name:
4471 if (NCH(n) == 3)
4472 symtable_add_def(st, STR(CHILD(n, 2)),
4473 DEF_LOCAL);
4474 else
4475 symtable_add_def(st,
4476 STR(CHILD(CHILD(n,
4477 0), 0)),
4478 DEF_LOCAL);
4479 return;
4480 case dotted_name:
4481 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL);
4482 return;
4483 case NAME:
4484 symtable_add_def(st, STR(n), DEF_LOCAL);
4485 return;
4486 default:
4487 if (NCH(n) == 0)
4488 return;
4489 assert(NCH(n) == 1);
4490 n = CHILD(n, 0);
4491 break;
4492 }
4493 }
4494}