blob: 0830855167a225b5a0213d8dfa5f2ec5b7acc5a7 [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'
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00008 XXX Allow 'continue' inside finally clause of 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"
Jeremy Hylton4b38da62001-02-02 18:19:15 +000019#include "symtable.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000020#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000021#include "structmember.h"
22
23#include <ctype.h>
Guido van Rossum282914b1991-04-04 10:42:56 +000024
Guido van Rossumb05a5c71997-05-07 17:46:13 +000025/* Three symbols from graminit.h are also defined in Python.h, with
26 Py_ prefixes to their names. Python.h can't include graminit.h
27 (which defines too many confusing symbols), but we can check here
28 that they haven't changed (which is very unlikely, but possible). */
29#if Py_single_input != single_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000030 #error "single_input has changed -- update Py_single_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000031#endif
32#if Py_file_input != file_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000033 #error "file_input has changed -- update Py_file_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000034#endif
35#if Py_eval_input != eval_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000036 #error "eval_input has changed -- update Py_eval_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000037#endif
38
Guido van Rossum8e793d91997-03-03 19:13:14 +000039int Py_OptimizeFlag = 0;
40
Guido van Rossum8861b741996-07-30 16:49:37 +000041#define OP_DELETE 0
42#define OP_ASSIGN 1
43#define OP_APPLY 2
44
Jeremy Hyltone36f7782001-01-19 03:21:30 +000045#define VAR_LOAD 0
46#define VAR_STORE 1
47#define VAR_DELETE 2
48
Jeremy Hylton64949cb2001-01-25 20:06:59 +000049#define DEL_CLOSURE_ERROR \
Jeremy Hyltoneab156f2001-01-30 01:24:43 +000050"can not delete variable '%.400s' referenced in nested scope"
51
52#define DUPLICATE_ARGUMENT \
53"duplicate argument '%s' in function definition"
54
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000055#define ILLEGAL_DYNAMIC_SCOPE \
56"%.100s: exec or 'import *' makes names ambiguous in nested scope"
Jeremy Hyltoneab156f2001-01-30 01:24:43 +000057
Jeremy Hylton29906ee2001-02-27 04:23:34 +000058#define GLOBAL_AFTER_ASSIGN \
59"name '%.400s' is assigned to before global declaration"
60
61#define GLOBAL_AFTER_USE \
62"name '%.400s' is used prior to global declaration"
63
64#define LOCAL_GLOBAL \
65"name '%.400s' is a function paramter and declared global"
66
Jeremy Hyltone36f7782001-01-19 03:21:30 +000067#define MANGLE_LEN 256
68
Guido van Rossum79f25d91997-04-29 20:08:16 +000069#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000070
71static struct memberlist code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000072 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
73 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000074 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000075 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000076 {"co_code", T_OBJECT, OFF(co_code), READONLY},
77 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
78 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000079 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Jeremy Hylton64949cb2001-01-25 20:06:59 +000080 {"co_freevars", T_OBJECT, OFF(co_freevars), READONLY},
81 {"co_cellvars", T_OBJECT, OFF(co_cellvars), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000082 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000083 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000084 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
85 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000086 {NULL} /* Sentinel */
87};
88
Guido van Rossum79f25d91997-04-29 20:08:16 +000089static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000090code_getattr(PyCodeObject *co, char *name)
Guido van Rossum3f5da241990-12-20 15:06:42 +000091{
Guido van Rossum79f25d91997-04-29 20:08:16 +000092 return PyMember_Get((char *)co, code_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +000093}
Guido van Rossum10dc2e81990-11-18 17:27:39 +000094
95static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000096code_dealloc(PyCodeObject *co)
Guido van Rossum10dc2e81990-11-18 17:27:39 +000097{
Guido van Rossum79f25d91997-04-29 20:08:16 +000098 Py_XDECREF(co->co_code);
99 Py_XDECREF(co->co_consts);
100 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +0000101 Py_XDECREF(co->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000102 Py_XDECREF(co->co_freevars);
103 Py_XDECREF(co->co_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000104 Py_XDECREF(co->co_filename);
105 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +0000106 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000107 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000108}
109
Guido van Rossum79f25d91997-04-29 20:08:16 +0000110static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000111code_repr(PyCodeObject *co)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000112{
113 char buf[500];
114 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000115 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000116 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000117
Guido van Rossuma396a882000-04-07 01:21:36 +0000118 if (co->co_firstlineno != 0)
119 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000120 if (co->co_filename && PyString_Check(co->co_filename))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000121 filename = PyString_AS_STRING(co->co_filename);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000122 if (co->co_name && PyString_Check(co->co_name))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000123 name = PyString_AS_STRING(co->co_name);
Fred Drake615ae552000-06-30 16:20:13 +0000124 sprintf(buf, "<code object %.100s at %p, file \"%.300s\", line %d>",
125 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000126 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000127}
128
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000129static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000130code_compare(PyCodeObject *co, PyCodeObject *cp)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000131{
132 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000133 cmp = PyObject_Compare(co->co_name, cp->co_name);
134 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000135 cmp = co->co_argcount - cp->co_argcount;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000136 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000137 cmp = co->co_nlocals - cp->co_nlocals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000138 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000139 cmp = co->co_flags - cp->co_flags;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000140 if (cmp) return cmp;
Guido van Rossumd076c731998-10-07 19:42:25 +0000141 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000142 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000143 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000144 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000145 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000146 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000147 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000148 if (cmp) return cmp;
149 cmp = PyObject_Compare(co->co_freevars, cp->co_freevars);
150 if (cmp) return cmp;
151 cmp = PyObject_Compare(co->co_cellvars, cp->co_cellvars);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000152 return cmp;
153}
154
155static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000156code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000157{
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000158 long h, h0, h1, h2, h3, h4, h5, h6;
Guido van Rossum44679592000-04-10 16:20:31 +0000159 h0 = PyObject_Hash(co->co_name);
160 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000161 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000162 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000163 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000164 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000165 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000166 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000167 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000168 if (h4 == -1) return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000169 h5 = PyObject_Hash(co->co_freevars);
170 if (h5 == -1) return -1;
171 h6 = PyObject_Hash(co->co_cellvars);
172 if (h6 == -1) return -1;
173 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^ h5 ^ h6 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000174 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000175 if (h == -1) h = -2;
176 return h;
177}
178
Guido van Rossum79f25d91997-04-29 20:08:16 +0000179PyTypeObject PyCode_Type = {
180 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000181 0,
182 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000183 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000184 0,
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000185 (destructor)code_dealloc, /*tp_dealloc*/
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000186 0, /*tp_print*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000187 (getattrfunc)code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000188 0, /*tp_setattr*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000189 (cmpfunc)code_compare, /*tp_compare*/
190 (reprfunc)code_repr, /*tp_repr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000191 0, /*tp_as_number*/
192 0, /*tp_as_sequence*/
193 0, /*tp_as_mapping*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000194 (hashfunc)code_hash, /*tp_hash*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000195};
196
Guido van Rossum644a12b1997-04-09 19:24:53 +0000197#define NAME_CHARS \
198 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
199
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000200/* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
201
202static int
203all_name_chars(unsigned char *s)
204{
Guido van Rossumcd90c202001-02-09 15:06:42 +0000205 static char ok_name_char[256];
206 static unsigned char *name_chars = (unsigned char *)NAME_CHARS;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000207
Guido van Rossumcd90c202001-02-09 15:06:42 +0000208 if (ok_name_char[*name_chars] == 0) {
209 unsigned char *p;
210 for (p = name_chars; *p; p++)
211 ok_name_char[*p] = 1;
212 }
213 while (*s) {
214 if (ok_name_char[*s++] == 0)
215 return 0;
216 }
217 return 1;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000218}
219
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000220static int
221intern_strings(PyObject *tuple)
222{
223 int i;
224
225 for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) {
226 PyObject *v = PyTuple_GET_ITEM(tuple, i);
227 if (v == NULL || !PyString_Check(v)) {
228 Py_FatalError("non-string found in code slot");
229 PyErr_BadInternalCall();
230 return -1;
231 }
232 PyString_InternInPlace(&PyTuple_GET_ITEM(tuple, i));
233 }
234 return 0;
235}
236
Guido van Rossum79f25d91997-04-29 20:08:16 +0000237PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000238PyCode_New(int argcount, int nlocals, int stacksize, int flags,
239 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000240 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
241 PyObject *filename, PyObject *name, int firstlineno,
242 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000243{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000244 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000245 int i;
Guido van Rossumd076c731998-10-07 19:42:25 +0000246 PyBufferProcs *pb;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000247 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000248 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000249 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000250 consts == NULL || !PyTuple_Check(consts) ||
251 names == NULL || !PyTuple_Check(names) ||
252 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000253 freevars == NULL || !PyTuple_Check(freevars) ||
254 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000255 name == NULL || !PyString_Check(name) ||
256 filename == NULL || !PyString_Check(filename) ||
257 lnotab == NULL || !PyString_Check(lnotab)) {
258 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000259 return NULL;
260 }
Guido van Rossumd076c731998-10-07 19:42:25 +0000261 pb = code->ob_type->tp_as_buffer;
262 if (pb == NULL ||
263 pb->bf_getreadbuffer == NULL ||
264 pb->bf_getsegcount == NULL ||
265 (*pb->bf_getsegcount)(code, NULL) != 1)
266 {
267 PyErr_BadInternalCall();
268 return NULL;
269 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000270 intern_strings(names);
271 intern_strings(varnames);
272 if (freevars == NULL)
273 freevars = PyTuple_New(0);
274 intern_strings(freevars);
275 if (cellvars == NULL)
276 cellvars = PyTuple_New(0);
277 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000278 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000279 for (i = PyTuple_Size(consts); --i >= 0; ) {
280 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000281 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000282 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000283 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000284 continue;
285 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000286 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000287 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000288 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000289 co->co_argcount = argcount;
290 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000291 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000292 co->co_flags = flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000293 Py_INCREF(code);
Guido van Rossumd076c731998-10-07 19:42:25 +0000294 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000295 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000296 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000297 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000298 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000299 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000300 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000301 Py_INCREF(freevars);
302 co->co_freevars = freevars;
303 Py_INCREF(cellvars);
304 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000305 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000306 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000307 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000308 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000309 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000310 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000311 co->co_lnotab = lnotab;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000312/* PyObject_Print((PyObject *)co, stderr, 0); */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000313 }
314 return co;
315}
316
317
318/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000319
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000320/* The compiler uses two passes to generate bytecodes. The first pass
321 builds the symbol table. The second pass generates the bytecode.
322
323 The first pass uses a single symtable struct. The second pass uses
324 a compiling struct for each code block. The compiling structs
325 share a reference to the symtable.
326
327 The two passes communicate via symtable_load_symbols() and via
328 is_local() and is_global(). The former initializes several slots
329 in the compiling struct: c_varnames, c_locals, c_nlocals,
330 c_argcount, c_globals, and c_flags.
331*/
332
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000333struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000334 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000335 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000336 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000337 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000338 PyObject *c_name_dict; /* inverse of c_names */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000339 PyObject *c_globals; /* dictionary (value=None) */
340 PyObject *c_locals; /* dictionary (value=localID) */
341 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000342 PyObject *c_freevars; /* dictionary (value=None) */
343 PyObject *c_cellvars; /* list */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000344 int c_nlocals; /* index of next local */
345 int c_argcount; /* number of top-level arguments */
346 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000347 int c_nexti; /* index into c_code */
348 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000349 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000350 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000351 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000352 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000353 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000354 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000355 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000356 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000357 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000358 int c_stacklevel; /* Current stack level */
359 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000360 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000361 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000362 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000363 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000364 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000365 int c_nested; /* Is block nested funcdef or lamdef? */
366 int c_closure; /* Is nested w/freevars? */
367 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000368 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000369};
370
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000371int is_free(int v)
372{
373 if ((v & (USE | DEF_FREE))
374 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
375 return 1;
376 if (v & DEF_FREE_CLASS)
377 return 1;
378 return 0;
379}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000380
Guido van Rossum452a9831996-09-17 14:32:04 +0000381/* Error message including line number */
382
383static void
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000384set_error_location(char *filename, int lineno)
385{
386 PyObject *exc, *v, *tb, *tmp;
387
388 /* add attributes for the line number and filename for the error */
389 PyErr_Fetch(&exc, &v, &tb);
390 PyErr_NormalizeException(&exc, &v, &tb);
391 tmp = PyInt_FromLong(lineno);
392 if (tmp == NULL)
393 PyErr_Clear();
394 else {
395 if (PyObject_SetAttrString(v, "lineno", tmp))
396 PyErr_Clear();
397 Py_DECREF(tmp);
398 }
399 if (filename != NULL) {
400 tmp = PyString_FromString(filename);
401 if (tmp == NULL)
402 PyErr_Clear();
403 else {
404 if (PyObject_SetAttrString(v, "filename", tmp))
405 PyErr_Clear();
406 Py_DECREF(tmp);
407 }
408 }
409 PyErr_Restore(exc, v, tb);
410}
411
412static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000413com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000414{
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000415 PyObject *v;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000416 if (c == NULL) {
417 /* Error occurred via symtable call to
418 is_constant_false */
419 PyErr_SetString(exc, msg);
420 return;
421 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000422 c->c_errors++;
Guido van Rossum452a9831996-09-17 14:32:04 +0000423 if (c->c_lineno <= 1) {
424 /* Unknown line number or single interactive command */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000425 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000426 return;
427 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000428 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000429 if (v == NULL)
430 return; /* MemoryError, too bad */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000431 PyErr_SetObject(exc, v);
432 Py_DECREF(v);
Fred Drakedcf08e02000-08-15 15:49:44 +0000433
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000434 set_error_location(c->c_filename, c->c_lineno);
Guido van Rossum452a9831996-09-17 14:32:04 +0000435}
436
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000437/* Interface to the block stack */
438
439static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000440block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000441{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000442 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000443 com_error(c, PyExc_SystemError,
444 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000445 }
446 else {
447 c->c_block[c->c_nblocks++] = type;
448 }
449}
450
451static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000452block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000453{
454 if (c->c_nblocks > 0)
455 c->c_nblocks--;
456 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000457 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000458 }
459}
460
Guido van Rossum681d79a1995-07-18 14:51:37 +0000461/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000462
Tim Petersdbd9ba62000-07-09 03:09:57 +0000463static int com_init(struct compiling *, char *);
464static void com_free(struct compiling *);
465static void com_push(struct compiling *, int);
466static void com_pop(struct compiling *, int);
467static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000468static void com_node(struct compiling *, node *);
469static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000470static void com_addbyte(struct compiling *, int);
471static void com_addint(struct compiling *, int);
472static void com_addoparg(struct compiling *, int, int);
473static void com_addfwref(struct compiling *, int, int *);
474static void com_backpatch(struct compiling *, int);
475static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
476static int com_addconst(struct compiling *, PyObject *);
477static int com_addname(struct compiling *, PyObject *);
478static void com_addopname(struct compiling *, int, node *);
479static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000480static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000481static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000482static void com_assign(struct compiling *, node *, int, node *);
483static void com_assign_name(struct compiling *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000484static PyCodeObject *icompile(node *, struct compiling *);
485static PyCodeObject *jcompile(node *, char *, struct compiling *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000486static PyObject *parsestrplus(node *);
487static PyObject *parsestr(char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000488static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000489
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000490static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000491
492/* symtable operations */
493static int symtable_build(struct compiling *, node *);
494static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000495static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000496static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000497static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000498static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000499static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000500
501static void symtable_node(struct symtable *, node *);
502static void symtable_funcdef(struct symtable *, node *);
503static void symtable_default_args(struct symtable *, node *);
504static void symtable_params(struct symtable *, node *);
505static void symtable_params_fplist(struct symtable *, node *n);
506static void symtable_global(struct symtable *, node *);
507static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000508static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000509static void symtable_list_comprehension(struct symtable *, node *);
510
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000511static int symtable_update_free_vars(struct symtable *);
512static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
513static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
514
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000515/* helper */
516static void
517do_pad(int pad)
518{
519 int i;
520 for (i = 0; i < pad; ++i)
521 fprintf(stderr, " ");
522}
523
524static void
525dump(node *n, int pad, int depth)
526{
527 int i;
528 if (depth == 0)
529 return;
530 do_pad(pad);
531 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
532 if (depth > 0)
533 depth--;
534 for (i = 0; i < NCH(n); ++i)
535 dump(CHILD(n, i), pad + 1, depth);
536}
537
538#define DUMP(N) dump(N, 0, -1)
539
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000540static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000541com_init(struct compiling *c, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000542{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000543 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000544 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
545 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000546 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000547 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000548 goto fail;
549 if ((c->c_const_dict = PyDict_New()) == NULL)
550 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000551 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000552 goto fail;
553 if ((c->c_name_dict = PyDict_New()) == NULL)
554 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000555 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000556 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000557 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
558 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000559 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000560 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000561 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000562 c->c_freevars = NULL;
563 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000564 c->c_nlocals = 0;
565 c->c_argcount = 0;
566 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000567 c->c_nexti = 0;
568 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000569 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000570 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000571 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000572 c->c_begin = 0;
573 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000574 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000575 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000576 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000577 c->c_stacklevel = 0;
578 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000579 c->c_firstlineno = 0;
580 c->c_last_addr = 0;
581 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000582 c->c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000583 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000584 c->c_nested = 0;
585 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000586 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000587 return 1;
588
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000589 fail:
590 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000591 return 0;
592}
593
594static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000595com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000596{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000597 Py_XDECREF(c->c_code);
598 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000599 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000600 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000601 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000602 Py_XDECREF(c->c_globals);
603 Py_XDECREF(c->c_locals);
604 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000605 Py_XDECREF(c->c_freevars);
606 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000607 Py_XDECREF(c->c_lnotab);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000608}
609
610static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000611com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000612{
613 c->c_stacklevel += n;
614 if (c->c_stacklevel > c->c_maxstacklevel)
615 c->c_maxstacklevel = c->c_stacklevel;
616}
617
618static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000619com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000620{
621 if (c->c_stacklevel < n) {
Guido van Rossum90f827c1998-08-25 18:22:17 +0000622 /* fprintf(stderr,
Guido van Rossum8b993a91997-01-17 21:04:03 +0000623 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
624 c->c_filename, c->c_lineno,
Guido van Rossum90f827c1998-08-25 18:22:17 +0000625 c->c_nexti, c->c_stacklevel, n); */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000626 c->c_stacklevel = 0;
627 }
628 else
629 c->c_stacklevel -= n;
630}
631
632static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000633com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000634{
635 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000636 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000637 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000638 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000639}
640
641static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000642com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000643{
644 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000645 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000646 assert(byte >= 0 && byte <= 255);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000647 if (byte < 0 || byte > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000648 com_error(c, PyExc_SystemError,
649 "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000650 }
651 if (c->c_code == NULL)
652 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000653 len = PyString_Size(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000654 if (c->c_nexti >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000655 if (_PyString_Resize(&c->c_code, len+1000) != 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000656 c->c_errors++;
657 return;
658 }
659 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000660 PyString_AsString(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000661}
662
663static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000664com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000665{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000666 com_addbyte(c, x & 0xff);
667 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000668}
669
670static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000671com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000672{
673 int size;
674 char *p;
675 if (c->c_lnotab == NULL)
676 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000677 size = PyString_Size(c->c_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000678 if (c->c_lnotab_next+2 > size) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000679 if (_PyString_Resize(&c->c_lnotab, size + 1000) < 0) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000680 c->c_errors++;
681 return;
682 }
683 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000684 p = PyString_AsString(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000685 *p++ = addr;
686 *p++ = line;
687 c->c_lnotab_next += 2;
688}
689
690static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000691com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000692{
693 c->c_lineno = lineno;
694 if (c->c_firstlineno == 0) {
695 c->c_firstlineno = c->c_last_line = lineno;
696 }
697 else {
698 int incr_addr = c->c_nexti - c->c_last_addr;
699 int incr_line = lineno - c->c_last_line;
700 while (incr_addr > 0 || incr_line > 0) {
701 int trunc_addr = incr_addr;
702 int trunc_line = incr_line;
703 if (trunc_addr > 255)
704 trunc_addr = 255;
705 if (trunc_line > 255)
706 trunc_line = 255;
707 com_add_lnotab(c, trunc_addr, trunc_line);
708 incr_addr -= trunc_addr;
709 incr_line -= trunc_line;
710 }
711 c->c_last_addr = c->c_nexti;
712 c->c_last_line = lineno;
713 }
714}
715
716static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000717com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000718{
Fred Drakeef8ace32000-08-24 00:32:09 +0000719 int extended_arg = arg >> 16;
Guido van Rossum8e793d91997-03-03 19:13:14 +0000720 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000721 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000722 if (Py_OptimizeFlag)
723 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000724 }
Fred Drakeef8ace32000-08-24 00:32:09 +0000725 if (extended_arg){
726 com_addbyte(c, EXTENDED_ARG);
727 com_addint(c, extended_arg);
728 arg &= 0xffff;
729 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000730 com_addbyte(c, op);
731 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000732}
733
734static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000735com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000736{
737 /* Compile a forward reference for backpatching */
738 int here;
739 int anchor;
740 com_addbyte(c, op);
741 here = c->c_nexti;
742 anchor = *p_anchor;
743 *p_anchor = here;
744 com_addint(c, anchor == 0 ? 0 : here - anchor);
745}
746
747static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000748com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000749{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000750 unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000751 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000752 int dist;
753 int prev;
754 for (;;) {
755 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000756 prev = code[anchor] + (code[anchor+1] << 8);
757 dist = target - (anchor+2);
758 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +0000759 dist >>= 8;
760 code[anchor+1] = dist;
761 dist >>= 8;
762 if (dist) {
763 com_error(c, PyExc_SystemError,
764 "com_backpatch: offset too large");
765 break;
766 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000767 if (!prev)
768 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000769 anchor -= prev;
770 }
771}
772
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000773/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000774
775static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000776com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000777{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000778 PyObject *w, *t, *np=NULL;
779 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000780
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000781 t = Py_BuildValue("(OO)", v, v->ob_type);
782 if (t == NULL)
783 goto fail;
784 w = PyDict_GetItem(dict, t);
785 if (w != NULL) {
786 n = PyInt_AsLong(w);
787 } else {
788 n = PyList_Size(list);
789 np = PyInt_FromLong(n);
790 if (np == NULL)
791 goto fail;
792 if (PyList_Append(list, v) != 0)
793 goto fail;
794 if (PyDict_SetItem(dict, t, np) != 0)
795 goto fail;
796 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000797 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000798 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000799 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000800 fail:
801 Py_XDECREF(np);
802 Py_XDECREF(t);
803 c->c_errors++;
804 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000805}
806
807static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000808com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000809{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000810 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000811}
812
813static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000814com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000815{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000816 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000817}
818
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000819static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000820mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000821{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000822 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000823 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +0000824 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000825 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
826 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000827 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000828 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000829 return 0; /* Don't mangle __extremely_long_names */
830 if (name[nlen-1] == '_' && name[nlen-2] == '_')
831 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000832 /* Strip leading underscores from class name */
833 while (*p == '_')
834 p++;
835 if (*p == '\0')
836 return 0; /* Don't mangle if class is just underscores */
837 plen = strlen(p);
838 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000839 plen = maxlen-nlen-2; /* Truncate class name if too long */
840 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000841 buffer[0] = '_';
842 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000843 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000844 return 1;
845}
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000846
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000847static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000848com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000849{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000850 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000851 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000852 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000853
854 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000855 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000856 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000857 c->c_errors++;
858 i = 255;
859 }
860 else {
861 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000862 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000863 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000864 com_addoparg(c, op, i);
865}
866
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000867#define NAME_LOCAL 0
868#define NAME_GLOBAL 1
869#define NAME_DEFAULT 2
870#define NAME_CLOSURE 3
871
872static int
873com_lookup_arg(PyObject *dict, PyObject *name)
874{
875 PyObject *v = PyDict_GetItem(dict, name);
876 if (v == NULL)
877 return -1;
878 else
879 return PyInt_AS_LONG(v);
880}
881
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000882static void
883com_addop_varname(struct compiling *c, int kind, char *name)
884{
885 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000886 int i, reftype;
887 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000888 int op = STOP_CODE;
889 char buffer[MANGLE_LEN];
890
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000891 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000892 name = buffer;
893 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
894 c->c_errors++;
895 i = 255;
896 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000897 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000898
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000899 reftype = get_ref_type(c, name);
900 switch (reftype) {
901 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000902 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000903 scope = NAME_LOCAL;
904 break;
905 case GLOBAL_EXPLICIT:
906 scope = NAME_GLOBAL;
907 break;
908 case GLOBAL_IMPLICIT:
909 if (c->c_flags & CO_OPTIMIZED)
910 scope = NAME_GLOBAL;
911 break;
912 case FREE:
913 case CELL:
914 scope = NAME_CLOSURE;
915 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000916 }
917
918 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000919 if (scope == NAME_LOCAL)
920 i = com_lookup_arg(c->c_locals, v);
921 else if (reftype == FREE)
922 i = com_lookup_arg(c->c_freevars, v);
923 else if (reftype == CELL)
924 i = com_lookup_arg(c->c_cellvars, v);
925 if (i == -1) {
926 c->c_errors++; /* XXX no exception set */
927 i = 255;
928 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000929 }
930 Py_DECREF(v);
931
932 switch (kind) {
933 case VAR_LOAD:
934 switch (scope) {
935 case NAME_LOCAL:
936 op = LOAD_FAST;
937 break;
938 case NAME_GLOBAL:
939 op = LOAD_GLOBAL;
940 break;
941 case NAME_DEFAULT:
942 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000943 break;
944 case NAME_CLOSURE:
945 op = LOAD_DEREF;
946 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000947 }
948 break;
949 case VAR_STORE:
950 switch (scope) {
951 case NAME_LOCAL:
952 op = STORE_FAST;
953 break;
954 case NAME_GLOBAL:
955 op = STORE_GLOBAL;
956 break;
957 case NAME_DEFAULT:
958 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000959 break;
960 case NAME_CLOSURE:
961 op = STORE_DEREF;
962 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000963 }
964 break;
965 case VAR_DELETE:
966 switch (scope) {
967 case NAME_LOCAL:
968 op = DELETE_FAST;
969 break;
970 case NAME_GLOBAL:
971 op = DELETE_GLOBAL;
972 break;
973 case NAME_DEFAULT:
974 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000975 break;
976 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000977 char buf[500];
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000978 sprintf(buf, DEL_CLOSURE_ERROR, name);
979 com_error(c, PyExc_SyntaxError, buf);
980 i = 255;
981 break;
982 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000983 }
984 break;
985 }
986done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000987 com_addoparg(c, op, i);
988}
989
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000990static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000991com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000992{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000993 char *name;
994 char buffer[1000];
995 /* XXX it is possible to write this code without the 1000
996 chars on the total length of dotted names, I just can't be
997 bothered right now */
998 if (TYPE(n) == STAR)
999 name = "*";
1000 else if (TYPE(n) == dotted_name) {
1001 char *p = buffer;
1002 int i;
1003 name = buffer;
1004 for (i = 0; i < NCH(n); i += 2) {
1005 char *s = STR(CHILD(n, i));
1006 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001007 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001008 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001009 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001010 break;
1011 }
1012 if (p != buffer)
1013 *p++ = '.';
1014 strcpy(p, s);
1015 p = strchr(p, '\0');
1016 }
1017 }
1018 else {
1019 REQ(n, NAME);
1020 name = STR(n);
1021 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001022 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001023}
1024
Guido van Rossum79f25d91997-04-29 20:08:16 +00001025static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001026parsenumber(struct compiling *co, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001027{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001028 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001029 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001030 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001031#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +00001032 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +00001033 int imflag;
1034#endif
1035
Guido van Rossum282914b1991-04-04 10:42:56 +00001036 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001037 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001038#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001039 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001040#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001041 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001042 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001043 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001044 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001045 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001046 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001047 if (*end == '\0') {
1048 if (errno != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001049 com_error(co, PyExc_OverflowError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001050 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +00001051 return NULL;
1052 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001053 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001054 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001055 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001056#ifndef WITHOUT_COMPLEX
1057 if (imflag) {
1058 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001059 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +00001060 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001061 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001062 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +00001063 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001064 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001065#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001066 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001067 PyFPE_START_PROTECT("atof", return 0)
1068 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001069 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001070 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001071 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001072}
1073
Guido van Rossum79f25d91997-04-29 20:08:16 +00001074static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001075parsestr(char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001076{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001077 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001078 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001079 char *buf;
1080 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001081 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001082 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001083 int first = *s;
1084 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001085 int rawmode = 0;
1086 int unicode = 0;
1087 if (isalpha(quote) || quote == '_') {
1088 if (quote == 'u' || quote == 'U') {
1089 quote = *++s;
1090 unicode = 1;
1091 }
1092 if (quote == 'r' || quote == 'R') {
1093 quote = *++s;
1094 rawmode = 1;
1095 }
1096 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001097 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001098 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001099 return NULL;
1100 }
1101 s++;
1102 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001103 if (len > INT_MAX) {
1104 PyErr_SetString(PyExc_OverflowError, "string to parse is too long");
1105 return NULL;
1106 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001107 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001108 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001109 return NULL;
1110 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001111 if (len >= 4 && s[0] == quote && s[1] == quote) {
1112 s += 2;
1113 len -= 2;
1114 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001115 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001116 return NULL;
1117 }
1118 }
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001119 if (unicode || Py_UnicodeFlag) {
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001120 if (rawmode)
1121 return PyUnicode_DecodeRawUnicodeEscape(
1122 s, len, NULL);
1123 else
1124 return PyUnicode_DecodeUnicodeEscape(
1125 s, len, NULL);
1126 }
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001127 if (rawmode || strchr(s, '\\') == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001128 return PyString_FromStringAndSize(s, len);
1129 v = PyString_FromStringAndSize((char *)NULL, len);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001130 if (v == NULL)
1131 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001132 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001133 end = s + len;
1134 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001135 if (*s != '\\') {
1136 *p++ = *s++;
1137 continue;
1138 }
1139 s++;
1140 switch (*s++) {
1141 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001142 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001143 case '\\': *p++ = '\\'; break;
1144 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +00001145 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001146 case 'b': *p++ = '\b'; break;
1147 case 'f': *p++ = '\014'; break; /* FF */
1148 case 't': *p++ = '\t'; break;
1149 case 'n': *p++ = '\n'; break;
1150 case 'r': *p++ = '\r'; break;
1151 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001152 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
1153 case '0': case '1': case '2': case '3':
1154 case '4': case '5': case '6': case '7':
1155 c = s[-1] - '0';
1156 if ('0' <= *s && *s <= '7') {
1157 c = (c<<3) + *s++ - '0';
1158 if ('0' <= *s && *s <= '7')
1159 c = (c<<3) + *s++ - '0';
1160 }
1161 *p++ = c;
1162 break;
1163 case 'x':
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001164 if (isxdigit(Py_CHARMASK(s[0])) && isxdigit(Py_CHARMASK(s[1]))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +00001165 unsigned int x = 0;
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001166 c = Py_CHARMASK(*s);
1167 s++;
1168 if (isdigit(c))
1169 x = c - '0';
1170 else if (islower(c))
1171 x = 10 + c - 'a';
1172 else
1173 x = 10 + c - 'A';
1174 x = x << 4;
1175 c = Py_CHARMASK(*s);
1176 s++;
1177 if (isdigit(c))
1178 x += c - '0';
1179 else if (islower(c))
1180 x += 10 + c - 'a';
1181 else
1182 x += 10 + c - 'A';
Guido van Rossumed1100f1997-10-20 23:24:07 +00001183 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001184 break;
1185 }
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001186 PyErr_SetString(PyExc_ValueError, "invalid \\x escape");
1187 Py_DECREF(v);
1188 return NULL;
1189 default:
1190 *p++ = '\\';
1191 *p++ = s[-1];
1192 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001193 }
1194 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001195 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001196 return v;
1197}
1198
Guido van Rossum79f25d91997-04-29 20:08:16 +00001199static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001200parsestrplus(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001201{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001202 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001203 int i;
1204 REQ(CHILD(n, 0), STRING);
1205 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
1206 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001207 for (i = 1; i < NCH(n); i++) {
1208 PyObject *s;
1209 s = parsestr(STR(CHILD(n, i)));
1210 if (s == NULL)
1211 goto onError;
1212 if (PyString_Check(v) && PyString_Check(s)) {
1213 PyString_ConcatAndDel(&v, s);
1214 if (v == NULL)
1215 goto onError;
1216 }
1217 else {
1218 PyObject *temp;
1219 temp = PyUnicode_Concat(v, s);
1220 Py_DECREF(s);
1221 if (temp == NULL)
1222 goto onError;
1223 Py_DECREF(v);
1224 v = temp;
1225 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001226 }
1227 }
1228 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001229
1230 onError:
1231 Py_XDECREF(v);
1232 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001233}
1234
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001235static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001236com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001237{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001238 PyObject *v;
1239 int anchor = 0;
1240 int save_begin = c->c_begin;
1241
1242 /* list_iter: for v in expr [list_iter] */
1243 com_node(c, CHILD(n, 3)); /* expr */
1244 v = PyInt_FromLong(0L);
1245 if (v == NULL)
1246 c->c_errors++;
1247 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
1248 com_push(c, 1);
1249 Py_XDECREF(v);
1250 c->c_begin = c->c_nexti;
1251 com_addoparg(c, SET_LINENO, n->n_lineno);
1252 com_addfwref(c, FOR_LOOP, &anchor);
1253 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001254 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001255 c->c_loops++;
1256 com_list_iter(c, n, e, t);
1257 c->c_loops--;
1258 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1259 c->c_begin = save_begin;
1260 com_backpatch(c, anchor);
1261 com_pop(c, 2); /* FOR_LOOP has popped these */
1262}
1263
1264static void
1265com_list_if(struct compiling *c, node *n, node *e, char *t)
1266{
1267 int anchor = 0;
1268 int a = 0;
1269 /* list_iter: 'if' test [list_iter] */
1270 com_addoparg(c, SET_LINENO, n->n_lineno);
1271 com_node(c, CHILD(n, 1));
1272 com_addfwref(c, JUMP_IF_FALSE, &a);
1273 com_addbyte(c, POP_TOP);
1274 com_pop(c, 1);
1275 com_list_iter(c, n, e, t);
1276 com_addfwref(c, JUMP_FORWARD, &anchor);
1277 com_backpatch(c, a);
1278 /* We jump here with an extra entry which we now pop */
1279 com_addbyte(c, POP_TOP);
1280 com_backpatch(c, anchor);
1281}
1282
1283static void
1284com_list_iter(struct compiling *c,
1285 node *p, /* parent of list_iter node */
1286 node *e, /* element expression node */
1287 char *t /* name of result list temp local */)
1288{
1289 /* list_iter is the last child in a listmaker, list_for, or list_if */
1290 node *n = CHILD(p, NCH(p)-1);
1291 if (TYPE(n) == list_iter) {
1292 n = CHILD(n, 0);
1293 switch (TYPE(n)) {
1294 case list_for:
1295 com_list_for(c, n, e, t);
1296 break;
1297 case list_if:
1298 com_list_if(c, n, e, t);
1299 break;
1300 default:
1301 com_error(c, PyExc_SystemError,
1302 "invalid list_iter node type");
1303 }
1304 }
1305 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001306 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001307 com_push(c, 1);
1308 com_node(c, e);
1309 com_addoparg(c, CALL_FUNCTION, 1);
1310 com_addbyte(c, POP_TOP);
1311 com_pop(c, 2);
1312 }
1313}
1314
1315static void
1316com_list_comprehension(struct compiling *c, node *n)
1317{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001318 /* listmaker: test list_for */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001319 char tmpname[12];
Tim Peters30814212001-02-17 05:30:26 +00001320 sprintf(tmpname, "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001321 com_addoparg(c, BUILD_LIST, 0);
1322 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1323 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001324 com_addop_name(c, LOAD_ATTR, "append");
1325 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001326 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001327 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001328 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001329 --c->c_tmpname;
1330}
1331
1332static void
1333com_listmaker(struct compiling *c, node *n)
1334{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001335 /* listmaker: test ( list_for | (',' test)* [','] ) */
1336 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001337 com_list_comprehension(c, n);
1338 else {
1339 int len = 0;
1340 int i;
1341 for (i = 0; i < NCH(n); i += 2, len++)
1342 com_node(c, CHILD(n, i));
1343 com_addoparg(c, BUILD_LIST, len);
1344 com_pop(c, len-1);
1345 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001346}
1347
1348static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001349com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001350{
1351 int i;
1352 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1353 for (i = 0; i+2 < NCH(n); i += 4) {
1354 /* We must arrange things just right for STORE_SUBSCR.
1355 It wants the stack to look like (value) (dict) (key) */
1356 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001357 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001358 com_node(c, CHILD(n, i+2)); /* value */
1359 com_addbyte(c, ROT_TWO);
1360 com_node(c, CHILD(n, i)); /* key */
1361 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001362 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001363 }
1364}
1365
1366static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001367com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001368{
1369 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001370 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001371 int i;
1372 REQ(n, atom);
1373 ch = CHILD(n, 0);
1374 switch (TYPE(ch)) {
1375 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001376 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001377 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001378 com_push(c, 1);
1379 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001380 else
1381 com_node(c, CHILD(n, 1));
1382 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001383 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001384 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001385 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001386 com_push(c, 1);
1387 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001388 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001389 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001390 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001391 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001392 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001393 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001394 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001395 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001396 break;
1397 case BACKQUOTE:
1398 com_node(c, CHILD(n, 1));
1399 com_addbyte(c, UNARY_CONVERT);
1400 break;
1401 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001402 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001403 i = 255;
1404 }
1405 else {
1406 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001407 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001408 }
1409 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001410 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001411 break;
1412 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001413 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001414 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001415 c->c_errors++;
1416 i = 255;
1417 }
1418 else {
1419 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001420 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001421 }
1422 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001423 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001424 break;
1425 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001426 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001427 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001428 break;
1429 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001430 com_error(c, PyExc_SystemError,
1431 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001432 }
1433}
1434
1435static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001436com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001437{
1438 if (NCH(n) == 1) {
1439 com_addbyte(c, op);
1440 }
1441 else if (NCH(n) == 2) {
1442 if (TYPE(CHILD(n, 0)) != COLON) {
1443 com_node(c, CHILD(n, 0));
1444 com_addbyte(c, op+1);
1445 }
1446 else {
1447 com_node(c, CHILD(n, 1));
1448 com_addbyte(c, op+2);
1449 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001450 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001451 }
1452 else {
1453 com_node(c, CHILD(n, 0));
1454 com_node(c, CHILD(n, 2));
1455 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001456 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001457 }
1458}
1459
Guido van Rossum635abd21997-01-06 22:56:52 +00001460static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001461com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1462{
1463 if (NCH(n) == 1) {
1464 com_addbyte(c, DUP_TOP);
1465 com_push(c, 1);
1466 com_addbyte(c, SLICE);
1467 com_node(c, augn);
1468 com_addbyte(c, opcode);
1469 com_pop(c, 1);
1470 com_addbyte(c, ROT_TWO);
1471 com_addbyte(c, STORE_SLICE);
1472 com_pop(c, 2);
1473 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1474 com_node(c, CHILD(n, 0));
1475 com_addoparg(c, DUP_TOPX, 2);
1476 com_push(c, 2);
1477 com_addbyte(c, SLICE+1);
1478 com_pop(c, 1);
1479 com_node(c, augn);
1480 com_addbyte(c, opcode);
1481 com_pop(c, 1);
1482 com_addbyte(c, ROT_THREE);
1483 com_addbyte(c, STORE_SLICE+1);
1484 com_pop(c, 3);
1485 } else if (NCH(n) == 2) {
1486 com_node(c, CHILD(n, 1));
1487 com_addoparg(c, DUP_TOPX, 2);
1488 com_push(c, 2);
1489 com_addbyte(c, SLICE+2);
1490 com_pop(c, 1);
1491 com_node(c, augn);
1492 com_addbyte(c, opcode);
1493 com_pop(c, 1);
1494 com_addbyte(c, ROT_THREE);
1495 com_addbyte(c, STORE_SLICE+2);
1496 com_pop(c, 3);
1497 } else {
1498 com_node(c, CHILD(n, 0));
1499 com_node(c, CHILD(n, 2));
1500 com_addoparg(c, DUP_TOPX, 3);
1501 com_push(c, 3);
1502 com_addbyte(c, SLICE+3);
1503 com_pop(c, 2);
1504 com_node(c, augn);
1505 com_addbyte(c, opcode);
1506 com_pop(c, 1);
1507 com_addbyte(c, ROT_FOUR);
1508 com_addbyte(c, STORE_SLICE+3);
1509 com_pop(c, 4);
1510 }
1511}
1512
1513static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001514com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001515{
1516 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001517 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001518 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001519 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001520 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001521 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001522 }
1523 else {
1524 com_node(c, CHILD(n, 0));
1525 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001526 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001527 }
1528 m = n;
1529 do {
1530 m = CHILD(m, 0);
1531 } while (NCH(m) == 1);
1532 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00001533 /* f(lambda x: x[0] = 3) ends up getting parsed with
1534 * LHS test = lambda x: x[0], and RHS test = 3.
1535 * SF bug 132313 points out that complaining about a keyword
1536 * then is very confusing.
1537 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001538 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00001539 TYPE(m) == lambdef ?
1540 "lambda cannot contain assignment" :
1541 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001542 }
1543 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001544 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001545 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001546 *pkeywords = PyDict_New();
Guido van Rossum635abd21997-01-06 22:56:52 +00001547 if (v == NULL || *pkeywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001548 c->c_errors++;
1549 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001550 if (PyDict_GetItem(*pkeywords, v) != NULL)
1551 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001552 "duplicate keyword argument");
1553 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001554 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001555 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001556 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001557 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001558 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001559 }
1560 }
1561 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001562}
1563
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001564static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001565com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001566{
1567 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001568 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001569 }
1570 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001571 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001572 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001573 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001574 int star_flag = 0;
1575 int starstar_flag = 0;
1576 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001577 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001578 na = 0;
1579 nk = 0;
1580 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001581 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001582 if (TYPE(ch) == STAR ||
1583 TYPE(ch) == DOUBLESTAR)
1584 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001585 if (ch->n_lineno != lineno) {
1586 lineno = ch->n_lineno;
1587 com_addoparg(c, SET_LINENO, lineno);
1588 }
1589 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001590 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001591 na++;
1592 else
1593 nk++;
1594 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001595 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001596 while (i < NCH(n)) {
1597 node *tok = CHILD(n, i);
1598 node *ch = CHILD(n, i+1);
1599 i += 3;
1600 switch (TYPE(tok)) {
1601 case STAR: star_flag = 1; break;
1602 case DOUBLESTAR: starstar_flag = 1; break;
1603 }
1604 com_node(c, ch);
1605 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001606 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001607 com_error(c, PyExc_SyntaxError,
1608 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001609 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001610 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001611 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001612 star_flag + (starstar_flag << 1);
1613 else
1614 opcode = CALL_FUNCTION;
1615 com_addoparg(c, opcode, na | (nk << 8));
1616 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001617 }
1618}
1619
1620static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001621com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001622{
1623 com_addopname(c, LOAD_ATTR, n);
1624}
1625
1626static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001627com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001628{
1629 int i=0;
1630 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001631 node *ch;
1632
1633 /* first argument */
1634 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001635 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001636 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001637 i++;
1638 }
1639 else {
1640 com_node(c, CHILD(n,i));
1641 i++;
1642 REQ(CHILD(n,i),COLON);
1643 i++;
1644 }
1645 /* second argument */
1646 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1647 com_node(c, CHILD(n,i));
1648 i++;
1649 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001650 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001651 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001652 com_push(c, 1);
1653 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001654 /* remaining arguments */
1655 for (; i < NCH(n); i++) {
1656 ns++;
1657 ch=CHILD(n,i);
1658 REQ(ch, sliceop);
1659 if (NCH(ch) == 1) {
1660 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001661 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001662 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001663 }
1664 else
1665 com_node(c, CHILD(ch,1));
1666 }
1667 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001668 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001669}
1670
1671static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001672com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001673{
1674 node *ch;
1675 REQ(n, subscript);
1676 ch = CHILD(n,0);
1677 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001678 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001679 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001680 com_push(c, 1);
1681 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001682 else {
1683 /* check for slice */
1684 if ((TYPE(ch) == COLON || NCH(n) > 1))
1685 com_sliceobj(c, n);
1686 else {
1687 REQ(ch, test);
1688 com_node(c, ch);
1689 }
1690 }
1691}
1692
1693static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001694com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001695{
1696 int i, op;
1697 REQ(n, subscriptlist);
1698 /* Check to make backward compatible slice behavior for '[i:j]' */
1699 if (NCH(n) == 1) {
1700 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001701 /* 'Basic' slice, should have exactly one colon. */
1702 if ((TYPE(CHILD(sub, 0)) == COLON
1703 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1704 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1705 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001706 switch (assigning) {
1707 case OP_DELETE:
1708 op = DELETE_SLICE;
1709 break;
1710 case OP_ASSIGN:
1711 op = STORE_SLICE;
1712 break;
1713 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001714 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001715 break;
1716 default:
1717 com_augassign_slice(c, sub, assigning, augn);
1718 return;
1719 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001720 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001721 if (op == STORE_SLICE)
1722 com_pop(c, 2);
1723 else if (op == DELETE_SLICE)
1724 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001725 return;
1726 }
1727 }
1728 /* Else normal subscriptlist. Compile each subscript. */
1729 for (i = 0; i < NCH(n); i += 2)
1730 com_subscript(c, CHILD(n, i));
1731 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001732 if (NCH(n) > 1) {
1733 i = (NCH(n)+1) / 2;
1734 com_addoparg(c, BUILD_TUPLE, i);
1735 com_pop(c, i-1);
1736 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001737 switch (assigning) {
1738 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001739 op = DELETE_SUBSCR;
1740 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00001741 break;
1742 default:
1743 case OP_ASSIGN:
1744 op = STORE_SUBSCR;
1745 i = 3;
1746 break;
1747 case OP_APPLY:
1748 op = BINARY_SUBSCR;
1749 i = 1;
1750 break;
1751 }
1752 if (assigning > OP_APPLY) {
1753 com_addoparg(c, DUP_TOPX, 2);
1754 com_push(c, 2);
1755 com_addbyte(c, BINARY_SUBSCR);
1756 com_pop(c, 1);
1757 com_node(c, augn);
1758 com_addbyte(c, assigning);
1759 com_pop(c, 1);
1760 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001761 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001762 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001763 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001764}
1765
1766static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001767com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001768{
1769 REQ(n, trailer);
1770 switch (TYPE(CHILD(n, 0))) {
1771 case LPAR:
1772 com_call_function(c, CHILD(n, 1));
1773 break;
1774 case DOT:
1775 com_select_member(c, CHILD(n, 1));
1776 break;
1777 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00001778 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001779 break;
1780 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001781 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001782 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001783 }
1784}
1785
1786static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001787com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001788{
1789 int i;
1790 REQ(n, power);
1791 com_atom(c, CHILD(n, 0));
1792 for (i = 1; i < NCH(n); i++) {
1793 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1794 com_factor(c, CHILD(n, i+1));
1795 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001796 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001797 break;
1798 }
1799 else
1800 com_apply_trailer(c, CHILD(n, i));
1801 }
1802}
1803
1804static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001805com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001806{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001807 REQ(n, factor);
1808 if (TYPE(CHILD(n, 0)) == PLUS) {
1809 com_factor(c, CHILD(n, 1));
1810 com_addbyte(c, UNARY_POSITIVE);
1811 }
1812 else if (TYPE(CHILD(n, 0)) == MINUS) {
1813 com_factor(c, CHILD(n, 1));
1814 com_addbyte(c, UNARY_NEGATIVE);
1815 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001816 else if (TYPE(CHILD(n, 0)) == TILDE) {
1817 com_factor(c, CHILD(n, 1));
1818 com_addbyte(c, UNARY_INVERT);
1819 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001820 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001821 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001822 }
1823}
1824
1825static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001826com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001827{
1828 int i;
1829 int op;
1830 REQ(n, term);
1831 com_factor(c, CHILD(n, 0));
1832 for (i = 2; i < NCH(n); i += 2) {
1833 com_factor(c, CHILD(n, i));
1834 switch (TYPE(CHILD(n, i-1))) {
1835 case STAR:
1836 op = BINARY_MULTIPLY;
1837 break;
1838 case SLASH:
1839 op = BINARY_DIVIDE;
1840 break;
1841 case PERCENT:
1842 op = BINARY_MODULO;
1843 break;
1844 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001845 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001846 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001847 op = 255;
1848 }
1849 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001850 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001851 }
1852}
1853
1854static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001855com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001856{
1857 int i;
1858 int op;
1859 REQ(n, arith_expr);
1860 com_term(c, CHILD(n, 0));
1861 for (i = 2; i < NCH(n); i += 2) {
1862 com_term(c, CHILD(n, i));
1863 switch (TYPE(CHILD(n, i-1))) {
1864 case PLUS:
1865 op = BINARY_ADD;
1866 break;
1867 case MINUS:
1868 op = BINARY_SUBTRACT;
1869 break;
1870 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001871 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001872 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001873 op = 255;
1874 }
1875 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001876 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001877 }
1878}
1879
1880static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001881com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001882{
1883 int i;
1884 int op;
1885 REQ(n, shift_expr);
1886 com_arith_expr(c, CHILD(n, 0));
1887 for (i = 2; i < NCH(n); i += 2) {
1888 com_arith_expr(c, CHILD(n, i));
1889 switch (TYPE(CHILD(n, i-1))) {
1890 case LEFTSHIFT:
1891 op = BINARY_LSHIFT;
1892 break;
1893 case RIGHTSHIFT:
1894 op = BINARY_RSHIFT;
1895 break;
1896 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001897 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001898 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001899 op = 255;
1900 }
1901 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001902 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001903 }
1904}
1905
1906static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001907com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001908{
1909 int i;
1910 int op;
1911 REQ(n, and_expr);
1912 com_shift_expr(c, CHILD(n, 0));
1913 for (i = 2; i < NCH(n); i += 2) {
1914 com_shift_expr(c, CHILD(n, i));
1915 if (TYPE(CHILD(n, i-1)) == AMPER) {
1916 op = BINARY_AND;
1917 }
1918 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001919 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001920 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001921 op = 255;
1922 }
1923 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001924 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001925 }
1926}
1927
1928static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001929com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001930{
1931 int i;
1932 int op;
1933 REQ(n, xor_expr);
1934 com_and_expr(c, CHILD(n, 0));
1935 for (i = 2; i < NCH(n); i += 2) {
1936 com_and_expr(c, CHILD(n, i));
1937 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1938 op = BINARY_XOR;
1939 }
1940 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001941 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001942 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001943 op = 255;
1944 }
1945 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001946 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001947 }
1948}
1949
1950static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001951com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001952{
1953 int i;
1954 int op;
1955 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001956 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001957 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001958 com_xor_expr(c, CHILD(n, i));
1959 if (TYPE(CHILD(n, i-1)) == VBAR) {
1960 op = BINARY_OR;
1961 }
1962 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001963 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001964 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001965 op = 255;
1966 }
1967 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001968 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001969 }
1970}
1971
1972static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001973cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001974{
1975 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001976 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001977 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1978 if (NCH(n) == 1) {
1979 n = CHILD(n, 0);
1980 switch (TYPE(n)) {
1981 case LESS: return LT;
1982 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001983 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001984 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001985 case LESSEQUAL: return LE;
1986 case GREATEREQUAL: return GE;
1987 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001988 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1989 if (strcmp(STR(n), "is") == 0) return IS;
1990 }
1991 }
1992 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001993 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001994 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1995 return NOT_IN;
1996 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1997 return IS_NOT;
1998 }
1999 }
2000 return BAD;
2001}
2002
2003static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002004com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002005{
2006 int i;
2007 enum cmp_op op;
2008 int anchor;
2009 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2010 com_expr(c, CHILD(n, 0));
2011 if (NCH(n) == 1)
2012 return;
2013
2014 /****************************************************************
2015 The following code is generated for all but the last
2016 comparison in a chain:
2017
2018 label: on stack: opcode: jump to:
2019
2020 a <code to load b>
2021 a, b DUP_TOP
2022 a, b, b ROT_THREE
2023 b, a, b COMPARE_OP
2024 b, 0-or-1 JUMP_IF_FALSE L1
2025 b, 1 POP_TOP
2026 b
2027
2028 We are now ready to repeat this sequence for the next
2029 comparison in the chain.
2030
2031 For the last we generate:
2032
2033 b <code to load c>
2034 b, c COMPARE_OP
2035 0-or-1
2036
2037 If there were any jumps to L1 (i.e., there was more than one
2038 comparison), we generate:
2039
2040 0-or-1 JUMP_FORWARD L2
2041 L1: b, 0 ROT_TWO
2042 0, b POP_TOP
2043 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002044 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002045 ****************************************************************/
2046
2047 anchor = 0;
2048
2049 for (i = 2; i < NCH(n); i += 2) {
2050 com_expr(c, CHILD(n, i));
2051 if (i+2 < NCH(n)) {
2052 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002053 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002054 com_addbyte(c, ROT_THREE);
2055 }
2056 op = cmp_type(CHILD(n, i-1));
2057 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002058 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002059 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002060 }
2061 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002062 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002063 if (i+2 < NCH(n)) {
2064 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2065 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002066 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002067 }
2068 }
2069
2070 if (anchor) {
2071 int anchor2 = 0;
2072 com_addfwref(c, JUMP_FORWARD, &anchor2);
2073 com_backpatch(c, anchor);
2074 com_addbyte(c, ROT_TWO);
2075 com_addbyte(c, POP_TOP);
2076 com_backpatch(c, anchor2);
2077 }
2078}
2079
2080static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002081com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002082{
2083 REQ(n, not_test); /* 'not' not_test | comparison */
2084 if (NCH(n) == 1) {
2085 com_comparison(c, CHILD(n, 0));
2086 }
2087 else {
2088 com_not_test(c, CHILD(n, 1));
2089 com_addbyte(c, UNARY_NOT);
2090 }
2091}
2092
2093static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002094com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002095{
2096 int i;
2097 int anchor;
2098 REQ(n, and_test); /* not_test ('and' not_test)* */
2099 anchor = 0;
2100 i = 0;
2101 for (;;) {
2102 com_not_test(c, CHILD(n, i));
2103 if ((i += 2) >= NCH(n))
2104 break;
2105 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2106 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002107 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002108 }
2109 if (anchor)
2110 com_backpatch(c, anchor);
2111}
2112
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002113static int
2114com_make_closure(struct compiling *c, PyCodeObject *co)
2115{
2116 int i, free = PyTuple_GET_SIZE(co->co_freevars);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002117 /* If the code is compiled with st->st_nested_scopes == 0,
2118 then no variable will ever be added to co_freevars.
2119 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002120 if (free == 0)
2121 return 0;
2122 for (i = 0; i < free; ++i) {
2123 /* Bypass com_addop_varname because it will generate
2124 LOAD_DEREF but LOAD_CLOSURE is needed.
2125 */
2126 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2127 int arg, reftype;
2128
2129 /* Special case: If a class contains a method with a
2130 free variable that has the same name as a method,
2131 the name will be considered free *and* local in the
2132 class. It should be handled by the closure, as
2133 well as by the normal name loookup logic.
2134 */
2135 reftype = get_ref_type(c, PyString_AS_STRING(name));
2136 if (reftype == CELL)
2137 arg = com_lookup_arg(c->c_cellvars, name);
2138 else /* (reftype == FREE) */
2139 arg = com_lookup_arg(c->c_freevars, name);
2140 if (arg == -1) {
2141 fprintf(stderr, "lookup %s in %s %d %d\n",
Jeremy Hylton483638c2001-02-01 20:20:45 +00002142 PyObject_REPR(name), c->c_name, reftype, arg);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002143 Py_FatalError("com_make_closure()");
2144 }
2145 com_addoparg(c, LOAD_CLOSURE, arg);
2146
2147 }
2148 com_push(c, free);
2149 return 1;
2150}
2151
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002152static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002153com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002154{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002155 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002156 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002157 PyObject *co;
2158 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002159 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002160 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2161 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002162 co = (PyObject *) icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002163 if (co == NULL) {
2164 c->c_errors++;
2165 return;
2166 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002167 symtable_exit_scope(c->c_symtable);
Tim Peters1e542112001-02-23 22:23:53 +00002168 i = com_addconst(c, co);
2169 closure = com_make_closure(c, (PyCodeObject *)co);
2170 Py_DECREF(co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002171 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002172 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002173 if (closure)
2174 com_addoparg(c, MAKE_CLOSURE, ndefs);
2175 else
2176 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002177 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002178 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002179 else {
2180 int anchor = 0;
2181 int i = 0;
2182 for (;;) {
2183 com_and_test(c, CHILD(n, i));
2184 if ((i += 2) >= NCH(n))
2185 break;
2186 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2187 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002188 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002189 }
2190 if (anchor)
2191 com_backpatch(c, anchor);
2192 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002193}
2194
2195static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002196com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002197{
2198 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002199 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002200 com_node(c, CHILD(n, 0));
2201 }
2202 else {
2203 int i;
2204 int len;
2205 len = (NCH(n) + 1) / 2;
2206 for (i = 0; i < NCH(n); i += 2)
2207 com_node(c, CHILD(n, i));
2208 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002209 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002210 }
2211}
2212
2213
2214/* Begin of assignment compilation */
2215
Thomas Wouters434d0822000-08-24 20:11:32 +00002216
2217static void
2218com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2219{
2220 com_addbyte(c, DUP_TOP);
2221 com_push(c, 1);
2222 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002223 com_node(c, augn);
2224 com_addbyte(c, opcode);
2225 com_pop(c, 1);
2226 com_addbyte(c, ROT_TWO);
2227 com_addopname(c, STORE_ATTR, n);
2228 com_pop(c, 2);
2229}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002230
2231static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002232com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002233{
2234 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002235 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002236}
2237
2238static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002239com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002240{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002241 REQ(n, trailer);
2242 switch (TYPE(CHILD(n, 0))) {
2243 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002244 com_error(c, PyExc_SyntaxError,
2245 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002246 break;
2247 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002248 if (assigning > OP_APPLY)
2249 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2250 else
2251 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002252 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002253 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002254 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002255 break;
2256 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002257 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002258 }
2259}
2260
2261static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002262com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002263{
2264 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002265 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002266 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002267 if (assigning) {
2268 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002269 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002270 com_push(c, i-1);
2271 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002272 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002273 com_assign(c, CHILD(n, i), assigning, NULL);
2274}
2275
2276static void
2277com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2278{
2279 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002280 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002281 com_push(c, 1);
2282 com_node(c, augn);
2283 com_addbyte(c, opcode);
2284 com_pop(c, 1);
2285 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002286}
2287
2288static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002289com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002290{
2291 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002292 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002293 if (assigning)
2294 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002295}
2296
2297static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002298com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002299{
2300 /* Loop to avoid trivial recursion */
2301 for (;;) {
2302 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002303
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002304 case exprlist:
2305 case testlist:
2306 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002307 if (assigning > OP_APPLY) {
2308 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002309 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002310 return;
2311 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002312 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002313 return;
2314 }
2315 n = CHILD(n, 0);
2316 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002317
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002318 case test:
2319 case and_test:
2320 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002321 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002322 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002323 case xor_expr:
2324 case and_expr:
2325 case shift_expr:
2326 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002327 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002328 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002329 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002330 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002331 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002332 return;
2333 }
2334 n = CHILD(n, 0);
2335 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002336
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002337 case power: /* atom trailer* ('**' power)*
2338 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002339 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002340 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002341 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002342 return;
2343 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002344 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002345 int i;
2346 com_node(c, CHILD(n, 0));
2347 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002348 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002349 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002350 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002351 return;
2352 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002353 com_apply_trailer(c, CHILD(n, i));
2354 } /* NB i is still alive */
2355 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002356 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002357 return;
2358 }
2359 n = CHILD(n, 0);
2360 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002361
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002362 case atom:
2363 switch (TYPE(CHILD(n, 0))) {
2364 case LPAR:
2365 n = CHILD(n, 1);
2366 if (TYPE(n) == RPAR) {
2367 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002368 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002369 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002370 return;
2371 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002372 if (assigning > OP_APPLY) {
2373 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002374 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002375 return;
2376 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002377 break;
2378 case LSQB:
2379 n = CHILD(n, 1);
2380 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002381 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002382 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002383 return;
2384 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002385 if (assigning > OP_APPLY) {
2386 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002387 "augmented assign to list not possible");
2388 return;
2389 }
2390 if (NCH(n) > 1
2391 && TYPE(CHILD(n, 1)) == list_for) {
2392 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002393 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002394 return;
2395 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002396 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002397 return;
2398 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002399 if (assigning > OP_APPLY)
2400 com_augassign_name(c, CHILD(n, 0),
2401 assigning, augn);
2402 else
2403 com_assign_name(c, CHILD(n, 0),
2404 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002405 return;
2406 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002407 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002408 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002409 return;
2410 }
2411 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002412
2413 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002414 com_error(c, PyExc_SyntaxError,
2415 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002416 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002417
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002418 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002419 com_error(c, PyExc_SystemError,
2420 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002421 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002422
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002423 }
2424 }
2425}
Guido van Rossum7c531111997-03-11 18:42:21 +00002426
Thomas Wouters434d0822000-08-24 20:11:32 +00002427static void
2428com_augassign(struct compiling *c, node *n)
2429{
2430 int opcode;
2431
2432 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2433 case '+': opcode = INPLACE_ADD; break;
2434 case '-': opcode = INPLACE_SUBTRACT; break;
2435 case '/': opcode = INPLACE_DIVIDE; break;
2436 case '%': opcode = INPLACE_MODULO; break;
2437 case '<': opcode = INPLACE_LSHIFT; break;
2438 case '>': opcode = INPLACE_RSHIFT; break;
2439 case '&': opcode = INPLACE_AND; break;
2440 case '^': opcode = INPLACE_XOR; break;
2441 case '|': opcode = INPLACE_OR; break;
2442 case '*':
2443 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2444 opcode = INPLACE_POWER;
2445 else
2446 opcode = INPLACE_MULTIPLY;
2447 break;
2448 default:
2449 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2450 return;
2451 }
2452 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2453}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002454
2455static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002456com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002457{
Thomas Wouters434d0822000-08-24 20:11:32 +00002458 REQ(n, expr_stmt);
2459 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002460 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002461 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002462 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002463 if (NCH(n) == 1) {
2464 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002465 if (c->c_interactive)
2466 com_addbyte(c, PRINT_EXPR);
2467 else
2468 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002469 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002470 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002471 else if (TYPE(CHILD(n,1)) == augassign)
2472 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002473 else {
2474 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002475 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002476 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002477 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002478 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002479 com_push(c, 1);
2480 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002481 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002482 }
2483 }
2484}
2485
2486static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002487com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002488{
2489 int a = 0, b = 0;
2490 int i;
2491 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2492 /* Generate code like for
2493
2494 if __debug__:
2495 if not <test>:
2496 raise AssertionError [, <message>]
2497
2498 where <message> is the second test, if present.
2499 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002500
Guido van Rossum228d7f31997-04-02 05:24:36 +00002501 if (Py_OptimizeFlag)
2502 return;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002503 com_addop_name(c, LOAD_GLOBAL, "__debug__");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002504 com_push(c, 1);
2505 com_addfwref(c, JUMP_IF_FALSE, &a);
2506 com_addbyte(c, POP_TOP);
2507 com_pop(c, 1);
2508 com_node(c, CHILD(n, 1));
2509 com_addfwref(c, JUMP_IF_TRUE, &b);
2510 com_addbyte(c, POP_TOP);
2511 com_pop(c, 1);
2512 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002513 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002514 com_push(c, 1);
2515 i = NCH(n)/2; /* Either 2 or 4 */
2516 if (i > 1)
2517 com_node(c, CHILD(n, 3));
2518 com_addoparg(c, RAISE_VARARGS, i);
2519 com_pop(c, i);
2520 /* The interpreter does not fall through */
2521 /* All jumps converge here */
2522 com_backpatch(c, a);
2523 com_backpatch(c, b);
2524 com_addbyte(c, POP_TOP);
2525}
2526
2527static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002528com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002529{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002530 int i = 1;
2531 node* stream = NULL;
2532
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002533 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002534
2535 /* are we using the extended print form? */
2536 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2537 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002538 com_node(c, stream);
2539 /* stack: [...] => [... stream] */
2540 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002541 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2542 i = 4;
2543 else
2544 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002545 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002546 for (; i < NCH(n); i += 2) {
2547 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002548 com_addbyte(c, DUP_TOP);
2549 /* stack: [stream] => [stream stream] */
2550 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002551 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002552 /* stack: [stream stream] => [stream stream obj] */
2553 com_addbyte(c, ROT_TWO);
2554 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002555 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002556 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002557 com_pop(c, 2);
2558 }
2559 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002560 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002561 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002562 com_addbyte(c, PRINT_ITEM);
2563 com_pop(c, 1);
2564 }
2565 }
2566 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002567 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002568 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002569 /* must pop the extra stream object off the stack */
2570 com_addbyte(c, POP_TOP);
2571 /* stack: [... stream] => [...] */
2572 com_pop(c, 1);
2573 }
2574 }
2575 else {
2576 if (stream != NULL) {
2577 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002578 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002579 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002580 com_pop(c, 1);
2581 }
2582 else
2583 com_addbyte(c, PRINT_NEWLINE);
2584 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002585}
2586
2587static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002588com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002589{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002590 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002591 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002592 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002593 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002594 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002595 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002596 com_push(c, 1);
2597 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002598 else
2599 com_node(c, CHILD(n, 1));
2600 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002601 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002602}
2603
2604static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002605com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002606{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002607 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002608 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2609 if (NCH(n) > 1) {
2610 com_node(c, CHILD(n, 1));
2611 if (NCH(n) > 3) {
2612 com_node(c, CHILD(n, 3));
2613 if (NCH(n) > 5)
2614 com_node(c, CHILD(n, 5));
2615 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002616 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002617 i = NCH(n)/2;
2618 com_addoparg(c, RAISE_VARARGS, i);
2619 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002620}
2621
2622static void
Thomas Wouters52152252000-08-17 22:55:00 +00002623com_from_import(struct compiling *c, node *n)
2624{
2625 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2626 com_push(c, 1);
2627 if (NCH(n) > 1) {
2628 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2629 com_error(c, PyExc_SyntaxError, "invalid syntax");
2630 return;
2631 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002632 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002633 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002634 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00002635 com_pop(c, 1);
2636}
2637
2638static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002639com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002640{
2641 int i;
2642 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002643 /* 'import' dotted_name (',' dotted_name)* |
2644 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002645 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00002646 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002647 /* 'from' dotted_name 'import' ... */
2648 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002649
2650 if (TYPE(CHILD(n, 3)) == STAR) {
2651 tup = Py_BuildValue("(s)", "*");
2652 } else {
2653 tup = PyTuple_New((NCH(n) - 2)/2);
2654 for (i = 3; i < NCH(n); i += 2) {
2655 PyTuple_SET_ITEM(tup, (i-3)/2,
2656 PyString_FromString(STR(
2657 CHILD(CHILD(n, i), 0))));
2658 }
2659 }
2660 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00002661 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002662 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002663 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00002664 if (TYPE(CHILD(n, 3)) == STAR)
2665 com_addbyte(c, IMPORT_STAR);
2666 else {
2667 for (i = 3; i < NCH(n); i += 2)
2668 com_from_import(c, CHILD(n, i));
2669 com_addbyte(c, POP_TOP);
2670 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002671 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002672 }
2673 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002674 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002675 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00002676 node *subn = CHILD(n, i);
2677 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002678 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002679 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002680 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00002681 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00002682 int j;
2683 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00002684 com_error(c, PyExc_SyntaxError,
2685 "invalid syntax");
2686 return;
2687 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00002688 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
2689 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002690 CHILD(CHILD(subn, 0),
2691 j));
2692 com_addop_varname(c, VAR_STORE,
2693 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002694 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002695 com_addop_varname(c, VAR_STORE,
2696 STR(CHILD(CHILD(subn, 0),
2697 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002698 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002699 }
2700 }
2701}
2702
2703static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002704com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002705{
2706 REQ(n, exec_stmt);
2707 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2708 com_node(c, CHILD(n, 1));
2709 if (NCH(n) >= 4)
2710 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002711 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002712 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002713 com_push(c, 1);
2714 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002715 if (NCH(n) >= 6)
2716 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002717 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002718 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002719 com_push(c, 1);
2720 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002721 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002722 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002723}
2724
Guido van Rossum7c531111997-03-11 18:42:21 +00002725static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002726is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002727{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002728 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002729 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002730 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00002731
2732 /* Label to avoid tail recursion */
2733 next:
2734 switch (TYPE(n)) {
2735
2736 case suite:
2737 if (NCH(n) == 1) {
2738 n = CHILD(n, 0);
2739 goto next;
2740 }
2741 /* Fall through */
2742 case file_input:
2743 for (i = 0; i < NCH(n); i++) {
2744 node *ch = CHILD(n, i);
2745 if (TYPE(ch) == stmt) {
2746 n = ch;
2747 goto next;
2748 }
2749 }
2750 break;
2751
2752 case stmt:
2753 case simple_stmt:
2754 case small_stmt:
2755 n = CHILD(n, 0);
2756 goto next;
2757
2758 case expr_stmt:
2759 case testlist:
2760 case test:
2761 case and_test:
2762 case not_test:
2763 case comparison:
2764 case expr:
2765 case xor_expr:
2766 case and_expr:
2767 case shift_expr:
2768 case arith_expr:
2769 case term:
2770 case factor:
2771 case power:
2772 case atom:
2773 if (NCH(n) == 1) {
2774 n = CHILD(n, 0);
2775 goto next;
2776 }
2777 break;
2778
2779 case NAME:
2780 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2781 return 1;
2782 break;
2783
2784 case NUMBER:
2785 v = parsenumber(c, STR(n));
2786 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002787 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002788 break;
2789 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002790 i = PyObject_IsTrue(v);
2791 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002792 return i == 0;
2793
2794 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002795 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002796 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002797 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002798 break;
2799 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002800 i = PyObject_IsTrue(v);
2801 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002802 return i == 0;
2803
2804 }
2805 return 0;
2806}
2807
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002808static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002809com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002810{
2811 int i;
2812 int anchor = 0;
2813 REQ(n, if_stmt);
2814 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2815 for (i = 0; i+3 < NCH(n); i+=4) {
2816 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002817 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002818 if (is_constant_false(c, ch))
2819 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002820 if (i > 0)
2821 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002822 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002823 com_addfwref(c, JUMP_IF_FALSE, &a);
2824 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002825 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002826 com_node(c, CHILD(n, i+3));
2827 com_addfwref(c, JUMP_FORWARD, &anchor);
2828 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002829 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002830 com_addbyte(c, POP_TOP);
2831 }
2832 if (i+2 < NCH(n))
2833 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002834 if (anchor)
2835 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002836}
2837
2838static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002839com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002840{
2841 int break_anchor = 0;
2842 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002843 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002844 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2845 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002846 block_push(c, SETUP_LOOP);
2847 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002848 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002849 com_node(c, CHILD(n, 1));
2850 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2851 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002852 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002853 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002854 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002855 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002856 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2857 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002858 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002859 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002860 com_addbyte(c, POP_TOP);
2861 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002862 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002863 if (NCH(n) > 4)
2864 com_node(c, CHILD(n, 6));
2865 com_backpatch(c, break_anchor);
2866}
2867
2868static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002869com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002870{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002871 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002872 int break_anchor = 0;
2873 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002874 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002875 REQ(n, for_stmt);
2876 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2877 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002878 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002879 com_node(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002880 v = PyInt_FromLong(0L);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002881 if (v == NULL)
2882 c->c_errors++;
2883 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002884 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002885 Py_XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002886 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002887 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002888 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002889 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00002890 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002891 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002892 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002893 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002894 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2895 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002896 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002897 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002898 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002899 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002900 if (NCH(n) > 8)
2901 com_node(c, CHILD(n, 8));
2902 com_backpatch(c, break_anchor);
2903}
2904
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002905/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002906
2907 SETUP_FINALLY L
2908 <code for S>
2909 POP_BLOCK
2910 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002911 L: <code for Sf>
2912 END_FINALLY
2913
2914 The special instructions use the block stack. Each block
2915 stack entry contains the instruction that created it (here
2916 SETUP_FINALLY), the level of the value stack at the time the
2917 block stack entry was created, and a label (here L).
2918
2919 SETUP_FINALLY:
2920 Pushes the current value stack level and the label
2921 onto the block stack.
2922 POP_BLOCK:
2923 Pops en entry from the block stack, and pops the value
2924 stack until its level is the same as indicated on the
2925 block stack. (The label is ignored.)
2926 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002927 Pops a variable number of entries from the *value* stack
2928 and re-raises the exception they specify. The number of
2929 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002930
2931 The block stack is unwound when an exception is raised:
2932 when a SETUP_FINALLY entry is found, the exception is pushed
2933 onto the value stack (and the exception condition is cleared),
2934 and the interpreter jumps to the label gotten from the block
2935 stack.
2936
2937 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002938 (The contents of the value stack is shown in [], with the top
2939 at the right; 'tb' is trace-back info, 'val' the exception's
2940 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002941
2942 Value stack Label Instruction Argument
2943 [] SETUP_EXCEPT L1
2944 [] <code for S>
2945 [] POP_BLOCK
2946 [] JUMP_FORWARD L0
2947
Guido van Rossum3f5da241990-12-20 15:06:42 +00002948 [tb, val, exc] L1: DUP )
2949 [tb, val, exc, exc] <evaluate E1> )
2950 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2951 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2952 [tb, val, exc, 1] POP )
2953 [tb, val, exc] POP
2954 [tb, val] <assign to V1> (or POP if no V1)
2955 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002956 [] <code for S1>
2957 JUMP_FORWARD L0
2958
Guido van Rossum3f5da241990-12-20 15:06:42 +00002959 [tb, val, exc, 0] L2: POP
2960 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002961 .............................etc.......................
2962
Guido van Rossum3f5da241990-12-20 15:06:42 +00002963 [tb, val, exc, 0] Ln+1: POP
2964 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002965
2966 [] L0: <next statement>
2967
2968 Of course, parts are not generated if Vi or Ei is not present.
2969*/
2970
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002971static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002972com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002973{
2974 int except_anchor = 0;
2975 int end_anchor = 0;
2976 int else_anchor = 0;
2977 int i;
2978 node *ch;
2979
2980 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2981 block_push(c, SETUP_EXCEPT);
2982 com_node(c, CHILD(n, 2));
2983 com_addbyte(c, POP_BLOCK);
2984 block_pop(c, SETUP_EXCEPT);
2985 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2986 com_backpatch(c, except_anchor);
2987 for (i = 3;
2988 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2989 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002990 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002991 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002992 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002993 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002994 break;
2995 }
2996 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002997 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002998 com_addoparg(c, SET_LINENO, ch->n_lineno);
2999 if (NCH(ch) > 1) {
3000 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003001 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003002 com_node(c, CHILD(ch, 1));
3003 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003004 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003005 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3006 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003007 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003008 }
3009 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003010 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003011 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003012 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003013 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003014 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003015 com_pop(c, 1);
3016 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003017 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003018 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003019 com_node(c, CHILD(n, i+2));
3020 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3021 if (except_anchor) {
3022 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003023 /* We come in with [tb, val, exc, 0] on the
3024 stack; one pop and it's the same as
3025 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003026 com_addbyte(c, POP_TOP);
3027 }
3028 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003029 /* We actually come in here with [tb, val, exc] but the
3030 END_FINALLY will zap those and jump around.
3031 The c_stacklevel does not reflect them so we need not pop
3032 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003033 com_addbyte(c, END_FINALLY);
3034 com_backpatch(c, else_anchor);
3035 if (i < NCH(n))
3036 com_node(c, CHILD(n, i+2));
3037 com_backpatch(c, end_anchor);
3038}
3039
3040static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003041com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003042{
3043 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003044 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003045
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003046 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3047 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003048 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003049 com_addbyte(c, POP_BLOCK);
3050 block_pop(c, SETUP_FINALLY);
3051 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003052 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003053 /* While the generated code pushes only one item,
3054 the try-finally handling can enter here with
3055 up to three items. OK, here are the details:
3056 3 for an exception, 2 for RETURN, 1 for BREAK. */
3057 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003058 com_backpatch(c, finally_anchor);
3059 ch = CHILD(n, NCH(n)-1);
3060 com_addoparg(c, SET_LINENO, ch->n_lineno);
3061 com_node(c, ch);
3062 com_addbyte(c, END_FINALLY);
3063 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003064 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003065}
3066
3067static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003068com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003069{
3070 REQ(n, try_stmt);
3071 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3072 | 'try' ':' suite 'finally' ':' suite */
3073 if (TYPE(CHILD(n, 3)) != except_clause)
3074 com_try_finally(c, n);
3075 else
3076 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003077}
3078
Guido van Rossum8b993a91997-01-17 21:04:03 +00003079static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003080get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003081{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003082 int i;
3083
Guido van Rossum8b993a91997-01-17 21:04:03 +00003084 /* Label to avoid tail recursion */
3085 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003086 switch (TYPE(n)) {
3087
3088 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003089 if (NCH(n) == 1) {
3090 n = CHILD(n, 0);
3091 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003092 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003093 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003094 case file_input:
3095 for (i = 0; i < NCH(n); i++) {
3096 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003097 if (TYPE(ch) == stmt) {
3098 n = ch;
3099 goto next;
3100 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003101 }
3102 break;
3103
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003104 case stmt:
3105 case simple_stmt:
3106 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003107 n = CHILD(n, 0);
3108 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003109
3110 case expr_stmt:
3111 case testlist:
3112 case test:
3113 case and_test:
3114 case not_test:
3115 case comparison:
3116 case expr:
3117 case xor_expr:
3118 case and_expr:
3119 case shift_expr:
3120 case arith_expr:
3121 case term:
3122 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003123 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003124 if (NCH(n) == 1) {
3125 n = CHILD(n, 0);
3126 goto next;
3127 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003128 break;
3129
3130 case atom:
3131 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003132 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003133 break;
3134
3135 }
3136 return NULL;
3137}
3138
Guido van Rossum79f25d91997-04-29 20:08:16 +00003139static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003140get_docstring(node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003141{
Guido van Rossum541563e1999-01-28 15:08:09 +00003142 /* Don't generate doc-strings if run with -OO */
3143 if (Py_OptimizeFlag > 1)
3144 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003145 n = get_rawdocstring(n);
3146 if (n == NULL)
3147 return NULL;
3148 return parsestrplus(n);
3149}
3150
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003151static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003152com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003153{
3154 REQ(n, suite);
3155 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3156 if (NCH(n) == 1) {
3157 com_node(c, CHILD(n, 0));
3158 }
3159 else {
3160 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003161 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003162 node *ch = CHILD(n, i);
3163 if (TYPE(ch) == stmt)
3164 com_node(c, ch);
3165 }
3166 }
3167}
3168
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003169/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003170static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003171com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003172{
3173 int i = c->c_nblocks;
3174 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3175 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3176 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003177 else if (i <= 0) {
3178 /* at the outer level */
3179 com_error(c, PyExc_SyntaxError,
3180 "'continue' not properly in loop");
3181 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003182 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003183 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003184 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003185 if (c->c_block[j] == SETUP_LOOP)
3186 break;
3187 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003188 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003189 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003190 for (; i > j; --i) {
3191 if (c->c_block[i] == SETUP_EXCEPT ||
3192 c->c_block[i] == SETUP_FINALLY) {
3193 com_addoparg(c, CONTINUE_LOOP,
3194 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003195 return;
3196 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003197 if (c->c_block[i] == END_FINALLY) {
3198 com_error(c, PyExc_SyntaxError,
3199 "'continue' not supported inside 'finally' clause");
3200 return;
3201 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003202 }
3203 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003204 com_error(c, PyExc_SyntaxError,
3205 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003206 }
3207 /* XXX Could allow it inside a 'finally' clause
3208 XXX if we could pop the exception still on the stack */
3209}
3210
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003211static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003212com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003213{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003214 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003215 if (TYPE(n) == lambdef) {
3216 /* lambdef: 'lambda' [varargslist] ':' test */
3217 n = CHILD(n, 1);
3218 }
3219 else {
3220 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3221 n = CHILD(n, 2);
3222 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3223 n = CHILD(n, 1);
3224 }
3225 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003226 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003227 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003228 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003229 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3230 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003231 nargs = 0;
3232 ndefs = 0;
3233 for (i = 0; i < nch; i++) {
3234 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003235 if (TYPE(CHILD(n, i)) == STAR ||
3236 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003237 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003238 nargs++;
3239 i++;
3240 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003241 t = RPAR; /* Anything except EQUAL or COMMA */
3242 else
3243 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003244 if (t == EQUAL) {
3245 i++;
3246 ndefs++;
3247 com_node(c, CHILD(n, i));
3248 i++;
3249 if (i >= nch)
3250 break;
3251 t = TYPE(CHILD(n, i));
3252 }
3253 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003254 /* Treat "(a=1, b)" as an error */
3255 if (ndefs)
3256 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003257 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003258 }
3259 if (t != COMMA)
3260 break;
3261 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003262 return ndefs;
3263}
3264
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003265static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003266com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003267{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003268 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003269 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003270 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003271 ndefs = com_argdefs(c, n);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003272 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3273 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003274 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003275 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003276 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003277 c->c_errors++;
3278 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003279 int closure = com_make_closure(c, (PyCodeObject *)co);
3280 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003281 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003282 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003283 if (closure)
3284 com_addoparg(c, MAKE_CLOSURE, ndefs);
3285 else
3286 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003287 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003288 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003289 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003290 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003291 }
3292}
3293
3294static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003295com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003296{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003297 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003298 REQ(n, testlist);
3299 /* testlist: test (',' test)* [','] */
3300 for (i = 0; i < NCH(n); i += 2)
3301 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003302 i = (NCH(n)+1) / 2;
3303 com_addoparg(c, BUILD_TUPLE, i);
3304 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003305}
3306
3307static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003308com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003309{
Guido van Rossum25831651993-05-19 14:50:45 +00003310 int i;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003311 PyObject *co, *v;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003312 char *name;
3313
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003314 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003315 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003316 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003317 c->c_errors++;
3318 return;
3319 }
3320 /* Push the class name on the stack */
3321 i = com_addconst(c, v);
3322 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003323 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003324 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003325 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003326 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003327 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003328 com_push(c, 1);
3329 }
Guido van Rossum25831651993-05-19 14:50:45 +00003330 else
3331 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003332 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003333 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003334 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003335 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003336 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003337 c->c_errors++;
3338 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003339 int closure = com_make_closure(c, (PyCodeObject *)co);
3340 i = com_addconst(c, co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003341 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003342 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003343 if (closure)
3344 com_addoparg(c, MAKE_CLOSURE, 0);
3345 else
3346 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003347 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003348 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003349 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003350 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003351 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003352 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003353}
3354
3355static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003356com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003357{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003358 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003359 if (c->c_errors)
3360 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003361 switch (TYPE(n)) {
3362
3363 /* Definition nodes */
3364
3365 case funcdef:
3366 com_funcdef(c, n);
3367 break;
3368 case classdef:
3369 com_classdef(c, n);
3370 break;
3371
3372 /* Trivial parse tree nodes */
3373
3374 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003375 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003376 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003377 n = CHILD(n, 0);
3378 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003379
3380 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003381 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
3382 com_addoparg(c, SET_LINENO, n->n_lineno);
3383 {
3384 int i;
3385 for (i = 0; i < NCH(n)-1; i += 2)
3386 com_node(c, CHILD(n, i));
3387 }
3388 break;
3389
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003390 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003391 com_addoparg(c, SET_LINENO, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003392 n = CHILD(n, 0);
3393 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003394
3395 /* Statement nodes */
3396
3397 case expr_stmt:
3398 com_expr_stmt(c, n);
3399 break;
3400 case print_stmt:
3401 com_print_stmt(c, n);
3402 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003403 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003404 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003405 break;
3406 case pass_stmt:
3407 break;
3408 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003409 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003410 com_error(c, PyExc_SyntaxError,
3411 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003412 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003413 com_addbyte(c, BREAK_LOOP);
3414 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003415 case continue_stmt:
3416 com_continue_stmt(c, n);
3417 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003418 case return_stmt:
3419 com_return_stmt(c, n);
3420 break;
3421 case raise_stmt:
3422 com_raise_stmt(c, n);
3423 break;
3424 case import_stmt:
3425 com_import_stmt(c, n);
3426 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003427 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003428 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003429 case exec_stmt:
3430 com_exec_stmt(c, n);
3431 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003432 case assert_stmt:
3433 com_assert_stmt(c, n);
3434 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003435 case if_stmt:
3436 com_if_stmt(c, n);
3437 break;
3438 case while_stmt:
3439 com_while_stmt(c, n);
3440 break;
3441 case for_stmt:
3442 com_for_stmt(c, n);
3443 break;
3444 case try_stmt:
3445 com_try_stmt(c, n);
3446 break;
3447 case suite:
3448 com_suite(c, n);
3449 break;
3450
3451 /* Expression nodes */
3452
3453 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003454 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003455 break;
3456 case test:
3457 com_test(c, n);
3458 break;
3459 case and_test:
3460 com_and_test(c, n);
3461 break;
3462 case not_test:
3463 com_not_test(c, n);
3464 break;
3465 case comparison:
3466 com_comparison(c, n);
3467 break;
3468 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003469 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003470 break;
3471 case expr:
3472 com_expr(c, n);
3473 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003474 case xor_expr:
3475 com_xor_expr(c, n);
3476 break;
3477 case and_expr:
3478 com_and_expr(c, n);
3479 break;
3480 case shift_expr:
3481 com_shift_expr(c, n);
3482 break;
3483 case arith_expr:
3484 com_arith_expr(c, n);
3485 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003486 case term:
3487 com_term(c, n);
3488 break;
3489 case factor:
3490 com_factor(c, n);
3491 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003492 case power:
3493 com_power(c, n);
3494 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003495 case atom:
3496 com_atom(c, n);
3497 break;
3498
3499 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003500 com_error(c, PyExc_SystemError,
3501 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003502 }
3503}
3504
Tim Petersdbd9ba62000-07-09 03:09:57 +00003505static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003506
3507static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003508com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003509{
3510 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3511 if (TYPE(CHILD(n, 0)) == LPAR)
3512 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003513 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003514 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003515 com_pop(c, 1);
3516 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003517}
3518
3519static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003520com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003521{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003522 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003523 if (NCH(n) == 1) {
3524 com_fpdef(c, CHILD(n, 0));
3525 }
3526 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003527 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003528 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003529 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003530 for (i = 0; i < NCH(n); i += 2)
3531 com_fpdef(c, CHILD(n, i));
3532 }
3533}
3534
3535static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003536com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003537{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003538 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003539 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003540 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003541 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003542 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003543 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003544 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003545 /* Enter all arguments in table of locals */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003546 for (i = 0, narg = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003547 node *ch = CHILD(n, i);
3548 node *fp;
3549 char *name;
Guido van Rossum50564e81996-01-12 01:13:16 +00003550 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003551 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003552 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3553 fp = CHILD(ch, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003554 if (TYPE(fp) == NAME) {
3555 PyObject *v;
3556 name = STR(fp);
3557 v = PyDict_GetItemString(c->c_cellvars, name);
3558 if (v) {
3559 com_addoparg(c, LOAD_FAST, narg);
3560 com_addoparg(c, STORE_DEREF,
3561 PyInt_AS_LONG(v));
3562 }
3563 } else {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003564 name = nbuf;
3565 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003566 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003567 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003568 narg++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003569 /* all name updates handled by symtable */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003570 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003571 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003572 ch = CHILD(n, i);
3573 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003574 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003575 else
3576 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003577 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003578 /* Handle *arguments */
3579 if (i < nch) {
3580 node *ch;
3581 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003582 if (TYPE(ch) != DOUBLESTAR) {
3583 REQ(ch, STAR);
3584 ch = CHILD(n, i+1);
3585 if (TYPE(ch) == NAME) {
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003586 PyObject *v;
Guido van Rossum50564e81996-01-12 01:13:16 +00003587 i += 3;
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003588 v = PyDict_GetItemString(c->c_cellvars,
3589 STR(ch));
3590 if (v) {
3591 com_addoparg(c, LOAD_FAST, narg);
3592 com_addoparg(c, STORE_DEREF,
3593 PyInt_AS_LONG(v));
Guido van Rossum50564e81996-01-12 01:13:16 +00003594 }
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003595 narg++;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003596 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003597 }
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003598 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003599 /* Handle **keywords */
3600 if (i < nch) {
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003601 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003602 node *ch;
3603 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003604 if (TYPE(ch) != DOUBLESTAR) {
3605 REQ(ch, STAR);
3606 ch = CHILD(n, i+1);
3607 REQ(ch, STAR);
3608 ch = CHILD(n, i+2);
3609 }
3610 else
3611 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003612 REQ(ch, NAME);
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003613 v = PyDict_GetItemString(c->c_cellvars, STR(ch));
3614 if (v) {
3615 com_addoparg(c, LOAD_FAST, narg);
3616 com_addoparg(c, STORE_DEREF, PyInt_AS_LONG(v));
3617 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003618 }
3619 if (complex) {
3620 /* Generate code for complex arguments only after
3621 having counted the simple arguments */
3622 int ilocal = 0;
3623 for (i = 0; i < nch; i++) {
3624 node *ch = CHILD(n, i);
3625 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003626 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003627 break;
3628 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3629 fp = CHILD(ch, 0);
3630 if (TYPE(fp) != NAME) {
3631 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003632 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003633 com_fpdef(c, ch);
3634 }
3635 ilocal++;
3636 if (++i >= nch)
3637 break;
3638 ch = CHILD(n, i);
3639 if (TYPE(ch) == EQUAL)
3640 i += 2;
3641 else
3642 REQ(ch, COMMA);
3643 }
3644 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003645}
3646
3647static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003648com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003649{
3650 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003651 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003652 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003653 doc = get_docstring(n);
3654 if (doc != NULL) {
3655 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003656 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003657 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003658 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003659 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003660 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003661 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003662 for (i = 0; i < NCH(n); i++) {
3663 node *ch = CHILD(n, i);
3664 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3665 com_node(c, ch);
3666 }
3667}
3668
3669/* Top-level compile-node interface */
3670
3671static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003672compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003673{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003674 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003675 node *ch;
3676 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003677 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003678 doc = get_docstring(CHILD(n, 4));
3679 if (doc != NULL) {
3680 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003681 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003682 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003683 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003684 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003685 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3686 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003687 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003688 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003689 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003690 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003691 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003692 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003693 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003694 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003695 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003696}
3697
3698static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003699compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003700{
Guido van Rossum590baa41993-11-30 13:40:46 +00003701 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003702 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003703 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003704
3705 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003706 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003707 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003708 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003709 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003710 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003711 else
3712 ch = CHILD(n, 2);
3713 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003714 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003715 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003716}
3717
3718static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003719compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003720{
3721 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003722 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003723 REQ(n, classdef);
3724 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3725 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003726 c->c_private = c->c_name;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003727 ch = CHILD(n, NCH(n)-1); /* The suite */
3728 doc = get_docstring(ch);
3729 if (doc != NULL) {
3730 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003731 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003732 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003733 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003734 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003735 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003736 }
3737 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003738 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003739 com_node(c, ch);
3740 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003741 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003742 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003743 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003744}
3745
3746static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003747compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003748{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003749 com_addoparg(c, SET_LINENO, n->n_lineno);
3750
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003751 switch (TYPE(n)) {
3752
Guido van Rossum4c417781991-01-21 16:09:22 +00003753 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003754 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003755 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003756 n = CHILD(n, 0);
3757 if (TYPE(n) != NEWLINE)
3758 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003759 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003760 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003761 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003762 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003763 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003764 break;
3765
Guido van Rossum4c417781991-01-21 16:09:22 +00003766 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003767 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003768 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003769 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003770 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003771 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003772 break;
3773
Guido van Rossum590baa41993-11-30 13:40:46 +00003774 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003775 com_node(c, CHILD(n, 0));
3776 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003777 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003778 break;
3779
Guido van Rossum590baa41993-11-30 13:40:46 +00003780 case lambdef: /* anonymous function definition */
3781 compile_lambdef(c, n);
3782 break;
3783
Guido van Rossum4c417781991-01-21 16:09:22 +00003784 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003785 compile_funcdef(c, n);
3786 break;
3787
Guido van Rossum4c417781991-01-21 16:09:22 +00003788 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003789 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003790 break;
3791
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003792 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003793 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003794 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003795 }
3796}
3797
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003798static PyObject *
3799dict_keys_inorder(PyObject *dict, int offset)
3800{
3801 PyObject *tuple, *k, *v;
3802 int i, pos = 0, size = PyDict_Size(dict);
3803
3804 tuple = PyTuple_New(size);
3805 if (tuple == NULL)
3806 return NULL;
3807 while (PyDict_Next(dict, &pos, &k, &v)) {
3808 i = PyInt_AS_LONG(v);
3809 Py_INCREF(k);
3810 PyTuple_SET_ITEM(tuple, i - offset, k);
3811 }
3812 return tuple;
3813}
3814
Guido van Rossum79f25d91997-04-29 20:08:16 +00003815PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003816PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003817{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003818 return jcompile(n, filename, NULL);
3819}
3820
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003821struct symtable *
3822PyNode_CompileSymtable(node *n, char *filename)
3823{
3824 struct symtable *st;
3825
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003826 st = symtable_init();
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003827 if (st == NULL)
3828 return NULL;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00003829 assert(st->st_symbols != NULL);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003830 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
3831 if (st->st_errors > 0) {
3832 PySymtable_Free(st);
3833 return NULL;
3834 }
3835 symtable_node(st, n);
3836 if (st->st_errors > 0) {
3837 PySymtable_Free(st);
3838 return NULL;
3839 }
3840 return st;
3841}
3842
Guido van Rossum79f25d91997-04-29 20:08:16 +00003843static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003844icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003845{
3846 return jcompile(n, base->c_filename, base);
3847}
3848
Guido van Rossum79f25d91997-04-29 20:08:16 +00003849static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003850jcompile(node *n, char *filename, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003851{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003852 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003853 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003854 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003855 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003856 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003857 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003858 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003859 /* c_symtable still points to parent's symbols */
3860 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003861 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003862 sc.c_nested = 1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003863 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003864 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00003865 sc.c_future = PyNode_Future(n, filename);
3866 if (sc.c_future == NULL || symtable_build(&sc, n) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003867 com_free(&sc);
3868 return NULL;
3869 }
3870 }
3871 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003872 if (symtable_load_symbols(&sc) < 0) {
3873 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003874 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003875 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003876 compile_node(&sc, n);
3877 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00003878 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003879 PyObject *consts, *names, *varnames, *filename, *name,
3880 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003881 consts = PyList_AsTuple(sc.c_consts);
3882 names = PyList_AsTuple(sc.c_names);
3883 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003884 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
3885 freevars = dict_keys_inorder(sc.c_freevars,
3886 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003887 filename = PyString_InternFromString(sc.c_filename);
3888 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003889 if (!PyErr_Occurred())
3890 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003891 sc.c_nlocals,
3892 sc.c_maxstacklevel,
3893 sc.c_flags,
3894 sc.c_code,
3895 consts,
3896 names,
3897 varnames,
3898 freevars,
3899 cellvars,
3900 filename,
3901 name,
3902 sc.c_firstlineno,
3903 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003904 Py_XDECREF(consts);
3905 Py_XDECREF(names);
3906 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003907 Py_XDECREF(freevars);
3908 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003909 Py_XDECREF(filename);
3910 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003911 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00003912 else if (!PyErr_Occurred()) {
3913 /* This could happen if someone called PyErr_Clear() after an
3914 error was reported above. That's not supposed to happen,
3915 but I just plugged one case and I'm not sure there can't be
3916 others. In that case, raise SystemError so that at least
3917 it gets reported instead dumping core. */
3918 PyErr_SetString(PyExc_SystemError, "lost syntax error");
3919 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003920 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00003921 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003922 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00003923 sc.c_symtable = NULL;
3924 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003925 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003926 return co;
3927}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003928
3929int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003930PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003931{
3932 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003933 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003934 int line = co->co_firstlineno;
3935 int addr = 0;
3936 while (--size >= 0) {
3937 addr += *p++;
3938 if (addr > addrq)
3939 break;
3940 line += *p++;
3941 }
3942 return line;
3943}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003944
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003945/* The test for LOCAL must come before the test for FREE in order to
3946 handle classes where name is both local and free. The local var is
3947 a method and the free var is a free var referenced within a method.
3948*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003949
3950static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003951get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003952{
3953 PyObject *v;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00003954 if (c->c_symtable->st_nested_scopes) {
3955 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
3956 return CELL;
3957 if (PyDict_GetItemString(c->c_locals, name) != NULL)
3958 return LOCAL;
3959 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
3960 return FREE;
3961 v = PyDict_GetItemString(c->c_globals, name);
3962 if (v) {
3963 if (v == Py_None)
3964 return GLOBAL_EXPLICIT;
3965 else {
3966 return GLOBAL_IMPLICIT;
3967 }
3968 }
3969 } else {
3970 if (PyDict_GetItemString(c->c_locals, name) != NULL)
3971 return LOCAL;
3972 v = PyDict_GetItemString(c->c_globals, name);
3973 if (v) {
3974 if (v == Py_None)
3975 return GLOBAL_EXPLICIT;
3976 else {
3977 return GLOBAL_IMPLICIT;
3978 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003979 }
3980 }
3981 {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003982 char buf[350];
3983 sprintf(buf,
3984 "unknown scope for %.100s in %.100s(%s) in %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00003985 name, c->c_name,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003986 PyObject_REPR(c->c_symtable->st_cur->ste_id),
3987 c->c_filename);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003988 Py_FatalError(buf);
3989 }
3990 return -1; /* can't get here */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003991}
3992
3993static int
3994symtable_build(struct compiling *c, node *n)
3995{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003996 if ((c->c_symtable = symtable_init()) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003997 return -1;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00003998 if (c->c_future->ff_nested_scopes)
3999 c->c_symtable->st_nested_scopes = 1;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004000 c->c_symtable->st_filename = c->c_filename;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004001 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
4002 if (c->c_symtable->st_errors > 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004003 return -1;
4004 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004005 if (c->c_symtable->st_errors > 0)
4006 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004007 /* reset for second pass */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004008 c->c_symtable->st_nscopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004009 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004010 return 0;
4011}
4012
4013static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004014symtable_init_compiling_symbols(struct compiling *c)
4015{
4016 PyObject *varnames;
4017
4018 varnames = c->c_symtable->st_cur->ste_varnames;
4019 if (varnames == NULL) {
4020 varnames = PyList_New(0);
4021 if (varnames == NULL)
4022 return -1;
4023 c->c_symtable->st_cur->ste_varnames = varnames;
4024 Py_INCREF(varnames);
4025 } else
4026 Py_INCREF(varnames);
4027 c->c_varnames = varnames;
4028
4029 c->c_globals = PyDict_New();
4030 if (c->c_globals == NULL)
4031 return -1;
4032 c->c_freevars = PyDict_New();
4033 if (c->c_freevars == NULL)
4034 return -1;
4035 c->c_cellvars = PyDict_New();
4036 if (c->c_cellvars == NULL)
4037 return -1;
4038 return 0;
4039}
4040
4041struct symbol_info {
4042 int si_nlocals;
4043 int si_ncells;
4044 int si_nfrees;
4045 int si_nimplicit;
4046};
4047
4048static void
4049symtable_init_info(struct symbol_info *si)
4050{
4051 si->si_nlocals = 0;
4052 si->si_ncells = 0;
4053 si->si_nfrees = 0;
4054 si->si_nimplicit = 0;
4055}
4056
4057static int
4058symtable_resolve_free(struct compiling *c, PyObject *name,
4059 struct symbol_info *si)
4060{
4061 PyObject *dict, *v;
4062
4063 /* Seperate logic for DEF_FREE. If it occurs in a function,
4064 it indicates a local that we must allocate storage for (a
4065 cell var). If it occurs in a class, then the class has a
4066 method and a free variable with the same name.
4067 */
4068
4069 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
4070 v = PyInt_FromLong(si->si_ncells++);
4071 dict = c->c_cellvars;
4072 } else {
4073 v = PyInt_FromLong(si->si_nfrees++);
4074 dict = c->c_freevars;
4075 }
4076 if (v == NULL)
4077 return -1;
4078 if (PyDict_SetItem(dict, name, v) < 0) {
4079 Py_DECREF(v);
4080 return -1;
4081 }
4082 Py_DECREF(v);
4083 return 0;
4084}
4085
4086static int
4087symtable_freevar_offsets(PyObject *freevars, int offset)
4088{
4089 PyObject *name, *v;
4090 int pos;
4091
4092 /* The cell vars are the first elements of the closure,
4093 followed by the free vars. Update the offsets in
4094 c_freevars to account for number of cellvars. */
4095 pos = 0;
4096 while (PyDict_Next(freevars, &pos, &name, &v)) {
4097 int i = PyInt_AS_LONG(v) + offset;
4098 PyObject *o = PyInt_FromLong(i);
4099 if (o == NULL)
4100 return -1;
4101 if (PyDict_SetItem(freevars, name, o) < 0) {
4102 Py_DECREF(o);
4103 return -1;
4104 }
4105 Py_DECREF(o);
4106 }
4107 return 0;
4108}
4109
4110static int
4111symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4112 struct symbol_info *si)
4113{
4114 if (ste->ste_type != TYPE_MODULE)
4115 c->c_flags |= CO_NEWLOCALS;
4116 if (ste->ste_type == TYPE_FUNCTION) {
4117 c->c_nlocals = si->si_nlocals;
4118 if (ste->ste_optimized == 0)
4119 c->c_flags |= CO_OPTIMIZED;
4120 else if (si->si_ncells || si->si_nfrees
4121 || (ste->ste_nested && si->si_nimplicit)
4122 || ste->ste_child_free) {
4123 if (c->c_symtable->st_nested_scopes) {
4124 PyErr_Format(PyExc_SyntaxError,
4125 ILLEGAL_DYNAMIC_SCOPE,
4126 PyString_AS_STRING(ste->ste_name));
4127 set_error_location(c->c_symtable->st_filename,
4128 ste->ste_lineno);
4129 return -1;
4130 } else {
4131 char buf[200];
4132 sprintf(buf, ILLEGAL_DYNAMIC_SCOPE,
4133 PyString_AS_STRING(ste->ste_name));
4134 if (PyErr_Warn(PyExc_SyntaxWarning,
4135 buf) < 0) {
4136 return -1;
4137 }
4138 }
4139 }
4140 }
4141 return 0;
4142}
4143
4144static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004145symtable_load_symbols(struct compiling *c)
4146{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004147 static PyObject *implicit = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004148 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004149 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004150 PyObject *name, *varnames, *v;
4151 int i, flags, pos;
4152 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004153
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004154 if (implicit == NULL) {
4155 implicit = PyInt_FromLong(1);
4156 if (implicit == NULL)
4157 return -1;
4158 }
4159 v = NULL;
4160
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004161 if (symtable_init_compiling_symbols(c) < 0)
4162 goto fail;
4163 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004164 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004165 si.si_nlocals = PyList_GET_SIZE(varnames);
4166 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004167
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004168 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004169 v = PyInt_FromLong(i);
4170 if (PyDict_SetItem(c->c_locals,
4171 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004172 goto fail;
4173 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004174 }
4175
4176 /* XXX The cases below define the rules for whether a name is
4177 local or global. The logic could probably be clearer. */
4178 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004179 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4180 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004181
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004182 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004183 /* undo the original DEF_FREE */
4184 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004185
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004186 if ((flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004187 && (flags & (DEF_LOCAL | DEF_PARAM)))
4188 symtable_resolve_free(c, name, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004189
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004190 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004191 c->c_argcount--;
4192 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004193 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004194 c->c_argcount--;
4195 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004196 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004197 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004198 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004199 if (flags & DEF_PARAM) {
4200 PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004201 PyString_AS_STRING(name));
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004202 set_error_location(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004203 ste->ste_lineno);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004204 st->st_errors++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004205 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004206 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004207 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4208 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004209 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004210 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004211 if (PyDict_SetItem(c->c_globals, name, implicit) < 0)
4212 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004213 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004214 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004215 if (v == NULL)
4216 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004217 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004218 goto fail;
4219 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004220 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004221 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004222 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004223 } else if (is_free(flags)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004224 if (ste->ste_nested && st->st_nested_scopes) {
4225 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004226 if (v == NULL)
4227 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004228 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004229 goto fail;
4230 Py_DECREF(v);
4231 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004232 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004233 if (PyDict_SetItem(c->c_globals, name,
4234 implicit) < 0)
4235 goto fail;
4236 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004237 }
4238 }
4239
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004240 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4241 return -1;
4242 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004243 fail:
4244 /* is this always the right thing to do? */
4245 Py_XDECREF(v);
4246 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004247}
4248
4249static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004250symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004251{
4252 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004253
4254 st = (struct symtable *)PyMem_Malloc(sizeof(struct symtable));
4255 if (st == NULL)
4256 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004257 st->st_pass = 1;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004258 st->st_nested_scopes = NESTED_SCOPES_DEFAULT;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004259 st->st_filename = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004260 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004261 goto fail;
4262 if ((st->st_symbols = PyDict_New()) == NULL)
4263 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004264 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004265 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004266 st->st_errors = 0;
4267 st->st_tmpname = 0;
4268 st->st_private = NULL;
4269 return st;
4270 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004271 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004272 return NULL;
4273}
4274
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004275void
4276PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004277{
4278 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004279 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004280 Py_XDECREF(st->st_cur);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004281 PyMem_Free((void *)st);
4282}
4283
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004284/* When the compiler exits a scope, it must should update the scope's
4285 free variable information with the list of free variables in its
4286 children.
4287
4288 Variables that are free in children and defined in the current
4289 scope are cellvars.
4290
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004291 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004292 false), free variables in children that are not defined here are
4293 implicit globals.
4294
4295*/
4296
4297static int
4298symtable_update_free_vars(struct symtable *st)
4299{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004300 int i, j, def;
4301 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004302 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004303
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004304 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004305 def = DEF_FREE_CLASS;
4306 else
4307 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004308 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004309 int pos = 0;
4310
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004311 if (list)
4312 PyList_SetSlice(list, 0,
4313 ((PyVarObject*)list)->ob_size, 0);
Barry Warsaw0372af72001-02-23 18:22:59 +00004314 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004315 PyList_GET_ITEM(ste->ste_children, i);
4316 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004317 int v = PyInt_AS_LONG(o);
4318 if (!(is_free(v)))
4319 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004320 if (list == NULL) {
4321 list = PyList_New(0);
4322 if (list == NULL)
4323 return -1;
4324 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004325 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004326 if (PyList_Append(list, name) < 0) {
4327 Py_DECREF(list);
4328 return -1;
4329 }
4330 }
4331 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
4332 name = PyList_GET_ITEM(list, j);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004333 if (ste->ste_nested) {
4334 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004335 name, def) < 0) {
4336 Py_DECREF(list);
4337 return -1;
4338 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004339 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004340 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004341 name) < 0) {
4342 Py_DECREF(list);
4343 return -1;
4344 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004345 }
4346 }
4347 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004348
4349 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004350 return 0;
4351}
4352
4353/* If the current scope is a non-nested class or if name is not
4354 defined in the current, non-nested scope, then it is an implicit
4355 global in all nested scopes.
4356*/
4357
4358static int
4359symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
4360{
4361 PyObject *o;
4362 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004363 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004364
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004365 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004366 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004367 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004368 if (o == NULL)
4369 return symtable_undo_free(st, child, name);
4370 v = PyInt_AS_LONG(o);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004371 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004372 return symtable_undo_free(st, child, name);
4373 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004374 return symtable_add_def_o(st, ste->ste_symbols,
4375 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004376}
4377
4378static int
4379symtable_undo_free(struct symtable *st, PyObject *id,
4380 PyObject *name)
4381{
4382 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004383 PyObject *info;
4384 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004385
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004386 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
4387 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004388 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004389 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004390 if (info == NULL)
4391 return 0;
4392 v = PyInt_AS_LONG(info);
4393 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004394 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004395 DEF_FREE_GLOBAL) < 0)
4396 return -1;
4397 } else
4398 /* If the name is defined here or declared global,
4399 then the recursion stops. */
4400 return 0;
4401
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004402 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
4403 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00004404 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004405 PyList_GET_ITEM(ste->ste_children, i);
4406 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004407 if (x < 0)
4408 return x;
4409 }
4410 return 0;
4411}
4412
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004413/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
4414 This reference is released when the scope is exited, via the DECREF
4415 in symtable_exit_scope().
4416*/
4417
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004418static int
4419symtable_exit_scope(struct symtable *st)
4420{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004421 int end;
4422
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004423 if (st->st_pass == 1 && st->st_nested_scopes)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004424 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004425 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004426 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004427 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
4428 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004429 if (PySequence_DelItem(st->st_stack, end) < 0)
4430 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004431 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004432}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004433
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004434static void
4435symtable_enter_scope(struct symtable *st, char *name, int type,
4436 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004437{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004438 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004439
4440 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004441 prev = st->st_cur;
4442 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
4443 Py_DECREF(st->st_cur);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004444 st->st_errors++;
4445 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004446 }
4447 }
Barry Warsaw0372af72001-02-23 18:22:59 +00004448 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004449 PySymtableEntry_New(st, name, type, lineno);
4450 if (strcmp(name, TOP) == 0)
4451 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004452 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004453 if (PyList_Append(prev->ste_children,
4454 (PyObject *)st->st_cur) < 0)
4455 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004456 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004457}
4458
4459static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004460symtable_lookup(struct symtable *st, char *name)
4461{
4462 char buffer[MANGLE_LEN];
4463 PyObject *v;
4464 int flags;
4465
4466 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
4467 name = buffer;
4468 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
4469 if (v == NULL) {
4470 if (PyErr_Occurred())
4471 return -1;
4472 else
4473 return 0;
4474 }
4475
4476 flags = PyInt_AS_LONG(v);
4477 return flags;
4478}
4479
4480static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004481symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004482{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004483 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004484 char buffer[MANGLE_LEN];
4485
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004486 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004487 name = buffer;
4488 if ((s = PyString_InternFromString(name)) == NULL)
4489 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004490 return symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004491}
4492
4493/* Must only be called with mangled names */
4494
4495static int
4496symtable_add_def_o(struct symtable *st, PyObject *dict,
4497 PyObject *name, int flag)
4498{
4499 PyObject *o;
4500 int val;
4501
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004502 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004503 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004504 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004505 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00004506 PyString_AsString(name));
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004507 set_error_location(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004508 st->st_cur->ste_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004509 return -1;
4510 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004511 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004512 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004513 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004514 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004515 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004516 Py_DECREF(o);
4517 return -1;
4518 }
4519 Py_DECREF(o);
4520
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004521 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004522 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004523 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004524 } else if (flag & DEF_GLOBAL) {
4525 /* XXX need to update DEF_GLOBAL for other flags too;
4526 perhaps only DEF_FREE_GLOBAL */
4527 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004528 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004529 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004530 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004531 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004532 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004533 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004534 Py_DECREF(o);
4535 return -1;
4536 }
4537 Py_DECREF(o);
4538 }
4539 return 0;
4540}
4541
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004542#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004543
4544static void
4545symtable_node(struct symtable *st, node *n)
4546{
4547 int i, start = 0;
4548
4549 loop:
4550 switch (TYPE(n)) {
4551 case funcdef: {
4552 char *func_name = STR(CHILD(n, 1));
4553 symtable_add_def(st, func_name, DEF_LOCAL);
4554 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004555 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004556 symtable_funcdef(st, n);
4557 symtable_exit_scope(st);
4558 break;
4559 }
4560 case lambdef:
4561 if (NCH(n) == 4)
4562 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004563 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004564 symtable_funcdef(st, n);
4565 symtable_exit_scope(st);
4566 break;
4567 case classdef: {
4568 char *tmp, *class_name = STR(CHILD(n, 1));
4569 symtable_add_def(st, class_name, DEF_LOCAL);
4570 if (TYPE(CHILD(n, 2)) == LPAR) {
4571 node *bases = CHILD(n, 3);
4572 int i;
4573 for (i = 0; i < NCH(bases); i += 2) {
4574 symtable_node(st, CHILD(bases, i));
4575 }
4576 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004577 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004578 tmp = st->st_private;
4579 st->st_private = class_name;
4580 symtable_node(st, CHILD(n, NCH(n) - 1));
4581 st->st_private = tmp;
4582 symtable_exit_scope(st);
4583 break;
4584 }
4585 case if_stmt:
4586 for (i = 0; i + 3 < NCH(n); i += 4) {
4587 if (is_constant_false(NULL, (CHILD(n, i + 1))))
4588 continue;
4589 symtable_node(st, CHILD(n, i + 1));
4590 symtable_node(st, CHILD(n, i + 3));
4591 }
4592 if (i + 2 < NCH(n))
4593 symtable_node(st, CHILD(n, i + 2));
4594 break;
4595 case global_stmt:
4596 symtable_global(st, n);
4597 break;
4598 case import_stmt:
4599 symtable_import(st, n);
4600 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004601 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004602 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004603 symtable_node(st, CHILD(n, 1));
4604 if (NCH(n) > 2)
4605 symtable_node(st, CHILD(n, 3));
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004606 else
4607 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004608 if (NCH(n) > 4)
4609 symtable_node(st, CHILD(n, 5));
4610 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004611
4612 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00004613 case assert_stmt:
4614 if (Py_OptimizeFlag)
4615 return;
4616 if (NCH(n) == 2) {
4617 n = CHILD(n, 1);
4618 goto loop;
4619 } else {
4620 symtable_node(st, CHILD(n, 1));
4621 n = CHILD(n, 3);
4622 goto loop;
4623 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004624 case except_clause:
4625 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004626 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004627 if (NCH(n) > 1) {
4628 n = CHILD(n, 1);
4629 goto loop;
4630 }
4631 break;
4632 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004633 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004634 break;
4635 case expr_stmt:
4636 if (NCH(n) == 1)
4637 n = CHILD(n, 0);
4638 else {
4639 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004640 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004641 symtable_node(st, CHILD(n, 2));
4642 break;
4643 } else {
4644 int i;
4645 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004646 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004647 n = CHILD(n, NCH(n) - 1);
4648 }
4649 }
4650 goto loop;
4651 /* watchout for fall-through logic below */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004652 case argument:
4653 if (NCH(n) == 3) {
4654 n = CHILD(n, 2);
4655 goto loop;
4656 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004657 case listmaker:
4658 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
4659 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton5f827f42001-01-23 01:26:20 +00004660 n = CHILD(n, 0);
4661 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004662 }
4663 case atom:
4664 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
4665 symtable_add_use(st, STR(CHILD(n, 0)));
4666 break;
4667 }
4668 case for_stmt:
4669 if (TYPE(n) == for_stmt) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004670 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004671 start = 3;
4672 }
4673 default:
4674 if (NCH(n) == 1) {
4675 n = CHILD(n, 0);
4676 goto loop;
4677 }
4678 for (i = start; i < NCH(n); ++i)
4679 if (TYPE(CHILD(n, i)) >= single_input)
4680 symtable_node(st, CHILD(n, i));
4681 }
4682}
4683
4684static void
4685symtable_funcdef(struct symtable *st, node *n)
4686{
4687 node *body;
4688
4689 if (TYPE(n) == lambdef) {
4690 if (NCH(n) == 4)
4691 symtable_params(st, CHILD(n, 1));
4692 } else
4693 symtable_params(st, CHILD(n, 2));
4694 body = CHILD(n, NCH(n) - 1);
4695 symtable_node(st, body);
4696}
4697
4698/* The next two functions parse the argument tuple.
4699 symtable_default_arg() checks for names in the default arguments,
4700 which are references in the defining scope. symtable_params()
4701 parses the parameter names, which are defined in the function's
4702 body.
4703
4704 varargslist:
4705 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
4706 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
4707*/
4708
4709static void
4710symtable_default_args(struct symtable *st, node *n)
4711{
4712 node *c;
4713 int i;
4714
4715 if (TYPE(n) == parameters) {
4716 n = CHILD(n, 1);
4717 if (TYPE(n) == RPAR)
4718 return;
4719 }
4720 REQ(n, varargslist);
4721 for (i = 0; i < NCH(n); i += 2) {
4722 c = CHILD(n, i);
4723 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
4724 break;
4725 }
4726 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
4727 symtable_node(st, CHILD(n, i));
4728 }
4729}
4730
4731static void
4732symtable_params(struct symtable *st, node *n)
4733{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004734 int i, complex = -1, ext = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004735 node *c = NULL;
4736
4737 if (TYPE(n) == parameters) {
4738 n = CHILD(n, 1);
4739 if (TYPE(n) == RPAR)
4740 return;
4741 }
4742 REQ(n, varargslist);
4743 for (i = 0; i < NCH(n); i += 2) {
4744 c = CHILD(n, i);
4745 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
4746 ext = 1;
4747 break;
4748 }
4749 if (TYPE(c) == test) {
4750 continue;
4751 }
4752 if (TYPE(CHILD(c, 0)) == NAME)
4753 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
4754 else {
4755 char nbuf[10];
4756 sprintf(nbuf, ".%d", i);
4757 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004758 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004759 }
4760 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004761 if (ext) {
4762 c = CHILD(n, i);
4763 if (TYPE(c) == STAR) {
4764 i++;
4765 symtable_add_def(st, STR(CHILD(n, i)),
4766 DEF_PARAM | DEF_STAR);
4767 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00004768 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004769 c = NULL;
4770 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004771 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004772 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004773 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004774 i++;
4775 symtable_add_def(st, STR(CHILD(n, i)),
4776 DEF_PARAM | DEF_DOUBLESTAR);
4777 }
4778 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004779 if (complex >= 0) {
4780 int j;
4781 for (j = 0; j <= complex; j++) {
4782 c = CHILD(n, j);
4783 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00004784 c = CHILD(n, ++j);
4785 else if (TYPE(c) == EQUAL)
4786 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004787 if (TYPE(CHILD(c, 0)) == LPAR)
4788 symtable_params_fplist(st, CHILD(c, 1));
4789 }
4790 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004791}
4792
4793static void
4794symtable_params_fplist(struct symtable *st, node *n)
4795{
4796 int i;
4797 node *c;
4798
4799 REQ(n, fplist);
4800 for (i = 0; i < NCH(n); i += 2) {
4801 c = CHILD(n, i);
4802 REQ(c, fpdef);
4803 if (NCH(c) == 1)
4804 symtable_add_def(st, STR(CHILD(c, 0)),
4805 DEF_PARAM | DEF_INTUPLE);
4806 else
4807 symtable_params_fplist(st, CHILD(c, 1));
4808 }
4809
4810}
4811
4812static void
4813symtable_global(struct symtable *st, node *n)
4814{
4815 int i;
4816
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004817 for (i = 1; i < NCH(n); i += 2) {
4818 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00004819 int flags;
4820
4821 flags = symtable_lookup(st, name);
4822 if (flags && flags != DEF_GLOBAL) {
4823 char buf[500];
4824 if (flags & DEF_PARAM) {
4825 PyErr_Format(PyExc_SyntaxError,
4826 "name '%.400s' is local and global",
4827 PyString_AS_STRING(name));
4828 set_error_location(st->st_filename,
4829 st->st_cur->ste_lineno);
4830 st->st_errors++;
4831 return;
4832 } else if (flags & DEF_LOCAL) {
4833 sprintf(buf, GLOBAL_AFTER_ASSIGN, name);
4834 if (PyErr_Warn(PyExc_SyntaxWarning,
4835 buf) < 0) {
4836 /* XXX set line number? */
4837 st->st_errors++;
4838 }
4839 } else {
4840 sprintf(buf, GLOBAL_AFTER_USE, name);
4841 if (PyErr_Warn(PyExc_SyntaxWarning,
4842 buf) < 0) {
4843 /* XXX set line number? */
4844 st->st_errors++;
4845 }
4846 }
4847 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004848 symtable_add_def(st, name, DEF_GLOBAL);
4849 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004850}
4851
4852static void
4853symtable_list_comprehension(struct symtable *st, node *n)
4854{
4855 char tmpname[12];
4856
Tim Peters30814212001-02-17 05:30:26 +00004857 sprintf(tmpname, "_[%d]", ++st->st_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004858 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004859 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004860 symtable_node(st, CHILD(n, 3));
4861 if (NCH(n) == 5)
4862 symtable_node(st, CHILD(n, 4));
4863 --st->st_tmpname;
4864}
4865
4866static void
4867symtable_import(struct symtable *st, node *n)
4868{
4869 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004870 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004871 | 'from' dotted_name 'import'
4872 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00004873 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004874 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004875 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
4876 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004877 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004878 } else {
4879 for (i = 3; i < NCH(n); i += 2) {
4880 node *c = CHILD(n, i);
4881 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004882 symtable_assign(st, CHILD(c, 2),
4883 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004884 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004885 symtable_assign(st, CHILD(c, 0),
4886 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004887 }
4888 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004889 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004890 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004891 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004892 }
4893 }
4894}
4895
4896static void
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004897symtable_assign(struct symtable *st, node *n, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004898{
4899 node *tmp;
4900 int i;
4901
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004902 loop:
4903 switch (TYPE(n)) {
4904 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004905 /* invalid assignment, e.g. lambda x:x=2. The next
4906 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004907 return;
4908 case power:
4909 if (NCH(n) > 2) {
4910 for (i = 2; i < NCH(n); ++i)
4911 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
4912 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004913 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004914 if (NCH(n) > 1) {
4915 symtable_node(st, CHILD(n, 0));
4916 symtable_node(st, CHILD(n, 1));
4917 } else {
4918 n = CHILD(n, 0);
4919 goto loop;
4920 }
4921 return;
4922 case listmaker:
4923 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
4924 symtable_list_comprehension(st, CHILD(n, 1));
4925 else {
4926 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004927 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004928 }
4929 return;
4930 case exprlist:
4931 case testlist:
4932 if (NCH(n) == 1) {
4933 n = CHILD(n, 0);
4934 goto loop;
4935 }
4936 else {
4937 int i;
4938 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004939 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004940 return;
4941 }
4942 goto loop;
4943 case atom:
4944 tmp = CHILD(n, 0);
4945 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
4946 n = CHILD(n, 1);
4947 goto loop;
4948 } else if (TYPE(tmp) == NAME)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004949 symtable_add_def(st, STR(tmp), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004950 return;
4951 case dotted_as_name:
4952 if (NCH(n) == 3)
4953 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004954 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004955 else
4956 symtable_add_def(st,
4957 STR(CHILD(CHILD(n,
4958 0), 0)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004959 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004960 return;
4961 case dotted_name:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004962 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004963 return;
4964 case NAME:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004965 symtable_add_def(st, STR(n), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004966 return;
4967 default:
4968 if (NCH(n) == 0)
4969 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00004970 if (NCH(n) == 1) {
4971 n = CHILD(n, 0);
4972 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004973 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00004974 /* Should only occur for errors like x + 1 = 1,
4975 which will be caught in the next pass. */
4976 for (i = 0; i < NCH(n); ++i)
4977 if (TYPE(CHILD(n, i)) >= single_input)
4978 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004979 }
4980}