blob: 362493690452bd514b5cae80f06369e65626e0ae [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 UNDEFINED_FUTURE_FEATURE \
59"future feature %.100s is not defined"
60
61#define GLOBAL_AFTER_ASSIGN \
62"name '%.400s' is assigned to before global declaration"
63
64#define GLOBAL_AFTER_USE \
65"name '%.400s' is used prior to global declaration"
66
67#define LOCAL_GLOBAL \
68"name '%.400s' is a function paramter and declared global"
69
Jeremy Hyltone36f7782001-01-19 03:21:30 +000070#define MANGLE_LEN 256
71
Guido van Rossum79f25d91997-04-29 20:08:16 +000072#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000073
74static struct memberlist code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000075 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
76 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000077 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000078 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000079 {"co_code", T_OBJECT, OFF(co_code), READONLY},
80 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
81 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000082 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Jeremy Hylton64949cb2001-01-25 20:06:59 +000083 {"co_freevars", T_OBJECT, OFF(co_freevars), READONLY},
84 {"co_cellvars", T_OBJECT, OFF(co_cellvars), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000085 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000086 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000087 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
88 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000089 {NULL} /* Sentinel */
90};
91
Guido van Rossum79f25d91997-04-29 20:08:16 +000092static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000093code_getattr(PyCodeObject *co, char *name)
Guido van Rossum3f5da241990-12-20 15:06:42 +000094{
Guido van Rossum79f25d91997-04-29 20:08:16 +000095 return PyMember_Get((char *)co, code_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +000096}
Guido van Rossum10dc2e81990-11-18 17:27:39 +000097
98static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000099code_dealloc(PyCodeObject *co)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000100{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000101 Py_XDECREF(co->co_code);
102 Py_XDECREF(co->co_consts);
103 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +0000104 Py_XDECREF(co->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000105 Py_XDECREF(co->co_freevars);
106 Py_XDECREF(co->co_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000107 Py_XDECREF(co->co_filename);
108 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +0000109 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000110 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000111}
112
Guido van Rossum79f25d91997-04-29 20:08:16 +0000113static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000114code_repr(PyCodeObject *co)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000115{
116 char buf[500];
117 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000118 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000119 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000120
Guido van Rossuma396a882000-04-07 01:21:36 +0000121 if (co->co_firstlineno != 0)
122 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000123 if (co->co_filename && PyString_Check(co->co_filename))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000124 filename = PyString_AS_STRING(co->co_filename);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000125 if (co->co_name && PyString_Check(co->co_name))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000126 name = PyString_AS_STRING(co->co_name);
Fred Drake615ae552000-06-30 16:20:13 +0000127 sprintf(buf, "<code object %.100s at %p, file \"%.300s\", line %d>",
128 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000129 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000130}
131
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000132static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000133code_compare(PyCodeObject *co, PyCodeObject *cp)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000134{
135 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000136 cmp = PyObject_Compare(co->co_name, cp->co_name);
137 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000138 cmp = co->co_argcount - cp->co_argcount;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000139 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000140 cmp = co->co_nlocals - cp->co_nlocals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000141 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000142 cmp = co->co_flags - cp->co_flags;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000143 if (cmp) return cmp;
Guido van Rossumd076c731998-10-07 19:42:25 +0000144 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000145 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000146 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000147 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000148 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000149 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000150 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000151 if (cmp) return cmp;
152 cmp = PyObject_Compare(co->co_freevars, cp->co_freevars);
153 if (cmp) return cmp;
154 cmp = PyObject_Compare(co->co_cellvars, cp->co_cellvars);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000155 return cmp;
156}
157
158static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000159code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000160{
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000161 long h, h0, h1, h2, h3, h4, h5, h6;
Guido van Rossum44679592000-04-10 16:20:31 +0000162 h0 = PyObject_Hash(co->co_name);
163 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000164 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000165 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000166 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000167 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000168 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000169 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000170 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000171 if (h4 == -1) return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000172 h5 = PyObject_Hash(co->co_freevars);
173 if (h5 == -1) return -1;
174 h6 = PyObject_Hash(co->co_cellvars);
175 if (h6 == -1) return -1;
176 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^ h5 ^ h6 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000177 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000178 if (h == -1) h = -2;
179 return h;
180}
181
Guido van Rossum79f25d91997-04-29 20:08:16 +0000182PyTypeObject PyCode_Type = {
183 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000184 0,
185 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000186 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000187 0,
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000188 (destructor)code_dealloc, /*tp_dealloc*/
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000189 0, /*tp_print*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000190 (getattrfunc)code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000191 0, /*tp_setattr*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000192 (cmpfunc)code_compare, /*tp_compare*/
193 (reprfunc)code_repr, /*tp_repr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000194 0, /*tp_as_number*/
195 0, /*tp_as_sequence*/
196 0, /*tp_as_mapping*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000197 (hashfunc)code_hash, /*tp_hash*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000198};
199
Guido van Rossum644a12b1997-04-09 19:24:53 +0000200#define NAME_CHARS \
201 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
202
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000203/* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
204
205static int
206all_name_chars(unsigned char *s)
207{
Guido van Rossumcd90c202001-02-09 15:06:42 +0000208 static char ok_name_char[256];
209 static unsigned char *name_chars = (unsigned char *)NAME_CHARS;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000210
Guido van Rossumcd90c202001-02-09 15:06:42 +0000211 if (ok_name_char[*name_chars] == 0) {
212 unsigned char *p;
213 for (p = name_chars; *p; p++)
214 ok_name_char[*p] = 1;
215 }
216 while (*s) {
217 if (ok_name_char[*s++] == 0)
218 return 0;
219 }
220 return 1;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000221}
222
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000223static int
224intern_strings(PyObject *tuple)
225{
226 int i;
227
228 for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) {
229 PyObject *v = PyTuple_GET_ITEM(tuple, i);
230 if (v == NULL || !PyString_Check(v)) {
231 Py_FatalError("non-string found in code slot");
232 PyErr_BadInternalCall();
233 return -1;
234 }
235 PyString_InternInPlace(&PyTuple_GET_ITEM(tuple, i));
236 }
237 return 0;
238}
239
Guido van Rossum79f25d91997-04-29 20:08:16 +0000240PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000241PyCode_New(int argcount, int nlocals, int stacksize, int flags,
242 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000243 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
244 PyObject *filename, PyObject *name, int firstlineno,
245 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000246{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000247 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000248 int i;
Guido van Rossumd076c731998-10-07 19:42:25 +0000249 PyBufferProcs *pb;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000250 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000251 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000252 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000253 consts == NULL || !PyTuple_Check(consts) ||
254 names == NULL || !PyTuple_Check(names) ||
255 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000256 freevars == NULL || !PyTuple_Check(freevars) ||
257 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000258 name == NULL || !PyString_Check(name) ||
259 filename == NULL || !PyString_Check(filename) ||
260 lnotab == NULL || !PyString_Check(lnotab)) {
261 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000262 return NULL;
263 }
Guido van Rossumd076c731998-10-07 19:42:25 +0000264 pb = code->ob_type->tp_as_buffer;
265 if (pb == NULL ||
266 pb->bf_getreadbuffer == NULL ||
267 pb->bf_getsegcount == NULL ||
268 (*pb->bf_getsegcount)(code, NULL) != 1)
269 {
270 PyErr_BadInternalCall();
271 return NULL;
272 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000273 intern_strings(names);
274 intern_strings(varnames);
275 if (freevars == NULL)
276 freevars = PyTuple_New(0);
277 intern_strings(freevars);
278 if (cellvars == NULL)
279 cellvars = PyTuple_New(0);
280 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000281 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000282 for (i = PyTuple_Size(consts); --i >= 0; ) {
283 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000284 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000285 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000286 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000287 continue;
288 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000289 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000290 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000291 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000292 co->co_argcount = argcount;
293 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000294 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000295 co->co_flags = flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000296 Py_INCREF(code);
Guido van Rossumd076c731998-10-07 19:42:25 +0000297 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000298 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000299 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000300 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000301 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000302 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000303 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000304 Py_INCREF(freevars);
305 co->co_freevars = freevars;
306 Py_INCREF(cellvars);
307 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000308 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000309 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000310 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000311 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000312 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000313 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000314 co->co_lnotab = lnotab;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000315/* PyObject_Print((PyObject *)co, stderr, 0); */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000316 }
317 return co;
318}
319
320
321/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000322
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000323/* The compiler uses two passes to generate bytecodes. The first pass
324 builds the symbol table. The second pass generates the bytecode.
325
326 The first pass uses a single symtable struct. The second pass uses
327 a compiling struct for each code block. The compiling structs
328 share a reference to the symtable.
329
330 The two passes communicate via symtable_load_symbols() and via
331 is_local() and is_global(). The former initializes several slots
332 in the compiling struct: c_varnames, c_locals, c_nlocals,
333 c_argcount, c_globals, and c_flags.
334*/
335
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000336struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000337 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000338 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000339 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000340 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000341 PyObject *c_name_dict; /* inverse of c_names */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000342 PyObject *c_globals; /* dictionary (value=None) */
343 PyObject *c_locals; /* dictionary (value=localID) */
344 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000345 PyObject *c_freevars; /* dictionary (value=None) */
346 PyObject *c_cellvars; /* list */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000347 int c_nlocals; /* index of next local */
348 int c_argcount; /* number of top-level arguments */
349 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000350 int c_nexti; /* index into c_code */
351 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000352 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000353 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000354 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000355 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000356 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000357 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000358 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000359 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000360 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000361 int c_stacklevel; /* Current stack level */
362 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000363 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000364 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000365 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000366 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000367 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000368 int c_nested; /* Is block nested funcdef or lamdef? */
369 int c_closure; /* Is nested w/freevars? */
370 struct symtable *c_symtable; /* pointer to module symbol table */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000371};
372
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000373int is_free(int v)
374{
375 if ((v & (USE | DEF_FREE))
376 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
377 return 1;
378 if (v & DEF_FREE_CLASS)
379 return 1;
380 return 0;
381}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000382
Guido van Rossum452a9831996-09-17 14:32:04 +0000383/* Error message including line number */
384
385static void
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000386set_error_location(char *filename, int lineno)
387{
388 PyObject *exc, *v, *tb, *tmp;
389
390 /* add attributes for the line number and filename for the error */
391 PyErr_Fetch(&exc, &v, &tb);
392 PyErr_NormalizeException(&exc, &v, &tb);
393 tmp = PyInt_FromLong(lineno);
394 if (tmp == NULL)
395 PyErr_Clear();
396 else {
397 if (PyObject_SetAttrString(v, "lineno", tmp))
398 PyErr_Clear();
399 Py_DECREF(tmp);
400 }
401 if (filename != NULL) {
402 tmp = PyString_FromString(filename);
403 if (tmp == NULL)
404 PyErr_Clear();
405 else {
406 if (PyObject_SetAttrString(v, "filename", tmp))
407 PyErr_Clear();
408 Py_DECREF(tmp);
409 }
410 }
411 PyErr_Restore(exc, v, tb);
412}
413
414static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000415com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000416{
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000417 PyObject *v;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000418 if (c == NULL) {
419 /* Error occurred via symtable call to
420 is_constant_false */
421 PyErr_SetString(exc, msg);
422 return;
423 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000424 c->c_errors++;
Guido van Rossum452a9831996-09-17 14:32:04 +0000425 if (c->c_lineno <= 1) {
426 /* Unknown line number or single interactive command */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000427 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000428 return;
429 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000430 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000431 if (v == NULL)
432 return; /* MemoryError, too bad */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000433 PyErr_SetObject(exc, v);
434 Py_DECREF(v);
Fred Drakedcf08e02000-08-15 15:49:44 +0000435
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000436 set_error_location(c->c_filename, c->c_lineno);
Guido van Rossum452a9831996-09-17 14:32:04 +0000437}
438
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000439/* Interface to the block stack */
440
441static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000442block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000443{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000444 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000445 com_error(c, PyExc_SystemError,
446 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000447 }
448 else {
449 c->c_block[c->c_nblocks++] = type;
450 }
451}
452
453static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000454block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000455{
456 if (c->c_nblocks > 0)
457 c->c_nblocks--;
458 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000459 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000460 }
461}
462
Guido van Rossum681d79a1995-07-18 14:51:37 +0000463/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000464
Tim Petersdbd9ba62000-07-09 03:09:57 +0000465static int com_init(struct compiling *, char *);
466static void com_free(struct compiling *);
467static void com_push(struct compiling *, int);
468static void com_pop(struct compiling *, int);
469static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000470static void com_node(struct compiling *, node *);
471static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000472static void com_addbyte(struct compiling *, int);
473static void com_addint(struct compiling *, int);
474static void com_addoparg(struct compiling *, int, int);
475static void com_addfwref(struct compiling *, int, int *);
476static void com_backpatch(struct compiling *, int);
477static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
478static int com_addconst(struct compiling *, PyObject *);
479static int com_addname(struct compiling *, PyObject *);
480static void com_addopname(struct compiling *, int, node *);
481static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000482static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000483static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000484static void com_assign(struct compiling *, node *, int, node *);
485static void com_assign_name(struct compiling *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000486static PyCodeObject *icompile(node *, struct compiling *);
487static PyCodeObject *jcompile(node *, char *, struct compiling *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000488static PyObject *parsestrplus(node *);
489static PyObject *parsestr(char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000490static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000491
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000492static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000493
494/* symtable operations */
495static int symtable_build(struct compiling *, node *);
496static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000497static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000498static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000499static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000500static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000501static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000502
503static void symtable_node(struct symtable *, node *);
504static void symtable_funcdef(struct symtable *, node *);
505static void symtable_default_args(struct symtable *, node *);
506static void symtable_params(struct symtable *, node *);
507static void symtable_params_fplist(struct symtable *, node *n);
508static void symtable_global(struct symtable *, node *);
509static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000510static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000511static void symtable_list_comprehension(struct symtable *, node *);
512
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000513static int symtable_update_free_vars(struct symtable *);
514static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
515static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
516
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000517/* helper */
518static void
519do_pad(int pad)
520{
521 int i;
522 for (i = 0; i < pad; ++i)
523 fprintf(stderr, " ");
524}
525
526static void
527dump(node *n, int pad, int depth)
528{
529 int i;
530 if (depth == 0)
531 return;
532 do_pad(pad);
533 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
534 if (depth > 0)
535 depth--;
536 for (i = 0; i < NCH(n); ++i)
537 dump(CHILD(n, i), pad + 1, depth);
538}
539
540#define DUMP(N) dump(N, 0, -1)
541
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000542static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000543com_init(struct compiling *c, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000544{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000545 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000546 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
547 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000548 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000549 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000550 goto fail;
551 if ((c->c_const_dict = PyDict_New()) == NULL)
552 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000553 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000554 goto fail;
555 if ((c->c_name_dict = PyDict_New()) == NULL)
556 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000557 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000558 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000559 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
560 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000561 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000562 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000563 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000564 c->c_freevars = NULL;
565 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000566 c->c_nlocals = 0;
567 c->c_argcount = 0;
568 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000569 c->c_nexti = 0;
570 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000571 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000572 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000573 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000574 c->c_begin = 0;
575 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000576 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000577 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000578 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000579 c->c_stacklevel = 0;
580 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000581 c->c_firstlineno = 0;
582 c->c_last_addr = 0;
583 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000584 c->c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000585 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000586 c->c_nested = 0;
587 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000588 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000589 return 1;
590
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000591 fail:
592 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000593 return 0;
594}
595
596static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000597com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000598{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000599 Py_XDECREF(c->c_code);
600 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000601 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000602 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000603 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000604 Py_XDECREF(c->c_globals);
605 Py_XDECREF(c->c_locals);
606 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000607 Py_XDECREF(c->c_freevars);
608 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000609 Py_XDECREF(c->c_lnotab);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000610}
611
612static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000613com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000614{
615 c->c_stacklevel += n;
616 if (c->c_stacklevel > c->c_maxstacklevel)
617 c->c_maxstacklevel = c->c_stacklevel;
618}
619
620static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000621com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000622{
623 if (c->c_stacklevel < n) {
Guido van Rossum90f827c1998-08-25 18:22:17 +0000624 /* fprintf(stderr,
Guido van Rossum8b993a91997-01-17 21:04:03 +0000625 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
626 c->c_filename, c->c_lineno,
Guido van Rossum90f827c1998-08-25 18:22:17 +0000627 c->c_nexti, c->c_stacklevel, n); */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000628 c->c_stacklevel = 0;
629 }
630 else
631 c->c_stacklevel -= n;
632}
633
634static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000635com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000636{
637 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000638 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000639 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000640 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000641}
642
643static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000644com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000645{
646 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000647 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000648 assert(byte >= 0 && byte <= 255);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000649 if (byte < 0 || byte > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000650 com_error(c, PyExc_SystemError,
651 "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000652 }
653 if (c->c_code == NULL)
654 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000655 len = PyString_Size(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000656 if (c->c_nexti >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000657 if (_PyString_Resize(&c->c_code, len+1000) != 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000658 c->c_errors++;
659 return;
660 }
661 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000662 PyString_AsString(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000663}
664
665static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000666com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000667{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000668 com_addbyte(c, x & 0xff);
669 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000670}
671
672static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000673com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000674{
675 int size;
676 char *p;
677 if (c->c_lnotab == NULL)
678 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000679 size = PyString_Size(c->c_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000680 if (c->c_lnotab_next+2 > size) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000681 if (_PyString_Resize(&c->c_lnotab, size + 1000) < 0) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000682 c->c_errors++;
683 return;
684 }
685 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000686 p = PyString_AsString(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000687 *p++ = addr;
688 *p++ = line;
689 c->c_lnotab_next += 2;
690}
691
692static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000693com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000694{
695 c->c_lineno = lineno;
696 if (c->c_firstlineno == 0) {
697 c->c_firstlineno = c->c_last_line = lineno;
698 }
699 else {
700 int incr_addr = c->c_nexti - c->c_last_addr;
701 int incr_line = lineno - c->c_last_line;
702 while (incr_addr > 0 || incr_line > 0) {
703 int trunc_addr = incr_addr;
704 int trunc_line = incr_line;
705 if (trunc_addr > 255)
706 trunc_addr = 255;
707 if (trunc_line > 255)
708 trunc_line = 255;
709 com_add_lnotab(c, trunc_addr, trunc_line);
710 incr_addr -= trunc_addr;
711 incr_line -= trunc_line;
712 }
713 c->c_last_addr = c->c_nexti;
714 c->c_last_line = lineno;
715 }
716}
717
718static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000719com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000720{
Fred Drakeef8ace32000-08-24 00:32:09 +0000721 int extended_arg = arg >> 16;
Guido van Rossum8e793d91997-03-03 19:13:14 +0000722 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000723 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000724 if (Py_OptimizeFlag)
725 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000726 }
Fred Drakeef8ace32000-08-24 00:32:09 +0000727 if (extended_arg){
728 com_addbyte(c, EXTENDED_ARG);
729 com_addint(c, extended_arg);
730 arg &= 0xffff;
731 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000732 com_addbyte(c, op);
733 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000734}
735
736static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000737com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000738{
739 /* Compile a forward reference for backpatching */
740 int here;
741 int anchor;
742 com_addbyte(c, op);
743 here = c->c_nexti;
744 anchor = *p_anchor;
745 *p_anchor = here;
746 com_addint(c, anchor == 0 ? 0 : here - anchor);
747}
748
749static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000750com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000751{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000752 unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000753 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000754 int dist;
755 int prev;
756 for (;;) {
757 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000758 prev = code[anchor] + (code[anchor+1] << 8);
759 dist = target - (anchor+2);
760 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +0000761 dist >>= 8;
762 code[anchor+1] = dist;
763 dist >>= 8;
764 if (dist) {
765 com_error(c, PyExc_SystemError,
766 "com_backpatch: offset too large");
767 break;
768 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000769 if (!prev)
770 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000771 anchor -= prev;
772 }
773}
774
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000775/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000776
777static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000778com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000779{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000780 PyObject *w, *t, *np=NULL;
781 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000782
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000783 t = Py_BuildValue("(OO)", v, v->ob_type);
784 if (t == NULL)
785 goto fail;
786 w = PyDict_GetItem(dict, t);
787 if (w != NULL) {
788 n = PyInt_AsLong(w);
789 } else {
790 n = PyList_Size(list);
791 np = PyInt_FromLong(n);
792 if (np == NULL)
793 goto fail;
794 if (PyList_Append(list, v) != 0)
795 goto fail;
796 if (PyDict_SetItem(dict, t, np) != 0)
797 goto fail;
798 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000799 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000800 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000801 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000802 fail:
803 Py_XDECREF(np);
804 Py_XDECREF(t);
805 c->c_errors++;
806 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000807}
808
809static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000810com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000811{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000812 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000813}
814
815static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000816com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000817{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000818 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000819}
820
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000821static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000822mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000823{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000824 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000825 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +0000826 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000827 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
828 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000829 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000830 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000831 return 0; /* Don't mangle __extremely_long_names */
832 if (name[nlen-1] == '_' && name[nlen-2] == '_')
833 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000834 /* Strip leading underscores from class name */
835 while (*p == '_')
836 p++;
837 if (*p == '\0')
838 return 0; /* Don't mangle if class is just underscores */
839 plen = strlen(p);
840 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000841 plen = maxlen-nlen-2; /* Truncate class name if too long */
842 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000843 buffer[0] = '_';
844 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000845 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000846 return 1;
847}
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000848
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000849static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000850com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000851{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000852 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000853 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000854 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000855
856 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000857 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000858 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000859 c->c_errors++;
860 i = 255;
861 }
862 else {
863 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000864 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000865 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000866 com_addoparg(c, op, i);
867}
868
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000869#define NAME_LOCAL 0
870#define NAME_GLOBAL 1
871#define NAME_DEFAULT 2
872#define NAME_CLOSURE 3
873
874static int
875com_lookup_arg(PyObject *dict, PyObject *name)
876{
877 PyObject *v = PyDict_GetItem(dict, name);
878 if (v == NULL)
879 return -1;
880 else
881 return PyInt_AS_LONG(v);
882}
883
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000884static void
885com_addop_varname(struct compiling *c, int kind, char *name)
886{
887 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000888 int i, reftype;
889 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000890 int op = STOP_CODE;
891 char buffer[MANGLE_LEN];
892
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000893 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000894 name = buffer;
895 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
896 c->c_errors++;
897 i = 255;
898 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000899 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000900
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000901 reftype = get_ref_type(c, name);
902 switch (reftype) {
903 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000904 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000905 scope = NAME_LOCAL;
906 break;
907 case GLOBAL_EXPLICIT:
908 scope = NAME_GLOBAL;
909 break;
910 case GLOBAL_IMPLICIT:
911 if (c->c_flags & CO_OPTIMIZED)
912 scope = NAME_GLOBAL;
913 break;
914 case FREE:
915 case CELL:
916 scope = NAME_CLOSURE;
917 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000918 }
919
920 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000921 if (scope == NAME_LOCAL)
922 i = com_lookup_arg(c->c_locals, v);
923 else if (reftype == FREE)
924 i = com_lookup_arg(c->c_freevars, v);
925 else if (reftype == CELL)
926 i = com_lookup_arg(c->c_cellvars, v);
927 if (i == -1) {
928 c->c_errors++; /* XXX no exception set */
929 i = 255;
930 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000931 }
932 Py_DECREF(v);
933
934 switch (kind) {
935 case VAR_LOAD:
936 switch (scope) {
937 case NAME_LOCAL:
938 op = LOAD_FAST;
939 break;
940 case NAME_GLOBAL:
941 op = LOAD_GLOBAL;
942 break;
943 case NAME_DEFAULT:
944 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000945 break;
946 case NAME_CLOSURE:
947 op = LOAD_DEREF;
948 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000949 }
950 break;
951 case VAR_STORE:
952 switch (scope) {
953 case NAME_LOCAL:
954 op = STORE_FAST;
955 break;
956 case NAME_GLOBAL:
957 op = STORE_GLOBAL;
958 break;
959 case NAME_DEFAULT:
960 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000961 break;
962 case NAME_CLOSURE:
963 op = STORE_DEREF;
964 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000965 }
966 break;
967 case VAR_DELETE:
968 switch (scope) {
969 case NAME_LOCAL:
970 op = DELETE_FAST;
971 break;
972 case NAME_GLOBAL:
973 op = DELETE_GLOBAL;
974 break;
975 case NAME_DEFAULT:
976 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000977 break;
978 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000979 char buf[500];
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000980 sprintf(buf, DEL_CLOSURE_ERROR, name);
981 com_error(c, PyExc_SyntaxError, buf);
982 i = 255;
983 break;
984 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000985 }
986 break;
987 }
988done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000989 com_addoparg(c, op, i);
990}
991
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000992static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000993com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000994{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000995 char *name;
996 char buffer[1000];
997 /* XXX it is possible to write this code without the 1000
998 chars on the total length of dotted names, I just can't be
999 bothered right now */
1000 if (TYPE(n) == STAR)
1001 name = "*";
1002 else if (TYPE(n) == dotted_name) {
1003 char *p = buffer;
1004 int i;
1005 name = buffer;
1006 for (i = 0; i < NCH(n); i += 2) {
1007 char *s = STR(CHILD(n, i));
1008 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001009 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001010 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001011 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001012 break;
1013 }
1014 if (p != buffer)
1015 *p++ = '.';
1016 strcpy(p, s);
1017 p = strchr(p, '\0');
1018 }
1019 }
1020 else {
1021 REQ(n, NAME);
1022 name = STR(n);
1023 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001024 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001025}
1026
Guido van Rossum79f25d91997-04-29 20:08:16 +00001027static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001028parsenumber(struct compiling *co, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001029{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001030 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001031 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001032 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001033#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +00001034 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +00001035 int imflag;
1036#endif
1037
Guido van Rossum282914b1991-04-04 10:42:56 +00001038 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001039 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001040#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001041 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001042#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001043 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001044 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001045 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001046 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001047 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001048 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001049 if (*end == '\0') {
1050 if (errno != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001051 com_error(co, PyExc_OverflowError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001052 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +00001053 return NULL;
1054 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001055 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001056 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001057 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001058#ifndef WITHOUT_COMPLEX
1059 if (imflag) {
1060 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001061 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +00001062 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001063 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001064 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +00001065 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001066 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001067#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001068 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001069 PyFPE_START_PROTECT("atof", return 0)
1070 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001071 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001072 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001073 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001074}
1075
Guido van Rossum79f25d91997-04-29 20:08:16 +00001076static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001077parsestr(char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001078{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001079 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001080 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001081 char *buf;
1082 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001083 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001084 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001085 int first = *s;
1086 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001087 int rawmode = 0;
1088 int unicode = 0;
1089 if (isalpha(quote) || quote == '_') {
1090 if (quote == 'u' || quote == 'U') {
1091 quote = *++s;
1092 unicode = 1;
1093 }
1094 if (quote == 'r' || quote == 'R') {
1095 quote = *++s;
1096 rawmode = 1;
1097 }
1098 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001099 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001100 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001101 return NULL;
1102 }
1103 s++;
1104 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001105 if (len > INT_MAX) {
1106 PyErr_SetString(PyExc_OverflowError, "string to parse is too long");
1107 return NULL;
1108 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001109 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001110 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001111 return NULL;
1112 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001113 if (len >= 4 && s[0] == quote && s[1] == quote) {
1114 s += 2;
1115 len -= 2;
1116 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001117 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001118 return NULL;
1119 }
1120 }
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001121 if (unicode || Py_UnicodeFlag) {
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001122 if (rawmode)
1123 return PyUnicode_DecodeRawUnicodeEscape(
1124 s, len, NULL);
1125 else
1126 return PyUnicode_DecodeUnicodeEscape(
1127 s, len, NULL);
1128 }
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001129 if (rawmode || strchr(s, '\\') == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001130 return PyString_FromStringAndSize(s, len);
1131 v = PyString_FromStringAndSize((char *)NULL, len);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001132 if (v == NULL)
1133 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001134 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001135 end = s + len;
1136 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001137 if (*s != '\\') {
1138 *p++ = *s++;
1139 continue;
1140 }
1141 s++;
1142 switch (*s++) {
1143 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001144 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001145 case '\\': *p++ = '\\'; break;
1146 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +00001147 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001148 case 'b': *p++ = '\b'; break;
1149 case 'f': *p++ = '\014'; break; /* FF */
1150 case 't': *p++ = '\t'; break;
1151 case 'n': *p++ = '\n'; break;
1152 case 'r': *p++ = '\r'; break;
1153 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001154 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
1155 case '0': case '1': case '2': case '3':
1156 case '4': case '5': case '6': case '7':
1157 c = s[-1] - '0';
1158 if ('0' <= *s && *s <= '7') {
1159 c = (c<<3) + *s++ - '0';
1160 if ('0' <= *s && *s <= '7')
1161 c = (c<<3) + *s++ - '0';
1162 }
1163 *p++ = c;
1164 break;
1165 case 'x':
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001166 if (isxdigit(Py_CHARMASK(s[0])) && isxdigit(Py_CHARMASK(s[1]))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +00001167 unsigned int x = 0;
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001168 c = Py_CHARMASK(*s);
1169 s++;
1170 if (isdigit(c))
1171 x = c - '0';
1172 else if (islower(c))
1173 x = 10 + c - 'a';
1174 else
1175 x = 10 + c - 'A';
1176 x = x << 4;
1177 c = Py_CHARMASK(*s);
1178 s++;
1179 if (isdigit(c))
1180 x += c - '0';
1181 else if (islower(c))
1182 x += 10 + c - 'a';
1183 else
1184 x += 10 + c - 'A';
Guido van Rossumed1100f1997-10-20 23:24:07 +00001185 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001186 break;
1187 }
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001188 PyErr_SetString(PyExc_ValueError, "invalid \\x escape");
1189 Py_DECREF(v);
1190 return NULL;
1191 default:
1192 *p++ = '\\';
1193 *p++ = s[-1];
1194 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001195 }
1196 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001197 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001198 return v;
1199}
1200
Guido van Rossum79f25d91997-04-29 20:08:16 +00001201static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001202parsestrplus(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001203{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001204 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001205 int i;
1206 REQ(CHILD(n, 0), STRING);
1207 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
1208 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001209 for (i = 1; i < NCH(n); i++) {
1210 PyObject *s;
1211 s = parsestr(STR(CHILD(n, i)));
1212 if (s == NULL)
1213 goto onError;
1214 if (PyString_Check(v) && PyString_Check(s)) {
1215 PyString_ConcatAndDel(&v, s);
1216 if (v == NULL)
1217 goto onError;
1218 }
1219 else {
1220 PyObject *temp;
1221 temp = PyUnicode_Concat(v, s);
1222 Py_DECREF(s);
1223 if (temp == NULL)
1224 goto onError;
1225 Py_DECREF(v);
1226 v = temp;
1227 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001228 }
1229 }
1230 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001231
1232 onError:
1233 Py_XDECREF(v);
1234 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001235}
1236
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001237static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001238com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001239{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001240 PyObject *v;
1241 int anchor = 0;
1242 int save_begin = c->c_begin;
1243
1244 /* list_iter: for v in expr [list_iter] */
1245 com_node(c, CHILD(n, 3)); /* expr */
1246 v = PyInt_FromLong(0L);
1247 if (v == NULL)
1248 c->c_errors++;
1249 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
1250 com_push(c, 1);
1251 Py_XDECREF(v);
1252 c->c_begin = c->c_nexti;
1253 com_addoparg(c, SET_LINENO, n->n_lineno);
1254 com_addfwref(c, FOR_LOOP, &anchor);
1255 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001256 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001257 c->c_loops++;
1258 com_list_iter(c, n, e, t);
1259 c->c_loops--;
1260 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1261 c->c_begin = save_begin;
1262 com_backpatch(c, anchor);
1263 com_pop(c, 2); /* FOR_LOOP has popped these */
1264}
1265
1266static void
1267com_list_if(struct compiling *c, node *n, node *e, char *t)
1268{
1269 int anchor = 0;
1270 int a = 0;
1271 /* list_iter: 'if' test [list_iter] */
1272 com_addoparg(c, SET_LINENO, n->n_lineno);
1273 com_node(c, CHILD(n, 1));
1274 com_addfwref(c, JUMP_IF_FALSE, &a);
1275 com_addbyte(c, POP_TOP);
1276 com_pop(c, 1);
1277 com_list_iter(c, n, e, t);
1278 com_addfwref(c, JUMP_FORWARD, &anchor);
1279 com_backpatch(c, a);
1280 /* We jump here with an extra entry which we now pop */
1281 com_addbyte(c, POP_TOP);
1282 com_backpatch(c, anchor);
1283}
1284
1285static void
1286com_list_iter(struct compiling *c,
1287 node *p, /* parent of list_iter node */
1288 node *e, /* element expression node */
1289 char *t /* name of result list temp local */)
1290{
1291 /* list_iter is the last child in a listmaker, list_for, or list_if */
1292 node *n = CHILD(p, NCH(p)-1);
1293 if (TYPE(n) == list_iter) {
1294 n = CHILD(n, 0);
1295 switch (TYPE(n)) {
1296 case list_for:
1297 com_list_for(c, n, e, t);
1298 break;
1299 case list_if:
1300 com_list_if(c, n, e, t);
1301 break;
1302 default:
1303 com_error(c, PyExc_SystemError,
1304 "invalid list_iter node type");
1305 }
1306 }
1307 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001308 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001309 com_push(c, 1);
1310 com_node(c, e);
1311 com_addoparg(c, CALL_FUNCTION, 1);
1312 com_addbyte(c, POP_TOP);
1313 com_pop(c, 2);
1314 }
1315}
1316
1317static void
1318com_list_comprehension(struct compiling *c, node *n)
1319{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001320 /* listmaker: test list_for */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001321 char tmpname[12];
Tim Peters30814212001-02-17 05:30:26 +00001322 sprintf(tmpname, "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001323 com_addoparg(c, BUILD_LIST, 0);
1324 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1325 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001326 com_addop_name(c, LOAD_ATTR, "append");
1327 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001328 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001329 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001330 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001331 --c->c_tmpname;
1332}
1333
1334static void
1335com_listmaker(struct compiling *c, node *n)
1336{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001337 /* listmaker: test ( list_for | (',' test)* [','] ) */
1338 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001339 com_list_comprehension(c, n);
1340 else {
1341 int len = 0;
1342 int i;
1343 for (i = 0; i < NCH(n); i += 2, len++)
1344 com_node(c, CHILD(n, i));
1345 com_addoparg(c, BUILD_LIST, len);
1346 com_pop(c, len-1);
1347 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001348}
1349
1350static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001351com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001352{
1353 int i;
1354 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1355 for (i = 0; i+2 < NCH(n); i += 4) {
1356 /* We must arrange things just right for STORE_SUBSCR.
1357 It wants the stack to look like (value) (dict) (key) */
1358 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001359 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001360 com_node(c, CHILD(n, i+2)); /* value */
1361 com_addbyte(c, ROT_TWO);
1362 com_node(c, CHILD(n, i)); /* key */
1363 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001364 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001365 }
1366}
1367
1368static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001369com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001370{
1371 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001372 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001373 int i;
1374 REQ(n, atom);
1375 ch = CHILD(n, 0);
1376 switch (TYPE(ch)) {
1377 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001378 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001379 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001380 com_push(c, 1);
1381 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001382 else
1383 com_node(c, CHILD(n, 1));
1384 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001385 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001386 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001387 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001388 com_push(c, 1);
1389 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001390 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001391 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001392 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001393 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001394 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001395 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001396 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001397 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001398 break;
1399 case BACKQUOTE:
1400 com_node(c, CHILD(n, 1));
1401 com_addbyte(c, UNARY_CONVERT);
1402 break;
1403 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001404 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001405 i = 255;
1406 }
1407 else {
1408 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001409 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001410 }
1411 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001412 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001413 break;
1414 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001415 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001416 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001417 c->c_errors++;
1418 i = 255;
1419 }
1420 else {
1421 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001422 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001423 }
1424 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001425 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001426 break;
1427 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001428 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001429 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001430 break;
1431 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001432 com_error(c, PyExc_SystemError,
1433 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001434 }
1435}
1436
1437static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001438com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001439{
1440 if (NCH(n) == 1) {
1441 com_addbyte(c, op);
1442 }
1443 else if (NCH(n) == 2) {
1444 if (TYPE(CHILD(n, 0)) != COLON) {
1445 com_node(c, CHILD(n, 0));
1446 com_addbyte(c, op+1);
1447 }
1448 else {
1449 com_node(c, CHILD(n, 1));
1450 com_addbyte(c, op+2);
1451 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001452 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001453 }
1454 else {
1455 com_node(c, CHILD(n, 0));
1456 com_node(c, CHILD(n, 2));
1457 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001458 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001459 }
1460}
1461
Guido van Rossum635abd21997-01-06 22:56:52 +00001462static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001463com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1464{
1465 if (NCH(n) == 1) {
1466 com_addbyte(c, DUP_TOP);
1467 com_push(c, 1);
1468 com_addbyte(c, SLICE);
1469 com_node(c, augn);
1470 com_addbyte(c, opcode);
1471 com_pop(c, 1);
1472 com_addbyte(c, ROT_TWO);
1473 com_addbyte(c, STORE_SLICE);
1474 com_pop(c, 2);
1475 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1476 com_node(c, CHILD(n, 0));
1477 com_addoparg(c, DUP_TOPX, 2);
1478 com_push(c, 2);
1479 com_addbyte(c, SLICE+1);
1480 com_pop(c, 1);
1481 com_node(c, augn);
1482 com_addbyte(c, opcode);
1483 com_pop(c, 1);
1484 com_addbyte(c, ROT_THREE);
1485 com_addbyte(c, STORE_SLICE+1);
1486 com_pop(c, 3);
1487 } else if (NCH(n) == 2) {
1488 com_node(c, CHILD(n, 1));
1489 com_addoparg(c, DUP_TOPX, 2);
1490 com_push(c, 2);
1491 com_addbyte(c, SLICE+2);
1492 com_pop(c, 1);
1493 com_node(c, augn);
1494 com_addbyte(c, opcode);
1495 com_pop(c, 1);
1496 com_addbyte(c, ROT_THREE);
1497 com_addbyte(c, STORE_SLICE+2);
1498 com_pop(c, 3);
1499 } else {
1500 com_node(c, CHILD(n, 0));
1501 com_node(c, CHILD(n, 2));
1502 com_addoparg(c, DUP_TOPX, 3);
1503 com_push(c, 3);
1504 com_addbyte(c, SLICE+3);
1505 com_pop(c, 2);
1506 com_node(c, augn);
1507 com_addbyte(c, opcode);
1508 com_pop(c, 1);
1509 com_addbyte(c, ROT_FOUR);
1510 com_addbyte(c, STORE_SLICE+3);
1511 com_pop(c, 4);
1512 }
1513}
1514
1515static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001516com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001517{
1518 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001519 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001520 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001521 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001522 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001523 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001524 }
1525 else {
1526 com_node(c, CHILD(n, 0));
1527 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001528 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001529 }
1530 m = n;
1531 do {
1532 m = CHILD(m, 0);
1533 } while (NCH(m) == 1);
1534 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00001535 /* f(lambda x: x[0] = 3) ends up getting parsed with
1536 * LHS test = lambda x: x[0], and RHS test = 3.
1537 * SF bug 132313 points out that complaining about a keyword
1538 * then is very confusing.
1539 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001540 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00001541 TYPE(m) == lambdef ?
1542 "lambda cannot contain assignment" :
1543 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001544 }
1545 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001546 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001547 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001548 *pkeywords = PyDict_New();
Guido van Rossum635abd21997-01-06 22:56:52 +00001549 if (v == NULL || *pkeywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001550 c->c_errors++;
1551 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001552 if (PyDict_GetItem(*pkeywords, v) != NULL)
1553 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001554 "duplicate keyword argument");
1555 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001556 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001557 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001558 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001559 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001560 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001561 }
1562 }
1563 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001564}
1565
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001566static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001567com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001568{
1569 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001570 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001571 }
1572 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001573 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001574 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001575 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001576 int star_flag = 0;
1577 int starstar_flag = 0;
1578 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001579 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001580 na = 0;
1581 nk = 0;
1582 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001583 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001584 if (TYPE(ch) == STAR ||
1585 TYPE(ch) == DOUBLESTAR)
1586 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001587 if (ch->n_lineno != lineno) {
1588 lineno = ch->n_lineno;
1589 com_addoparg(c, SET_LINENO, lineno);
1590 }
1591 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001592 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001593 na++;
1594 else
1595 nk++;
1596 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001597 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001598 while (i < NCH(n)) {
1599 node *tok = CHILD(n, i);
1600 node *ch = CHILD(n, i+1);
1601 i += 3;
1602 switch (TYPE(tok)) {
1603 case STAR: star_flag = 1; break;
1604 case DOUBLESTAR: starstar_flag = 1; break;
1605 }
1606 com_node(c, ch);
1607 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001608 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001609 com_error(c, PyExc_SyntaxError,
1610 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001611 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001612 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001613 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001614 star_flag + (starstar_flag << 1);
1615 else
1616 opcode = CALL_FUNCTION;
1617 com_addoparg(c, opcode, na | (nk << 8));
1618 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001619 }
1620}
1621
1622static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001623com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001624{
1625 com_addopname(c, LOAD_ATTR, n);
1626}
1627
1628static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001629com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001630{
1631 int i=0;
1632 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001633 node *ch;
1634
1635 /* first argument */
1636 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001637 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001638 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001639 i++;
1640 }
1641 else {
1642 com_node(c, CHILD(n,i));
1643 i++;
1644 REQ(CHILD(n,i),COLON);
1645 i++;
1646 }
1647 /* second argument */
1648 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1649 com_node(c, CHILD(n,i));
1650 i++;
1651 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001652 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001653 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001654 com_push(c, 1);
1655 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001656 /* remaining arguments */
1657 for (; i < NCH(n); i++) {
1658 ns++;
1659 ch=CHILD(n,i);
1660 REQ(ch, sliceop);
1661 if (NCH(ch) == 1) {
1662 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001663 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001664 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001665 }
1666 else
1667 com_node(c, CHILD(ch,1));
1668 }
1669 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001670 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001671}
1672
1673static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001674com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001675{
1676 node *ch;
1677 REQ(n, subscript);
1678 ch = CHILD(n,0);
1679 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001680 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001681 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001682 com_push(c, 1);
1683 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001684 else {
1685 /* check for slice */
1686 if ((TYPE(ch) == COLON || NCH(n) > 1))
1687 com_sliceobj(c, n);
1688 else {
1689 REQ(ch, test);
1690 com_node(c, ch);
1691 }
1692 }
1693}
1694
1695static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001696com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001697{
1698 int i, op;
1699 REQ(n, subscriptlist);
1700 /* Check to make backward compatible slice behavior for '[i:j]' */
1701 if (NCH(n) == 1) {
1702 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001703 /* 'Basic' slice, should have exactly one colon. */
1704 if ((TYPE(CHILD(sub, 0)) == COLON
1705 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1706 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1707 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001708 switch (assigning) {
1709 case OP_DELETE:
1710 op = DELETE_SLICE;
1711 break;
1712 case OP_ASSIGN:
1713 op = STORE_SLICE;
1714 break;
1715 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001716 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001717 break;
1718 default:
1719 com_augassign_slice(c, sub, assigning, augn);
1720 return;
1721 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001722 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001723 if (op == STORE_SLICE)
1724 com_pop(c, 2);
1725 else if (op == DELETE_SLICE)
1726 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001727 return;
1728 }
1729 }
1730 /* Else normal subscriptlist. Compile each subscript. */
1731 for (i = 0; i < NCH(n); i += 2)
1732 com_subscript(c, CHILD(n, i));
1733 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001734 if (NCH(n) > 1) {
1735 i = (NCH(n)+1) / 2;
1736 com_addoparg(c, BUILD_TUPLE, i);
1737 com_pop(c, i-1);
1738 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001739 switch (assigning) {
1740 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001741 op = DELETE_SUBSCR;
1742 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00001743 break;
1744 default:
1745 case OP_ASSIGN:
1746 op = STORE_SUBSCR;
1747 i = 3;
1748 break;
1749 case OP_APPLY:
1750 op = BINARY_SUBSCR;
1751 i = 1;
1752 break;
1753 }
1754 if (assigning > OP_APPLY) {
1755 com_addoparg(c, DUP_TOPX, 2);
1756 com_push(c, 2);
1757 com_addbyte(c, BINARY_SUBSCR);
1758 com_pop(c, 1);
1759 com_node(c, augn);
1760 com_addbyte(c, assigning);
1761 com_pop(c, 1);
1762 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001763 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001764 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001765 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001766}
1767
1768static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001769com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001770{
1771 REQ(n, trailer);
1772 switch (TYPE(CHILD(n, 0))) {
1773 case LPAR:
1774 com_call_function(c, CHILD(n, 1));
1775 break;
1776 case DOT:
1777 com_select_member(c, CHILD(n, 1));
1778 break;
1779 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00001780 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001781 break;
1782 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001783 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001784 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001785 }
1786}
1787
1788static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001789com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001790{
1791 int i;
1792 REQ(n, power);
1793 com_atom(c, CHILD(n, 0));
1794 for (i = 1; i < NCH(n); i++) {
1795 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1796 com_factor(c, CHILD(n, i+1));
1797 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001798 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001799 break;
1800 }
1801 else
1802 com_apply_trailer(c, CHILD(n, i));
1803 }
1804}
1805
1806static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001807com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001808{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001809 REQ(n, factor);
1810 if (TYPE(CHILD(n, 0)) == PLUS) {
1811 com_factor(c, CHILD(n, 1));
1812 com_addbyte(c, UNARY_POSITIVE);
1813 }
1814 else if (TYPE(CHILD(n, 0)) == MINUS) {
1815 com_factor(c, CHILD(n, 1));
1816 com_addbyte(c, UNARY_NEGATIVE);
1817 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001818 else if (TYPE(CHILD(n, 0)) == TILDE) {
1819 com_factor(c, CHILD(n, 1));
1820 com_addbyte(c, UNARY_INVERT);
1821 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001822 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001823 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001824 }
1825}
1826
1827static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001828com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001829{
1830 int i;
1831 int op;
1832 REQ(n, term);
1833 com_factor(c, CHILD(n, 0));
1834 for (i = 2; i < NCH(n); i += 2) {
1835 com_factor(c, CHILD(n, i));
1836 switch (TYPE(CHILD(n, i-1))) {
1837 case STAR:
1838 op = BINARY_MULTIPLY;
1839 break;
1840 case SLASH:
1841 op = BINARY_DIVIDE;
1842 break;
1843 case PERCENT:
1844 op = BINARY_MODULO;
1845 break;
1846 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001847 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001848 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001849 op = 255;
1850 }
1851 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001852 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001853 }
1854}
1855
1856static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001857com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001858{
1859 int i;
1860 int op;
1861 REQ(n, arith_expr);
1862 com_term(c, CHILD(n, 0));
1863 for (i = 2; i < NCH(n); i += 2) {
1864 com_term(c, CHILD(n, i));
1865 switch (TYPE(CHILD(n, i-1))) {
1866 case PLUS:
1867 op = BINARY_ADD;
1868 break;
1869 case MINUS:
1870 op = BINARY_SUBTRACT;
1871 break;
1872 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001873 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001874 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001875 op = 255;
1876 }
1877 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001878 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001879 }
1880}
1881
1882static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001883com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001884{
1885 int i;
1886 int op;
1887 REQ(n, shift_expr);
1888 com_arith_expr(c, CHILD(n, 0));
1889 for (i = 2; i < NCH(n); i += 2) {
1890 com_arith_expr(c, CHILD(n, i));
1891 switch (TYPE(CHILD(n, i-1))) {
1892 case LEFTSHIFT:
1893 op = BINARY_LSHIFT;
1894 break;
1895 case RIGHTSHIFT:
1896 op = BINARY_RSHIFT;
1897 break;
1898 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001899 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001900 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001901 op = 255;
1902 }
1903 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001904 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001905 }
1906}
1907
1908static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001909com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001910{
1911 int i;
1912 int op;
1913 REQ(n, and_expr);
1914 com_shift_expr(c, CHILD(n, 0));
1915 for (i = 2; i < NCH(n); i += 2) {
1916 com_shift_expr(c, CHILD(n, i));
1917 if (TYPE(CHILD(n, i-1)) == AMPER) {
1918 op = BINARY_AND;
1919 }
1920 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001921 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001922 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001923 op = 255;
1924 }
1925 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001926 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001927 }
1928}
1929
1930static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001931com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001932{
1933 int i;
1934 int op;
1935 REQ(n, xor_expr);
1936 com_and_expr(c, CHILD(n, 0));
1937 for (i = 2; i < NCH(n); i += 2) {
1938 com_and_expr(c, CHILD(n, i));
1939 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1940 op = BINARY_XOR;
1941 }
1942 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001943 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001944 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001945 op = 255;
1946 }
1947 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001948 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001949 }
1950}
1951
1952static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001953com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001954{
1955 int i;
1956 int op;
1957 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001958 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001959 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001960 com_xor_expr(c, CHILD(n, i));
1961 if (TYPE(CHILD(n, i-1)) == VBAR) {
1962 op = BINARY_OR;
1963 }
1964 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001965 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001966 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001967 op = 255;
1968 }
1969 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001970 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001971 }
1972}
1973
1974static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001975cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001976{
1977 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001978 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001979 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1980 if (NCH(n) == 1) {
1981 n = CHILD(n, 0);
1982 switch (TYPE(n)) {
1983 case LESS: return LT;
1984 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001985 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001986 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001987 case LESSEQUAL: return LE;
1988 case GREATEREQUAL: return GE;
1989 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001990 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1991 if (strcmp(STR(n), "is") == 0) return IS;
1992 }
1993 }
1994 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001995 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001996 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1997 return NOT_IN;
1998 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1999 return IS_NOT;
2000 }
2001 }
2002 return BAD;
2003}
2004
2005static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002006com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002007{
2008 int i;
2009 enum cmp_op op;
2010 int anchor;
2011 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2012 com_expr(c, CHILD(n, 0));
2013 if (NCH(n) == 1)
2014 return;
2015
2016 /****************************************************************
2017 The following code is generated for all but the last
2018 comparison in a chain:
2019
2020 label: on stack: opcode: jump to:
2021
2022 a <code to load b>
2023 a, b DUP_TOP
2024 a, b, b ROT_THREE
2025 b, a, b COMPARE_OP
2026 b, 0-or-1 JUMP_IF_FALSE L1
2027 b, 1 POP_TOP
2028 b
2029
2030 We are now ready to repeat this sequence for the next
2031 comparison in the chain.
2032
2033 For the last we generate:
2034
2035 b <code to load c>
2036 b, c COMPARE_OP
2037 0-or-1
2038
2039 If there were any jumps to L1 (i.e., there was more than one
2040 comparison), we generate:
2041
2042 0-or-1 JUMP_FORWARD L2
2043 L1: b, 0 ROT_TWO
2044 0, b POP_TOP
2045 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002046 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002047 ****************************************************************/
2048
2049 anchor = 0;
2050
2051 for (i = 2; i < NCH(n); i += 2) {
2052 com_expr(c, CHILD(n, i));
2053 if (i+2 < NCH(n)) {
2054 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002055 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002056 com_addbyte(c, ROT_THREE);
2057 }
2058 op = cmp_type(CHILD(n, i-1));
2059 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002060 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002061 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002062 }
2063 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002064 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002065 if (i+2 < NCH(n)) {
2066 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2067 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002068 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002069 }
2070 }
2071
2072 if (anchor) {
2073 int anchor2 = 0;
2074 com_addfwref(c, JUMP_FORWARD, &anchor2);
2075 com_backpatch(c, anchor);
2076 com_addbyte(c, ROT_TWO);
2077 com_addbyte(c, POP_TOP);
2078 com_backpatch(c, anchor2);
2079 }
2080}
2081
2082static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002083com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002084{
2085 REQ(n, not_test); /* 'not' not_test | comparison */
2086 if (NCH(n) == 1) {
2087 com_comparison(c, CHILD(n, 0));
2088 }
2089 else {
2090 com_not_test(c, CHILD(n, 1));
2091 com_addbyte(c, UNARY_NOT);
2092 }
2093}
2094
2095static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002096com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002097{
2098 int i;
2099 int anchor;
2100 REQ(n, and_test); /* not_test ('and' not_test)* */
2101 anchor = 0;
2102 i = 0;
2103 for (;;) {
2104 com_not_test(c, CHILD(n, i));
2105 if ((i += 2) >= NCH(n))
2106 break;
2107 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2108 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002109 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002110 }
2111 if (anchor)
2112 com_backpatch(c, anchor);
2113}
2114
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002115static int
2116com_make_closure(struct compiling *c, PyCodeObject *co)
2117{
2118 int i, free = PyTuple_GET_SIZE(co->co_freevars);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002119 /* If the code is compiled with st->st_nested_scopes == 0,
2120 then no variable will ever be added to co_freevars.
2121 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002122 if (free == 0)
2123 return 0;
2124 for (i = 0; i < free; ++i) {
2125 /* Bypass com_addop_varname because it will generate
2126 LOAD_DEREF but LOAD_CLOSURE is needed.
2127 */
2128 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2129 int arg, reftype;
2130
2131 /* Special case: If a class contains a method with a
2132 free variable that has the same name as a method,
2133 the name will be considered free *and* local in the
2134 class. It should be handled by the closure, as
2135 well as by the normal name loookup logic.
2136 */
2137 reftype = get_ref_type(c, PyString_AS_STRING(name));
2138 if (reftype == CELL)
2139 arg = com_lookup_arg(c->c_cellvars, name);
2140 else /* (reftype == FREE) */
2141 arg = com_lookup_arg(c->c_freevars, name);
2142 if (arg == -1) {
2143 fprintf(stderr, "lookup %s in %s %d %d\n",
Jeremy Hylton483638c2001-02-01 20:20:45 +00002144 PyObject_REPR(name), c->c_name, reftype, arg);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002145 Py_FatalError("com_make_closure()");
2146 }
2147 com_addoparg(c, LOAD_CLOSURE, arg);
2148
2149 }
2150 com_push(c, free);
2151 return 1;
2152}
2153
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002154static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002155com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002156{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002157 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002158 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002159 PyObject *co;
2160 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002161 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002162 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2163 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002164 co = (PyObject *) icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002165 if (co == NULL) {
2166 c->c_errors++;
2167 return;
2168 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002169 symtable_exit_scope(c->c_symtable);
Tim Peters1e542112001-02-23 22:23:53 +00002170 i = com_addconst(c, co);
2171 closure = com_make_closure(c, (PyCodeObject *)co);
2172 Py_DECREF(co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002173 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002174 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002175 if (closure)
2176 com_addoparg(c, MAKE_CLOSURE, ndefs);
2177 else
2178 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002179 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002180 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002181 else {
2182 int anchor = 0;
2183 int i = 0;
2184 for (;;) {
2185 com_and_test(c, CHILD(n, i));
2186 if ((i += 2) >= NCH(n))
2187 break;
2188 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2189 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002190 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002191 }
2192 if (anchor)
2193 com_backpatch(c, anchor);
2194 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002195}
2196
2197static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002198com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002199{
2200 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002201 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002202 com_node(c, CHILD(n, 0));
2203 }
2204 else {
2205 int i;
2206 int len;
2207 len = (NCH(n) + 1) / 2;
2208 for (i = 0; i < NCH(n); i += 2)
2209 com_node(c, CHILD(n, i));
2210 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002211 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002212 }
2213}
2214
2215
2216/* Begin of assignment compilation */
2217
Thomas Wouters434d0822000-08-24 20:11:32 +00002218
2219static void
2220com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2221{
2222 com_addbyte(c, DUP_TOP);
2223 com_push(c, 1);
2224 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002225 com_node(c, augn);
2226 com_addbyte(c, opcode);
2227 com_pop(c, 1);
2228 com_addbyte(c, ROT_TWO);
2229 com_addopname(c, STORE_ATTR, n);
2230 com_pop(c, 2);
2231}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002232
2233static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002234com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002235{
2236 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002237 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002238}
2239
2240static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002241com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002242{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002243 REQ(n, trailer);
2244 switch (TYPE(CHILD(n, 0))) {
2245 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002246 com_error(c, PyExc_SyntaxError,
2247 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002248 break;
2249 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002250 if (assigning > OP_APPLY)
2251 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2252 else
2253 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002254 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002255 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002256 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002257 break;
2258 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002259 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002260 }
2261}
2262
2263static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002264com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002265{
2266 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002267 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002268 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002269 if (assigning) {
2270 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002271 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002272 com_push(c, i-1);
2273 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002274 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002275 com_assign(c, CHILD(n, i), assigning, NULL);
2276}
2277
2278static void
2279com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2280{
2281 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002282 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002283 com_push(c, 1);
2284 com_node(c, augn);
2285 com_addbyte(c, opcode);
2286 com_pop(c, 1);
2287 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002288}
2289
2290static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002291com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002292{
2293 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002294 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002295 if (assigning)
2296 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002297}
2298
2299static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002300com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002301{
2302 /* Loop to avoid trivial recursion */
2303 for (;;) {
2304 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002305
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002306 case exprlist:
2307 case testlist:
2308 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002309 if (assigning > OP_APPLY) {
2310 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002311 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002312 return;
2313 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002314 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002315 return;
2316 }
2317 n = CHILD(n, 0);
2318 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002319
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002320 case test:
2321 case and_test:
2322 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002323 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002324 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002325 case xor_expr:
2326 case and_expr:
2327 case shift_expr:
2328 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002329 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002330 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002331 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002332 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002333 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002334 return;
2335 }
2336 n = CHILD(n, 0);
2337 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002338
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002339 case power: /* atom trailer* ('**' power)*
2340 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002341 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002342 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002343 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002344 return;
2345 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002346 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002347 int i;
2348 com_node(c, CHILD(n, 0));
2349 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002350 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002351 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002352 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002353 return;
2354 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002355 com_apply_trailer(c, CHILD(n, i));
2356 } /* NB i is still alive */
2357 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002358 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002359 return;
2360 }
2361 n = CHILD(n, 0);
2362 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002363
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002364 case atom:
2365 switch (TYPE(CHILD(n, 0))) {
2366 case LPAR:
2367 n = CHILD(n, 1);
2368 if (TYPE(n) == RPAR) {
2369 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002370 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002371 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002372 return;
2373 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002374 if (assigning > OP_APPLY) {
2375 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002376 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002377 return;
2378 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002379 break;
2380 case LSQB:
2381 n = CHILD(n, 1);
2382 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002383 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002384 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002385 return;
2386 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002387 if (assigning > OP_APPLY) {
2388 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002389 "augmented assign to list not possible");
2390 return;
2391 }
2392 if (NCH(n) > 1
2393 && TYPE(CHILD(n, 1)) == list_for) {
2394 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002395 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002396 return;
2397 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002398 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002399 return;
2400 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002401 if (assigning > OP_APPLY)
2402 com_augassign_name(c, CHILD(n, 0),
2403 assigning, augn);
2404 else
2405 com_assign_name(c, CHILD(n, 0),
2406 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002407 return;
2408 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002409 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002410 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002411 return;
2412 }
2413 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002414
2415 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002416 com_error(c, PyExc_SyntaxError,
2417 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002418 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002419
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002420 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002421 com_error(c, PyExc_SystemError,
2422 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002423 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002424
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002425 }
2426 }
2427}
Guido van Rossum7c531111997-03-11 18:42:21 +00002428
Thomas Wouters434d0822000-08-24 20:11:32 +00002429static void
2430com_augassign(struct compiling *c, node *n)
2431{
2432 int opcode;
2433
2434 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2435 case '+': opcode = INPLACE_ADD; break;
2436 case '-': opcode = INPLACE_SUBTRACT; break;
2437 case '/': opcode = INPLACE_DIVIDE; break;
2438 case '%': opcode = INPLACE_MODULO; break;
2439 case '<': opcode = INPLACE_LSHIFT; break;
2440 case '>': opcode = INPLACE_RSHIFT; break;
2441 case '&': opcode = INPLACE_AND; break;
2442 case '^': opcode = INPLACE_XOR; break;
2443 case '|': opcode = INPLACE_OR; break;
2444 case '*':
2445 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2446 opcode = INPLACE_POWER;
2447 else
2448 opcode = INPLACE_MULTIPLY;
2449 break;
2450 default:
2451 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2452 return;
2453 }
2454 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2455}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002456
2457static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002458com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002459{
Thomas Wouters434d0822000-08-24 20:11:32 +00002460 REQ(n, expr_stmt);
2461 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002462 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002463 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002464 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002465 if (NCH(n) == 1) {
2466 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002467 if (c->c_interactive)
2468 com_addbyte(c, PRINT_EXPR);
2469 else
2470 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002471 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002472 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002473 else if (TYPE(CHILD(n,1)) == augassign)
2474 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002475 else {
2476 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002477 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002478 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002479 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002480 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002481 com_push(c, 1);
2482 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002483 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002484 }
2485 }
2486}
2487
2488static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002489com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002490{
2491 int a = 0, b = 0;
2492 int i;
2493 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2494 /* Generate code like for
2495
2496 if __debug__:
2497 if not <test>:
2498 raise AssertionError [, <message>]
2499
2500 where <message> is the second test, if present.
2501 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002502
Guido van Rossum228d7f31997-04-02 05:24:36 +00002503 if (Py_OptimizeFlag)
2504 return;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002505 com_addop_name(c, LOAD_GLOBAL, "__debug__");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002506 com_push(c, 1);
2507 com_addfwref(c, JUMP_IF_FALSE, &a);
2508 com_addbyte(c, POP_TOP);
2509 com_pop(c, 1);
2510 com_node(c, CHILD(n, 1));
2511 com_addfwref(c, JUMP_IF_TRUE, &b);
2512 com_addbyte(c, POP_TOP);
2513 com_pop(c, 1);
2514 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002515 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002516 com_push(c, 1);
2517 i = NCH(n)/2; /* Either 2 or 4 */
2518 if (i > 1)
2519 com_node(c, CHILD(n, 3));
2520 com_addoparg(c, RAISE_VARARGS, i);
2521 com_pop(c, i);
2522 /* The interpreter does not fall through */
2523 /* All jumps converge here */
2524 com_backpatch(c, a);
2525 com_backpatch(c, b);
2526 com_addbyte(c, POP_TOP);
2527}
2528
2529static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002530com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002531{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002532 int i = 1;
2533 node* stream = NULL;
2534
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002535 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002536
2537 /* are we using the extended print form? */
2538 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2539 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002540 com_node(c, stream);
2541 /* stack: [...] => [... stream] */
2542 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002543 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2544 i = 4;
2545 else
2546 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002547 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002548 for (; i < NCH(n); i += 2) {
2549 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002550 com_addbyte(c, DUP_TOP);
2551 /* stack: [stream] => [stream stream] */
2552 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002553 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002554 /* stack: [stream stream] => [stream stream obj] */
2555 com_addbyte(c, ROT_TWO);
2556 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002557 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002558 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002559 com_pop(c, 2);
2560 }
2561 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002562 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002563 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002564 com_addbyte(c, PRINT_ITEM);
2565 com_pop(c, 1);
2566 }
2567 }
2568 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002569 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002570 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002571 /* must pop the extra stream object off the stack */
2572 com_addbyte(c, POP_TOP);
2573 /* stack: [... stream] => [...] */
2574 com_pop(c, 1);
2575 }
2576 }
2577 else {
2578 if (stream != NULL) {
2579 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002580 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002581 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002582 com_pop(c, 1);
2583 }
2584 else
2585 com_addbyte(c, PRINT_NEWLINE);
2586 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002587}
2588
2589static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002590com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002591{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002592 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002593 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002594 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002595 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002596 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002597 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002598 com_push(c, 1);
2599 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002600 else
2601 com_node(c, CHILD(n, 1));
2602 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002603 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002604}
2605
2606static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002607com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002608{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002609 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002610 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2611 if (NCH(n) > 1) {
2612 com_node(c, CHILD(n, 1));
2613 if (NCH(n) > 3) {
2614 com_node(c, CHILD(n, 3));
2615 if (NCH(n) > 5)
2616 com_node(c, CHILD(n, 5));
2617 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002618 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002619 i = NCH(n)/2;
2620 com_addoparg(c, RAISE_VARARGS, i);
2621 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002622}
2623
2624static void
Thomas Wouters52152252000-08-17 22:55:00 +00002625com_from_import(struct compiling *c, node *n)
2626{
2627 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2628 com_push(c, 1);
2629 if (NCH(n) > 1) {
2630 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2631 com_error(c, PyExc_SyntaxError, "invalid syntax");
2632 return;
2633 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002634 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002635 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002636 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00002637 com_pop(c, 1);
2638}
2639
2640static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002641com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002642{
2643 int i;
2644 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002645 /* 'import' dotted_name (',' dotted_name)* |
2646 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002647 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00002648 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002649 /* 'from' dotted_name 'import' ... */
2650 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002651
2652 if (TYPE(CHILD(n, 3)) == STAR) {
2653 tup = Py_BuildValue("(s)", "*");
2654 } else {
2655 tup = PyTuple_New((NCH(n) - 2)/2);
2656 for (i = 3; i < NCH(n); i += 2) {
2657 PyTuple_SET_ITEM(tup, (i-3)/2,
2658 PyString_FromString(STR(
2659 CHILD(CHILD(n, i), 0))));
2660 }
2661 }
2662 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00002663 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002664 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002665 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00002666 if (TYPE(CHILD(n, 3)) == STAR)
2667 com_addbyte(c, IMPORT_STAR);
2668 else {
2669 for (i = 3; i < NCH(n); i += 2)
2670 com_from_import(c, CHILD(n, i));
2671 com_addbyte(c, POP_TOP);
2672 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002673 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002674 }
2675 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002676 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002677 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00002678 node *subn = CHILD(n, i);
2679 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002680 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002681 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002682 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00002683 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00002684 int j;
2685 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00002686 com_error(c, PyExc_SyntaxError,
2687 "invalid syntax");
2688 return;
2689 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00002690 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
2691 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002692 CHILD(CHILD(subn, 0),
2693 j));
2694 com_addop_varname(c, VAR_STORE,
2695 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002696 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002697 com_addop_varname(c, VAR_STORE,
2698 STR(CHILD(CHILD(subn, 0),
2699 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002700 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002701 }
2702 }
2703}
2704
2705static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002706com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002707{
2708 REQ(n, exec_stmt);
2709 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2710 com_node(c, CHILD(n, 1));
2711 if (NCH(n) >= 4)
2712 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002713 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002714 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002715 com_push(c, 1);
2716 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002717 if (NCH(n) >= 6)
2718 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002719 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002720 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002721 com_push(c, 1);
2722 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002723 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002724 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002725}
2726
Guido van Rossum7c531111997-03-11 18:42:21 +00002727static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002728is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002729{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002730 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002731 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002732 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00002733
2734 /* Label to avoid tail recursion */
2735 next:
2736 switch (TYPE(n)) {
2737
2738 case suite:
2739 if (NCH(n) == 1) {
2740 n = CHILD(n, 0);
2741 goto next;
2742 }
2743 /* Fall through */
2744 case file_input:
2745 for (i = 0; i < NCH(n); i++) {
2746 node *ch = CHILD(n, i);
2747 if (TYPE(ch) == stmt) {
2748 n = ch;
2749 goto next;
2750 }
2751 }
2752 break;
2753
2754 case stmt:
2755 case simple_stmt:
2756 case small_stmt:
2757 n = CHILD(n, 0);
2758 goto next;
2759
2760 case expr_stmt:
2761 case testlist:
2762 case test:
2763 case and_test:
2764 case not_test:
2765 case comparison:
2766 case expr:
2767 case xor_expr:
2768 case and_expr:
2769 case shift_expr:
2770 case arith_expr:
2771 case term:
2772 case factor:
2773 case power:
2774 case atom:
2775 if (NCH(n) == 1) {
2776 n = CHILD(n, 0);
2777 goto next;
2778 }
2779 break;
2780
2781 case NAME:
2782 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2783 return 1;
2784 break;
2785
2786 case NUMBER:
2787 v = parsenumber(c, STR(n));
2788 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002789 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002790 break;
2791 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002792 i = PyObject_IsTrue(v);
2793 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002794 return i == 0;
2795
2796 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002797 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002798 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002799 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002800 break;
2801 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002802 i = PyObject_IsTrue(v);
2803 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002804 return i == 0;
2805
2806 }
2807 return 0;
2808}
2809
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002810static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002811com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002812{
2813 int i;
2814 int anchor = 0;
2815 REQ(n, if_stmt);
2816 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2817 for (i = 0; i+3 < NCH(n); i+=4) {
2818 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002819 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002820 if (is_constant_false(c, ch))
2821 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002822 if (i > 0)
2823 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002824 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002825 com_addfwref(c, JUMP_IF_FALSE, &a);
2826 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002827 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002828 com_node(c, CHILD(n, i+3));
2829 com_addfwref(c, JUMP_FORWARD, &anchor);
2830 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002831 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002832 com_addbyte(c, POP_TOP);
2833 }
2834 if (i+2 < NCH(n))
2835 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002836 if (anchor)
2837 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002838}
2839
2840static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002841com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002842{
2843 int break_anchor = 0;
2844 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002845 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002846 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2847 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002848 block_push(c, SETUP_LOOP);
2849 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002850 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002851 com_node(c, CHILD(n, 1));
2852 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2853 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002854 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002855 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002856 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002857 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002858 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2859 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002860 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002861 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002862 com_addbyte(c, POP_TOP);
2863 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002864 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002865 if (NCH(n) > 4)
2866 com_node(c, CHILD(n, 6));
2867 com_backpatch(c, break_anchor);
2868}
2869
2870static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002871com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002872{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002873 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002874 int break_anchor = 0;
2875 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002876 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002877 REQ(n, for_stmt);
2878 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2879 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002880 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002881 com_node(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002882 v = PyInt_FromLong(0L);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002883 if (v == NULL)
2884 c->c_errors++;
2885 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002886 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002887 Py_XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002888 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002889 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002890 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002891 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00002892 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002893 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002894 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002895 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002896 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2897 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002898 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002899 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002900 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002901 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002902 if (NCH(n) > 8)
2903 com_node(c, CHILD(n, 8));
2904 com_backpatch(c, break_anchor);
2905}
2906
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002907/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002908
2909 SETUP_FINALLY L
2910 <code for S>
2911 POP_BLOCK
2912 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002913 L: <code for Sf>
2914 END_FINALLY
2915
2916 The special instructions use the block stack. Each block
2917 stack entry contains the instruction that created it (here
2918 SETUP_FINALLY), the level of the value stack at the time the
2919 block stack entry was created, and a label (here L).
2920
2921 SETUP_FINALLY:
2922 Pushes the current value stack level and the label
2923 onto the block stack.
2924 POP_BLOCK:
2925 Pops en entry from the block stack, and pops the value
2926 stack until its level is the same as indicated on the
2927 block stack. (The label is ignored.)
2928 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002929 Pops a variable number of entries from the *value* stack
2930 and re-raises the exception they specify. The number of
2931 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002932
2933 The block stack is unwound when an exception is raised:
2934 when a SETUP_FINALLY entry is found, the exception is pushed
2935 onto the value stack (and the exception condition is cleared),
2936 and the interpreter jumps to the label gotten from the block
2937 stack.
2938
2939 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002940 (The contents of the value stack is shown in [], with the top
2941 at the right; 'tb' is trace-back info, 'val' the exception's
2942 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002943
2944 Value stack Label Instruction Argument
2945 [] SETUP_EXCEPT L1
2946 [] <code for S>
2947 [] POP_BLOCK
2948 [] JUMP_FORWARD L0
2949
Guido van Rossum3f5da241990-12-20 15:06:42 +00002950 [tb, val, exc] L1: DUP )
2951 [tb, val, exc, exc] <evaluate E1> )
2952 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2953 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2954 [tb, val, exc, 1] POP )
2955 [tb, val, exc] POP
2956 [tb, val] <assign to V1> (or POP if no V1)
2957 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002958 [] <code for S1>
2959 JUMP_FORWARD L0
2960
Guido van Rossum3f5da241990-12-20 15:06:42 +00002961 [tb, val, exc, 0] L2: POP
2962 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002963 .............................etc.......................
2964
Guido van Rossum3f5da241990-12-20 15:06:42 +00002965 [tb, val, exc, 0] Ln+1: POP
2966 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002967
2968 [] L0: <next statement>
2969
2970 Of course, parts are not generated if Vi or Ei is not present.
2971*/
2972
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002973static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002974com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002975{
2976 int except_anchor = 0;
2977 int end_anchor = 0;
2978 int else_anchor = 0;
2979 int i;
2980 node *ch;
2981
2982 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2983 block_push(c, SETUP_EXCEPT);
2984 com_node(c, CHILD(n, 2));
2985 com_addbyte(c, POP_BLOCK);
2986 block_pop(c, SETUP_EXCEPT);
2987 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2988 com_backpatch(c, except_anchor);
2989 for (i = 3;
2990 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2991 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002992 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002993 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002994 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002995 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002996 break;
2997 }
2998 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002999 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003000 com_addoparg(c, SET_LINENO, ch->n_lineno);
3001 if (NCH(ch) > 1) {
3002 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003003 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003004 com_node(c, CHILD(ch, 1));
3005 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003006 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003007 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3008 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003009 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003010 }
3011 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003012 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003013 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003014 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003015 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003016 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003017 com_pop(c, 1);
3018 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003019 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003020 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003021 com_node(c, CHILD(n, i+2));
3022 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3023 if (except_anchor) {
3024 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003025 /* We come in with [tb, val, exc, 0] on the
3026 stack; one pop and it's the same as
3027 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003028 com_addbyte(c, POP_TOP);
3029 }
3030 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003031 /* We actually come in here with [tb, val, exc] but the
3032 END_FINALLY will zap those and jump around.
3033 The c_stacklevel does not reflect them so we need not pop
3034 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003035 com_addbyte(c, END_FINALLY);
3036 com_backpatch(c, else_anchor);
3037 if (i < NCH(n))
3038 com_node(c, CHILD(n, i+2));
3039 com_backpatch(c, end_anchor);
3040}
3041
3042static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003043com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003044{
3045 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003046 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003047
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003048 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3049 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003050 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003051 com_addbyte(c, POP_BLOCK);
3052 block_pop(c, SETUP_FINALLY);
3053 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003054 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003055 /* While the generated code pushes only one item,
3056 the try-finally handling can enter here with
3057 up to three items. OK, here are the details:
3058 3 for an exception, 2 for RETURN, 1 for BREAK. */
3059 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003060 com_backpatch(c, finally_anchor);
3061 ch = CHILD(n, NCH(n)-1);
3062 com_addoparg(c, SET_LINENO, ch->n_lineno);
3063 com_node(c, ch);
3064 com_addbyte(c, END_FINALLY);
3065 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003066 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003067}
3068
3069static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003070com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003071{
3072 REQ(n, try_stmt);
3073 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3074 | 'try' ':' suite 'finally' ':' suite */
3075 if (TYPE(CHILD(n, 3)) != except_clause)
3076 com_try_finally(c, n);
3077 else
3078 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003079}
3080
Guido van Rossum8b993a91997-01-17 21:04:03 +00003081static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003082get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003083{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003084 int i;
3085
Guido van Rossum8b993a91997-01-17 21:04:03 +00003086 /* Label to avoid tail recursion */
3087 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003088 switch (TYPE(n)) {
3089
3090 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003091 if (NCH(n) == 1) {
3092 n = CHILD(n, 0);
3093 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003094 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003095 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003096 case file_input:
3097 for (i = 0; i < NCH(n); i++) {
3098 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003099 if (TYPE(ch) == stmt) {
3100 n = ch;
3101 goto next;
3102 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003103 }
3104 break;
3105
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003106 case stmt:
3107 case simple_stmt:
3108 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003109 n = CHILD(n, 0);
3110 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003111
3112 case expr_stmt:
3113 case testlist:
3114 case test:
3115 case and_test:
3116 case not_test:
3117 case comparison:
3118 case expr:
3119 case xor_expr:
3120 case and_expr:
3121 case shift_expr:
3122 case arith_expr:
3123 case term:
3124 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003125 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003126 if (NCH(n) == 1) {
3127 n = CHILD(n, 0);
3128 goto next;
3129 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003130 break;
3131
3132 case atom:
3133 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003134 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003135 break;
3136
3137 }
3138 return NULL;
3139}
3140
Guido van Rossum79f25d91997-04-29 20:08:16 +00003141static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003142get_docstring(node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003143{
Guido van Rossum541563e1999-01-28 15:08:09 +00003144 /* Don't generate doc-strings if run with -OO */
3145 if (Py_OptimizeFlag > 1)
3146 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003147 n = get_rawdocstring(n);
3148 if (n == NULL)
3149 return NULL;
3150 return parsestrplus(n);
3151}
3152
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003153static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003154com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003155{
3156 REQ(n, suite);
3157 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3158 if (NCH(n) == 1) {
3159 com_node(c, CHILD(n, 0));
3160 }
3161 else {
3162 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003163 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003164 node *ch = CHILD(n, i);
3165 if (TYPE(ch) == stmt)
3166 com_node(c, ch);
3167 }
3168 }
3169}
3170
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003171/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003172static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003173com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003174{
3175 int i = c->c_nblocks;
3176 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3177 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3178 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003179 else if (i <= 0) {
3180 /* at the outer level */
3181 com_error(c, PyExc_SyntaxError,
3182 "'continue' not properly in loop");
3183 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003184 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003185 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003186 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003187 if (c->c_block[j] == SETUP_LOOP)
3188 break;
3189 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003190 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003191 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003192 for (; i > j; --i) {
3193 if (c->c_block[i] == SETUP_EXCEPT ||
3194 c->c_block[i] == SETUP_FINALLY) {
3195 com_addoparg(c, CONTINUE_LOOP,
3196 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003197 return;
3198 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003199 if (c->c_block[i] == END_FINALLY) {
3200 com_error(c, PyExc_SyntaxError,
3201 "'continue' not supported inside 'finally' clause");
3202 return;
3203 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003204 }
3205 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003206 com_error(c, PyExc_SyntaxError,
3207 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003208 }
3209 /* XXX Could allow it inside a 'finally' clause
3210 XXX if we could pop the exception still on the stack */
3211}
3212
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003213static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003214com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003215{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003216 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003217 if (TYPE(n) == lambdef) {
3218 /* lambdef: 'lambda' [varargslist] ':' test */
3219 n = CHILD(n, 1);
3220 }
3221 else {
3222 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3223 n = CHILD(n, 2);
3224 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3225 n = CHILD(n, 1);
3226 }
3227 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003228 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003229 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003230 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003231 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3232 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003233 nargs = 0;
3234 ndefs = 0;
3235 for (i = 0; i < nch; i++) {
3236 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003237 if (TYPE(CHILD(n, i)) == STAR ||
3238 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003239 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003240 nargs++;
3241 i++;
3242 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003243 t = RPAR; /* Anything except EQUAL or COMMA */
3244 else
3245 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003246 if (t == EQUAL) {
3247 i++;
3248 ndefs++;
3249 com_node(c, CHILD(n, i));
3250 i++;
3251 if (i >= nch)
3252 break;
3253 t = TYPE(CHILD(n, i));
3254 }
3255 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003256 /* Treat "(a=1, b)" as an error */
3257 if (ndefs)
3258 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003259 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003260 }
3261 if (t != COMMA)
3262 break;
3263 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003264 return ndefs;
3265}
3266
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003267static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003268com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003269{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003270 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003271 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003272 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003273 ndefs = com_argdefs(c, n);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003274 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3275 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003276 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003277 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003278 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003279 c->c_errors++;
3280 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003281 int closure = com_make_closure(c, (PyCodeObject *)co);
3282 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003283 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003284 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003285 if (closure)
3286 com_addoparg(c, MAKE_CLOSURE, ndefs);
3287 else
3288 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003289 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003290 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003291 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003292 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003293 }
3294}
3295
3296static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003297com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003298{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003299 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003300 REQ(n, testlist);
3301 /* testlist: test (',' test)* [','] */
3302 for (i = 0; i < NCH(n); i += 2)
3303 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003304 i = (NCH(n)+1) / 2;
3305 com_addoparg(c, BUILD_TUPLE, i);
3306 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003307}
3308
3309static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003310com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003311{
Guido van Rossum25831651993-05-19 14:50:45 +00003312 int i;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003313 PyObject *co, *v;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003314 char *name;
3315
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003316 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003317 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003318 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003319 c->c_errors++;
3320 return;
3321 }
3322 /* Push the class name on the stack */
3323 i = com_addconst(c, v);
3324 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003325 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003326 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003327 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003328 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003329 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003330 com_push(c, 1);
3331 }
Guido van Rossum25831651993-05-19 14:50:45 +00003332 else
3333 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003334 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003335 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003336 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003337 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003338 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003339 c->c_errors++;
3340 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003341 int closure = com_make_closure(c, (PyCodeObject *)co);
3342 i = com_addconst(c, co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003343 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003344 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003345 if (closure)
3346 com_addoparg(c, MAKE_CLOSURE, 0);
3347 else
3348 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003349 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003350 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003351 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003352 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003353 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003354 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003355}
3356
3357static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003358com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003359{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003360 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003361 if (c->c_errors)
3362 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003363 switch (TYPE(n)) {
3364
3365 /* Definition nodes */
3366
3367 case funcdef:
3368 com_funcdef(c, n);
3369 break;
3370 case classdef:
3371 com_classdef(c, n);
3372 break;
3373
3374 /* Trivial parse tree nodes */
3375
3376 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003377 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003378 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003379 n = CHILD(n, 0);
3380 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003381
3382 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003383 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
3384 com_addoparg(c, SET_LINENO, n->n_lineno);
3385 {
3386 int i;
3387 for (i = 0; i < NCH(n)-1; i += 2)
3388 com_node(c, CHILD(n, i));
3389 }
3390 break;
3391
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003392 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003393 com_addoparg(c, SET_LINENO, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003394 n = CHILD(n, 0);
3395 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003396
3397 /* Statement nodes */
3398
3399 case expr_stmt:
3400 com_expr_stmt(c, n);
3401 break;
3402 case print_stmt:
3403 com_print_stmt(c, n);
3404 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003405 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003406 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003407 break;
3408 case pass_stmt:
3409 break;
3410 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003411 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003412 com_error(c, PyExc_SyntaxError,
3413 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003414 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003415 com_addbyte(c, BREAK_LOOP);
3416 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003417 case continue_stmt:
3418 com_continue_stmt(c, n);
3419 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003420 case return_stmt:
3421 com_return_stmt(c, n);
3422 break;
3423 case raise_stmt:
3424 com_raise_stmt(c, n);
3425 break;
3426 case import_stmt:
3427 com_import_stmt(c, n);
3428 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003429 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003430 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003431 case exec_stmt:
3432 com_exec_stmt(c, n);
3433 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003434 case assert_stmt:
3435 com_assert_stmt(c, n);
3436 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003437 case if_stmt:
3438 com_if_stmt(c, n);
3439 break;
3440 case while_stmt:
3441 com_while_stmt(c, n);
3442 break;
3443 case for_stmt:
3444 com_for_stmt(c, n);
3445 break;
3446 case try_stmt:
3447 com_try_stmt(c, n);
3448 break;
3449 case suite:
3450 com_suite(c, n);
3451 break;
3452
3453 /* Expression nodes */
3454
3455 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003456 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003457 break;
3458 case test:
3459 com_test(c, n);
3460 break;
3461 case and_test:
3462 com_and_test(c, n);
3463 break;
3464 case not_test:
3465 com_not_test(c, n);
3466 break;
3467 case comparison:
3468 com_comparison(c, n);
3469 break;
3470 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003471 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003472 break;
3473 case expr:
3474 com_expr(c, n);
3475 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003476 case xor_expr:
3477 com_xor_expr(c, n);
3478 break;
3479 case and_expr:
3480 com_and_expr(c, n);
3481 break;
3482 case shift_expr:
3483 com_shift_expr(c, n);
3484 break;
3485 case arith_expr:
3486 com_arith_expr(c, n);
3487 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003488 case term:
3489 com_term(c, n);
3490 break;
3491 case factor:
3492 com_factor(c, n);
3493 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003494 case power:
3495 com_power(c, n);
3496 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003497 case atom:
3498 com_atom(c, n);
3499 break;
3500
3501 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003502 com_error(c, PyExc_SystemError,
3503 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003504 }
3505}
3506
Tim Petersdbd9ba62000-07-09 03:09:57 +00003507static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003508
3509static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003510com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003511{
3512 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3513 if (TYPE(CHILD(n, 0)) == LPAR)
3514 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003515 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003516 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003517 com_pop(c, 1);
3518 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003519}
3520
3521static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003522com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003523{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003524 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003525 if (NCH(n) == 1) {
3526 com_fpdef(c, CHILD(n, 0));
3527 }
3528 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003529 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003530 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003531 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003532 for (i = 0; i < NCH(n); i += 2)
3533 com_fpdef(c, CHILD(n, i));
3534 }
3535}
3536
3537static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003538com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003539{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003540 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003541 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003542 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003543 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003544 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003545 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003546 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003547 /* Enter all arguments in table of locals */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003548 for (i = 0, narg = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003549 node *ch = CHILD(n, i);
3550 node *fp;
3551 char *name;
Guido van Rossum50564e81996-01-12 01:13:16 +00003552 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003553 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003554 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3555 fp = CHILD(ch, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003556 if (TYPE(fp) == NAME) {
3557 PyObject *v;
3558 name = STR(fp);
3559 v = PyDict_GetItemString(c->c_cellvars, name);
3560 if (v) {
3561 com_addoparg(c, LOAD_FAST, narg);
3562 com_addoparg(c, STORE_DEREF,
3563 PyInt_AS_LONG(v));
3564 }
3565 } else {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003566 name = nbuf;
3567 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003568 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003569 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003570 narg++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003571 /* all name updates handled by symtable */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003572 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003573 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003574 ch = CHILD(n, i);
3575 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003576 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003577 else
3578 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003579 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003580 /* Handle *arguments */
3581 if (i < nch) {
3582 node *ch;
3583 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003584 if (TYPE(ch) != DOUBLESTAR) {
3585 REQ(ch, STAR);
3586 ch = CHILD(n, i+1);
3587 if (TYPE(ch) == NAME) {
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003588 PyObject *v;
Guido van Rossum50564e81996-01-12 01:13:16 +00003589 i += 3;
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003590 v = PyDict_GetItemString(c->c_cellvars,
3591 STR(ch));
3592 if (v) {
3593 com_addoparg(c, LOAD_FAST, narg);
3594 com_addoparg(c, STORE_DEREF,
3595 PyInt_AS_LONG(v));
Guido van Rossum50564e81996-01-12 01:13:16 +00003596 }
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003597 narg++;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003598 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003599 }
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003600 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003601 /* Handle **keywords */
3602 if (i < nch) {
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003603 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003604 node *ch;
3605 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003606 if (TYPE(ch) != DOUBLESTAR) {
3607 REQ(ch, STAR);
3608 ch = CHILD(n, i+1);
3609 REQ(ch, STAR);
3610 ch = CHILD(n, i+2);
3611 }
3612 else
3613 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003614 REQ(ch, NAME);
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003615 v = PyDict_GetItemString(c->c_cellvars, STR(ch));
3616 if (v) {
3617 com_addoparg(c, LOAD_FAST, narg);
3618 com_addoparg(c, STORE_DEREF, PyInt_AS_LONG(v));
3619 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003620 }
3621 if (complex) {
3622 /* Generate code for complex arguments only after
3623 having counted the simple arguments */
3624 int ilocal = 0;
3625 for (i = 0; i < nch; i++) {
3626 node *ch = CHILD(n, i);
3627 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003628 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003629 break;
3630 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3631 fp = CHILD(ch, 0);
3632 if (TYPE(fp) != NAME) {
3633 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003634 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003635 com_fpdef(c, ch);
3636 }
3637 ilocal++;
3638 if (++i >= nch)
3639 break;
3640 ch = CHILD(n, i);
3641 if (TYPE(ch) == EQUAL)
3642 i += 2;
3643 else
3644 REQ(ch, COMMA);
3645 }
3646 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003647}
3648
3649static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003650com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003651{
3652 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003653 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003654 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003655 doc = get_docstring(n);
3656 if (doc != NULL) {
3657 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003658 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003659 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003660 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003661 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003662 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003663 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003664 for (i = 0; i < NCH(n); i++) {
3665 node *ch = CHILD(n, i);
3666 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3667 com_node(c, ch);
3668 }
3669}
3670
3671/* Top-level compile-node interface */
3672
3673static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003674compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003675{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003676 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003677 node *ch;
3678 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003679 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003680 doc = get_docstring(CHILD(n, 4));
3681 if (doc != NULL) {
3682 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003683 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003684 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003685 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003686 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003687 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3688 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003689 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003690 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003691 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003692 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003693 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003694 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003695 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003696 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003697 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003698}
3699
3700static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003701compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003702{
Guido van Rossum590baa41993-11-30 13:40:46 +00003703 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003704 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003705 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003706
3707 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003708 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003709 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003710 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003711 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003712 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003713 else
3714 ch = CHILD(n, 2);
3715 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003716 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003717 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003718}
3719
3720static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003721compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003722{
3723 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003724 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003725 REQ(n, classdef);
3726 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3727 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003728 c->c_private = c->c_name;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003729 ch = CHILD(n, NCH(n)-1); /* The suite */
3730 doc = get_docstring(ch);
3731 if (doc != NULL) {
3732 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003733 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003734 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003735 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003736 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003737 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003738 }
3739 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003740 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003741 com_node(c, ch);
3742 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003743 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003744 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003745 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003746}
3747
3748static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003749compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003750{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003751 com_addoparg(c, SET_LINENO, n->n_lineno);
3752
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003753 switch (TYPE(n)) {
3754
Guido van Rossum4c417781991-01-21 16:09:22 +00003755 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003756 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003757 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003758 n = CHILD(n, 0);
3759 if (TYPE(n) != NEWLINE)
3760 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003761 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003762 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003763 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003764 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003765 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003766 break;
3767
Guido van Rossum4c417781991-01-21 16:09:22 +00003768 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003769 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003770 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003771 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003772 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003773 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003774 break;
3775
Guido van Rossum590baa41993-11-30 13:40:46 +00003776 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003777 com_node(c, CHILD(n, 0));
3778 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003779 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003780 break;
3781
Guido van Rossum590baa41993-11-30 13:40:46 +00003782 case lambdef: /* anonymous function definition */
3783 compile_lambdef(c, n);
3784 break;
3785
Guido van Rossum4c417781991-01-21 16:09:22 +00003786 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003787 compile_funcdef(c, n);
3788 break;
3789
Guido van Rossum4c417781991-01-21 16:09:22 +00003790 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003791 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003792 break;
3793
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003794 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003795 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003796 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003797 }
3798}
3799
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003800static PyObject *
3801dict_keys_inorder(PyObject *dict, int offset)
3802{
3803 PyObject *tuple, *k, *v;
3804 int i, pos = 0, size = PyDict_Size(dict);
3805
3806 tuple = PyTuple_New(size);
3807 if (tuple == NULL)
3808 return NULL;
3809 while (PyDict_Next(dict, &pos, &k, &v)) {
3810 i = PyInt_AS_LONG(v);
3811 Py_INCREF(k);
3812 PyTuple_SET_ITEM(tuple, i - offset, k);
3813 }
3814 return tuple;
3815}
3816
Guido van Rossum79f25d91997-04-29 20:08:16 +00003817PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003818PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003819{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003820 return jcompile(n, filename, NULL);
3821}
3822
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003823struct symtable *
3824PyNode_CompileSymtable(node *n, char *filename)
3825{
3826 struct symtable *st;
3827
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003828 st = symtable_init();
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003829 if (st == NULL)
3830 return NULL;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00003831 assert(st->st_symbols != NULL);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003832 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
3833 if (st->st_errors > 0) {
3834 PySymtable_Free(st);
3835 return NULL;
3836 }
3837 symtable_node(st, n);
3838 if (st->st_errors > 0) {
3839 PySymtable_Free(st);
3840 return NULL;
3841 }
3842 return st;
3843}
3844
Guido van Rossum79f25d91997-04-29 20:08:16 +00003845static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003846icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003847{
3848 return jcompile(n, base->c_filename, base);
3849}
3850
Guido van Rossum79f25d91997-04-29 20:08:16 +00003851static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003852jcompile(node *n, char *filename, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003853{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003854 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003855 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003856 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003857 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003858 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003859 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003860 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003861 /* c_symtable still points to parent's symbols */
3862 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003863 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003864 sc.c_nested = 1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003865 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003866 sc.c_private = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003867 if (symtable_build(&sc, n) < 0) {
3868 com_free(&sc);
3869 return NULL;
3870 }
3871 }
3872 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003873 if (symtable_load_symbols(&sc) < 0) {
3874 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003875 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003876 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003877 compile_node(&sc, n);
3878 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00003879 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003880 PyObject *consts, *names, *varnames, *filename, *name,
3881 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003882 consts = PyList_AsTuple(sc.c_consts);
3883 names = PyList_AsTuple(sc.c_names);
3884 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003885 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
3886 freevars = dict_keys_inorder(sc.c_freevars,
3887 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003888 filename = PyString_InternFromString(sc.c_filename);
3889 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003890 if (!PyErr_Occurred())
3891 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003892 sc.c_nlocals,
3893 sc.c_maxstacklevel,
3894 sc.c_flags,
3895 sc.c_code,
3896 consts,
3897 names,
3898 varnames,
3899 freevars,
3900 cellvars,
3901 filename,
3902 name,
3903 sc.c_firstlineno,
3904 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003905 Py_XDECREF(consts);
3906 Py_XDECREF(names);
3907 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003908 Py_XDECREF(freevars);
3909 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003910 Py_XDECREF(filename);
3911 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003912 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00003913 else if (!PyErr_Occurred()) {
3914 /* This could happen if someone called PyErr_Clear() after an
3915 error was reported above. That's not supposed to happen,
3916 but I just plugged one case and I'm not sure there can't be
3917 others. In that case, raise SystemError so that at least
3918 it gets reported instead dumping core. */
3919 PyErr_SetString(PyExc_SystemError, "lost syntax error");
3920 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003921 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00003922 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003923 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00003924 sc.c_symtable = NULL;
3925 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003926 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003927 return co;
3928}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003929
3930int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003931PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003932{
3933 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003934 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003935 int line = co->co_firstlineno;
3936 int addr = 0;
3937 while (--size >= 0) {
3938 addr += *p++;
3939 if (addr > addrq)
3940 break;
3941 line += *p++;
3942 }
3943 return line;
3944}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003945
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003946/* The test for LOCAL must come before the test for FREE in order to
3947 handle classes where name is both local and free. The local var is
3948 a method and the free var is a free var referenced within a method.
3949*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003950
3951static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003952get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003953{
3954 PyObject *v;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00003955 if (c->c_symtable->st_nested_scopes) {
3956 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
3957 return CELL;
3958 if (PyDict_GetItemString(c->c_locals, name) != NULL)
3959 return LOCAL;
3960 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
3961 return FREE;
3962 v = PyDict_GetItemString(c->c_globals, name);
3963 if (v) {
3964 if (v == Py_None)
3965 return GLOBAL_EXPLICIT;
3966 else {
3967 return GLOBAL_IMPLICIT;
3968 }
3969 }
3970 } else {
3971 if (PyDict_GetItemString(c->c_locals, name) != NULL)
3972 return LOCAL;
3973 v = PyDict_GetItemString(c->c_globals, name);
3974 if (v) {
3975 if (v == Py_None)
3976 return GLOBAL_EXPLICIT;
3977 else {
3978 return GLOBAL_IMPLICIT;
3979 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003980 }
3981 }
3982 {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003983 char buf[350];
3984 sprintf(buf,
3985 "unknown scope for %.100s in %.100s(%s) in %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00003986 name, c->c_name,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003987 PyObject_REPR(c->c_symtable->st_cur->ste_id),
3988 c->c_filename);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003989 Py_FatalError(buf);
3990 }
3991 return -1; /* can't get here */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003992}
3993
3994static int
3995symtable_build(struct compiling *c, node *n)
3996{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003997 if ((c->c_symtable = symtable_init()) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003998 return -1;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00003999 c->c_symtable->st_filename = c->c_filename;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004000 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
4001 if (c->c_symtable->st_errors > 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004002 return -1;
4003 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004004 if (c->c_symtable->st_errors > 0)
4005 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004006 /* reset for second pass */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004007 c->c_symtable->st_nscopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004008 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004009 return 0;
4010}
4011
4012static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004013symtable_init_compiling_symbols(struct compiling *c)
4014{
4015 PyObject *varnames;
4016
4017 varnames = c->c_symtable->st_cur->ste_varnames;
4018 if (varnames == NULL) {
4019 varnames = PyList_New(0);
4020 if (varnames == NULL)
4021 return -1;
4022 c->c_symtable->st_cur->ste_varnames = varnames;
4023 Py_INCREF(varnames);
4024 } else
4025 Py_INCREF(varnames);
4026 c->c_varnames = varnames;
4027
4028 c->c_globals = PyDict_New();
4029 if (c->c_globals == NULL)
4030 return -1;
4031 c->c_freevars = PyDict_New();
4032 if (c->c_freevars == NULL)
4033 return -1;
4034 c->c_cellvars = PyDict_New();
4035 if (c->c_cellvars == NULL)
4036 return -1;
4037 return 0;
4038}
4039
4040struct symbol_info {
4041 int si_nlocals;
4042 int si_ncells;
4043 int si_nfrees;
4044 int si_nimplicit;
4045};
4046
4047static void
4048symtable_init_info(struct symbol_info *si)
4049{
4050 si->si_nlocals = 0;
4051 si->si_ncells = 0;
4052 si->si_nfrees = 0;
4053 si->si_nimplicit = 0;
4054}
4055
4056static int
4057symtable_resolve_free(struct compiling *c, PyObject *name,
4058 struct symbol_info *si)
4059{
4060 PyObject *dict, *v;
4061
4062 /* Seperate logic for DEF_FREE. If it occurs in a function,
4063 it indicates a local that we must allocate storage for (a
4064 cell var). If it occurs in a class, then the class has a
4065 method and a free variable with the same name.
4066 */
4067
4068 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
4069 v = PyInt_FromLong(si->si_ncells++);
4070 dict = c->c_cellvars;
4071 } else {
4072 v = PyInt_FromLong(si->si_nfrees++);
4073 dict = c->c_freevars;
4074 }
4075 if (v == NULL)
4076 return -1;
4077 if (PyDict_SetItem(dict, name, v) < 0) {
4078 Py_DECREF(v);
4079 return -1;
4080 }
4081 Py_DECREF(v);
4082 return 0;
4083}
4084
4085static int
4086symtable_freevar_offsets(PyObject *freevars, int offset)
4087{
4088 PyObject *name, *v;
4089 int pos;
4090
4091 /* The cell vars are the first elements of the closure,
4092 followed by the free vars. Update the offsets in
4093 c_freevars to account for number of cellvars. */
4094 pos = 0;
4095 while (PyDict_Next(freevars, &pos, &name, &v)) {
4096 int i = PyInt_AS_LONG(v) + offset;
4097 PyObject *o = PyInt_FromLong(i);
4098 if (o == NULL)
4099 return -1;
4100 if (PyDict_SetItem(freevars, name, o) < 0) {
4101 Py_DECREF(o);
4102 return -1;
4103 }
4104 Py_DECREF(o);
4105 }
4106 return 0;
4107}
4108
4109static int
4110symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4111 struct symbol_info *si)
4112{
4113 if (ste->ste_type != TYPE_MODULE)
4114 c->c_flags |= CO_NEWLOCALS;
4115 if (ste->ste_type == TYPE_FUNCTION) {
4116 c->c_nlocals = si->si_nlocals;
4117 if (ste->ste_optimized == 0)
4118 c->c_flags |= CO_OPTIMIZED;
4119 else if (si->si_ncells || si->si_nfrees
4120 || (ste->ste_nested && si->si_nimplicit)
4121 || ste->ste_child_free) {
4122 if (c->c_symtable->st_nested_scopes) {
4123 PyErr_Format(PyExc_SyntaxError,
4124 ILLEGAL_DYNAMIC_SCOPE,
4125 PyString_AS_STRING(ste->ste_name));
4126 set_error_location(c->c_symtable->st_filename,
4127 ste->ste_lineno);
4128 return -1;
4129 } else {
4130 char buf[200];
4131 sprintf(buf, ILLEGAL_DYNAMIC_SCOPE,
4132 PyString_AS_STRING(ste->ste_name));
4133 if (PyErr_Warn(PyExc_SyntaxWarning,
4134 buf) < 0) {
4135 return -1;
4136 }
4137 }
4138 }
4139 }
4140 return 0;
4141}
4142
4143static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004144symtable_load_symbols(struct compiling *c)
4145{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004146 static PyObject *implicit = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004147 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004148 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004149 PyObject *name, *varnames, *v;
4150 int i, flags, pos;
4151 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004152
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004153 if (implicit == NULL) {
4154 implicit = PyInt_FromLong(1);
4155 if (implicit == NULL)
4156 return -1;
4157 }
4158 v = NULL;
4159
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004160 if (symtable_init_compiling_symbols(c) < 0)
4161 goto fail;
4162 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004163 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004164 si.si_nlocals = PyList_GET_SIZE(varnames);
4165 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004166
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004167 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004168 v = PyInt_FromLong(i);
4169 if (PyDict_SetItem(c->c_locals,
4170 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004171 goto fail;
4172 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004173 }
4174
4175 /* XXX The cases below define the rules for whether a name is
4176 local or global. The logic could probably be clearer. */
4177 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004178 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4179 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004180
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004181 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004182 /* undo the original DEF_FREE */
4183 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004184
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004185 if ((flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004186 && (flags & (DEF_LOCAL | DEF_PARAM)))
4187 symtable_resolve_free(c, name, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004188
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004189 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004190 c->c_argcount--;
4191 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004192 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004193 c->c_argcount--;
4194 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004195 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004196 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004197 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004198 if (flags & DEF_PARAM) {
4199 PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004200 PyString_AS_STRING(name));
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004201 set_error_location(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004202 ste->ste_lineno);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004203 st->st_errors++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004204 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004205 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004206 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4207 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004208 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004209 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004210 if (PyDict_SetItem(c->c_globals, name, implicit) < 0)
4211 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004212 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004213 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004214 if (v == NULL)
4215 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004216 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004217 goto fail;
4218 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004219 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004220 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004221 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004222 } else if (is_free(flags)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004223 if (ste->ste_nested && st->st_nested_scopes) {
4224 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004225 if (v == NULL)
4226 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004227 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004228 goto fail;
4229 Py_DECREF(v);
4230 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004231 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004232 if (PyDict_SetItem(c->c_globals, name,
4233 implicit) < 0)
4234 goto fail;
4235 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004236 }
4237 }
4238
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004239 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4240 return -1;
4241 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004242 fail:
4243 /* is this always the right thing to do? */
4244 Py_XDECREF(v);
4245 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004246}
4247
4248static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004249symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004250{
4251 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004252
4253 st = (struct symtable *)PyMem_Malloc(sizeof(struct symtable));
4254 if (st == NULL)
4255 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004256 st->st_pass = 1;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004257 st->st_nested_scopes = NESTED_SCOPES_DEFAULT;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004258 st->st_filename = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004259 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004260 goto fail;
4261 if ((st->st_symbols = PyDict_New()) == NULL)
4262 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004263 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004264 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004265 st->st_errors = 0;
4266 st->st_tmpname = 0;
4267 st->st_private = NULL;
4268 return st;
4269 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004270 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004271 return NULL;
4272}
4273
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004274void
4275PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004276{
4277 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004278 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004279 Py_XDECREF(st->st_cur);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004280 PyMem_Free((void *)st);
4281}
4282
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004283/* XXX this code is a placeholder for correct code.
4284 from __future__ import name set language options */
4285
4286static int
4287symtable_check_future(struct symtable *st, node *n)
4288{
4289 int i;
4290 node *name = CHILD(n, 1);
4291
4292 if (strcmp(STR(CHILD(name, 0)), "__future__") != 0)
4293 return 0;
4294 /* It is only legal to define __future__ features at the top
4295 of a module. If the current scope is not the module level
4296 or if there are any symbols defined, it is too late. */
4297 if (st->st_cur->ste_symbols != st->st_global
4298 || PyDict_Size(st->st_cur->ste_symbols) != 0) {
4299 PyErr_SetString(PyExc_SyntaxError,
4300 "imports from __future__ are only legal at the beginning of a module");
4301 return -1;
4302 }
4303 for (i = 3; i < NCH(n); ++i) {
4304 char *feature = STR(CHILD(CHILD(n, i), 0));
4305 /* Do a linear search through the defined features,
4306 assuming there aren't very many of them. */
4307 if (strcmp(feature, FUTURE_NESTED_SCOPES) == 0) {
4308 st->st_nested_scopes = 1;
4309 } else {
4310 PyErr_Format(PyExc_SyntaxError,
4311 UNDEFINED_FUTURE_FEATURE, feature);
4312 set_error_location(st->st_filename,
4313 st->st_cur->ste_lineno);
4314 st->st_errors++;
4315 return -1;
4316 }
4317 }
4318 return 1;
4319}
4320
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004321/* When the compiler exits a scope, it must should update the scope's
4322 free variable information with the list of free variables in its
4323 children.
4324
4325 Variables that are free in children and defined in the current
4326 scope are cellvars.
4327
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004328 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004329 false), free variables in children that are not defined here are
4330 implicit globals.
4331
4332*/
4333
4334static int
4335symtable_update_free_vars(struct symtable *st)
4336{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004337 int i, j, def;
4338 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004339 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004340
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004341 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004342 def = DEF_FREE_CLASS;
4343 else
4344 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004345 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004346 int pos = 0;
4347
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004348 if (list)
4349 PyList_SetSlice(list, 0,
4350 ((PyVarObject*)list)->ob_size, 0);
Barry Warsaw0372af72001-02-23 18:22:59 +00004351 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004352 PyList_GET_ITEM(ste->ste_children, i);
4353 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004354 int v = PyInt_AS_LONG(o);
4355 if (!(is_free(v)))
4356 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004357 if (list == NULL) {
4358 list = PyList_New(0);
4359 if (list == NULL)
4360 return -1;
4361 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004362 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004363 if (PyList_Append(list, name) < 0) {
4364 Py_DECREF(list);
4365 return -1;
4366 }
4367 }
4368 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
4369 name = PyList_GET_ITEM(list, j);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004370 if (ste->ste_nested) {
4371 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004372 name, def) < 0) {
4373 Py_DECREF(list);
4374 return -1;
4375 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004376 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004377 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004378 name) < 0) {
4379 Py_DECREF(list);
4380 return -1;
4381 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004382 }
4383 }
4384 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004385
4386 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004387 return 0;
4388}
4389
4390/* If the current scope is a non-nested class or if name is not
4391 defined in the current, non-nested scope, then it is an implicit
4392 global in all nested scopes.
4393*/
4394
4395static int
4396symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
4397{
4398 PyObject *o;
4399 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004400 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004401
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004402 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004403 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004404 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004405 if (o == NULL)
4406 return symtable_undo_free(st, child, name);
4407 v = PyInt_AS_LONG(o);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004408 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004409 return symtable_undo_free(st, child, name);
4410 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004411 return symtable_add_def_o(st, ste->ste_symbols,
4412 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004413}
4414
4415static int
4416symtable_undo_free(struct symtable *st, PyObject *id,
4417 PyObject *name)
4418{
4419 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004420 PyObject *info;
4421 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004422
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004423 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
4424 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004425 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004426 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004427 if (info == NULL)
4428 return 0;
4429 v = PyInt_AS_LONG(info);
4430 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004431 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004432 DEF_FREE_GLOBAL) < 0)
4433 return -1;
4434 } else
4435 /* If the name is defined here or declared global,
4436 then the recursion stops. */
4437 return 0;
4438
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004439 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
4440 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00004441 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004442 PyList_GET_ITEM(ste->ste_children, i);
4443 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004444 if (x < 0)
4445 return x;
4446 }
4447 return 0;
4448}
4449
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004450/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
4451 This reference is released when the scope is exited, via the DECREF
4452 in symtable_exit_scope().
4453*/
4454
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004455static int
4456symtable_exit_scope(struct symtable *st)
4457{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004458 int end;
4459
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004460 if (st->st_pass == 1 && st->st_nested_scopes)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004461 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004462 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004463 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004464 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
4465 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004466 if (PySequence_DelItem(st->st_stack, end) < 0)
4467 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004468 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004469}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004470
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004471static void
4472symtable_enter_scope(struct symtable *st, char *name, int type,
4473 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004474{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004475 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004476
4477 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004478 prev = st->st_cur;
4479 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
4480 Py_DECREF(st->st_cur);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004481 st->st_errors++;
4482 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004483 }
4484 }
Barry Warsaw0372af72001-02-23 18:22:59 +00004485 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004486 PySymtableEntry_New(st, name, type, lineno);
4487 if (strcmp(name, TOP) == 0)
4488 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004489 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004490 if (PyList_Append(prev->ste_children,
4491 (PyObject *)st->st_cur) < 0)
4492 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004493 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004494}
4495
4496static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004497symtable_lookup(struct symtable *st, char *name)
4498{
4499 char buffer[MANGLE_LEN];
4500 PyObject *v;
4501 int flags;
4502
4503 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
4504 name = buffer;
4505 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
4506 if (v == NULL) {
4507 if (PyErr_Occurred())
4508 return -1;
4509 else
4510 return 0;
4511 }
4512
4513 flags = PyInt_AS_LONG(v);
4514 return flags;
4515}
4516
4517static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004518symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004519{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004520 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004521 char buffer[MANGLE_LEN];
4522
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004523 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004524 name = buffer;
4525 if ((s = PyString_InternFromString(name)) == NULL)
4526 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004527 return symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004528}
4529
4530/* Must only be called with mangled names */
4531
4532static int
4533symtable_add_def_o(struct symtable *st, PyObject *dict,
4534 PyObject *name, int flag)
4535{
4536 PyObject *o;
4537 int val;
4538
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004539 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004540 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004541 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004542 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00004543 PyString_AsString(name));
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004544 set_error_location(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004545 st->st_cur->ste_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004546 return -1;
4547 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004548 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004549 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004550 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004551 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004552 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004553 Py_DECREF(o);
4554 return -1;
4555 }
4556 Py_DECREF(o);
4557
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004558 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004559 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004560 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004561 } else if (flag & DEF_GLOBAL) {
4562 /* XXX need to update DEF_GLOBAL for other flags too;
4563 perhaps only DEF_FREE_GLOBAL */
4564 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004565 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004566 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004567 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004568 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004569 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004570 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004571 Py_DECREF(o);
4572 return -1;
4573 }
4574 Py_DECREF(o);
4575 }
4576 return 0;
4577}
4578
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004579#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004580
4581static void
4582symtable_node(struct symtable *st, node *n)
4583{
4584 int i, start = 0;
4585
4586 loop:
4587 switch (TYPE(n)) {
4588 case funcdef: {
4589 char *func_name = STR(CHILD(n, 1));
4590 symtable_add_def(st, func_name, DEF_LOCAL);
4591 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004592 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004593 symtable_funcdef(st, n);
4594 symtable_exit_scope(st);
4595 break;
4596 }
4597 case lambdef:
4598 if (NCH(n) == 4)
4599 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004600 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004601 symtable_funcdef(st, n);
4602 symtable_exit_scope(st);
4603 break;
4604 case classdef: {
4605 char *tmp, *class_name = STR(CHILD(n, 1));
4606 symtable_add_def(st, class_name, DEF_LOCAL);
4607 if (TYPE(CHILD(n, 2)) == LPAR) {
4608 node *bases = CHILD(n, 3);
4609 int i;
4610 for (i = 0; i < NCH(bases); i += 2) {
4611 symtable_node(st, CHILD(bases, i));
4612 }
4613 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004614 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004615 tmp = st->st_private;
4616 st->st_private = class_name;
4617 symtable_node(st, CHILD(n, NCH(n) - 1));
4618 st->st_private = tmp;
4619 symtable_exit_scope(st);
4620 break;
4621 }
4622 case if_stmt:
4623 for (i = 0; i + 3 < NCH(n); i += 4) {
4624 if (is_constant_false(NULL, (CHILD(n, i + 1))))
4625 continue;
4626 symtable_node(st, CHILD(n, i + 1));
4627 symtable_node(st, CHILD(n, i + 3));
4628 }
4629 if (i + 2 < NCH(n))
4630 symtable_node(st, CHILD(n, i + 2));
4631 break;
4632 case global_stmt:
4633 symtable_global(st, n);
4634 break;
4635 case import_stmt:
4636 symtable_import(st, n);
4637 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004638 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004639 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004640 symtable_node(st, CHILD(n, 1));
4641 if (NCH(n) > 2)
4642 symtable_node(st, CHILD(n, 3));
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004643 else
4644 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004645 if (NCH(n) > 4)
4646 symtable_node(st, CHILD(n, 5));
4647 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004648
4649 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00004650 case assert_stmt:
4651 if (Py_OptimizeFlag)
4652 return;
4653 if (NCH(n) == 2) {
4654 n = CHILD(n, 1);
4655 goto loop;
4656 } else {
4657 symtable_node(st, CHILD(n, 1));
4658 n = CHILD(n, 3);
4659 goto loop;
4660 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004661 case except_clause:
4662 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004663 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004664 if (NCH(n) > 1) {
4665 n = CHILD(n, 1);
4666 goto loop;
4667 }
4668 break;
4669 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004670 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004671 break;
4672 case expr_stmt:
4673 if (NCH(n) == 1)
4674 n = CHILD(n, 0);
4675 else {
4676 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004677 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004678 symtable_node(st, CHILD(n, 2));
4679 break;
4680 } else {
4681 int i;
4682 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004683 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004684 n = CHILD(n, NCH(n) - 1);
4685 }
4686 }
4687 goto loop;
4688 /* watchout for fall-through logic below */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004689 case argument:
4690 if (NCH(n) == 3) {
4691 n = CHILD(n, 2);
4692 goto loop;
4693 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004694 case listmaker:
4695 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
4696 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton5f827f42001-01-23 01:26:20 +00004697 n = CHILD(n, 0);
4698 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004699 }
4700 case atom:
4701 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
4702 symtable_add_use(st, STR(CHILD(n, 0)));
4703 break;
4704 }
4705 case for_stmt:
4706 if (TYPE(n) == for_stmt) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004707 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004708 start = 3;
4709 }
4710 default:
4711 if (NCH(n) == 1) {
4712 n = CHILD(n, 0);
4713 goto loop;
4714 }
4715 for (i = start; i < NCH(n); ++i)
4716 if (TYPE(CHILD(n, i)) >= single_input)
4717 symtable_node(st, CHILD(n, i));
4718 }
4719}
4720
4721static void
4722symtable_funcdef(struct symtable *st, node *n)
4723{
4724 node *body;
4725
4726 if (TYPE(n) == lambdef) {
4727 if (NCH(n) == 4)
4728 symtable_params(st, CHILD(n, 1));
4729 } else
4730 symtable_params(st, CHILD(n, 2));
4731 body = CHILD(n, NCH(n) - 1);
4732 symtable_node(st, body);
4733}
4734
4735/* The next two functions parse the argument tuple.
4736 symtable_default_arg() checks for names in the default arguments,
4737 which are references in the defining scope. symtable_params()
4738 parses the parameter names, which are defined in the function's
4739 body.
4740
4741 varargslist:
4742 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
4743 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
4744*/
4745
4746static void
4747symtable_default_args(struct symtable *st, node *n)
4748{
4749 node *c;
4750 int i;
4751
4752 if (TYPE(n) == parameters) {
4753 n = CHILD(n, 1);
4754 if (TYPE(n) == RPAR)
4755 return;
4756 }
4757 REQ(n, varargslist);
4758 for (i = 0; i < NCH(n); i += 2) {
4759 c = CHILD(n, i);
4760 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
4761 break;
4762 }
4763 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
4764 symtable_node(st, CHILD(n, i));
4765 }
4766}
4767
4768static void
4769symtable_params(struct symtable *st, node *n)
4770{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004771 int i, complex = -1, ext = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004772 node *c = NULL;
4773
4774 if (TYPE(n) == parameters) {
4775 n = CHILD(n, 1);
4776 if (TYPE(n) == RPAR)
4777 return;
4778 }
4779 REQ(n, varargslist);
4780 for (i = 0; i < NCH(n); i += 2) {
4781 c = CHILD(n, i);
4782 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
4783 ext = 1;
4784 break;
4785 }
4786 if (TYPE(c) == test) {
4787 continue;
4788 }
4789 if (TYPE(CHILD(c, 0)) == NAME)
4790 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
4791 else {
4792 char nbuf[10];
4793 sprintf(nbuf, ".%d", i);
4794 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004795 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004796 }
4797 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004798 if (ext) {
4799 c = CHILD(n, i);
4800 if (TYPE(c) == STAR) {
4801 i++;
4802 symtable_add_def(st, STR(CHILD(n, i)),
4803 DEF_PARAM | DEF_STAR);
4804 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00004805 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004806 c = NULL;
4807 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004808 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004809 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004810 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004811 i++;
4812 symtable_add_def(st, STR(CHILD(n, i)),
4813 DEF_PARAM | DEF_DOUBLESTAR);
4814 }
4815 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004816 if (complex >= 0) {
4817 int j;
4818 for (j = 0; j <= complex; j++) {
4819 c = CHILD(n, j);
4820 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00004821 c = CHILD(n, ++j);
4822 else if (TYPE(c) == EQUAL)
4823 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004824 if (TYPE(CHILD(c, 0)) == LPAR)
4825 symtable_params_fplist(st, CHILD(c, 1));
4826 }
4827 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004828}
4829
4830static void
4831symtable_params_fplist(struct symtable *st, node *n)
4832{
4833 int i;
4834 node *c;
4835
4836 REQ(n, fplist);
4837 for (i = 0; i < NCH(n); i += 2) {
4838 c = CHILD(n, i);
4839 REQ(c, fpdef);
4840 if (NCH(c) == 1)
4841 symtable_add_def(st, STR(CHILD(c, 0)),
4842 DEF_PARAM | DEF_INTUPLE);
4843 else
4844 symtable_params_fplist(st, CHILD(c, 1));
4845 }
4846
4847}
4848
4849static void
4850symtable_global(struct symtable *st, node *n)
4851{
4852 int i;
4853
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004854 for (i = 1; i < NCH(n); i += 2) {
4855 char *name = STR(CHILD(n, i));
4856 symtable_add_def(st, name, DEF_GLOBAL);
4857 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004858}
4859
4860static void
4861symtable_list_comprehension(struct symtable *st, node *n)
4862{
4863 char tmpname[12];
4864
Tim Peters30814212001-02-17 05:30:26 +00004865 sprintf(tmpname, "_[%d]", ++st->st_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004866 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004867 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004868 symtable_node(st, CHILD(n, 3));
4869 if (NCH(n) == 5)
4870 symtable_node(st, CHILD(n, 4));
4871 --st->st_tmpname;
4872}
4873
4874static void
4875symtable_import(struct symtable *st, node *n)
4876{
4877 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004878 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004879 | 'from' dotted_name 'import'
4880 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00004881 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004882 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004883 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004884 symtable_check_future(st, n);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004885 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004886 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004887 } else {
4888 for (i = 3; i < NCH(n); i += 2) {
4889 node *c = CHILD(n, i);
4890 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004891 symtable_assign(st, CHILD(c, 2),
4892 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004893 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004894 symtable_assign(st, CHILD(c, 0),
4895 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004896 }
4897 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004898 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004899 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004900 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004901 }
4902 }
4903}
4904
4905static void
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004906symtable_assign(struct symtable *st, node *n, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004907{
4908 node *tmp;
4909 int i;
4910
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004911 loop:
4912 switch (TYPE(n)) {
4913 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004914 /* invalid assignment, e.g. lambda x:x=2. The next
4915 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004916 return;
4917 case power:
4918 if (NCH(n) > 2) {
4919 for (i = 2; i < NCH(n); ++i)
4920 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
4921 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004922 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004923 if (NCH(n) > 1) {
4924 symtable_node(st, CHILD(n, 0));
4925 symtable_node(st, CHILD(n, 1));
4926 } else {
4927 n = CHILD(n, 0);
4928 goto loop;
4929 }
4930 return;
4931 case listmaker:
4932 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
4933 symtable_list_comprehension(st, CHILD(n, 1));
4934 else {
4935 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004936 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004937 }
4938 return;
4939 case exprlist:
4940 case testlist:
4941 if (NCH(n) == 1) {
4942 n = CHILD(n, 0);
4943 goto loop;
4944 }
4945 else {
4946 int i;
4947 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004948 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004949 return;
4950 }
4951 goto loop;
4952 case atom:
4953 tmp = CHILD(n, 0);
4954 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
4955 n = CHILD(n, 1);
4956 goto loop;
4957 } else if (TYPE(tmp) == NAME)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004958 symtable_add_def(st, STR(tmp), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004959 return;
4960 case dotted_as_name:
4961 if (NCH(n) == 3)
4962 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004963 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004964 else
4965 symtable_add_def(st,
4966 STR(CHILD(CHILD(n,
4967 0), 0)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004968 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004969 return;
4970 case dotted_name:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004971 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004972 return;
4973 case NAME:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004974 symtable_add_def(st, STR(n), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004975 return;
4976 default:
4977 if (NCH(n) == 0)
4978 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00004979 if (NCH(n) == 1) {
4980 n = CHILD(n, 0);
4981 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004982 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00004983 /* Should only occur for errors like x + 1 = 1,
4984 which will be caught in the next pass. */
4985 for (i = 0; i < NCH(n); ++i)
4986 if (TYPE(CHILD(n, i)) >= single_input)
4987 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004988 }
4989}