blob: 2646dbe85b31dc5d1a4885a462e568b524d6f2dc [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002/* Compile an expression node to intermediate code */
3
Guido van Rossum3f5da241990-12-20 15:06:42 +00004/* XXX TO DO:
Guido van Rossum8b993a91997-01-17 21:04:03 +00005 XXX add __doc__ attribute == co_doc to code object attributes?
6 XXX (it's currently the first item of the co_const tuple)
Guido van Rossum3f5da241990-12-20 15:06:42 +00007 XXX Generate simple jump for break/return outside 'try...finally'
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00008 XXX Allow 'continue' inside finally clause of try-finally
Guido van Rossum8b993a91997-01-17 21:04:03 +00009 XXX New opcode for loading the initial index for a for loop
Guido van Rossum681d79a1995-07-18 14:51:37 +000010 XXX other JAR tricks?
Guido van Rossum3f5da241990-12-20 15:06:42 +000011*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +000012
Guido van Rossum79f25d91997-04-29 20:08:16 +000013#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000014
Guido van Rossum10dc2e81990-11-18 17:27:39 +000015#include "node.h"
16#include "token.h"
17#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000018#include "compile.h"
Jeremy Hylton4b38da62001-02-02 18:19:15 +000019#include "symtable.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000020#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000021#include "structmember.h"
22
23#include <ctype.h>
Guido van Rossum282914b1991-04-04 10:42:56 +000024
Guido van Rossumb05a5c71997-05-07 17:46:13 +000025/* Three symbols from graminit.h are also defined in Python.h, with
26 Py_ prefixes to their names. Python.h can't include graminit.h
27 (which defines too many confusing symbols), but we can check here
28 that they haven't changed (which is very unlikely, but possible). */
29#if Py_single_input != single_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000030 #error "single_input has changed -- update Py_single_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000031#endif
32#if Py_file_input != file_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000033 #error "file_input has changed -- update Py_file_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000034#endif
35#if Py_eval_input != eval_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000036 #error "eval_input has changed -- update Py_eval_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000037#endif
38
Guido van Rossum8e793d91997-03-03 19:13:14 +000039int Py_OptimizeFlag = 0;
40
Guido van Rossum8861b741996-07-30 16:49:37 +000041#define OP_DELETE 0
42#define OP_ASSIGN 1
43#define OP_APPLY 2
44
Jeremy Hyltone36f7782001-01-19 03:21:30 +000045#define VAR_LOAD 0
46#define VAR_STORE 1
47#define VAR_DELETE 2
48
Jeremy Hylton64949cb2001-01-25 20:06:59 +000049#define DEL_CLOSURE_ERROR \
Jeremy Hyltoneab156f2001-01-30 01:24:43 +000050"can not delete variable '%.400s' referenced in nested scope"
51
52#define DUPLICATE_ARGUMENT \
53"duplicate argument '%s' in function definition"
54
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000055#define ILLEGAL_DYNAMIC_SCOPE \
56"%.100s: exec or 'import *' makes names ambiguous in nested scope"
Jeremy Hyltoneab156f2001-01-30 01:24:43 +000057
Jeremy Hylton29906ee2001-02-27 04:23:34 +000058#define GLOBAL_AFTER_ASSIGN \
59"name '%.400s' is assigned to before global declaration"
60
61#define GLOBAL_AFTER_USE \
62"name '%.400s' is used prior to global declaration"
63
64#define LOCAL_GLOBAL \
65"name '%.400s' is a function paramter and declared global"
66
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +000067#define LATE_FUTURE \
68"from __future__ imports must occur at the beginning of the file"
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 */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000371 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000372};
373
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000374int is_free(int v)
375{
376 if ((v & (USE | DEF_FREE))
377 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
378 return 1;
379 if (v & DEF_FREE_CLASS)
380 return 1;
381 return 0;
382}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000383
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000384static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000385com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000386{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000387 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
388
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000389 if (c == NULL) {
390 /* Error occurred via symtable call to
391 is_constant_false */
392 PyErr_SetString(exc, msg);
393 return;
394 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000395 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000396 if (c->c_lineno < 1 || c->c_interactive) {
397 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000398 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000399 return;
400 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000401 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000402 if (v == NULL)
403 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000404
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000405 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000406 if (line == NULL) {
407 Py_INCREF(Py_None);
408 line = Py_None;
409 }
410 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
411 Py_None, line);
412 if (t == NULL)
413 goto exit;
414 w = Py_BuildValue("(OO)", v, t);
415 if (w == NULL)
416 goto exit;
417 PyErr_SetObject(exc, w);
418 exit:
419 Py_XDECREF(t);
420 Py_XDECREF(v);
421 Py_XDECREF(w);
422 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000423}
424
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000425/* Interface to the block stack */
426
427static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000428block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000429{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000430 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000431 com_error(c, PyExc_SystemError,
432 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000433 }
434 else {
435 c->c_block[c->c_nblocks++] = type;
436 }
437}
438
439static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000440block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000441{
442 if (c->c_nblocks > 0)
443 c->c_nblocks--;
444 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000445 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000446 }
447}
448
Guido van Rossum681d79a1995-07-18 14:51:37 +0000449/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000450
Tim Petersdbd9ba62000-07-09 03:09:57 +0000451static int com_init(struct compiling *, char *);
452static void com_free(struct compiling *);
453static void com_push(struct compiling *, int);
454static void com_pop(struct compiling *, int);
455static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000456static void com_node(struct compiling *, node *);
457static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000458static void com_addbyte(struct compiling *, int);
459static void com_addint(struct compiling *, int);
460static void com_addoparg(struct compiling *, int, int);
461static void com_addfwref(struct compiling *, int, int *);
462static void com_backpatch(struct compiling *, int);
463static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
464static int com_addconst(struct compiling *, PyObject *);
465static int com_addname(struct compiling *, PyObject *);
466static void com_addopname(struct compiling *, int, node *);
467static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000468static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000469static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000470static void com_assign(struct compiling *, node *, int, node *);
471static void com_assign_name(struct compiling *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000472static PyCodeObject *icompile(node *, struct compiling *);
473static PyCodeObject *jcompile(node *, char *, struct compiling *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000474static PyObject *parsestrplus(node *);
475static PyObject *parsestr(char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000476static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000477
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000478static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000479
480/* symtable operations */
481static int symtable_build(struct compiling *, node *);
482static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000483static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000484static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000485static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000486static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000487static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000488
489static void symtable_node(struct symtable *, node *);
490static void symtable_funcdef(struct symtable *, node *);
491static void symtable_default_args(struct symtable *, node *);
492static void symtable_params(struct symtable *, node *);
493static void symtable_params_fplist(struct symtable *, node *n);
494static void symtable_global(struct symtable *, node *);
495static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000496static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000497static void symtable_list_comprehension(struct symtable *, node *);
498
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000499static int symtable_update_free_vars(struct symtable *);
500static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
501static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
502
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000503/* helper */
504static void
505do_pad(int pad)
506{
507 int i;
508 for (i = 0; i < pad; ++i)
509 fprintf(stderr, " ");
510}
511
512static void
513dump(node *n, int pad, int depth)
514{
515 int i;
516 if (depth == 0)
517 return;
518 do_pad(pad);
519 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
520 if (depth > 0)
521 depth--;
522 for (i = 0; i < NCH(n); ++i)
523 dump(CHILD(n, i), pad + 1, depth);
524}
525
526#define DUMP(N) dump(N, 0, -1)
527
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000528static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000529com_init(struct compiling *c, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000530{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000531 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000532 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
533 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000534 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000535 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000536 goto fail;
537 if ((c->c_const_dict = PyDict_New()) == NULL)
538 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000539 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000540 goto fail;
541 if ((c->c_name_dict = PyDict_New()) == NULL)
542 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000543 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000544 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000545 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
546 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000547 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000548 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000549 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000550 c->c_freevars = NULL;
551 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000552 c->c_nlocals = 0;
553 c->c_argcount = 0;
554 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000555 c->c_nexti = 0;
556 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000557 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000558 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000559 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000560 c->c_begin = 0;
561 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000562 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000563 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000564 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000565 c->c_stacklevel = 0;
566 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000567 c->c_firstlineno = 0;
568 c->c_last_addr = 0;
569 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000570 c->c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000571 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000572 c->c_nested = 0;
573 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000574 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000575 return 1;
576
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000577 fail:
578 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000579 return 0;
580}
581
582static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000583com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000584{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000585 Py_XDECREF(c->c_code);
586 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000587 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000588 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000589 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000590 Py_XDECREF(c->c_globals);
591 Py_XDECREF(c->c_locals);
592 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000593 Py_XDECREF(c->c_freevars);
594 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000595 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +0000596 if (c->c_future)
597 PyMem_Free((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000598}
599
600static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000601com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000602{
603 c->c_stacklevel += n;
604 if (c->c_stacklevel > c->c_maxstacklevel)
605 c->c_maxstacklevel = c->c_stacklevel;
606}
607
608static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000609com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000610{
611 if (c->c_stacklevel < n) {
Guido van Rossum90f827c1998-08-25 18:22:17 +0000612 /* fprintf(stderr,
Guido van Rossum8b993a91997-01-17 21:04:03 +0000613 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
614 c->c_filename, c->c_lineno,
Guido van Rossum90f827c1998-08-25 18:22:17 +0000615 c->c_nexti, c->c_stacklevel, n); */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000616 c->c_stacklevel = 0;
617 }
618 else
619 c->c_stacklevel -= n;
620}
621
622static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000623com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000624{
625 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000626 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000627 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000628 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000629}
630
631static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000632com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000633{
634 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000635 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000636 assert(byte >= 0 && byte <= 255);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000637 if (byte < 0 || byte > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000638 com_error(c, PyExc_SystemError,
639 "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000640 }
641 if (c->c_code == NULL)
642 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000643 len = PyString_Size(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000644 if (c->c_nexti >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000645 if (_PyString_Resize(&c->c_code, len+1000) != 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000646 c->c_errors++;
647 return;
648 }
649 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000650 PyString_AsString(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000651}
652
653static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000654com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000655{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000656 com_addbyte(c, x & 0xff);
657 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000658}
659
660static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000661com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000662{
663 int size;
664 char *p;
665 if (c->c_lnotab == NULL)
666 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000667 size = PyString_Size(c->c_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000668 if (c->c_lnotab_next+2 > size) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000669 if (_PyString_Resize(&c->c_lnotab, size + 1000) < 0) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000670 c->c_errors++;
671 return;
672 }
673 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000674 p = PyString_AsString(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000675 *p++ = addr;
676 *p++ = line;
677 c->c_lnotab_next += 2;
678}
679
680static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000681com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000682{
683 c->c_lineno = lineno;
684 if (c->c_firstlineno == 0) {
685 c->c_firstlineno = c->c_last_line = lineno;
686 }
687 else {
688 int incr_addr = c->c_nexti - c->c_last_addr;
689 int incr_line = lineno - c->c_last_line;
690 while (incr_addr > 0 || incr_line > 0) {
691 int trunc_addr = incr_addr;
692 int trunc_line = incr_line;
693 if (trunc_addr > 255)
694 trunc_addr = 255;
695 if (trunc_line > 255)
696 trunc_line = 255;
697 com_add_lnotab(c, trunc_addr, trunc_line);
698 incr_addr -= trunc_addr;
699 incr_line -= trunc_line;
700 }
701 c->c_last_addr = c->c_nexti;
702 c->c_last_line = lineno;
703 }
704}
705
706static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000707com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000708{
Fred Drakeef8ace32000-08-24 00:32:09 +0000709 int extended_arg = arg >> 16;
Guido van Rossum8e793d91997-03-03 19:13:14 +0000710 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000711 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000712 if (Py_OptimizeFlag)
713 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000714 }
Fred Drakeef8ace32000-08-24 00:32:09 +0000715 if (extended_arg){
716 com_addbyte(c, EXTENDED_ARG);
717 com_addint(c, extended_arg);
718 arg &= 0xffff;
719 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000720 com_addbyte(c, op);
721 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000722}
723
724static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000725com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000726{
727 /* Compile a forward reference for backpatching */
728 int here;
729 int anchor;
730 com_addbyte(c, op);
731 here = c->c_nexti;
732 anchor = *p_anchor;
733 *p_anchor = here;
734 com_addint(c, anchor == 0 ? 0 : here - anchor);
735}
736
737static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000738com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000739{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000740 unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000741 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000742 int dist;
743 int prev;
744 for (;;) {
745 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000746 prev = code[anchor] + (code[anchor+1] << 8);
747 dist = target - (anchor+2);
748 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +0000749 dist >>= 8;
750 code[anchor+1] = dist;
751 dist >>= 8;
752 if (dist) {
753 com_error(c, PyExc_SystemError,
754 "com_backpatch: offset too large");
755 break;
756 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000757 if (!prev)
758 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000759 anchor -= prev;
760 }
761}
762
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000763/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000764
765static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000766com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000767{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000768 PyObject *w, *t, *np=NULL;
769 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000770
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000771 t = Py_BuildValue("(OO)", v, v->ob_type);
772 if (t == NULL)
773 goto fail;
774 w = PyDict_GetItem(dict, t);
775 if (w != NULL) {
776 n = PyInt_AsLong(w);
777 } else {
778 n = PyList_Size(list);
779 np = PyInt_FromLong(n);
780 if (np == NULL)
781 goto fail;
782 if (PyList_Append(list, v) != 0)
783 goto fail;
784 if (PyDict_SetItem(dict, t, np) != 0)
785 goto fail;
786 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000787 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000788 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000789 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000790 fail:
791 Py_XDECREF(np);
792 Py_XDECREF(t);
793 c->c_errors++;
794 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000795}
796
797static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000798com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000799{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000800 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000801}
802
803static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000804com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000805{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000806 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000807}
808
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000809static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000810mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000811{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000812 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000813 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +0000814 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000815 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
816 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000817 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000818 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000819 return 0; /* Don't mangle __extremely_long_names */
820 if (name[nlen-1] == '_' && name[nlen-2] == '_')
821 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000822 /* Strip leading underscores from class name */
823 while (*p == '_')
824 p++;
825 if (*p == '\0')
826 return 0; /* Don't mangle if class is just underscores */
827 plen = strlen(p);
828 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000829 plen = maxlen-nlen-2; /* Truncate class name if too long */
830 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000831 buffer[0] = '_';
832 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000833 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000834 return 1;
835}
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000836
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000837static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000838com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000839{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000840 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000841 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000842 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000843
844 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000845 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000846 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000847 c->c_errors++;
848 i = 255;
849 }
850 else {
851 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000852 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000853 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000854 com_addoparg(c, op, i);
855}
856
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000857#define NAME_LOCAL 0
858#define NAME_GLOBAL 1
859#define NAME_DEFAULT 2
860#define NAME_CLOSURE 3
861
862static int
863com_lookup_arg(PyObject *dict, PyObject *name)
864{
865 PyObject *v = PyDict_GetItem(dict, name);
866 if (v == NULL)
867 return -1;
868 else
869 return PyInt_AS_LONG(v);
870}
871
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000872static void
873com_addop_varname(struct compiling *c, int kind, char *name)
874{
875 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000876 int i, reftype;
877 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000878 int op = STOP_CODE;
879 char buffer[MANGLE_LEN];
880
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000881 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000882 name = buffer;
883 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
884 c->c_errors++;
885 i = 255;
886 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000887 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000888
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000889 reftype = get_ref_type(c, name);
890 switch (reftype) {
891 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000892 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000893 scope = NAME_LOCAL;
894 break;
895 case GLOBAL_EXPLICIT:
896 scope = NAME_GLOBAL;
897 break;
898 case GLOBAL_IMPLICIT:
899 if (c->c_flags & CO_OPTIMIZED)
900 scope = NAME_GLOBAL;
901 break;
902 case FREE:
903 case CELL:
904 scope = NAME_CLOSURE;
905 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000906 }
907
908 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000909 if (scope == NAME_LOCAL)
910 i = com_lookup_arg(c->c_locals, v);
911 else if (reftype == FREE)
912 i = com_lookup_arg(c->c_freevars, v);
913 else if (reftype == CELL)
914 i = com_lookup_arg(c->c_cellvars, v);
915 if (i == -1) {
916 c->c_errors++; /* XXX no exception set */
917 i = 255;
918 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000919 }
920 Py_DECREF(v);
921
922 switch (kind) {
923 case VAR_LOAD:
924 switch (scope) {
925 case NAME_LOCAL:
926 op = LOAD_FAST;
927 break;
928 case NAME_GLOBAL:
929 op = LOAD_GLOBAL;
930 break;
931 case NAME_DEFAULT:
932 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000933 break;
934 case NAME_CLOSURE:
935 op = LOAD_DEREF;
936 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000937 }
938 break;
939 case VAR_STORE:
940 switch (scope) {
941 case NAME_LOCAL:
942 op = STORE_FAST;
943 break;
944 case NAME_GLOBAL:
945 op = STORE_GLOBAL;
946 break;
947 case NAME_DEFAULT:
948 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000949 break;
950 case NAME_CLOSURE:
951 op = STORE_DEREF;
952 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000953 }
954 break;
955 case VAR_DELETE:
956 switch (scope) {
957 case NAME_LOCAL:
958 op = DELETE_FAST;
959 break;
960 case NAME_GLOBAL:
961 op = DELETE_GLOBAL;
962 break;
963 case NAME_DEFAULT:
964 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000965 break;
966 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000967 char buf[500];
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000968 sprintf(buf, DEL_CLOSURE_ERROR, name);
969 com_error(c, PyExc_SyntaxError, buf);
970 i = 255;
971 break;
972 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000973 }
974 break;
975 }
976done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000977 com_addoparg(c, op, i);
978}
979
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000980static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000981com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000982{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000983 char *name;
984 char buffer[1000];
985 /* XXX it is possible to write this code without the 1000
986 chars on the total length of dotted names, I just can't be
987 bothered right now */
988 if (TYPE(n) == STAR)
989 name = "*";
990 else if (TYPE(n) == dotted_name) {
991 char *p = buffer;
992 int i;
993 name = buffer;
994 for (i = 0; i < NCH(n); i += 2) {
995 char *s = STR(CHILD(n, i));
996 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000997 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000998 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +0000999 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001000 break;
1001 }
1002 if (p != buffer)
1003 *p++ = '.';
1004 strcpy(p, s);
1005 p = strchr(p, '\0');
1006 }
1007 }
1008 else {
1009 REQ(n, NAME);
1010 name = STR(n);
1011 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001012 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001013}
1014
Guido van Rossum79f25d91997-04-29 20:08:16 +00001015static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001016parsenumber(struct compiling *co, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001017{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001018 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001019 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001020 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001021#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +00001022 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +00001023 int imflag;
1024#endif
1025
Guido van Rossum282914b1991-04-04 10:42:56 +00001026 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001027 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001028#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001029 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001030#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001031 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001032 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001033 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001034 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001035 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001036 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001037 if (*end == '\0') {
1038 if (errno != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001039 com_error(co, PyExc_OverflowError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001040 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +00001041 return NULL;
1042 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001043 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001044 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001045 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001046#ifndef WITHOUT_COMPLEX
1047 if (imflag) {
1048 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001049 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +00001050 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001051 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001052 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +00001053 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001054 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001055#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001056 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001057 PyFPE_START_PROTECT("atof", return 0)
1058 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001059 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001060 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001061 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001062}
1063
Guido van Rossum79f25d91997-04-29 20:08:16 +00001064static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001065parsestr(char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001066{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001067 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001068 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001069 char *buf;
1070 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001071 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001072 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001073 int first = *s;
1074 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001075 int rawmode = 0;
1076 int unicode = 0;
1077 if (isalpha(quote) || quote == '_') {
1078 if (quote == 'u' || quote == 'U') {
1079 quote = *++s;
1080 unicode = 1;
1081 }
1082 if (quote == 'r' || quote == 'R') {
1083 quote = *++s;
1084 rawmode = 1;
1085 }
1086 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001087 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001088 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001089 return NULL;
1090 }
1091 s++;
1092 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001093 if (len > INT_MAX) {
1094 PyErr_SetString(PyExc_OverflowError, "string to parse is too long");
1095 return NULL;
1096 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001097 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001098 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001099 return NULL;
1100 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001101 if (len >= 4 && s[0] == quote && s[1] == quote) {
1102 s += 2;
1103 len -= 2;
1104 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001105 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001106 return NULL;
1107 }
1108 }
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001109 if (unicode || Py_UnicodeFlag) {
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001110 if (rawmode)
1111 return PyUnicode_DecodeRawUnicodeEscape(
1112 s, len, NULL);
1113 else
1114 return PyUnicode_DecodeUnicodeEscape(
1115 s, len, NULL);
1116 }
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001117 if (rawmode || strchr(s, '\\') == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001118 return PyString_FromStringAndSize(s, len);
1119 v = PyString_FromStringAndSize((char *)NULL, len);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001120 if (v == NULL)
1121 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001122 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001123 end = s + len;
1124 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001125 if (*s != '\\') {
1126 *p++ = *s++;
1127 continue;
1128 }
1129 s++;
1130 switch (*s++) {
1131 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001132 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001133 case '\\': *p++ = '\\'; break;
1134 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +00001135 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001136 case 'b': *p++ = '\b'; break;
1137 case 'f': *p++ = '\014'; break; /* FF */
1138 case 't': *p++ = '\t'; break;
1139 case 'n': *p++ = '\n'; break;
1140 case 'r': *p++ = '\r'; break;
1141 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001142 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
1143 case '0': case '1': case '2': case '3':
1144 case '4': case '5': case '6': case '7':
1145 c = s[-1] - '0';
1146 if ('0' <= *s && *s <= '7') {
1147 c = (c<<3) + *s++ - '0';
1148 if ('0' <= *s && *s <= '7')
1149 c = (c<<3) + *s++ - '0';
1150 }
1151 *p++ = c;
1152 break;
1153 case 'x':
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001154 if (isxdigit(Py_CHARMASK(s[0])) && isxdigit(Py_CHARMASK(s[1]))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +00001155 unsigned int x = 0;
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001156 c = Py_CHARMASK(*s);
1157 s++;
1158 if (isdigit(c))
1159 x = c - '0';
1160 else if (islower(c))
1161 x = 10 + c - 'a';
1162 else
1163 x = 10 + c - 'A';
1164 x = x << 4;
1165 c = Py_CHARMASK(*s);
1166 s++;
1167 if (isdigit(c))
1168 x += c - '0';
1169 else if (islower(c))
1170 x += 10 + c - 'a';
1171 else
1172 x += 10 + c - 'A';
Guido van Rossumed1100f1997-10-20 23:24:07 +00001173 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001174 break;
1175 }
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001176 PyErr_SetString(PyExc_ValueError, "invalid \\x escape");
1177 Py_DECREF(v);
1178 return NULL;
1179 default:
1180 *p++ = '\\';
1181 *p++ = s[-1];
1182 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001183 }
1184 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001185 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001186 return v;
1187}
1188
Guido van Rossum79f25d91997-04-29 20:08:16 +00001189static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001190parsestrplus(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001191{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001192 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001193 int i;
1194 REQ(CHILD(n, 0), STRING);
1195 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
1196 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001197 for (i = 1; i < NCH(n); i++) {
1198 PyObject *s;
1199 s = parsestr(STR(CHILD(n, i)));
1200 if (s == NULL)
1201 goto onError;
1202 if (PyString_Check(v) && PyString_Check(s)) {
1203 PyString_ConcatAndDel(&v, s);
1204 if (v == NULL)
1205 goto onError;
1206 }
1207 else {
1208 PyObject *temp;
1209 temp = PyUnicode_Concat(v, s);
1210 Py_DECREF(s);
1211 if (temp == NULL)
1212 goto onError;
1213 Py_DECREF(v);
1214 v = temp;
1215 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001216 }
1217 }
1218 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001219
1220 onError:
1221 Py_XDECREF(v);
1222 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001223}
1224
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001225static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001226com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001227{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001228 PyObject *v;
1229 int anchor = 0;
1230 int save_begin = c->c_begin;
1231
1232 /* list_iter: for v in expr [list_iter] */
1233 com_node(c, CHILD(n, 3)); /* expr */
1234 v = PyInt_FromLong(0L);
1235 if (v == NULL)
1236 c->c_errors++;
1237 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
1238 com_push(c, 1);
1239 Py_XDECREF(v);
1240 c->c_begin = c->c_nexti;
1241 com_addoparg(c, SET_LINENO, n->n_lineno);
1242 com_addfwref(c, FOR_LOOP, &anchor);
1243 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001244 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001245 c->c_loops++;
1246 com_list_iter(c, n, e, t);
1247 c->c_loops--;
1248 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1249 c->c_begin = save_begin;
1250 com_backpatch(c, anchor);
1251 com_pop(c, 2); /* FOR_LOOP has popped these */
1252}
1253
1254static void
1255com_list_if(struct compiling *c, node *n, node *e, char *t)
1256{
1257 int anchor = 0;
1258 int a = 0;
1259 /* list_iter: 'if' test [list_iter] */
1260 com_addoparg(c, SET_LINENO, n->n_lineno);
1261 com_node(c, CHILD(n, 1));
1262 com_addfwref(c, JUMP_IF_FALSE, &a);
1263 com_addbyte(c, POP_TOP);
1264 com_pop(c, 1);
1265 com_list_iter(c, n, e, t);
1266 com_addfwref(c, JUMP_FORWARD, &anchor);
1267 com_backpatch(c, a);
1268 /* We jump here with an extra entry which we now pop */
1269 com_addbyte(c, POP_TOP);
1270 com_backpatch(c, anchor);
1271}
1272
1273static void
1274com_list_iter(struct compiling *c,
1275 node *p, /* parent of list_iter node */
1276 node *e, /* element expression node */
1277 char *t /* name of result list temp local */)
1278{
1279 /* list_iter is the last child in a listmaker, list_for, or list_if */
1280 node *n = CHILD(p, NCH(p)-1);
1281 if (TYPE(n) == list_iter) {
1282 n = CHILD(n, 0);
1283 switch (TYPE(n)) {
1284 case list_for:
1285 com_list_for(c, n, e, t);
1286 break;
1287 case list_if:
1288 com_list_if(c, n, e, t);
1289 break;
1290 default:
1291 com_error(c, PyExc_SystemError,
1292 "invalid list_iter node type");
1293 }
1294 }
1295 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001296 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001297 com_push(c, 1);
1298 com_node(c, e);
1299 com_addoparg(c, CALL_FUNCTION, 1);
1300 com_addbyte(c, POP_TOP);
1301 com_pop(c, 2);
1302 }
1303}
1304
1305static void
1306com_list_comprehension(struct compiling *c, node *n)
1307{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001308 /* listmaker: test list_for */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001309 char tmpname[12];
Tim Peters30814212001-02-17 05:30:26 +00001310 sprintf(tmpname, "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001311 com_addoparg(c, BUILD_LIST, 0);
1312 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1313 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001314 com_addop_name(c, LOAD_ATTR, "append");
1315 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001316 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001317 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001318 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001319 --c->c_tmpname;
1320}
1321
1322static void
1323com_listmaker(struct compiling *c, node *n)
1324{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001325 /* listmaker: test ( list_for | (',' test)* [','] ) */
1326 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001327 com_list_comprehension(c, n);
1328 else {
1329 int len = 0;
1330 int i;
1331 for (i = 0; i < NCH(n); i += 2, len++)
1332 com_node(c, CHILD(n, i));
1333 com_addoparg(c, BUILD_LIST, len);
1334 com_pop(c, len-1);
1335 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001336}
1337
1338static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001339com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001340{
1341 int i;
1342 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1343 for (i = 0; i+2 < NCH(n); i += 4) {
1344 /* We must arrange things just right for STORE_SUBSCR.
1345 It wants the stack to look like (value) (dict) (key) */
1346 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001347 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001348 com_node(c, CHILD(n, i+2)); /* value */
1349 com_addbyte(c, ROT_TWO);
1350 com_node(c, CHILD(n, i)); /* key */
1351 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001352 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001353 }
1354}
1355
1356static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001357com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001358{
1359 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001360 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001361 int i;
1362 REQ(n, atom);
1363 ch = CHILD(n, 0);
1364 switch (TYPE(ch)) {
1365 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001366 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001367 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001368 com_push(c, 1);
1369 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001370 else
1371 com_node(c, CHILD(n, 1));
1372 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001373 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001374 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001375 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001376 com_push(c, 1);
1377 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001378 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001379 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001380 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001381 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001382 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001383 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001384 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001385 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001386 break;
1387 case BACKQUOTE:
1388 com_node(c, CHILD(n, 1));
1389 com_addbyte(c, UNARY_CONVERT);
1390 break;
1391 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001392 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001393 i = 255;
1394 }
1395 else {
1396 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001397 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001398 }
1399 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001400 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001401 break;
1402 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001403 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001404 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001405 c->c_errors++;
1406 i = 255;
1407 }
1408 else {
1409 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001410 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001411 }
1412 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001413 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001414 break;
1415 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001416 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001417 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001418 break;
1419 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001420 com_error(c, PyExc_SystemError,
1421 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001422 }
1423}
1424
1425static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001426com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001427{
1428 if (NCH(n) == 1) {
1429 com_addbyte(c, op);
1430 }
1431 else if (NCH(n) == 2) {
1432 if (TYPE(CHILD(n, 0)) != COLON) {
1433 com_node(c, CHILD(n, 0));
1434 com_addbyte(c, op+1);
1435 }
1436 else {
1437 com_node(c, CHILD(n, 1));
1438 com_addbyte(c, op+2);
1439 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001440 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001441 }
1442 else {
1443 com_node(c, CHILD(n, 0));
1444 com_node(c, CHILD(n, 2));
1445 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001446 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001447 }
1448}
1449
Guido van Rossum635abd21997-01-06 22:56:52 +00001450static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001451com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1452{
1453 if (NCH(n) == 1) {
1454 com_addbyte(c, DUP_TOP);
1455 com_push(c, 1);
1456 com_addbyte(c, SLICE);
1457 com_node(c, augn);
1458 com_addbyte(c, opcode);
1459 com_pop(c, 1);
1460 com_addbyte(c, ROT_TWO);
1461 com_addbyte(c, STORE_SLICE);
1462 com_pop(c, 2);
1463 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1464 com_node(c, CHILD(n, 0));
1465 com_addoparg(c, DUP_TOPX, 2);
1466 com_push(c, 2);
1467 com_addbyte(c, SLICE+1);
1468 com_pop(c, 1);
1469 com_node(c, augn);
1470 com_addbyte(c, opcode);
1471 com_pop(c, 1);
1472 com_addbyte(c, ROT_THREE);
1473 com_addbyte(c, STORE_SLICE+1);
1474 com_pop(c, 3);
1475 } else if (NCH(n) == 2) {
1476 com_node(c, CHILD(n, 1));
1477 com_addoparg(c, DUP_TOPX, 2);
1478 com_push(c, 2);
1479 com_addbyte(c, SLICE+2);
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+2);
1486 com_pop(c, 3);
1487 } else {
1488 com_node(c, CHILD(n, 0));
1489 com_node(c, CHILD(n, 2));
1490 com_addoparg(c, DUP_TOPX, 3);
1491 com_push(c, 3);
1492 com_addbyte(c, SLICE+3);
1493 com_pop(c, 2);
1494 com_node(c, augn);
1495 com_addbyte(c, opcode);
1496 com_pop(c, 1);
1497 com_addbyte(c, ROT_FOUR);
1498 com_addbyte(c, STORE_SLICE+3);
1499 com_pop(c, 4);
1500 }
1501}
1502
1503static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001504com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001505{
1506 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001507 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001508 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001509 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001510 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001511 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001512 }
1513 else {
1514 com_node(c, CHILD(n, 0));
1515 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001516 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001517 }
1518 m = n;
1519 do {
1520 m = CHILD(m, 0);
1521 } while (NCH(m) == 1);
1522 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00001523 /* f(lambda x: x[0] = 3) ends up getting parsed with
1524 * LHS test = lambda x: x[0], and RHS test = 3.
1525 * SF bug 132313 points out that complaining about a keyword
1526 * then is very confusing.
1527 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001528 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00001529 TYPE(m) == lambdef ?
1530 "lambda cannot contain assignment" :
1531 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001532 }
1533 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001534 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001535 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001536 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001537 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001538 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001539 else if (*pkeywords == NULL) {
1540 c->c_errors++;
1541 Py_DECREF(v);
1542 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001543 if (PyDict_GetItem(*pkeywords, v) != NULL)
1544 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001545 "duplicate keyword argument");
1546 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001547 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001548 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001549 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001550 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001551 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001552 }
1553 }
1554 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001555}
1556
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001557static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001558com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001559{
1560 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001561 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001562 }
1563 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001564 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001565 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001566 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001567 int star_flag = 0;
1568 int starstar_flag = 0;
1569 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001570 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001571 na = 0;
1572 nk = 0;
1573 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001574 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001575 if (TYPE(ch) == STAR ||
1576 TYPE(ch) == DOUBLESTAR)
1577 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001578 if (ch->n_lineno != lineno) {
1579 lineno = ch->n_lineno;
1580 com_addoparg(c, SET_LINENO, lineno);
1581 }
1582 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001583 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001584 na++;
1585 else
1586 nk++;
1587 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001588 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001589 while (i < NCH(n)) {
1590 node *tok = CHILD(n, i);
1591 node *ch = CHILD(n, i+1);
1592 i += 3;
1593 switch (TYPE(tok)) {
1594 case STAR: star_flag = 1; break;
1595 case DOUBLESTAR: starstar_flag = 1; break;
1596 }
1597 com_node(c, ch);
1598 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001599 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001600 com_error(c, PyExc_SyntaxError,
1601 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001602 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001603 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001604 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001605 star_flag + (starstar_flag << 1);
1606 else
1607 opcode = CALL_FUNCTION;
1608 com_addoparg(c, opcode, na | (nk << 8));
1609 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001610 }
1611}
1612
1613static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001614com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001615{
1616 com_addopname(c, LOAD_ATTR, n);
1617}
1618
1619static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001620com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001621{
1622 int i=0;
1623 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001624 node *ch;
1625
1626 /* first argument */
1627 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001628 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001629 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001630 i++;
1631 }
1632 else {
1633 com_node(c, CHILD(n,i));
1634 i++;
1635 REQ(CHILD(n,i),COLON);
1636 i++;
1637 }
1638 /* second argument */
1639 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1640 com_node(c, CHILD(n,i));
1641 i++;
1642 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001643 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001644 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001645 com_push(c, 1);
1646 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001647 /* remaining arguments */
1648 for (; i < NCH(n); i++) {
1649 ns++;
1650 ch=CHILD(n,i);
1651 REQ(ch, sliceop);
1652 if (NCH(ch) == 1) {
1653 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001654 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001655 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001656 }
1657 else
1658 com_node(c, CHILD(ch,1));
1659 }
1660 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001661 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001662}
1663
1664static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001665com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001666{
1667 node *ch;
1668 REQ(n, subscript);
1669 ch = CHILD(n,0);
1670 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001671 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001672 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001673 com_push(c, 1);
1674 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001675 else {
1676 /* check for slice */
1677 if ((TYPE(ch) == COLON || NCH(n) > 1))
1678 com_sliceobj(c, n);
1679 else {
1680 REQ(ch, test);
1681 com_node(c, ch);
1682 }
1683 }
1684}
1685
1686static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001687com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001688{
1689 int i, op;
1690 REQ(n, subscriptlist);
1691 /* Check to make backward compatible slice behavior for '[i:j]' */
1692 if (NCH(n) == 1) {
1693 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001694 /* 'Basic' slice, should have exactly one colon. */
1695 if ((TYPE(CHILD(sub, 0)) == COLON
1696 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1697 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1698 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001699 switch (assigning) {
1700 case OP_DELETE:
1701 op = DELETE_SLICE;
1702 break;
1703 case OP_ASSIGN:
1704 op = STORE_SLICE;
1705 break;
1706 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001707 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001708 break;
1709 default:
1710 com_augassign_slice(c, sub, assigning, augn);
1711 return;
1712 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001713 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001714 if (op == STORE_SLICE)
1715 com_pop(c, 2);
1716 else if (op == DELETE_SLICE)
1717 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001718 return;
1719 }
1720 }
1721 /* Else normal subscriptlist. Compile each subscript. */
1722 for (i = 0; i < NCH(n); i += 2)
1723 com_subscript(c, CHILD(n, i));
1724 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001725 if (NCH(n) > 1) {
1726 i = (NCH(n)+1) / 2;
1727 com_addoparg(c, BUILD_TUPLE, i);
1728 com_pop(c, i-1);
1729 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001730 switch (assigning) {
1731 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001732 op = DELETE_SUBSCR;
1733 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00001734 break;
1735 default:
1736 case OP_ASSIGN:
1737 op = STORE_SUBSCR;
1738 i = 3;
1739 break;
1740 case OP_APPLY:
1741 op = BINARY_SUBSCR;
1742 i = 1;
1743 break;
1744 }
1745 if (assigning > OP_APPLY) {
1746 com_addoparg(c, DUP_TOPX, 2);
1747 com_push(c, 2);
1748 com_addbyte(c, BINARY_SUBSCR);
1749 com_pop(c, 1);
1750 com_node(c, augn);
1751 com_addbyte(c, assigning);
1752 com_pop(c, 1);
1753 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001754 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001755 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001756 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001757}
1758
1759static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001760com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001761{
1762 REQ(n, trailer);
1763 switch (TYPE(CHILD(n, 0))) {
1764 case LPAR:
1765 com_call_function(c, CHILD(n, 1));
1766 break;
1767 case DOT:
1768 com_select_member(c, CHILD(n, 1));
1769 break;
1770 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00001771 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001772 break;
1773 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001774 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001775 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001776 }
1777}
1778
1779static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001780com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001781{
1782 int i;
1783 REQ(n, power);
1784 com_atom(c, CHILD(n, 0));
1785 for (i = 1; i < NCH(n); i++) {
1786 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1787 com_factor(c, CHILD(n, i+1));
1788 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001789 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001790 break;
1791 }
1792 else
1793 com_apply_trailer(c, CHILD(n, i));
1794 }
1795}
1796
1797static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001798com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001799{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001800 REQ(n, factor);
1801 if (TYPE(CHILD(n, 0)) == PLUS) {
1802 com_factor(c, CHILD(n, 1));
1803 com_addbyte(c, UNARY_POSITIVE);
1804 }
1805 else if (TYPE(CHILD(n, 0)) == MINUS) {
1806 com_factor(c, CHILD(n, 1));
1807 com_addbyte(c, UNARY_NEGATIVE);
1808 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001809 else if (TYPE(CHILD(n, 0)) == TILDE) {
1810 com_factor(c, CHILD(n, 1));
1811 com_addbyte(c, UNARY_INVERT);
1812 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001813 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001814 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001815 }
1816}
1817
1818static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001819com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001820{
1821 int i;
1822 int op;
1823 REQ(n, term);
1824 com_factor(c, CHILD(n, 0));
1825 for (i = 2; i < NCH(n); i += 2) {
1826 com_factor(c, CHILD(n, i));
1827 switch (TYPE(CHILD(n, i-1))) {
1828 case STAR:
1829 op = BINARY_MULTIPLY;
1830 break;
1831 case SLASH:
1832 op = BINARY_DIVIDE;
1833 break;
1834 case PERCENT:
1835 op = BINARY_MODULO;
1836 break;
1837 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001838 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001839 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001840 op = 255;
1841 }
1842 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001843 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001844 }
1845}
1846
1847static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001848com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001849{
1850 int i;
1851 int op;
1852 REQ(n, arith_expr);
1853 com_term(c, CHILD(n, 0));
1854 for (i = 2; i < NCH(n); i += 2) {
1855 com_term(c, CHILD(n, i));
1856 switch (TYPE(CHILD(n, i-1))) {
1857 case PLUS:
1858 op = BINARY_ADD;
1859 break;
1860 case MINUS:
1861 op = BINARY_SUBTRACT;
1862 break;
1863 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001864 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001865 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001866 op = 255;
1867 }
1868 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001869 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001870 }
1871}
1872
1873static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001874com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001875{
1876 int i;
1877 int op;
1878 REQ(n, shift_expr);
1879 com_arith_expr(c, CHILD(n, 0));
1880 for (i = 2; i < NCH(n); i += 2) {
1881 com_arith_expr(c, CHILD(n, i));
1882 switch (TYPE(CHILD(n, i-1))) {
1883 case LEFTSHIFT:
1884 op = BINARY_LSHIFT;
1885 break;
1886 case RIGHTSHIFT:
1887 op = BINARY_RSHIFT;
1888 break;
1889 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001890 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001891 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001892 op = 255;
1893 }
1894 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001895 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001896 }
1897}
1898
1899static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001900com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001901{
1902 int i;
1903 int op;
1904 REQ(n, and_expr);
1905 com_shift_expr(c, CHILD(n, 0));
1906 for (i = 2; i < NCH(n); i += 2) {
1907 com_shift_expr(c, CHILD(n, i));
1908 if (TYPE(CHILD(n, i-1)) == AMPER) {
1909 op = BINARY_AND;
1910 }
1911 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001912 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001913 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001914 op = 255;
1915 }
1916 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001917 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001918 }
1919}
1920
1921static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001922com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001923{
1924 int i;
1925 int op;
1926 REQ(n, xor_expr);
1927 com_and_expr(c, CHILD(n, 0));
1928 for (i = 2; i < NCH(n); i += 2) {
1929 com_and_expr(c, CHILD(n, i));
1930 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1931 op = BINARY_XOR;
1932 }
1933 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001934 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001935 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001936 op = 255;
1937 }
1938 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001939 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001940 }
1941}
1942
1943static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001944com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001945{
1946 int i;
1947 int op;
1948 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001949 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001950 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001951 com_xor_expr(c, CHILD(n, i));
1952 if (TYPE(CHILD(n, i-1)) == VBAR) {
1953 op = BINARY_OR;
1954 }
1955 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001956 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001957 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001958 op = 255;
1959 }
1960 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001961 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001962 }
1963}
1964
1965static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001966cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001967{
1968 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001969 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001970 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1971 if (NCH(n) == 1) {
1972 n = CHILD(n, 0);
1973 switch (TYPE(n)) {
1974 case LESS: return LT;
1975 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001976 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001977 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001978 case LESSEQUAL: return LE;
1979 case GREATEREQUAL: return GE;
1980 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001981 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1982 if (strcmp(STR(n), "is") == 0) return IS;
1983 }
1984 }
1985 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001986 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001987 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1988 return NOT_IN;
1989 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1990 return IS_NOT;
1991 }
1992 }
1993 return BAD;
1994}
1995
1996static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001997com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001998{
1999 int i;
2000 enum cmp_op op;
2001 int anchor;
2002 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2003 com_expr(c, CHILD(n, 0));
2004 if (NCH(n) == 1)
2005 return;
2006
2007 /****************************************************************
2008 The following code is generated for all but the last
2009 comparison in a chain:
2010
2011 label: on stack: opcode: jump to:
2012
2013 a <code to load b>
2014 a, b DUP_TOP
2015 a, b, b ROT_THREE
2016 b, a, b COMPARE_OP
2017 b, 0-or-1 JUMP_IF_FALSE L1
2018 b, 1 POP_TOP
2019 b
2020
2021 We are now ready to repeat this sequence for the next
2022 comparison in the chain.
2023
2024 For the last we generate:
2025
2026 b <code to load c>
2027 b, c COMPARE_OP
2028 0-or-1
2029
2030 If there were any jumps to L1 (i.e., there was more than one
2031 comparison), we generate:
2032
2033 0-or-1 JUMP_FORWARD L2
2034 L1: b, 0 ROT_TWO
2035 0, b POP_TOP
2036 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002037 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002038 ****************************************************************/
2039
2040 anchor = 0;
2041
2042 for (i = 2; i < NCH(n); i += 2) {
2043 com_expr(c, CHILD(n, i));
2044 if (i+2 < NCH(n)) {
2045 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002046 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002047 com_addbyte(c, ROT_THREE);
2048 }
2049 op = cmp_type(CHILD(n, i-1));
2050 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002051 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002052 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002053 }
2054 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002055 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002056 if (i+2 < NCH(n)) {
2057 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2058 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002059 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002060 }
2061 }
2062
2063 if (anchor) {
2064 int anchor2 = 0;
2065 com_addfwref(c, JUMP_FORWARD, &anchor2);
2066 com_backpatch(c, anchor);
2067 com_addbyte(c, ROT_TWO);
2068 com_addbyte(c, POP_TOP);
2069 com_backpatch(c, anchor2);
2070 }
2071}
2072
2073static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002074com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002075{
2076 REQ(n, not_test); /* 'not' not_test | comparison */
2077 if (NCH(n) == 1) {
2078 com_comparison(c, CHILD(n, 0));
2079 }
2080 else {
2081 com_not_test(c, CHILD(n, 1));
2082 com_addbyte(c, UNARY_NOT);
2083 }
2084}
2085
2086static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002087com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002088{
2089 int i;
2090 int anchor;
2091 REQ(n, and_test); /* not_test ('and' not_test)* */
2092 anchor = 0;
2093 i = 0;
2094 for (;;) {
2095 com_not_test(c, CHILD(n, i));
2096 if ((i += 2) >= NCH(n))
2097 break;
2098 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2099 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002100 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002101 }
2102 if (anchor)
2103 com_backpatch(c, anchor);
2104}
2105
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002106static int
2107com_make_closure(struct compiling *c, PyCodeObject *co)
2108{
2109 int i, free = PyTuple_GET_SIZE(co->co_freevars);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002110 /* If the code is compiled with st->st_nested_scopes == 0,
2111 then no variable will ever be added to co_freevars.
2112 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002113 if (free == 0)
2114 return 0;
2115 for (i = 0; i < free; ++i) {
2116 /* Bypass com_addop_varname because it will generate
2117 LOAD_DEREF but LOAD_CLOSURE is needed.
2118 */
2119 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2120 int arg, reftype;
2121
2122 /* Special case: If a class contains a method with a
2123 free variable that has the same name as a method,
2124 the name will be considered free *and* local in the
2125 class. It should be handled by the closure, as
2126 well as by the normal name loookup logic.
2127 */
2128 reftype = get_ref_type(c, PyString_AS_STRING(name));
2129 if (reftype == CELL)
2130 arg = com_lookup_arg(c->c_cellvars, name);
2131 else /* (reftype == FREE) */
2132 arg = com_lookup_arg(c->c_freevars, name);
2133 if (arg == -1) {
2134 fprintf(stderr, "lookup %s in %s %d %d\n",
Jeremy Hylton483638c2001-02-01 20:20:45 +00002135 PyObject_REPR(name), c->c_name, reftype, arg);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002136 Py_FatalError("com_make_closure()");
2137 }
2138 com_addoparg(c, LOAD_CLOSURE, arg);
2139
2140 }
2141 com_push(c, free);
2142 return 1;
2143}
2144
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002145static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002146com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002147{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002148 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002149 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002150 PyObject *co;
2151 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002152 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002153 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2154 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002155 co = (PyObject *) icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002156 if (co == NULL) {
2157 c->c_errors++;
2158 return;
2159 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002160 symtable_exit_scope(c->c_symtable);
Tim Peters1e542112001-02-23 22:23:53 +00002161 i = com_addconst(c, co);
2162 closure = com_make_closure(c, (PyCodeObject *)co);
2163 Py_DECREF(co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002164 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002165 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002166 if (closure)
2167 com_addoparg(c, MAKE_CLOSURE, ndefs);
2168 else
2169 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002170 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002171 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002172 else {
2173 int anchor = 0;
2174 int i = 0;
2175 for (;;) {
2176 com_and_test(c, CHILD(n, i));
2177 if ((i += 2) >= NCH(n))
2178 break;
2179 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2180 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002181 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002182 }
2183 if (anchor)
2184 com_backpatch(c, anchor);
2185 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002186}
2187
2188static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002189com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002190{
2191 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002192 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002193 com_node(c, CHILD(n, 0));
2194 }
2195 else {
2196 int i;
2197 int len;
2198 len = (NCH(n) + 1) / 2;
2199 for (i = 0; i < NCH(n); i += 2)
2200 com_node(c, CHILD(n, i));
2201 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002202 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002203 }
2204}
2205
2206
2207/* Begin of assignment compilation */
2208
Thomas Wouters434d0822000-08-24 20:11:32 +00002209
2210static void
2211com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2212{
2213 com_addbyte(c, DUP_TOP);
2214 com_push(c, 1);
2215 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002216 com_node(c, augn);
2217 com_addbyte(c, opcode);
2218 com_pop(c, 1);
2219 com_addbyte(c, ROT_TWO);
2220 com_addopname(c, STORE_ATTR, n);
2221 com_pop(c, 2);
2222}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002223
2224static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002225com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002226{
2227 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002228 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002229}
2230
2231static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002232com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002233{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002234 REQ(n, trailer);
2235 switch (TYPE(CHILD(n, 0))) {
2236 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002237 com_error(c, PyExc_SyntaxError,
2238 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002239 break;
2240 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002241 if (assigning > OP_APPLY)
2242 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2243 else
2244 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002245 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002246 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002247 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002248 break;
2249 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002250 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002251 }
2252}
2253
2254static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002255com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002256{
2257 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002258 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002259 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002260 if (assigning) {
2261 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002262 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002263 com_push(c, i-1);
2264 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002265 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002266 com_assign(c, CHILD(n, i), assigning, NULL);
2267}
2268
2269static void
2270com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2271{
2272 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002273 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002274 com_push(c, 1);
2275 com_node(c, augn);
2276 com_addbyte(c, opcode);
2277 com_pop(c, 1);
2278 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002279}
2280
2281static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002282com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002283{
2284 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002285 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002286 if (assigning)
2287 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002288}
2289
2290static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002291com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002292{
2293 /* Loop to avoid trivial recursion */
2294 for (;;) {
2295 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002296
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002297 case exprlist:
2298 case testlist:
2299 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002300 if (assigning > OP_APPLY) {
2301 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002302 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002303 return;
2304 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002305 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002306 return;
2307 }
2308 n = CHILD(n, 0);
2309 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002310
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002311 case test:
2312 case and_test:
2313 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002314 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002315 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002316 case xor_expr:
2317 case and_expr:
2318 case shift_expr:
2319 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002320 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002321 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002322 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002323 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002324 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002325 return;
2326 }
2327 n = CHILD(n, 0);
2328 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002329
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002330 case power: /* atom trailer* ('**' power)*
2331 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002332 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002333 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002334 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002335 return;
2336 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002337 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002338 int i;
2339 com_node(c, CHILD(n, 0));
2340 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002341 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
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 Rossum50564e81996-01-12 01:13:16 +00002344 return;
2345 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002346 com_apply_trailer(c, CHILD(n, i));
2347 } /* NB i is still alive */
2348 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002349 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002350 return;
2351 }
2352 n = CHILD(n, 0);
2353 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002354
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002355 case atom:
2356 switch (TYPE(CHILD(n, 0))) {
2357 case LPAR:
2358 n = CHILD(n, 1);
2359 if (TYPE(n) == RPAR) {
2360 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002361 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002362 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002363 return;
2364 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002365 if (assigning > OP_APPLY) {
2366 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002367 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002368 return;
2369 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002370 break;
2371 case LSQB:
2372 n = CHILD(n, 1);
2373 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002374 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002375 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002376 return;
2377 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002378 if (assigning > OP_APPLY) {
2379 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002380 "augmented assign to list not possible");
2381 return;
2382 }
2383 if (NCH(n) > 1
2384 && TYPE(CHILD(n, 1)) == list_for) {
2385 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002386 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002387 return;
2388 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002389 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002390 return;
2391 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002392 if (assigning > OP_APPLY)
2393 com_augassign_name(c, CHILD(n, 0),
2394 assigning, augn);
2395 else
2396 com_assign_name(c, CHILD(n, 0),
2397 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002398 return;
2399 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002400 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002401 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002402 return;
2403 }
2404 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002405
2406 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002407 com_error(c, PyExc_SyntaxError,
2408 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002409 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002410
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002411 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002412 com_error(c, PyExc_SystemError,
2413 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002414 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002415
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002416 }
2417 }
2418}
Guido van Rossum7c531111997-03-11 18:42:21 +00002419
Thomas Wouters434d0822000-08-24 20:11:32 +00002420static void
2421com_augassign(struct compiling *c, node *n)
2422{
2423 int opcode;
2424
2425 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2426 case '+': opcode = INPLACE_ADD; break;
2427 case '-': opcode = INPLACE_SUBTRACT; break;
2428 case '/': opcode = INPLACE_DIVIDE; break;
2429 case '%': opcode = INPLACE_MODULO; break;
2430 case '<': opcode = INPLACE_LSHIFT; break;
2431 case '>': opcode = INPLACE_RSHIFT; break;
2432 case '&': opcode = INPLACE_AND; break;
2433 case '^': opcode = INPLACE_XOR; break;
2434 case '|': opcode = INPLACE_OR; break;
2435 case '*':
2436 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2437 opcode = INPLACE_POWER;
2438 else
2439 opcode = INPLACE_MULTIPLY;
2440 break;
2441 default:
2442 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2443 return;
2444 }
2445 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2446}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002447
2448static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002449com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002450{
Thomas Wouters434d0822000-08-24 20:11:32 +00002451 REQ(n, expr_stmt);
2452 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002453 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002454 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002455 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002456 if (NCH(n) == 1) {
2457 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002458 if (c->c_interactive)
2459 com_addbyte(c, PRINT_EXPR);
2460 else
2461 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002462 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002463 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002464 else if (TYPE(CHILD(n,1)) == augassign)
2465 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002466 else {
2467 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002468 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002469 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002470 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002471 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002472 com_push(c, 1);
2473 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002474 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002475 }
2476 }
2477}
2478
2479static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002480com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002481{
2482 int a = 0, b = 0;
2483 int i;
2484 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2485 /* Generate code like for
2486
2487 if __debug__:
2488 if not <test>:
2489 raise AssertionError [, <message>]
2490
2491 where <message> is the second test, if present.
2492 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002493
Guido van Rossum228d7f31997-04-02 05:24:36 +00002494 if (Py_OptimizeFlag)
2495 return;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002496 com_addop_name(c, LOAD_GLOBAL, "__debug__");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002497 com_push(c, 1);
2498 com_addfwref(c, JUMP_IF_FALSE, &a);
2499 com_addbyte(c, POP_TOP);
2500 com_pop(c, 1);
2501 com_node(c, CHILD(n, 1));
2502 com_addfwref(c, JUMP_IF_TRUE, &b);
2503 com_addbyte(c, POP_TOP);
2504 com_pop(c, 1);
2505 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002506 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002507 com_push(c, 1);
2508 i = NCH(n)/2; /* Either 2 or 4 */
2509 if (i > 1)
2510 com_node(c, CHILD(n, 3));
2511 com_addoparg(c, RAISE_VARARGS, i);
2512 com_pop(c, i);
2513 /* The interpreter does not fall through */
2514 /* All jumps converge here */
2515 com_backpatch(c, a);
2516 com_backpatch(c, b);
2517 com_addbyte(c, POP_TOP);
2518}
2519
2520static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002521com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002522{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002523 int i = 1;
2524 node* stream = NULL;
2525
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002526 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002527
2528 /* are we using the extended print form? */
2529 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2530 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002531 com_node(c, stream);
2532 /* stack: [...] => [... stream] */
2533 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002534 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2535 i = 4;
2536 else
2537 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002538 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002539 for (; i < NCH(n); i += 2) {
2540 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002541 com_addbyte(c, DUP_TOP);
2542 /* stack: [stream] => [stream stream] */
2543 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002544 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002545 /* stack: [stream stream] => [stream stream obj] */
2546 com_addbyte(c, ROT_TWO);
2547 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002548 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002549 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002550 com_pop(c, 2);
2551 }
2552 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002553 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002554 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002555 com_addbyte(c, PRINT_ITEM);
2556 com_pop(c, 1);
2557 }
2558 }
2559 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002560 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002561 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002562 /* must pop the extra stream object off the stack */
2563 com_addbyte(c, POP_TOP);
2564 /* stack: [... stream] => [...] */
2565 com_pop(c, 1);
2566 }
2567 }
2568 else {
2569 if (stream != NULL) {
2570 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002571 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002572 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002573 com_pop(c, 1);
2574 }
2575 else
2576 com_addbyte(c, PRINT_NEWLINE);
2577 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002578}
2579
2580static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002581com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002582{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002583 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002584 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002585 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002586 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002587 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002588 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002589 com_push(c, 1);
2590 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002591 else
2592 com_node(c, CHILD(n, 1));
2593 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002594 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002595}
2596
2597static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002598com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002599{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002600 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002601 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2602 if (NCH(n) > 1) {
2603 com_node(c, CHILD(n, 1));
2604 if (NCH(n) > 3) {
2605 com_node(c, CHILD(n, 3));
2606 if (NCH(n) > 5)
2607 com_node(c, CHILD(n, 5));
2608 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002609 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002610 i = NCH(n)/2;
2611 com_addoparg(c, RAISE_VARARGS, i);
2612 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002613}
2614
2615static void
Thomas Wouters52152252000-08-17 22:55:00 +00002616com_from_import(struct compiling *c, node *n)
2617{
2618 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2619 com_push(c, 1);
2620 if (NCH(n) > 1) {
2621 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2622 com_error(c, PyExc_SyntaxError, "invalid syntax");
2623 return;
2624 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002625 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002626 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002627 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00002628 com_pop(c, 1);
2629}
2630
2631static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002632com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002633{
2634 int i;
2635 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002636 /* 'import' dotted_name (',' dotted_name)* |
2637 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002638 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00002639 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002640 /* 'from' dotted_name 'import' ... */
2641 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002642
2643 if (TYPE(CHILD(n, 3)) == STAR) {
2644 tup = Py_BuildValue("(s)", "*");
2645 } else {
2646 tup = PyTuple_New((NCH(n) - 2)/2);
2647 for (i = 3; i < NCH(n); i += 2) {
2648 PyTuple_SET_ITEM(tup, (i-3)/2,
2649 PyString_FromString(STR(
2650 CHILD(CHILD(n, i), 0))));
2651 }
2652 }
2653 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00002654 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002655 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002656 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00002657 if (TYPE(CHILD(n, 3)) == STAR)
2658 com_addbyte(c, IMPORT_STAR);
2659 else {
2660 for (i = 3; i < NCH(n); i += 2)
2661 com_from_import(c, CHILD(n, i));
2662 com_addbyte(c, POP_TOP);
2663 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002664 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002665 }
2666 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002667 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002668 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00002669 node *subn = CHILD(n, i);
2670 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002671 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002672 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002673 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00002674 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00002675 int j;
2676 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00002677 com_error(c, PyExc_SyntaxError,
2678 "invalid syntax");
2679 return;
2680 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00002681 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
2682 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002683 CHILD(CHILD(subn, 0),
2684 j));
2685 com_addop_varname(c, VAR_STORE,
2686 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002687 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002688 com_addop_varname(c, VAR_STORE,
2689 STR(CHILD(CHILD(subn, 0),
2690 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002691 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002692 }
2693 }
2694}
2695
2696static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002697com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002698{
2699 REQ(n, exec_stmt);
2700 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2701 com_node(c, CHILD(n, 1));
2702 if (NCH(n) >= 4)
2703 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002704 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002705 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002706 com_push(c, 1);
2707 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002708 if (NCH(n) >= 6)
2709 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002710 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002711 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002712 com_push(c, 1);
2713 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002714 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002715 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002716}
2717
Guido van Rossum7c531111997-03-11 18:42:21 +00002718static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002719is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002720{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002721 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002722 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002723 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00002724
2725 /* Label to avoid tail recursion */
2726 next:
2727 switch (TYPE(n)) {
2728
2729 case suite:
2730 if (NCH(n) == 1) {
2731 n = CHILD(n, 0);
2732 goto next;
2733 }
2734 /* Fall through */
2735 case file_input:
2736 for (i = 0; i < NCH(n); i++) {
2737 node *ch = CHILD(n, i);
2738 if (TYPE(ch) == stmt) {
2739 n = ch;
2740 goto next;
2741 }
2742 }
2743 break;
2744
2745 case stmt:
2746 case simple_stmt:
2747 case small_stmt:
2748 n = CHILD(n, 0);
2749 goto next;
2750
2751 case expr_stmt:
2752 case testlist:
2753 case test:
2754 case and_test:
2755 case not_test:
2756 case comparison:
2757 case expr:
2758 case xor_expr:
2759 case and_expr:
2760 case shift_expr:
2761 case arith_expr:
2762 case term:
2763 case factor:
2764 case power:
2765 case atom:
2766 if (NCH(n) == 1) {
2767 n = CHILD(n, 0);
2768 goto next;
2769 }
2770 break;
2771
2772 case NAME:
2773 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2774 return 1;
2775 break;
2776
2777 case NUMBER:
2778 v = parsenumber(c, STR(n));
2779 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002780 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002781 break;
2782 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002783 i = PyObject_IsTrue(v);
2784 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002785 return i == 0;
2786
2787 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002788 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002789 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002790 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002791 break;
2792 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002793 i = PyObject_IsTrue(v);
2794 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002795 return i == 0;
2796
2797 }
2798 return 0;
2799}
2800
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002801static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002802com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002803{
2804 int i;
2805 int anchor = 0;
2806 REQ(n, if_stmt);
2807 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2808 for (i = 0; i+3 < NCH(n); i+=4) {
2809 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002810 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002811 if (is_constant_false(c, ch))
2812 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002813 if (i > 0)
2814 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002815 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002816 com_addfwref(c, JUMP_IF_FALSE, &a);
2817 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002818 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002819 com_node(c, CHILD(n, i+3));
2820 com_addfwref(c, JUMP_FORWARD, &anchor);
2821 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002822 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002823 com_addbyte(c, POP_TOP);
2824 }
2825 if (i+2 < NCH(n))
2826 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002827 if (anchor)
2828 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002829}
2830
2831static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002832com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002833{
2834 int break_anchor = 0;
2835 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002836 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002837 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2838 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002839 block_push(c, SETUP_LOOP);
2840 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002841 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002842 com_node(c, CHILD(n, 1));
2843 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2844 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002845 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002846 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002847 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002848 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002849 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2850 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002851 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002852 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002853 com_addbyte(c, POP_TOP);
2854 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002855 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002856 if (NCH(n) > 4)
2857 com_node(c, CHILD(n, 6));
2858 com_backpatch(c, break_anchor);
2859}
2860
2861static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002862com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002863{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002864 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002865 int break_anchor = 0;
2866 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002867 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002868 REQ(n, for_stmt);
2869 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2870 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002871 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002872 com_node(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002873 v = PyInt_FromLong(0L);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002874 if (v == NULL)
2875 c->c_errors++;
2876 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002877 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002878 Py_XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002879 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002880 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002881 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002882 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00002883 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002884 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002885 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002886 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002887 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2888 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002889 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002890 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002891 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002892 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002893 if (NCH(n) > 8)
2894 com_node(c, CHILD(n, 8));
2895 com_backpatch(c, break_anchor);
2896}
2897
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002898/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002899
2900 SETUP_FINALLY L
2901 <code for S>
2902 POP_BLOCK
2903 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002904 L: <code for Sf>
2905 END_FINALLY
2906
2907 The special instructions use the block stack. Each block
2908 stack entry contains the instruction that created it (here
2909 SETUP_FINALLY), the level of the value stack at the time the
2910 block stack entry was created, and a label (here L).
2911
2912 SETUP_FINALLY:
2913 Pushes the current value stack level and the label
2914 onto the block stack.
2915 POP_BLOCK:
2916 Pops en entry from the block stack, and pops the value
2917 stack until its level is the same as indicated on the
2918 block stack. (The label is ignored.)
2919 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002920 Pops a variable number of entries from the *value* stack
2921 and re-raises the exception they specify. The number of
2922 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002923
2924 The block stack is unwound when an exception is raised:
2925 when a SETUP_FINALLY entry is found, the exception is pushed
2926 onto the value stack (and the exception condition is cleared),
2927 and the interpreter jumps to the label gotten from the block
2928 stack.
2929
2930 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002931 (The contents of the value stack is shown in [], with the top
2932 at the right; 'tb' is trace-back info, 'val' the exception's
2933 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002934
2935 Value stack Label Instruction Argument
2936 [] SETUP_EXCEPT L1
2937 [] <code for S>
2938 [] POP_BLOCK
2939 [] JUMP_FORWARD L0
2940
Guido van Rossum3f5da241990-12-20 15:06:42 +00002941 [tb, val, exc] L1: DUP )
2942 [tb, val, exc, exc] <evaluate E1> )
2943 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2944 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2945 [tb, val, exc, 1] POP )
2946 [tb, val, exc] POP
2947 [tb, val] <assign to V1> (or POP if no V1)
2948 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002949 [] <code for S1>
2950 JUMP_FORWARD L0
2951
Guido van Rossum3f5da241990-12-20 15:06:42 +00002952 [tb, val, exc, 0] L2: POP
2953 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002954 .............................etc.......................
2955
Guido van Rossum3f5da241990-12-20 15:06:42 +00002956 [tb, val, exc, 0] Ln+1: POP
2957 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002958
2959 [] L0: <next statement>
2960
2961 Of course, parts are not generated if Vi or Ei is not present.
2962*/
2963
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002964static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002965com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002966{
2967 int except_anchor = 0;
2968 int end_anchor = 0;
2969 int else_anchor = 0;
2970 int i;
2971 node *ch;
2972
2973 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2974 block_push(c, SETUP_EXCEPT);
2975 com_node(c, CHILD(n, 2));
2976 com_addbyte(c, POP_BLOCK);
2977 block_pop(c, SETUP_EXCEPT);
2978 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2979 com_backpatch(c, except_anchor);
2980 for (i = 3;
2981 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2982 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002983 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002984 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002985 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002986 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002987 break;
2988 }
2989 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002990 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002991 com_addoparg(c, SET_LINENO, ch->n_lineno);
2992 if (NCH(ch) > 1) {
2993 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002994 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002995 com_node(c, CHILD(ch, 1));
2996 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002997 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002998 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
2999 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003000 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003001 }
3002 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003003 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003004 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003005 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003006 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003007 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003008 com_pop(c, 1);
3009 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003010 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003011 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003012 com_node(c, CHILD(n, i+2));
3013 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3014 if (except_anchor) {
3015 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003016 /* We come in with [tb, val, exc, 0] on the
3017 stack; one pop and it's the same as
3018 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003019 com_addbyte(c, POP_TOP);
3020 }
3021 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003022 /* We actually come in here with [tb, val, exc] but the
3023 END_FINALLY will zap those and jump around.
3024 The c_stacklevel does not reflect them so we need not pop
3025 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003026 com_addbyte(c, END_FINALLY);
3027 com_backpatch(c, else_anchor);
3028 if (i < NCH(n))
3029 com_node(c, CHILD(n, i+2));
3030 com_backpatch(c, end_anchor);
3031}
3032
3033static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003034com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003035{
3036 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003037 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003038
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003039 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3040 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003041 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003042 com_addbyte(c, POP_BLOCK);
3043 block_pop(c, SETUP_FINALLY);
3044 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003045 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003046 /* While the generated code pushes only one item,
3047 the try-finally handling can enter here with
3048 up to three items. OK, here are the details:
3049 3 for an exception, 2 for RETURN, 1 for BREAK. */
3050 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003051 com_backpatch(c, finally_anchor);
3052 ch = CHILD(n, NCH(n)-1);
3053 com_addoparg(c, SET_LINENO, ch->n_lineno);
3054 com_node(c, ch);
3055 com_addbyte(c, END_FINALLY);
3056 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003057 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003058}
3059
3060static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003061com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003062{
3063 REQ(n, try_stmt);
3064 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3065 | 'try' ':' suite 'finally' ':' suite */
3066 if (TYPE(CHILD(n, 3)) != except_clause)
3067 com_try_finally(c, n);
3068 else
3069 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003070}
3071
Guido van Rossum8b993a91997-01-17 21:04:03 +00003072static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003073get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003074{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003075 int i;
3076
Guido van Rossum8b993a91997-01-17 21:04:03 +00003077 /* Label to avoid tail recursion */
3078 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003079 switch (TYPE(n)) {
3080
3081 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003082 if (NCH(n) == 1) {
3083 n = CHILD(n, 0);
3084 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003085 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003086 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003087 case file_input:
3088 for (i = 0; i < NCH(n); i++) {
3089 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003090 if (TYPE(ch) == stmt) {
3091 n = ch;
3092 goto next;
3093 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003094 }
3095 break;
3096
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003097 case stmt:
3098 case simple_stmt:
3099 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003100 n = CHILD(n, 0);
3101 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003102
3103 case expr_stmt:
3104 case testlist:
3105 case test:
3106 case and_test:
3107 case not_test:
3108 case comparison:
3109 case expr:
3110 case xor_expr:
3111 case and_expr:
3112 case shift_expr:
3113 case arith_expr:
3114 case term:
3115 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003116 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003117 if (NCH(n) == 1) {
3118 n = CHILD(n, 0);
3119 goto next;
3120 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003121 break;
3122
3123 case atom:
3124 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003125 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003126 break;
3127
3128 }
3129 return NULL;
3130}
3131
Guido van Rossum79f25d91997-04-29 20:08:16 +00003132static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003133get_docstring(node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003134{
Guido van Rossum541563e1999-01-28 15:08:09 +00003135 /* Don't generate doc-strings if run with -OO */
3136 if (Py_OptimizeFlag > 1)
3137 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003138 n = get_rawdocstring(n);
3139 if (n == NULL)
3140 return NULL;
3141 return parsestrplus(n);
3142}
3143
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003144static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003145com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003146{
3147 REQ(n, suite);
3148 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3149 if (NCH(n) == 1) {
3150 com_node(c, CHILD(n, 0));
3151 }
3152 else {
3153 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003154 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003155 node *ch = CHILD(n, i);
3156 if (TYPE(ch) == stmt)
3157 com_node(c, ch);
3158 }
3159 }
3160}
3161
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003162/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003163static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003164com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003165{
3166 int i = c->c_nblocks;
3167 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3168 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3169 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003170 else if (i <= 0) {
3171 /* at the outer level */
3172 com_error(c, PyExc_SyntaxError,
3173 "'continue' not properly in loop");
3174 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003175 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003176 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003177 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003178 if (c->c_block[j] == SETUP_LOOP)
3179 break;
3180 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003181 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003182 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003183 for (; i > j; --i) {
3184 if (c->c_block[i] == SETUP_EXCEPT ||
3185 c->c_block[i] == SETUP_FINALLY) {
3186 com_addoparg(c, CONTINUE_LOOP,
3187 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003188 return;
3189 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003190 if (c->c_block[i] == END_FINALLY) {
3191 com_error(c, PyExc_SyntaxError,
3192 "'continue' not supported inside 'finally' clause");
3193 return;
3194 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003195 }
3196 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003197 com_error(c, PyExc_SyntaxError,
3198 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003199 }
3200 /* XXX Could allow it inside a 'finally' clause
3201 XXX if we could pop the exception still on the stack */
3202}
3203
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003204static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003205com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003206{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003207 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003208 if (TYPE(n) == lambdef) {
3209 /* lambdef: 'lambda' [varargslist] ':' test */
3210 n = CHILD(n, 1);
3211 }
3212 else {
3213 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3214 n = CHILD(n, 2);
3215 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3216 n = CHILD(n, 1);
3217 }
3218 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003219 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003220 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003221 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003222 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3223 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003224 nargs = 0;
3225 ndefs = 0;
3226 for (i = 0; i < nch; i++) {
3227 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003228 if (TYPE(CHILD(n, i)) == STAR ||
3229 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003230 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003231 nargs++;
3232 i++;
3233 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003234 t = RPAR; /* Anything except EQUAL or COMMA */
3235 else
3236 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003237 if (t == EQUAL) {
3238 i++;
3239 ndefs++;
3240 com_node(c, CHILD(n, i));
3241 i++;
3242 if (i >= nch)
3243 break;
3244 t = TYPE(CHILD(n, i));
3245 }
3246 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003247 /* Treat "(a=1, b)" as an error */
3248 if (ndefs)
3249 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003250 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003251 }
3252 if (t != COMMA)
3253 break;
3254 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003255 return ndefs;
3256}
3257
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003258static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003259com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003260{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003261 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003262 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003263 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003264 ndefs = com_argdefs(c, n);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003265 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3266 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003267 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003268 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003269 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003270 c->c_errors++;
3271 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003272 int closure = com_make_closure(c, (PyCodeObject *)co);
3273 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003274 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003275 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003276 if (closure)
3277 com_addoparg(c, MAKE_CLOSURE, ndefs);
3278 else
3279 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003280 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003281 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003282 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003283 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003284 }
3285}
3286
3287static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003288com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003289{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003290 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003291 REQ(n, testlist);
3292 /* testlist: test (',' test)* [','] */
3293 for (i = 0; i < NCH(n); i += 2)
3294 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003295 i = (NCH(n)+1) / 2;
3296 com_addoparg(c, BUILD_TUPLE, i);
3297 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003298}
3299
3300static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003301com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003302{
Guido van Rossum25831651993-05-19 14:50:45 +00003303 int i;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003304 PyObject *co, *v;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003305 char *name;
3306
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003307 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003308 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003309 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003310 c->c_errors++;
3311 return;
3312 }
3313 /* Push the class name on the stack */
3314 i = com_addconst(c, v);
3315 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003316 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003317 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003318 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003319 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003320 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003321 com_push(c, 1);
3322 }
Guido van Rossum25831651993-05-19 14:50:45 +00003323 else
3324 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003325 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003326 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003327 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003328 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003329 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003330 c->c_errors++;
3331 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003332 int closure = com_make_closure(c, (PyCodeObject *)co);
3333 i = com_addconst(c, co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003334 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003335 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003336 if (closure)
3337 com_addoparg(c, MAKE_CLOSURE, 0);
3338 else
3339 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003340 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003341 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003342 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003343 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003344 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003345 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003346}
3347
3348static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003349com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003350{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003351 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003352 if (c->c_errors)
3353 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003354 switch (TYPE(n)) {
3355
3356 /* Definition nodes */
3357
3358 case funcdef:
3359 com_funcdef(c, n);
3360 break;
3361 case classdef:
3362 com_classdef(c, n);
3363 break;
3364
3365 /* Trivial parse tree nodes */
3366
3367 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003368 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003369 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003370 n = CHILD(n, 0);
3371 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003372
3373 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003374 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
3375 com_addoparg(c, SET_LINENO, n->n_lineno);
3376 {
3377 int i;
3378 for (i = 0; i < NCH(n)-1; i += 2)
3379 com_node(c, CHILD(n, i));
3380 }
3381 break;
3382
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003383 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003384 com_addoparg(c, SET_LINENO, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003385 n = CHILD(n, 0);
3386 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003387
3388 /* Statement nodes */
3389
3390 case expr_stmt:
3391 com_expr_stmt(c, n);
3392 break;
3393 case print_stmt:
3394 com_print_stmt(c, n);
3395 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003396 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003397 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003398 break;
3399 case pass_stmt:
3400 break;
3401 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003402 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003403 com_error(c, PyExc_SyntaxError,
3404 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003405 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003406 com_addbyte(c, BREAK_LOOP);
3407 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003408 case continue_stmt:
3409 com_continue_stmt(c, n);
3410 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003411 case return_stmt:
3412 com_return_stmt(c, n);
3413 break;
3414 case raise_stmt:
3415 com_raise_stmt(c, n);
3416 break;
3417 case import_stmt:
3418 com_import_stmt(c, n);
3419 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003420 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003421 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003422 case exec_stmt:
3423 com_exec_stmt(c, n);
3424 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003425 case assert_stmt:
3426 com_assert_stmt(c, n);
3427 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003428 case if_stmt:
3429 com_if_stmt(c, n);
3430 break;
3431 case while_stmt:
3432 com_while_stmt(c, n);
3433 break;
3434 case for_stmt:
3435 com_for_stmt(c, n);
3436 break;
3437 case try_stmt:
3438 com_try_stmt(c, n);
3439 break;
3440 case suite:
3441 com_suite(c, n);
3442 break;
3443
3444 /* Expression nodes */
3445
3446 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003447 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003448 break;
3449 case test:
3450 com_test(c, n);
3451 break;
3452 case and_test:
3453 com_and_test(c, n);
3454 break;
3455 case not_test:
3456 com_not_test(c, n);
3457 break;
3458 case comparison:
3459 com_comparison(c, n);
3460 break;
3461 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003462 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003463 break;
3464 case expr:
3465 com_expr(c, n);
3466 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003467 case xor_expr:
3468 com_xor_expr(c, n);
3469 break;
3470 case and_expr:
3471 com_and_expr(c, n);
3472 break;
3473 case shift_expr:
3474 com_shift_expr(c, n);
3475 break;
3476 case arith_expr:
3477 com_arith_expr(c, n);
3478 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003479 case term:
3480 com_term(c, n);
3481 break;
3482 case factor:
3483 com_factor(c, n);
3484 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003485 case power:
3486 com_power(c, n);
3487 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003488 case atom:
3489 com_atom(c, n);
3490 break;
3491
3492 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003493 com_error(c, PyExc_SystemError,
3494 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003495 }
3496}
3497
Tim Petersdbd9ba62000-07-09 03:09:57 +00003498static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003499
3500static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003501com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003502{
3503 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3504 if (TYPE(CHILD(n, 0)) == LPAR)
3505 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003506 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003507 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003508 com_pop(c, 1);
3509 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003510}
3511
3512static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003513com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003514{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003515 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003516 if (NCH(n) == 1) {
3517 com_fpdef(c, CHILD(n, 0));
3518 }
3519 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003520 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003521 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003522 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003523 for (i = 0; i < NCH(n); i += 2)
3524 com_fpdef(c, CHILD(n, i));
3525 }
3526}
3527
3528static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003529com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003530{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003531 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003532 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003533 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003534 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003535 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003536 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003537 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003538 /* Enter all arguments in table of locals */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003539 for (i = 0, narg = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003540 node *ch = CHILD(n, i);
3541 node *fp;
3542 char *name;
Guido van Rossum50564e81996-01-12 01:13:16 +00003543 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003544 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003545 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3546 fp = CHILD(ch, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003547 if (TYPE(fp) == NAME) {
3548 PyObject *v;
3549 name = STR(fp);
3550 v = PyDict_GetItemString(c->c_cellvars, name);
3551 if (v) {
3552 com_addoparg(c, LOAD_FAST, narg);
3553 com_addoparg(c, STORE_DEREF,
3554 PyInt_AS_LONG(v));
3555 }
3556 } else {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003557 name = nbuf;
3558 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003559 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003560 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003561 narg++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003562 /* all name updates handled by symtable */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003563 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003564 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003565 ch = CHILD(n, i);
3566 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003567 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003568 else
3569 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003570 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003571 /* Handle *arguments */
3572 if (i < nch) {
3573 node *ch;
3574 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003575 if (TYPE(ch) != DOUBLESTAR) {
3576 REQ(ch, STAR);
3577 ch = CHILD(n, i+1);
3578 if (TYPE(ch) == NAME) {
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003579 PyObject *v;
Guido van Rossum50564e81996-01-12 01:13:16 +00003580 i += 3;
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003581 v = PyDict_GetItemString(c->c_cellvars,
3582 STR(ch));
3583 if (v) {
3584 com_addoparg(c, LOAD_FAST, narg);
3585 com_addoparg(c, STORE_DEREF,
3586 PyInt_AS_LONG(v));
Guido van Rossum50564e81996-01-12 01:13:16 +00003587 }
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003588 narg++;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003589 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003590 }
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003591 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003592 /* Handle **keywords */
3593 if (i < nch) {
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003594 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003595 node *ch;
3596 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003597 if (TYPE(ch) != DOUBLESTAR) {
3598 REQ(ch, STAR);
3599 ch = CHILD(n, i+1);
3600 REQ(ch, STAR);
3601 ch = CHILD(n, i+2);
3602 }
3603 else
3604 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003605 REQ(ch, NAME);
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003606 v = PyDict_GetItemString(c->c_cellvars, STR(ch));
3607 if (v) {
3608 com_addoparg(c, LOAD_FAST, narg);
3609 com_addoparg(c, STORE_DEREF, PyInt_AS_LONG(v));
3610 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003611 }
3612 if (complex) {
3613 /* Generate code for complex arguments only after
3614 having counted the simple arguments */
3615 int ilocal = 0;
3616 for (i = 0; i < nch; i++) {
3617 node *ch = CHILD(n, i);
3618 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003619 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003620 break;
3621 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3622 fp = CHILD(ch, 0);
3623 if (TYPE(fp) != NAME) {
3624 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003625 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003626 com_fpdef(c, ch);
3627 }
3628 ilocal++;
3629 if (++i >= nch)
3630 break;
3631 ch = CHILD(n, i);
3632 if (TYPE(ch) == EQUAL)
3633 i += 2;
3634 else
3635 REQ(ch, COMMA);
3636 }
3637 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003638}
3639
3640static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003641com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003642{
3643 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003644 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003645 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003646 doc = get_docstring(n);
3647 if (doc != NULL) {
3648 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003649 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003650 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003651 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003652 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003653 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003654 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003655 for (i = 0; i < NCH(n); i++) {
3656 node *ch = CHILD(n, i);
3657 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3658 com_node(c, ch);
3659 }
3660}
3661
3662/* Top-level compile-node interface */
3663
3664static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003665compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003666{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003667 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003668 node *ch;
3669 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003670 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003671 doc = get_docstring(CHILD(n, 4));
3672 if (doc != NULL) {
3673 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003674 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003675 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003676 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003677 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003678 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3679 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003680 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003681 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003682 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003683 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003684 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003685 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003686 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003687 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003688 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003689}
3690
3691static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003692compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003693{
Guido van Rossum590baa41993-11-30 13:40:46 +00003694 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003695 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003696 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003697
3698 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003699 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003700 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003701 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003702 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003703 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003704 else
3705 ch = CHILD(n, 2);
3706 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003707 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003708 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003709}
3710
3711static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003712compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003713{
3714 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003715 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003716 REQ(n, classdef);
3717 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3718 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003719 c->c_private = c->c_name;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003720 ch = CHILD(n, NCH(n)-1); /* The suite */
3721 doc = get_docstring(ch);
3722 if (doc != NULL) {
3723 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003724 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003725 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003726 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003727 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003728 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003729 }
3730 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003731 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003732 com_node(c, ch);
3733 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003734 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003735 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003736 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003737}
3738
3739static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003740compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003741{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003742 com_addoparg(c, SET_LINENO, n->n_lineno);
3743
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003744 switch (TYPE(n)) {
3745
Guido van Rossum4c417781991-01-21 16:09:22 +00003746 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003747 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003748 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003749 n = CHILD(n, 0);
3750 if (TYPE(n) != NEWLINE)
3751 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003752 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003753 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003754 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003755 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003756 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003757 break;
3758
Guido van Rossum4c417781991-01-21 16:09:22 +00003759 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003760 com_file_input(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 Rossum10dc2e81990-11-18 17:27:39 +00003765 break;
3766
Guido van Rossum590baa41993-11-30 13:40:46 +00003767 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003768 com_node(c, CHILD(n, 0));
3769 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003770 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003771 break;
3772
Guido van Rossum590baa41993-11-30 13:40:46 +00003773 case lambdef: /* anonymous function definition */
3774 compile_lambdef(c, n);
3775 break;
3776
Guido van Rossum4c417781991-01-21 16:09:22 +00003777 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003778 compile_funcdef(c, n);
3779 break;
3780
Guido van Rossum4c417781991-01-21 16:09:22 +00003781 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003782 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003783 break;
3784
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003785 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003786 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003787 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003788 }
3789}
3790
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003791static PyObject *
3792dict_keys_inorder(PyObject *dict, int offset)
3793{
3794 PyObject *tuple, *k, *v;
3795 int i, pos = 0, size = PyDict_Size(dict);
3796
3797 tuple = PyTuple_New(size);
3798 if (tuple == NULL)
3799 return NULL;
3800 while (PyDict_Next(dict, &pos, &k, &v)) {
3801 i = PyInt_AS_LONG(v);
3802 Py_INCREF(k);
3803 PyTuple_SET_ITEM(tuple, i - offset, k);
3804 }
3805 return tuple;
3806}
3807
Guido van Rossum79f25d91997-04-29 20:08:16 +00003808PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003809PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003810{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003811 return jcompile(n, filename, NULL);
3812}
3813
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003814struct symtable *
3815PyNode_CompileSymtable(node *n, char *filename)
3816{
3817 struct symtable *st;
3818
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003819 st = symtable_init();
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003820 if (st == NULL)
3821 return NULL;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00003822 assert(st->st_symbols != NULL);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003823 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
3824 if (st->st_errors > 0) {
3825 PySymtable_Free(st);
3826 return NULL;
3827 }
3828 symtable_node(st, n);
3829 if (st->st_errors > 0) {
3830 PySymtable_Free(st);
3831 return NULL;
3832 }
3833 return st;
3834}
3835
Guido van Rossum79f25d91997-04-29 20:08:16 +00003836static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003837icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003838{
3839 return jcompile(n, base->c_filename, base);
3840}
3841
Guido van Rossum79f25d91997-04-29 20:08:16 +00003842static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003843jcompile(node *n, char *filename, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003844{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003845 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003846 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003847 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003848 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003849 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003850 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003851 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003852 /* c_symtable still points to parent's symbols */
3853 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003854 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003855 sc.c_nested = 1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003856 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003857 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00003858 sc.c_future = PyNode_Future(n, filename);
3859 if (sc.c_future == NULL || symtable_build(&sc, n) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003860 com_free(&sc);
3861 return NULL;
3862 }
3863 }
3864 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003865 if (symtable_load_symbols(&sc) < 0) {
3866 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003867 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003868 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003869 compile_node(&sc, n);
3870 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00003871 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003872 PyObject *consts, *names, *varnames, *filename, *name,
3873 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003874 consts = PyList_AsTuple(sc.c_consts);
3875 names = PyList_AsTuple(sc.c_names);
3876 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003877 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
3878 freevars = dict_keys_inorder(sc.c_freevars,
3879 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003880 filename = PyString_InternFromString(sc.c_filename);
3881 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003882 if (!PyErr_Occurred())
3883 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003884 sc.c_nlocals,
3885 sc.c_maxstacklevel,
3886 sc.c_flags,
3887 sc.c_code,
3888 consts,
3889 names,
3890 varnames,
3891 freevars,
3892 cellvars,
3893 filename,
3894 name,
3895 sc.c_firstlineno,
3896 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003897 Py_XDECREF(consts);
3898 Py_XDECREF(names);
3899 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003900 Py_XDECREF(freevars);
3901 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003902 Py_XDECREF(filename);
3903 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003904 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00003905 else if (!PyErr_Occurred()) {
3906 /* This could happen if someone called PyErr_Clear() after an
3907 error was reported above. That's not supposed to happen,
3908 but I just plugged one case and I'm not sure there can't be
3909 others. In that case, raise SystemError so that at least
3910 it gets reported instead dumping core. */
3911 PyErr_SetString(PyExc_SystemError, "lost syntax error");
3912 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003913 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00003914 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003915 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00003916 sc.c_symtable = NULL;
3917 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003918 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003919 return co;
3920}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003921
3922int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003923PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003924{
3925 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003926 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003927 int line = co->co_firstlineno;
3928 int addr = 0;
3929 while (--size >= 0) {
3930 addr += *p++;
3931 if (addr > addrq)
3932 break;
3933 line += *p++;
3934 }
3935 return line;
3936}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003937
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003938/* The test for LOCAL must come before the test for FREE in order to
3939 handle classes where name is both local and free. The local var is
3940 a method and the free var is a free var referenced within a method.
3941*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003942
3943static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003944get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003945{
3946 PyObject *v;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00003947 if (c->c_symtable->st_nested_scopes) {
3948 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
3949 return CELL;
3950 if (PyDict_GetItemString(c->c_locals, name) != NULL)
3951 return LOCAL;
3952 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
3953 return FREE;
3954 v = PyDict_GetItemString(c->c_globals, name);
3955 if (v) {
3956 if (v == Py_None)
3957 return GLOBAL_EXPLICIT;
3958 else {
3959 return GLOBAL_IMPLICIT;
3960 }
3961 }
3962 } else {
3963 if (PyDict_GetItemString(c->c_locals, name) != NULL)
3964 return LOCAL;
3965 v = PyDict_GetItemString(c->c_globals, name);
3966 if (v) {
3967 if (v == Py_None)
3968 return GLOBAL_EXPLICIT;
3969 else {
3970 return GLOBAL_IMPLICIT;
3971 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003972 }
3973 }
3974 {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003975 char buf[350];
3976 sprintf(buf,
3977 "unknown scope for %.100s in %.100s(%s) in %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00003978 name, c->c_name,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003979 PyObject_REPR(c->c_symtable->st_cur->ste_id),
3980 c->c_filename);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003981 Py_FatalError(buf);
3982 }
3983 return -1; /* can't get here */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003984}
3985
Guido van Rossumee34ac12001-02-28 22:08:12 +00003986/* Helper function to issue symbol table warnings */
3987
3988static void
3989symtable_warn(struct symtable *st, char *msg)
3990{
3991 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, st->st_filename,
3992 st->st_cur->ste_lineno, NULL, NULL) < 0) {
3993 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
3994 PyErr_SetString(PyExc_SyntaxError, msg);
3995 PyErr_SyntaxLocation(st->st_filename,
3996 st->st_cur->ste_lineno);
3997 }
3998 st->st_errors++;
3999 }
4000}
4001
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004002/* Helper function for setting lineno and filename */
4003
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004004static int
4005symtable_build(struct compiling *c, node *n)
4006{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004007 if ((c->c_symtable = symtable_init()) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004008 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004009 c->c_symtable->st_future = c->c_future;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004010 if (c->c_future->ff_nested_scopes)
4011 c->c_symtable->st_nested_scopes = 1;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004012 c->c_symtable->st_filename = c->c_filename;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004013 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
4014 if (c->c_symtable->st_errors > 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004015 return -1;
4016 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004017 if (c->c_symtable->st_errors > 0)
4018 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004019 /* reset for second pass */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004020 c->c_symtable->st_nscopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004021 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004022 return 0;
4023}
4024
4025static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004026symtable_init_compiling_symbols(struct compiling *c)
4027{
4028 PyObject *varnames;
4029
4030 varnames = c->c_symtable->st_cur->ste_varnames;
4031 if (varnames == NULL) {
4032 varnames = PyList_New(0);
4033 if (varnames == NULL)
4034 return -1;
4035 c->c_symtable->st_cur->ste_varnames = varnames;
4036 Py_INCREF(varnames);
4037 } else
4038 Py_INCREF(varnames);
4039 c->c_varnames = varnames;
4040
4041 c->c_globals = PyDict_New();
4042 if (c->c_globals == NULL)
4043 return -1;
4044 c->c_freevars = PyDict_New();
4045 if (c->c_freevars == NULL)
4046 return -1;
4047 c->c_cellvars = PyDict_New();
4048 if (c->c_cellvars == NULL)
4049 return -1;
4050 return 0;
4051}
4052
4053struct symbol_info {
4054 int si_nlocals;
4055 int si_ncells;
4056 int si_nfrees;
4057 int si_nimplicit;
4058};
4059
4060static void
4061symtable_init_info(struct symbol_info *si)
4062{
4063 si->si_nlocals = 0;
4064 si->si_ncells = 0;
4065 si->si_nfrees = 0;
4066 si->si_nimplicit = 0;
4067}
4068
4069static int
4070symtable_resolve_free(struct compiling *c, PyObject *name,
4071 struct symbol_info *si)
4072{
4073 PyObject *dict, *v;
4074
4075 /* Seperate logic for DEF_FREE. If it occurs in a function,
4076 it indicates a local that we must allocate storage for (a
4077 cell var). If it occurs in a class, then the class has a
4078 method and a free variable with the same name.
4079 */
4080
4081 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
4082 v = PyInt_FromLong(si->si_ncells++);
4083 dict = c->c_cellvars;
4084 } else {
4085 v = PyInt_FromLong(si->si_nfrees++);
4086 dict = c->c_freevars;
4087 }
4088 if (v == NULL)
4089 return -1;
4090 if (PyDict_SetItem(dict, name, v) < 0) {
4091 Py_DECREF(v);
4092 return -1;
4093 }
4094 Py_DECREF(v);
4095 return 0;
4096}
4097
4098static int
4099symtable_freevar_offsets(PyObject *freevars, int offset)
4100{
4101 PyObject *name, *v;
4102 int pos;
4103
4104 /* The cell vars are the first elements of the closure,
4105 followed by the free vars. Update the offsets in
4106 c_freevars to account for number of cellvars. */
4107 pos = 0;
4108 while (PyDict_Next(freevars, &pos, &name, &v)) {
4109 int i = PyInt_AS_LONG(v) + offset;
4110 PyObject *o = PyInt_FromLong(i);
4111 if (o == NULL)
4112 return -1;
4113 if (PyDict_SetItem(freevars, name, o) < 0) {
4114 Py_DECREF(o);
4115 return -1;
4116 }
4117 Py_DECREF(o);
4118 }
4119 return 0;
4120}
4121
4122static int
4123symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4124 struct symbol_info *si)
4125{
4126 if (ste->ste_type != TYPE_MODULE)
4127 c->c_flags |= CO_NEWLOCALS;
4128 if (ste->ste_type == TYPE_FUNCTION) {
4129 c->c_nlocals = si->si_nlocals;
4130 if (ste->ste_optimized == 0)
4131 c->c_flags |= CO_OPTIMIZED;
4132 else if (si->si_ncells || si->si_nfrees
4133 || (ste->ste_nested && si->si_nimplicit)
4134 || ste->ste_child_free) {
4135 if (c->c_symtable->st_nested_scopes) {
4136 PyErr_Format(PyExc_SyntaxError,
4137 ILLEGAL_DYNAMIC_SCOPE,
4138 PyString_AS_STRING(ste->ste_name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004139 PyErr_SyntaxLocation(c->c_symtable->st_filename,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004140 ste->ste_lineno);
4141 return -1;
4142 } else {
4143 char buf[200];
4144 sprintf(buf, ILLEGAL_DYNAMIC_SCOPE,
4145 PyString_AS_STRING(ste->ste_name));
4146 if (PyErr_Warn(PyExc_SyntaxWarning,
4147 buf) < 0) {
4148 return -1;
4149 }
4150 }
4151 }
4152 }
4153 return 0;
4154}
4155
4156static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004157symtable_load_symbols(struct compiling *c)
4158{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004159 static PyObject *implicit = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004160 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004161 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004162 PyObject *name, *varnames, *v;
4163 int i, flags, pos;
4164 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004165
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004166 if (implicit == NULL) {
4167 implicit = PyInt_FromLong(1);
4168 if (implicit == NULL)
4169 return -1;
4170 }
4171 v = NULL;
4172
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004173 if (symtable_init_compiling_symbols(c) < 0)
4174 goto fail;
4175 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004176 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004177 si.si_nlocals = PyList_GET_SIZE(varnames);
4178 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004179
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004180 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004181 v = PyInt_FromLong(i);
4182 if (PyDict_SetItem(c->c_locals,
4183 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004184 goto fail;
4185 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004186 }
4187
4188 /* XXX The cases below define the rules for whether a name is
4189 local or global. The logic could probably be clearer. */
4190 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004191 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4192 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004193
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004194 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004195 /* undo the original DEF_FREE */
4196 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004197
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004198 if ((flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004199 && (flags & (DEF_LOCAL | DEF_PARAM)))
4200 symtable_resolve_free(c, name, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004201
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004202 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004203 c->c_argcount--;
4204 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004205 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004206 c->c_argcount--;
4207 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004208 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004209 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004210 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004211 if (flags & DEF_PARAM) {
4212 PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004213 PyString_AS_STRING(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004214 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004215 ste->ste_lineno);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004216 st->st_errors++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004217 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004218 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004219 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4220 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004221 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004222 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004223 if (PyDict_SetItem(c->c_globals, name, implicit) < 0)
4224 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004225 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004226 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004227 if (v == NULL)
4228 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004229 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004230 goto fail;
4231 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004232 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004233 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004234 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004235 } else if (is_free(flags)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004236 if (ste->ste_nested && st->st_nested_scopes) {
4237 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004238 if (v == NULL)
4239 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004240 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004241 goto fail;
4242 Py_DECREF(v);
4243 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004244 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004245 if (PyDict_SetItem(c->c_globals, name,
4246 implicit) < 0)
4247 goto fail;
4248 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004249 }
4250 }
4251
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004252 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4253 return -1;
4254 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004255 fail:
4256 /* is this always the right thing to do? */
4257 Py_XDECREF(v);
4258 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004259}
4260
4261static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004262symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004263{
4264 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004265
4266 st = (struct symtable *)PyMem_Malloc(sizeof(struct symtable));
4267 if (st == NULL)
4268 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004269 st->st_pass = 1;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004270 st->st_nested_scopes = NESTED_SCOPES_DEFAULT;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004271 st->st_filename = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004272 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004273 goto fail;
4274 if ((st->st_symbols = PyDict_New()) == NULL)
4275 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004276 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004277 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004278 st->st_errors = 0;
4279 st->st_tmpname = 0;
4280 st->st_private = NULL;
4281 return st;
4282 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004283 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004284 return NULL;
4285}
4286
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004287void
4288PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004289{
4290 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004291 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004292 Py_XDECREF(st->st_cur);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004293 PyMem_Free((void *)st);
4294}
4295
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004296/* When the compiler exits a scope, it must should update the scope's
4297 free variable information with the list of free variables in its
4298 children.
4299
4300 Variables that are free in children and defined in the current
4301 scope are cellvars.
4302
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004303 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004304 false), free variables in children that are not defined here are
4305 implicit globals.
4306
4307*/
4308
4309static int
4310symtable_update_free_vars(struct symtable *st)
4311{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004312 int i, j, def;
4313 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004314 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004315
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004316 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004317 def = DEF_FREE_CLASS;
4318 else
4319 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004320 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004321 int pos = 0;
4322
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004323 if (list)
4324 PyList_SetSlice(list, 0,
4325 ((PyVarObject*)list)->ob_size, 0);
Barry Warsaw0372af72001-02-23 18:22:59 +00004326 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004327 PyList_GET_ITEM(ste->ste_children, i);
4328 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004329 int v = PyInt_AS_LONG(o);
4330 if (!(is_free(v)))
4331 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004332 if (list == NULL) {
4333 list = PyList_New(0);
4334 if (list == NULL)
4335 return -1;
4336 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004337 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004338 if (PyList_Append(list, name) < 0) {
4339 Py_DECREF(list);
4340 return -1;
4341 }
4342 }
4343 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
4344 name = PyList_GET_ITEM(list, j);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004345 if (ste->ste_nested) {
4346 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004347 name, def) < 0) {
4348 Py_DECREF(list);
4349 return -1;
4350 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004351 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004352 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004353 name) < 0) {
4354 Py_DECREF(list);
4355 return -1;
4356 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004357 }
4358 }
4359 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004360
4361 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004362 return 0;
4363}
4364
4365/* If the current scope is a non-nested class or if name is not
4366 defined in the current, non-nested scope, then it is an implicit
4367 global in all nested scopes.
4368*/
4369
4370static int
4371symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
4372{
4373 PyObject *o;
4374 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004375 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004376
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004377 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004378 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004379 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004380 if (o == NULL)
4381 return symtable_undo_free(st, child, name);
4382 v = PyInt_AS_LONG(o);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004383 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004384 return symtable_undo_free(st, child, name);
4385 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004386 return symtable_add_def_o(st, ste->ste_symbols,
4387 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004388}
4389
4390static int
4391symtable_undo_free(struct symtable *st, PyObject *id,
4392 PyObject *name)
4393{
4394 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004395 PyObject *info;
4396 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004397
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004398 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
4399 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004400 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004401 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004402 if (info == NULL)
4403 return 0;
4404 v = PyInt_AS_LONG(info);
4405 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004406 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004407 DEF_FREE_GLOBAL) < 0)
4408 return -1;
4409 } else
4410 /* If the name is defined here or declared global,
4411 then the recursion stops. */
4412 return 0;
4413
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004414 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
4415 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00004416 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004417 PyList_GET_ITEM(ste->ste_children, i);
4418 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004419 if (x < 0)
4420 return x;
4421 }
4422 return 0;
4423}
4424
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004425/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
4426 This reference is released when the scope is exited, via the DECREF
4427 in symtable_exit_scope().
4428*/
4429
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004430static int
4431symtable_exit_scope(struct symtable *st)
4432{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004433 int end;
4434
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004435 if (st->st_pass == 1 && st->st_nested_scopes)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004436 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004437 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004438 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004439 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
4440 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004441 if (PySequence_DelItem(st->st_stack, end) < 0)
4442 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004443 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004444}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004445
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004446static void
4447symtable_enter_scope(struct symtable *st, char *name, int type,
4448 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004449{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004450 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004451
4452 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004453 prev = st->st_cur;
4454 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
4455 Py_DECREF(st->st_cur);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004456 st->st_errors++;
4457 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004458 }
4459 }
Barry Warsaw0372af72001-02-23 18:22:59 +00004460 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004461 PySymtableEntry_New(st, name, type, lineno);
4462 if (strcmp(name, TOP) == 0)
4463 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004464 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004465 if (PyList_Append(prev->ste_children,
4466 (PyObject *)st->st_cur) < 0)
4467 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004468 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004469}
4470
4471static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004472symtable_lookup(struct symtable *st, char *name)
4473{
4474 char buffer[MANGLE_LEN];
4475 PyObject *v;
4476 int flags;
4477
4478 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
4479 name = buffer;
4480 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
4481 if (v == NULL) {
4482 if (PyErr_Occurred())
4483 return -1;
4484 else
4485 return 0;
4486 }
4487
4488 flags = PyInt_AS_LONG(v);
4489 return flags;
4490}
4491
4492static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004493symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004494{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004495 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004496 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004497 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004498
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004499 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004500 name = buffer;
4501 if ((s = PyString_InternFromString(name)) == NULL)
4502 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004503 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
4504 Py_DECREF(s);
4505 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004506}
4507
4508/* Must only be called with mangled names */
4509
4510static int
4511symtable_add_def_o(struct symtable *st, PyObject *dict,
4512 PyObject *name, int flag)
4513{
4514 PyObject *o;
4515 int val;
4516
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004517 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004518 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004519 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004520 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00004521 PyString_AsString(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004522 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004523 st->st_cur->ste_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004524 return -1;
4525 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004526 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004527 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004528 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004529 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004530 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004531 Py_DECREF(o);
4532 return -1;
4533 }
4534 Py_DECREF(o);
4535
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004536 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004537 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004538 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004539 } else if (flag & DEF_GLOBAL) {
4540 /* XXX need to update DEF_GLOBAL for other flags too;
4541 perhaps only DEF_FREE_GLOBAL */
4542 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004543 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004544 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004545 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004546 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004547 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004548 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004549 Py_DECREF(o);
4550 return -1;
4551 }
4552 Py_DECREF(o);
4553 }
4554 return 0;
4555}
4556
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004557#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004558
4559static void
4560symtable_node(struct symtable *st, node *n)
4561{
4562 int i, start = 0;
4563
4564 loop:
4565 switch (TYPE(n)) {
4566 case funcdef: {
4567 char *func_name = STR(CHILD(n, 1));
4568 symtable_add_def(st, func_name, DEF_LOCAL);
4569 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004570 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004571 symtable_funcdef(st, n);
4572 symtable_exit_scope(st);
4573 break;
4574 }
4575 case lambdef:
4576 if (NCH(n) == 4)
4577 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004578 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004579 symtable_funcdef(st, n);
4580 symtable_exit_scope(st);
4581 break;
4582 case classdef: {
4583 char *tmp, *class_name = STR(CHILD(n, 1));
4584 symtable_add_def(st, class_name, DEF_LOCAL);
4585 if (TYPE(CHILD(n, 2)) == LPAR) {
4586 node *bases = CHILD(n, 3);
4587 int i;
4588 for (i = 0; i < NCH(bases); i += 2) {
4589 symtable_node(st, CHILD(bases, i));
4590 }
4591 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004592 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004593 tmp = st->st_private;
4594 st->st_private = class_name;
4595 symtable_node(st, CHILD(n, NCH(n) - 1));
4596 st->st_private = tmp;
4597 symtable_exit_scope(st);
4598 break;
4599 }
4600 case if_stmt:
4601 for (i = 0; i + 3 < NCH(n); i += 4) {
4602 if (is_constant_false(NULL, (CHILD(n, i + 1))))
4603 continue;
4604 symtable_node(st, CHILD(n, i + 1));
4605 symtable_node(st, CHILD(n, i + 3));
4606 }
4607 if (i + 2 < NCH(n))
4608 symtable_node(st, CHILD(n, i + 2));
4609 break;
4610 case global_stmt:
4611 symtable_global(st, n);
4612 break;
4613 case import_stmt:
4614 symtable_import(st, n);
4615 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004616 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004617 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004618 symtable_node(st, CHILD(n, 1));
4619 if (NCH(n) > 2)
4620 symtable_node(st, CHILD(n, 3));
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004621 else
4622 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004623 if (NCH(n) > 4)
4624 symtable_node(st, CHILD(n, 5));
4625 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004626
4627 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00004628 case assert_stmt:
4629 if (Py_OptimizeFlag)
4630 return;
4631 if (NCH(n) == 2) {
4632 n = CHILD(n, 1);
4633 goto loop;
4634 } else {
4635 symtable_node(st, CHILD(n, 1));
4636 n = CHILD(n, 3);
4637 goto loop;
4638 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004639 case except_clause:
4640 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004641 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004642 if (NCH(n) > 1) {
4643 n = CHILD(n, 1);
4644 goto loop;
4645 }
4646 break;
4647 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004648 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004649 break;
4650 case expr_stmt:
4651 if (NCH(n) == 1)
4652 n = CHILD(n, 0);
4653 else {
4654 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004655 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004656 symtable_node(st, CHILD(n, 2));
4657 break;
4658 } else {
4659 int i;
4660 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004661 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004662 n = CHILD(n, NCH(n) - 1);
4663 }
4664 }
4665 goto loop;
4666 /* watchout for fall-through logic below */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004667 case argument:
4668 if (NCH(n) == 3) {
4669 n = CHILD(n, 2);
4670 goto loop;
4671 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004672 case listmaker:
4673 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
4674 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton5f827f42001-01-23 01:26:20 +00004675 n = CHILD(n, 0);
4676 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004677 }
4678 case atom:
4679 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
4680 symtable_add_use(st, STR(CHILD(n, 0)));
4681 break;
4682 }
4683 case for_stmt:
4684 if (TYPE(n) == for_stmt) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004685 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004686 start = 3;
4687 }
4688 default:
4689 if (NCH(n) == 1) {
4690 n = CHILD(n, 0);
4691 goto loop;
4692 }
4693 for (i = start; i < NCH(n); ++i)
4694 if (TYPE(CHILD(n, i)) >= single_input)
4695 symtable_node(st, CHILD(n, i));
4696 }
4697}
4698
4699static void
4700symtable_funcdef(struct symtable *st, node *n)
4701{
4702 node *body;
4703
4704 if (TYPE(n) == lambdef) {
4705 if (NCH(n) == 4)
4706 symtable_params(st, CHILD(n, 1));
4707 } else
4708 symtable_params(st, CHILD(n, 2));
4709 body = CHILD(n, NCH(n) - 1);
4710 symtable_node(st, body);
4711}
4712
4713/* The next two functions parse the argument tuple.
4714 symtable_default_arg() checks for names in the default arguments,
4715 which are references in the defining scope. symtable_params()
4716 parses the parameter names, which are defined in the function's
4717 body.
4718
4719 varargslist:
4720 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
4721 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
4722*/
4723
4724static void
4725symtable_default_args(struct symtable *st, node *n)
4726{
4727 node *c;
4728 int i;
4729
4730 if (TYPE(n) == parameters) {
4731 n = CHILD(n, 1);
4732 if (TYPE(n) == RPAR)
4733 return;
4734 }
4735 REQ(n, varargslist);
4736 for (i = 0; i < NCH(n); i += 2) {
4737 c = CHILD(n, i);
4738 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
4739 break;
4740 }
4741 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
4742 symtable_node(st, CHILD(n, i));
4743 }
4744}
4745
4746static void
4747symtable_params(struct symtable *st, node *n)
4748{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004749 int i, complex = -1, ext = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004750 node *c = NULL;
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 ext = 1;
4762 break;
4763 }
4764 if (TYPE(c) == test) {
4765 continue;
4766 }
4767 if (TYPE(CHILD(c, 0)) == NAME)
4768 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
4769 else {
4770 char nbuf[10];
4771 sprintf(nbuf, ".%d", i);
4772 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004773 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004774 }
4775 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004776 if (ext) {
4777 c = CHILD(n, i);
4778 if (TYPE(c) == STAR) {
4779 i++;
4780 symtable_add_def(st, STR(CHILD(n, i)),
4781 DEF_PARAM | DEF_STAR);
4782 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00004783 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004784 c = NULL;
4785 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004786 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004787 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004788 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004789 i++;
4790 symtable_add_def(st, STR(CHILD(n, i)),
4791 DEF_PARAM | DEF_DOUBLESTAR);
4792 }
4793 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004794 if (complex >= 0) {
4795 int j;
4796 for (j = 0; j <= complex; j++) {
4797 c = CHILD(n, j);
4798 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00004799 c = CHILD(n, ++j);
4800 else if (TYPE(c) == EQUAL)
4801 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004802 if (TYPE(CHILD(c, 0)) == LPAR)
4803 symtable_params_fplist(st, CHILD(c, 1));
4804 }
4805 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004806}
4807
4808static void
4809symtable_params_fplist(struct symtable *st, node *n)
4810{
4811 int i;
4812 node *c;
4813
4814 REQ(n, fplist);
4815 for (i = 0; i < NCH(n); i += 2) {
4816 c = CHILD(n, i);
4817 REQ(c, fpdef);
4818 if (NCH(c) == 1)
4819 symtable_add_def(st, STR(CHILD(c, 0)),
4820 DEF_PARAM | DEF_INTUPLE);
4821 else
4822 symtable_params_fplist(st, CHILD(c, 1));
4823 }
4824
4825}
4826
4827static void
4828symtable_global(struct symtable *st, node *n)
4829{
4830 int i;
4831
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004832 for (i = 1; i < NCH(n); i += 2) {
4833 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00004834 int flags;
4835
4836 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004837 if (flags < 0)
4838 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00004839 if (flags && flags != DEF_GLOBAL) {
4840 char buf[500];
4841 if (flags & DEF_PARAM) {
4842 PyErr_Format(PyExc_SyntaxError,
4843 "name '%.400s' is local and global",
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004844 name);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004845 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00004846 st->st_cur->ste_lineno);
4847 st->st_errors++;
4848 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00004849 }
4850 else {
4851 if (flags & DEF_LOCAL)
4852 sprintf(buf, GLOBAL_AFTER_ASSIGN,
4853 name);
4854 else
4855 sprintf(buf, GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00004856 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00004857 }
4858 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004859 symtable_add_def(st, name, DEF_GLOBAL);
4860 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004861}
4862
4863static void
4864symtable_list_comprehension(struct symtable *st, node *n)
4865{
4866 char tmpname[12];
4867
Tim Peters30814212001-02-17 05:30:26 +00004868 sprintf(tmpname, "_[%d]", ++st->st_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004869 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004870 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004871 symtable_node(st, CHILD(n, 3));
4872 if (NCH(n) == 5)
4873 symtable_node(st, CHILD(n, 4));
4874 --st->st_tmpname;
4875}
4876
4877static void
4878symtable_import(struct symtable *st, node *n)
4879{
4880 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004881 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004882 | 'from' dotted_name 'import'
4883 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00004884 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004885 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004886 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004887 node *dotname = CHILD(n, 1);
4888 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
4889 /* check for bogus imports */
4890 if (n->n_lineno >= st->st_future->ff_last_lineno) {
4891 PyErr_SetString(PyExc_SyntaxError,
4892 LATE_FUTURE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004893 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004894 n->n_lineno);
4895 st->st_errors++;
4896 return;
4897 }
4898 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004899 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004900 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004901 } else {
4902 for (i = 3; i < NCH(n); i += 2) {
4903 node *c = CHILD(n, i);
4904 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004905 symtable_assign(st, CHILD(c, 2),
4906 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004907 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004908 symtable_assign(st, CHILD(c, 0),
4909 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004910 }
4911 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004912 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004913 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004914 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004915 }
4916 }
4917}
4918
4919static void
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004920symtable_assign(struct symtable *st, node *n, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004921{
4922 node *tmp;
4923 int i;
4924
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004925 loop:
4926 switch (TYPE(n)) {
4927 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004928 /* invalid assignment, e.g. lambda x:x=2. The next
4929 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004930 return;
4931 case power:
4932 if (NCH(n) > 2) {
4933 for (i = 2; i < NCH(n); ++i)
4934 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
4935 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004936 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004937 if (NCH(n) > 1) {
4938 symtable_node(st, CHILD(n, 0));
4939 symtable_node(st, CHILD(n, 1));
4940 } else {
4941 n = CHILD(n, 0);
4942 goto loop;
4943 }
4944 return;
4945 case listmaker:
4946 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
4947 symtable_list_comprehension(st, CHILD(n, 1));
4948 else {
4949 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004950 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004951 }
4952 return;
4953 case exprlist:
4954 case testlist:
4955 if (NCH(n) == 1) {
4956 n = CHILD(n, 0);
4957 goto loop;
4958 }
4959 else {
4960 int i;
4961 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004962 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004963 return;
4964 }
4965 goto loop;
4966 case atom:
4967 tmp = CHILD(n, 0);
4968 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
4969 n = CHILD(n, 1);
4970 goto loop;
4971 } else if (TYPE(tmp) == NAME)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004972 symtable_add_def(st, STR(tmp), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004973 return;
4974 case dotted_as_name:
4975 if (NCH(n) == 3)
4976 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004977 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004978 else
4979 symtable_add_def(st,
4980 STR(CHILD(CHILD(n,
4981 0), 0)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004982 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004983 return;
4984 case dotted_name:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004985 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004986 return;
4987 case NAME:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004988 symtable_add_def(st, STR(n), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004989 return;
4990 default:
4991 if (NCH(n) == 0)
4992 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00004993 if (NCH(n) == 1) {
4994 n = CHILD(n, 0);
4995 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004996 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00004997 /* Should only occur for errors like x + 1 = 1,
4998 which will be caught in the next pass. */
4999 for (i = 0; i < NCH(n); ++i)
5000 if (TYPE(CHILD(n, i)) >= single_input)
5001 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005002 }
5003}