blob: bd6a679658d18dbe42aae8ddc6822ee09e6cb3c4 [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;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000315 }
316 return co;
317}
318
319
320/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000321
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000322/* The compiler uses two passes to generate bytecodes. The first pass
323 builds the symbol table. The second pass generates the bytecode.
324
325 The first pass uses a single symtable struct. The second pass uses
326 a compiling struct for each code block. The compiling structs
327 share a reference to the symtable.
328
329 The two passes communicate via symtable_load_symbols() and via
330 is_local() and is_global(). The former initializes several slots
331 in the compiling struct: c_varnames, c_locals, c_nlocals,
332 c_argcount, c_globals, and c_flags.
333*/
334
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000335struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000336 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000337 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000338 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000339 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000340 PyObject *c_name_dict; /* inverse of c_names */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000341 PyObject *c_globals; /* dictionary (value=None) */
342 PyObject *c_locals; /* dictionary (value=localID) */
343 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000344 PyObject *c_freevars; /* dictionary (value=None) */
345 PyObject *c_cellvars; /* list */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000346 int c_nlocals; /* index of next local */
347 int c_argcount; /* number of top-level arguments */
348 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000349 int c_nexti; /* index into c_code */
350 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000351 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000352 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000353 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000354 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000355 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000356 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000357 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000358 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000359 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000360 int c_stacklevel; /* Current stack level */
361 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000362 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000363 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000364 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000365 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000366 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000367 int c_nested; /* Is block nested funcdef or lamdef? */
368 int c_closure; /* Is nested w/freevars? */
369 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000370 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000371};
372
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000373int is_free(int v)
374{
375 if ((v & (USE | DEF_FREE))
376 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
377 return 1;
378 if (v & DEF_FREE_CLASS)
379 return 1;
380 return 0;
381}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000382
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000383static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000384com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000385{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000386 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
387
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000388 if (c == NULL) {
389 /* Error occurred via symtable call to
390 is_constant_false */
391 PyErr_SetString(exc, msg);
392 return;
393 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000394 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000395 if (c->c_lineno < 1 || c->c_interactive) {
396 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000397 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000398 return;
399 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000400 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000401 if (v == NULL)
402 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000403
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000404 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000405 if (line == NULL) {
406 Py_INCREF(Py_None);
407 line = Py_None;
408 }
409 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
410 Py_None, line);
411 if (t == NULL)
412 goto exit;
413 w = Py_BuildValue("(OO)", v, t);
414 if (w == NULL)
415 goto exit;
416 PyErr_SetObject(exc, w);
417 exit:
418 Py_XDECREF(t);
419 Py_XDECREF(v);
420 Py_XDECREF(w);
421 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000422}
423
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000424/* Interface to the block stack */
425
426static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000427block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000428{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000429 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000430 com_error(c, PyExc_SystemError,
431 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000432 }
433 else {
434 c->c_block[c->c_nblocks++] = type;
435 }
436}
437
438static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000439block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000440{
441 if (c->c_nblocks > 0)
442 c->c_nblocks--;
443 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000444 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000445 }
446}
447
Guido van Rossum681d79a1995-07-18 14:51:37 +0000448/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000449
Tim Petersdbd9ba62000-07-09 03:09:57 +0000450static int com_init(struct compiling *, char *);
451static void com_free(struct compiling *);
452static void com_push(struct compiling *, int);
453static void com_pop(struct compiling *, int);
454static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000455static void com_node(struct compiling *, node *);
456static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000457static void com_addbyte(struct compiling *, int);
458static void com_addint(struct compiling *, int);
459static void com_addoparg(struct compiling *, int, int);
460static void com_addfwref(struct compiling *, int, int *);
461static void com_backpatch(struct compiling *, int);
462static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
463static int com_addconst(struct compiling *, PyObject *);
464static int com_addname(struct compiling *, PyObject *);
465static void com_addopname(struct compiling *, int, node *);
466static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000467static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000468static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000469static void com_assign(struct compiling *, node *, int, node *);
470static void com_assign_name(struct compiling *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000471static PyCodeObject *icompile(node *, struct compiling *);
472static PyCodeObject *jcompile(node *, char *, struct compiling *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000473static PyObject *parsestrplus(node *);
474static PyObject *parsestr(char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000475static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000476
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000477static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000478
479/* symtable operations */
480static int symtable_build(struct compiling *, node *);
481static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000482static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000483static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000484static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000485static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000486static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000487
488static void symtable_node(struct symtable *, node *);
489static void symtable_funcdef(struct symtable *, node *);
490static void symtable_default_args(struct symtable *, node *);
491static void symtable_params(struct symtable *, node *);
492static void symtable_params_fplist(struct symtable *, node *n);
493static void symtable_global(struct symtable *, node *);
494static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000495static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000496static void symtable_list_comprehension(struct symtable *, node *);
497
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000498static int symtable_update_free_vars(struct symtable *);
499static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
500static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
501
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000502/* helper */
503static void
504do_pad(int pad)
505{
506 int i;
507 for (i = 0; i < pad; ++i)
508 fprintf(stderr, " ");
509}
510
511static void
512dump(node *n, int pad, int depth)
513{
514 int i;
515 if (depth == 0)
516 return;
517 do_pad(pad);
518 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
519 if (depth > 0)
520 depth--;
521 for (i = 0; i < NCH(n); ++i)
522 dump(CHILD(n, i), pad + 1, depth);
523}
524
525#define DUMP(N) dump(N, 0, -1)
526
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000527static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000528com_init(struct compiling *c, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000529{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000530 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000531 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
532 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000533 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000534 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000535 goto fail;
536 if ((c->c_const_dict = PyDict_New()) == NULL)
537 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000538 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000539 goto fail;
540 if ((c->c_name_dict = PyDict_New()) == NULL)
541 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000542 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000543 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000544 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
545 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000546 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000547 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000548 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000549 c->c_freevars = NULL;
550 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000551 c->c_nlocals = 0;
552 c->c_argcount = 0;
553 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000554 c->c_nexti = 0;
555 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000556 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000557 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000558 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000559 c->c_begin = 0;
560 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000561 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000562 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000563 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000564 c->c_stacklevel = 0;
565 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000566 c->c_firstlineno = 0;
567 c->c_last_addr = 0;
568 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000569 c->c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000570 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000571 c->c_nested = 0;
572 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000573 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000574 return 1;
575
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000576 fail:
577 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000578 return 0;
579}
580
581static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000582com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000583{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000584 Py_XDECREF(c->c_code);
585 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000586 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000587 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000588 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000589 Py_XDECREF(c->c_globals);
590 Py_XDECREF(c->c_locals);
591 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000592 Py_XDECREF(c->c_freevars);
593 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000594 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +0000595 if (c->c_future)
596 PyMem_Free((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000597}
598
599static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000600com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000601{
602 c->c_stacklevel += n;
603 if (c->c_stacklevel > c->c_maxstacklevel)
604 c->c_maxstacklevel = c->c_stacklevel;
605}
606
607static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000608com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000609{
610 if (c->c_stacklevel < n) {
Guido van Rossum90f827c1998-08-25 18:22:17 +0000611 /* fprintf(stderr,
Guido van Rossum8b993a91997-01-17 21:04:03 +0000612 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
613 c->c_filename, c->c_lineno,
Guido van Rossum90f827c1998-08-25 18:22:17 +0000614 c->c_nexti, c->c_stacklevel, n); */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000615 c->c_stacklevel = 0;
616 }
617 else
618 c->c_stacklevel -= n;
619}
620
621static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000622com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000623{
624 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000625 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000626 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000627 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000628}
629
630static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000631com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000632{
633 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000634 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000635 assert(byte >= 0 && byte <= 255);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000636 if (byte < 0 || byte > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000637 com_error(c, PyExc_SystemError,
638 "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000639 }
640 if (c->c_code == NULL)
641 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000642 len = PyString_Size(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000643 if (c->c_nexti >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000644 if (_PyString_Resize(&c->c_code, len+1000) != 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000645 c->c_errors++;
646 return;
647 }
648 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000649 PyString_AsString(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000650}
651
652static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000653com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000654{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000655 com_addbyte(c, x & 0xff);
656 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000657}
658
659static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000660com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000661{
662 int size;
663 char *p;
664 if (c->c_lnotab == NULL)
665 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000666 size = PyString_Size(c->c_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000667 if (c->c_lnotab_next+2 > size) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000668 if (_PyString_Resize(&c->c_lnotab, size + 1000) < 0) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000669 c->c_errors++;
670 return;
671 }
672 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000673 p = PyString_AsString(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000674 *p++ = addr;
675 *p++ = line;
676 c->c_lnotab_next += 2;
677}
678
679static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000680com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000681{
682 c->c_lineno = lineno;
683 if (c->c_firstlineno == 0) {
684 c->c_firstlineno = c->c_last_line = lineno;
685 }
686 else {
687 int incr_addr = c->c_nexti - c->c_last_addr;
688 int incr_line = lineno - c->c_last_line;
689 while (incr_addr > 0 || incr_line > 0) {
690 int trunc_addr = incr_addr;
691 int trunc_line = incr_line;
692 if (trunc_addr > 255)
693 trunc_addr = 255;
694 if (trunc_line > 255)
695 trunc_line = 255;
696 com_add_lnotab(c, trunc_addr, trunc_line);
697 incr_addr -= trunc_addr;
698 incr_line -= trunc_line;
699 }
700 c->c_last_addr = c->c_nexti;
701 c->c_last_line = lineno;
702 }
703}
704
705static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000706com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000707{
Fred Drakeef8ace32000-08-24 00:32:09 +0000708 int extended_arg = arg >> 16;
Guido van Rossum8e793d91997-03-03 19:13:14 +0000709 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000710 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000711 if (Py_OptimizeFlag)
712 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000713 }
Fred Drakeef8ace32000-08-24 00:32:09 +0000714 if (extended_arg){
715 com_addbyte(c, EXTENDED_ARG);
716 com_addint(c, extended_arg);
717 arg &= 0xffff;
718 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000719 com_addbyte(c, op);
720 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000721}
722
723static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000724com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000725{
726 /* Compile a forward reference for backpatching */
727 int here;
728 int anchor;
729 com_addbyte(c, op);
730 here = c->c_nexti;
731 anchor = *p_anchor;
732 *p_anchor = here;
733 com_addint(c, anchor == 0 ? 0 : here - anchor);
734}
735
736static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000737com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000738{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000739 unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000740 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000741 int dist;
742 int prev;
743 for (;;) {
744 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000745 prev = code[anchor] + (code[anchor+1] << 8);
746 dist = target - (anchor+2);
747 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +0000748 dist >>= 8;
749 code[anchor+1] = dist;
750 dist >>= 8;
751 if (dist) {
752 com_error(c, PyExc_SystemError,
753 "com_backpatch: offset too large");
754 break;
755 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000756 if (!prev)
757 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000758 anchor -= prev;
759 }
760}
761
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000762/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000763
764static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000765com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000766{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000767 PyObject *w, *t, *np=NULL;
768 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000769
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000770 t = Py_BuildValue("(OO)", v, v->ob_type);
771 if (t == NULL)
772 goto fail;
773 w = PyDict_GetItem(dict, t);
774 if (w != NULL) {
775 n = PyInt_AsLong(w);
776 } else {
777 n = PyList_Size(list);
778 np = PyInt_FromLong(n);
779 if (np == NULL)
780 goto fail;
781 if (PyList_Append(list, v) != 0)
782 goto fail;
783 if (PyDict_SetItem(dict, t, np) != 0)
784 goto fail;
785 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000786 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000787 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000788 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000789 fail:
790 Py_XDECREF(np);
791 Py_XDECREF(t);
792 c->c_errors++;
793 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000794}
795
796static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000797com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000798{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000799 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000800}
801
802static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000803com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000804{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000805 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000806}
807
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000808static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000809mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000810{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000811 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000812 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +0000813 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000814 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
815 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000816 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000817 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000818 return 0; /* Don't mangle __extremely_long_names */
819 if (name[nlen-1] == '_' && name[nlen-2] == '_')
820 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000821 /* Strip leading underscores from class name */
822 while (*p == '_')
823 p++;
824 if (*p == '\0')
825 return 0; /* Don't mangle if class is just underscores */
826 plen = strlen(p);
827 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000828 plen = maxlen-nlen-2; /* Truncate class name if too long */
829 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000830 buffer[0] = '_';
831 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000832 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000833 return 1;
834}
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000835
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000836static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000837com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000838{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000839 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000840 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000841 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000842
843 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000844 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000845 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000846 c->c_errors++;
847 i = 255;
848 }
849 else {
850 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000851 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000852 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000853 com_addoparg(c, op, i);
854}
855
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000856#define NAME_LOCAL 0
857#define NAME_GLOBAL 1
858#define NAME_DEFAULT 2
859#define NAME_CLOSURE 3
860
861static int
862com_lookup_arg(PyObject *dict, PyObject *name)
863{
864 PyObject *v = PyDict_GetItem(dict, name);
865 if (v == NULL)
866 return -1;
867 else
868 return PyInt_AS_LONG(v);
869}
870
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000871static void
872com_addop_varname(struct compiling *c, int kind, char *name)
873{
874 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000875 int i, reftype;
876 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000877 int op = STOP_CODE;
878 char buffer[MANGLE_LEN];
879
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000880 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000881 name = buffer;
882 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
883 c->c_errors++;
884 i = 255;
885 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000886 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000887
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000888 reftype = get_ref_type(c, name);
889 switch (reftype) {
890 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000891 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000892 scope = NAME_LOCAL;
893 break;
894 case GLOBAL_EXPLICIT:
895 scope = NAME_GLOBAL;
896 break;
897 case GLOBAL_IMPLICIT:
898 if (c->c_flags & CO_OPTIMIZED)
899 scope = NAME_GLOBAL;
900 break;
901 case FREE:
902 case CELL:
903 scope = NAME_CLOSURE;
904 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000905 }
906
907 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000908 if (scope == NAME_LOCAL)
909 i = com_lookup_arg(c->c_locals, v);
910 else if (reftype == FREE)
911 i = com_lookup_arg(c->c_freevars, v);
912 else if (reftype == CELL)
913 i = com_lookup_arg(c->c_cellvars, v);
914 if (i == -1) {
915 c->c_errors++; /* XXX no exception set */
916 i = 255;
917 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000918 }
919 Py_DECREF(v);
920
921 switch (kind) {
922 case VAR_LOAD:
923 switch (scope) {
924 case NAME_LOCAL:
925 op = LOAD_FAST;
926 break;
927 case NAME_GLOBAL:
928 op = LOAD_GLOBAL;
929 break;
930 case NAME_DEFAULT:
931 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000932 break;
933 case NAME_CLOSURE:
934 op = LOAD_DEREF;
935 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000936 }
937 break;
938 case VAR_STORE:
939 switch (scope) {
940 case NAME_LOCAL:
941 op = STORE_FAST;
942 break;
943 case NAME_GLOBAL:
944 op = STORE_GLOBAL;
945 break;
946 case NAME_DEFAULT:
947 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000948 break;
949 case NAME_CLOSURE:
950 op = STORE_DEREF;
951 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000952 }
953 break;
954 case VAR_DELETE:
955 switch (scope) {
956 case NAME_LOCAL:
957 op = DELETE_FAST;
958 break;
959 case NAME_GLOBAL:
960 op = DELETE_GLOBAL;
961 break;
962 case NAME_DEFAULT:
963 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000964 break;
965 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000966 char buf[500];
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000967 sprintf(buf, DEL_CLOSURE_ERROR, name);
968 com_error(c, PyExc_SyntaxError, buf);
969 i = 255;
970 break;
971 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000972 }
973 break;
974 }
975done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000976 com_addoparg(c, op, i);
977}
978
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000979static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000980com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000981{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000982 char *name;
983 char buffer[1000];
984 /* XXX it is possible to write this code without the 1000
985 chars on the total length of dotted names, I just can't be
986 bothered right now */
987 if (TYPE(n) == STAR)
988 name = "*";
989 else if (TYPE(n) == dotted_name) {
990 char *p = buffer;
991 int i;
992 name = buffer;
993 for (i = 0; i < NCH(n); i += 2) {
994 char *s = STR(CHILD(n, i));
995 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000996 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000997 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +0000998 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000999 break;
1000 }
1001 if (p != buffer)
1002 *p++ = '.';
1003 strcpy(p, s);
1004 p = strchr(p, '\0');
1005 }
1006 }
1007 else {
1008 REQ(n, NAME);
1009 name = STR(n);
1010 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001011 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001012}
1013
Guido van Rossum79f25d91997-04-29 20:08:16 +00001014static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001015parsenumber(struct compiling *co, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001016{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001017 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001018 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001019 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001020#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +00001021 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +00001022 int imflag;
1023#endif
1024
Guido van Rossum282914b1991-04-04 10:42:56 +00001025 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001026 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001027#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001028 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001029#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001030 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001031 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001032 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001033 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001034 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001035 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001036 if (*end == '\0') {
1037 if (errno != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001038 com_error(co, PyExc_OverflowError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001039 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +00001040 return NULL;
1041 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001042 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001043 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001044 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001045#ifndef WITHOUT_COMPLEX
1046 if (imflag) {
1047 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001048 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +00001049 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001050 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001051 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +00001052 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001053 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001054#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001055 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001056 PyFPE_START_PROTECT("atof", return 0)
1057 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001058 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001059 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001060 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001061}
1062
Guido van Rossum79f25d91997-04-29 20:08:16 +00001063static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001064parsestr(char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001065{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001066 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001067 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001068 char *buf;
1069 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001070 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001071 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001072 int first = *s;
1073 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001074 int rawmode = 0;
1075 int unicode = 0;
1076 if (isalpha(quote) || quote == '_') {
1077 if (quote == 'u' || quote == 'U') {
1078 quote = *++s;
1079 unicode = 1;
1080 }
1081 if (quote == 'r' || quote == 'R') {
1082 quote = *++s;
1083 rawmode = 1;
1084 }
1085 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001086 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001087 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001088 return NULL;
1089 }
1090 s++;
1091 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001092 if (len > INT_MAX) {
1093 PyErr_SetString(PyExc_OverflowError, "string to parse is too long");
1094 return NULL;
1095 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001096 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001097 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001098 return NULL;
1099 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001100 if (len >= 4 && s[0] == quote && s[1] == quote) {
1101 s += 2;
1102 len -= 2;
1103 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001104 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001105 return NULL;
1106 }
1107 }
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001108 if (unicode || Py_UnicodeFlag) {
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001109 if (rawmode)
1110 return PyUnicode_DecodeRawUnicodeEscape(
1111 s, len, NULL);
1112 else
1113 return PyUnicode_DecodeUnicodeEscape(
1114 s, len, NULL);
1115 }
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001116 if (rawmode || strchr(s, '\\') == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001117 return PyString_FromStringAndSize(s, len);
1118 v = PyString_FromStringAndSize((char *)NULL, len);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001119 if (v == NULL)
1120 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001121 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001122 end = s + len;
1123 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001124 if (*s != '\\') {
1125 *p++ = *s++;
1126 continue;
1127 }
1128 s++;
1129 switch (*s++) {
1130 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001131 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001132 case '\\': *p++ = '\\'; break;
1133 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +00001134 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001135 case 'b': *p++ = '\b'; break;
1136 case 'f': *p++ = '\014'; break; /* FF */
1137 case 't': *p++ = '\t'; break;
1138 case 'n': *p++ = '\n'; break;
1139 case 'r': *p++ = '\r'; break;
1140 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001141 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
1142 case '0': case '1': case '2': case '3':
1143 case '4': case '5': case '6': case '7':
1144 c = s[-1] - '0';
1145 if ('0' <= *s && *s <= '7') {
1146 c = (c<<3) + *s++ - '0';
1147 if ('0' <= *s && *s <= '7')
1148 c = (c<<3) + *s++ - '0';
1149 }
1150 *p++ = c;
1151 break;
1152 case 'x':
Jeremy Hylton4419ac12001-02-28 22:54:51 +00001153 if (isxdigit(Py_CHARMASK(s[0]))
1154 && 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 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00001176 PyErr_SetString(PyExc_ValueError,
1177 "invalid \\x escape");
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001178 Py_DECREF(v);
1179 return NULL;
1180 default:
1181 *p++ = '\\';
1182 *p++ = s[-1];
1183 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001184 }
1185 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001186 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001187 return v;
1188}
1189
Guido van Rossum79f25d91997-04-29 20:08:16 +00001190static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001191parsestrplus(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001192{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001193 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001194 int i;
1195 REQ(CHILD(n, 0), STRING);
1196 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
1197 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001198 for (i = 1; i < NCH(n); i++) {
1199 PyObject *s;
1200 s = parsestr(STR(CHILD(n, i)));
1201 if (s == NULL)
1202 goto onError;
1203 if (PyString_Check(v) && PyString_Check(s)) {
1204 PyString_ConcatAndDel(&v, s);
1205 if (v == NULL)
1206 goto onError;
1207 }
1208 else {
1209 PyObject *temp;
1210 temp = PyUnicode_Concat(v, s);
1211 Py_DECREF(s);
1212 if (temp == NULL)
1213 goto onError;
1214 Py_DECREF(v);
1215 v = temp;
1216 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001217 }
1218 }
1219 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001220
1221 onError:
1222 Py_XDECREF(v);
1223 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001224}
1225
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001226static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001227com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001228{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001229 PyObject *v;
1230 int anchor = 0;
1231 int save_begin = c->c_begin;
1232
1233 /* list_iter: for v in expr [list_iter] */
1234 com_node(c, CHILD(n, 3)); /* expr */
1235 v = PyInt_FromLong(0L);
1236 if (v == NULL)
1237 c->c_errors++;
1238 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
1239 com_push(c, 1);
1240 Py_XDECREF(v);
1241 c->c_begin = c->c_nexti;
1242 com_addoparg(c, SET_LINENO, n->n_lineno);
1243 com_addfwref(c, FOR_LOOP, &anchor);
1244 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001245 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001246 c->c_loops++;
1247 com_list_iter(c, n, e, t);
1248 c->c_loops--;
1249 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1250 c->c_begin = save_begin;
1251 com_backpatch(c, anchor);
1252 com_pop(c, 2); /* FOR_LOOP has popped these */
1253}
1254
1255static void
1256com_list_if(struct compiling *c, node *n, node *e, char *t)
1257{
1258 int anchor = 0;
1259 int a = 0;
1260 /* list_iter: 'if' test [list_iter] */
1261 com_addoparg(c, SET_LINENO, n->n_lineno);
1262 com_node(c, CHILD(n, 1));
1263 com_addfwref(c, JUMP_IF_FALSE, &a);
1264 com_addbyte(c, POP_TOP);
1265 com_pop(c, 1);
1266 com_list_iter(c, n, e, t);
1267 com_addfwref(c, JUMP_FORWARD, &anchor);
1268 com_backpatch(c, a);
1269 /* We jump here with an extra entry which we now pop */
1270 com_addbyte(c, POP_TOP);
1271 com_backpatch(c, anchor);
1272}
1273
1274static void
1275com_list_iter(struct compiling *c,
1276 node *p, /* parent of list_iter node */
1277 node *e, /* element expression node */
1278 char *t /* name of result list temp local */)
1279{
1280 /* list_iter is the last child in a listmaker, list_for, or list_if */
1281 node *n = CHILD(p, NCH(p)-1);
1282 if (TYPE(n) == list_iter) {
1283 n = CHILD(n, 0);
1284 switch (TYPE(n)) {
1285 case list_for:
1286 com_list_for(c, n, e, t);
1287 break;
1288 case list_if:
1289 com_list_if(c, n, e, t);
1290 break;
1291 default:
1292 com_error(c, PyExc_SystemError,
1293 "invalid list_iter node type");
1294 }
1295 }
1296 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001297 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001298 com_push(c, 1);
1299 com_node(c, e);
1300 com_addoparg(c, CALL_FUNCTION, 1);
1301 com_addbyte(c, POP_TOP);
1302 com_pop(c, 2);
1303 }
1304}
1305
1306static void
1307com_list_comprehension(struct compiling *c, node *n)
1308{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001309 /* listmaker: test list_for */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001310 char tmpname[12];
Tim Peters30814212001-02-17 05:30:26 +00001311 sprintf(tmpname, "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001312 com_addoparg(c, BUILD_LIST, 0);
1313 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1314 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001315 com_addop_name(c, LOAD_ATTR, "append");
1316 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001317 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001318 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001319 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001320 --c->c_tmpname;
1321}
1322
1323static void
1324com_listmaker(struct compiling *c, node *n)
1325{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001326 /* listmaker: test ( list_for | (',' test)* [','] ) */
1327 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001328 com_list_comprehension(c, n);
1329 else {
1330 int len = 0;
1331 int i;
1332 for (i = 0; i < NCH(n); i += 2, len++)
1333 com_node(c, CHILD(n, i));
1334 com_addoparg(c, BUILD_LIST, len);
1335 com_pop(c, len-1);
1336 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001337}
1338
1339static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001340com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001341{
1342 int i;
1343 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1344 for (i = 0; i+2 < NCH(n); i += 4) {
1345 /* We must arrange things just right for STORE_SUBSCR.
1346 It wants the stack to look like (value) (dict) (key) */
1347 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001348 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001349 com_node(c, CHILD(n, i+2)); /* value */
1350 com_addbyte(c, ROT_TWO);
1351 com_node(c, CHILD(n, i)); /* key */
1352 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001353 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001354 }
1355}
1356
1357static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001358com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001359{
1360 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001361 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001362 int i;
1363 REQ(n, atom);
1364 ch = CHILD(n, 0);
1365 switch (TYPE(ch)) {
1366 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001367 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001368 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001369 com_push(c, 1);
1370 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001371 else
1372 com_node(c, CHILD(n, 1));
1373 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001374 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001375 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001376 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001377 com_push(c, 1);
1378 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001379 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001380 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001381 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001382 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001383 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001384 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001385 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001386 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001387 break;
1388 case BACKQUOTE:
1389 com_node(c, CHILD(n, 1));
1390 com_addbyte(c, UNARY_CONVERT);
1391 break;
1392 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001393 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001394 i = 255;
1395 }
1396 else {
1397 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001398 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001399 }
1400 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001401 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001402 break;
1403 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001404 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001405 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001406 c->c_errors++;
1407 i = 255;
1408 }
1409 else {
1410 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001411 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001412 }
1413 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001414 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001415 break;
1416 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001417 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001418 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001419 break;
1420 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001421 com_error(c, PyExc_SystemError,
1422 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001423 }
1424}
1425
1426static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001427com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001428{
1429 if (NCH(n) == 1) {
1430 com_addbyte(c, op);
1431 }
1432 else if (NCH(n) == 2) {
1433 if (TYPE(CHILD(n, 0)) != COLON) {
1434 com_node(c, CHILD(n, 0));
1435 com_addbyte(c, op+1);
1436 }
1437 else {
1438 com_node(c, CHILD(n, 1));
1439 com_addbyte(c, op+2);
1440 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001441 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001442 }
1443 else {
1444 com_node(c, CHILD(n, 0));
1445 com_node(c, CHILD(n, 2));
1446 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001447 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001448 }
1449}
1450
Guido van Rossum635abd21997-01-06 22:56:52 +00001451static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001452com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1453{
1454 if (NCH(n) == 1) {
1455 com_addbyte(c, DUP_TOP);
1456 com_push(c, 1);
1457 com_addbyte(c, SLICE);
1458 com_node(c, augn);
1459 com_addbyte(c, opcode);
1460 com_pop(c, 1);
1461 com_addbyte(c, ROT_TWO);
1462 com_addbyte(c, STORE_SLICE);
1463 com_pop(c, 2);
1464 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1465 com_node(c, CHILD(n, 0));
1466 com_addoparg(c, DUP_TOPX, 2);
1467 com_push(c, 2);
1468 com_addbyte(c, SLICE+1);
1469 com_pop(c, 1);
1470 com_node(c, augn);
1471 com_addbyte(c, opcode);
1472 com_pop(c, 1);
1473 com_addbyte(c, ROT_THREE);
1474 com_addbyte(c, STORE_SLICE+1);
1475 com_pop(c, 3);
1476 } else if (NCH(n) == 2) {
1477 com_node(c, CHILD(n, 1));
1478 com_addoparg(c, DUP_TOPX, 2);
1479 com_push(c, 2);
1480 com_addbyte(c, SLICE+2);
1481 com_pop(c, 1);
1482 com_node(c, augn);
1483 com_addbyte(c, opcode);
1484 com_pop(c, 1);
1485 com_addbyte(c, ROT_THREE);
1486 com_addbyte(c, STORE_SLICE+2);
1487 com_pop(c, 3);
1488 } else {
1489 com_node(c, CHILD(n, 0));
1490 com_node(c, CHILD(n, 2));
1491 com_addoparg(c, DUP_TOPX, 3);
1492 com_push(c, 3);
1493 com_addbyte(c, SLICE+3);
1494 com_pop(c, 2);
1495 com_node(c, augn);
1496 com_addbyte(c, opcode);
1497 com_pop(c, 1);
1498 com_addbyte(c, ROT_FOUR);
1499 com_addbyte(c, STORE_SLICE+3);
1500 com_pop(c, 4);
1501 }
1502}
1503
1504static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001505com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001506{
1507 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001508 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001509 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001510 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001511 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001512 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001513 }
1514 else {
1515 com_node(c, CHILD(n, 0));
1516 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001517 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001518 }
1519 m = n;
1520 do {
1521 m = CHILD(m, 0);
1522 } while (NCH(m) == 1);
1523 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00001524 /* f(lambda x: x[0] = 3) ends up getting parsed with
1525 * LHS test = lambda x: x[0], and RHS test = 3.
1526 * SF bug 132313 points out that complaining about a keyword
1527 * then is very confusing.
1528 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001529 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00001530 TYPE(m) == lambdef ?
1531 "lambda cannot contain assignment" :
1532 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001533 }
1534 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001535 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001536 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001537 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001538 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001539 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001540 else if (*pkeywords == NULL) {
1541 c->c_errors++;
1542 Py_DECREF(v);
1543 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001544 if (PyDict_GetItem(*pkeywords, v) != NULL)
1545 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001546 "duplicate keyword argument");
1547 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001548 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001549 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001550 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001551 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001552 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001553 }
1554 }
1555 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001556}
1557
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001558static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001559com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001560{
1561 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001562 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001563 }
1564 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001565 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001566 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001567 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001568 int star_flag = 0;
1569 int starstar_flag = 0;
1570 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001571 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001572 na = 0;
1573 nk = 0;
1574 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001575 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001576 if (TYPE(ch) == STAR ||
1577 TYPE(ch) == DOUBLESTAR)
1578 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001579 if (ch->n_lineno != lineno) {
1580 lineno = ch->n_lineno;
1581 com_addoparg(c, SET_LINENO, lineno);
1582 }
1583 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001584 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001585 na++;
1586 else
1587 nk++;
1588 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001589 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001590 while (i < NCH(n)) {
1591 node *tok = CHILD(n, i);
1592 node *ch = CHILD(n, i+1);
1593 i += 3;
1594 switch (TYPE(tok)) {
1595 case STAR: star_flag = 1; break;
1596 case DOUBLESTAR: starstar_flag = 1; break;
1597 }
1598 com_node(c, ch);
1599 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001600 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001601 com_error(c, PyExc_SyntaxError,
1602 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001603 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001604 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001605 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001606 star_flag + (starstar_flag << 1);
1607 else
1608 opcode = CALL_FUNCTION;
1609 com_addoparg(c, opcode, na | (nk << 8));
1610 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001611 }
1612}
1613
1614static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001615com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001616{
1617 com_addopname(c, LOAD_ATTR, n);
1618}
1619
1620static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001621com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001622{
1623 int i=0;
1624 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001625 node *ch;
1626
1627 /* first argument */
1628 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001629 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001630 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001631 i++;
1632 }
1633 else {
1634 com_node(c, CHILD(n,i));
1635 i++;
1636 REQ(CHILD(n,i),COLON);
1637 i++;
1638 }
1639 /* second argument */
1640 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1641 com_node(c, CHILD(n,i));
1642 i++;
1643 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001644 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001645 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001646 com_push(c, 1);
1647 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001648 /* remaining arguments */
1649 for (; i < NCH(n); i++) {
1650 ns++;
1651 ch=CHILD(n,i);
1652 REQ(ch, sliceop);
1653 if (NCH(ch) == 1) {
1654 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001655 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001656 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001657 }
1658 else
1659 com_node(c, CHILD(ch,1));
1660 }
1661 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001662 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001663}
1664
1665static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001666com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001667{
1668 node *ch;
1669 REQ(n, subscript);
1670 ch = CHILD(n,0);
1671 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001672 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001673 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001674 com_push(c, 1);
1675 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001676 else {
1677 /* check for slice */
1678 if ((TYPE(ch) == COLON || NCH(n) > 1))
1679 com_sliceobj(c, n);
1680 else {
1681 REQ(ch, test);
1682 com_node(c, ch);
1683 }
1684 }
1685}
1686
1687static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001688com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001689{
1690 int i, op;
1691 REQ(n, subscriptlist);
1692 /* Check to make backward compatible slice behavior for '[i:j]' */
1693 if (NCH(n) == 1) {
1694 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001695 /* 'Basic' slice, should have exactly one colon. */
1696 if ((TYPE(CHILD(sub, 0)) == COLON
1697 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1698 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1699 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001700 switch (assigning) {
1701 case OP_DELETE:
1702 op = DELETE_SLICE;
1703 break;
1704 case OP_ASSIGN:
1705 op = STORE_SLICE;
1706 break;
1707 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001708 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001709 break;
1710 default:
1711 com_augassign_slice(c, sub, assigning, augn);
1712 return;
1713 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001714 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001715 if (op == STORE_SLICE)
1716 com_pop(c, 2);
1717 else if (op == DELETE_SLICE)
1718 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001719 return;
1720 }
1721 }
1722 /* Else normal subscriptlist. Compile each subscript. */
1723 for (i = 0; i < NCH(n); i += 2)
1724 com_subscript(c, CHILD(n, i));
1725 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001726 if (NCH(n) > 1) {
1727 i = (NCH(n)+1) / 2;
1728 com_addoparg(c, BUILD_TUPLE, i);
1729 com_pop(c, i-1);
1730 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001731 switch (assigning) {
1732 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001733 op = DELETE_SUBSCR;
1734 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00001735 break;
1736 default:
1737 case OP_ASSIGN:
1738 op = STORE_SUBSCR;
1739 i = 3;
1740 break;
1741 case OP_APPLY:
1742 op = BINARY_SUBSCR;
1743 i = 1;
1744 break;
1745 }
1746 if (assigning > OP_APPLY) {
1747 com_addoparg(c, DUP_TOPX, 2);
1748 com_push(c, 2);
1749 com_addbyte(c, BINARY_SUBSCR);
1750 com_pop(c, 1);
1751 com_node(c, augn);
1752 com_addbyte(c, assigning);
1753 com_pop(c, 1);
1754 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001755 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001756 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001757 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001758}
1759
1760static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001761com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001762{
1763 REQ(n, trailer);
1764 switch (TYPE(CHILD(n, 0))) {
1765 case LPAR:
1766 com_call_function(c, CHILD(n, 1));
1767 break;
1768 case DOT:
1769 com_select_member(c, CHILD(n, 1));
1770 break;
1771 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00001772 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001773 break;
1774 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001775 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001776 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001777 }
1778}
1779
1780static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001781com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001782{
1783 int i;
1784 REQ(n, power);
1785 com_atom(c, CHILD(n, 0));
1786 for (i = 1; i < NCH(n); i++) {
1787 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1788 com_factor(c, CHILD(n, i+1));
1789 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001790 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001791 break;
1792 }
1793 else
1794 com_apply_trailer(c, CHILD(n, i));
1795 }
1796}
1797
1798static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001799com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001800{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001801 REQ(n, factor);
1802 if (TYPE(CHILD(n, 0)) == PLUS) {
1803 com_factor(c, CHILD(n, 1));
1804 com_addbyte(c, UNARY_POSITIVE);
1805 }
1806 else if (TYPE(CHILD(n, 0)) == MINUS) {
1807 com_factor(c, CHILD(n, 1));
1808 com_addbyte(c, UNARY_NEGATIVE);
1809 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001810 else if (TYPE(CHILD(n, 0)) == TILDE) {
1811 com_factor(c, CHILD(n, 1));
1812 com_addbyte(c, UNARY_INVERT);
1813 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001814 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001815 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001816 }
1817}
1818
1819static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001820com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001821{
1822 int i;
1823 int op;
1824 REQ(n, term);
1825 com_factor(c, CHILD(n, 0));
1826 for (i = 2; i < NCH(n); i += 2) {
1827 com_factor(c, CHILD(n, i));
1828 switch (TYPE(CHILD(n, i-1))) {
1829 case STAR:
1830 op = BINARY_MULTIPLY;
1831 break;
1832 case SLASH:
1833 op = BINARY_DIVIDE;
1834 break;
1835 case PERCENT:
1836 op = BINARY_MODULO;
1837 break;
1838 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001839 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001840 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001841 op = 255;
1842 }
1843 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001844 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001845 }
1846}
1847
1848static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001849com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001850{
1851 int i;
1852 int op;
1853 REQ(n, arith_expr);
1854 com_term(c, CHILD(n, 0));
1855 for (i = 2; i < NCH(n); i += 2) {
1856 com_term(c, CHILD(n, i));
1857 switch (TYPE(CHILD(n, i-1))) {
1858 case PLUS:
1859 op = BINARY_ADD;
1860 break;
1861 case MINUS:
1862 op = BINARY_SUBTRACT;
1863 break;
1864 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001865 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001866 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001867 op = 255;
1868 }
1869 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001870 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001871 }
1872}
1873
1874static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001875com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001876{
1877 int i;
1878 int op;
1879 REQ(n, shift_expr);
1880 com_arith_expr(c, CHILD(n, 0));
1881 for (i = 2; i < NCH(n); i += 2) {
1882 com_arith_expr(c, CHILD(n, i));
1883 switch (TYPE(CHILD(n, i-1))) {
1884 case LEFTSHIFT:
1885 op = BINARY_LSHIFT;
1886 break;
1887 case RIGHTSHIFT:
1888 op = BINARY_RSHIFT;
1889 break;
1890 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001891 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001892 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001893 op = 255;
1894 }
1895 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001896 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001897 }
1898}
1899
1900static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001901com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001902{
1903 int i;
1904 int op;
1905 REQ(n, and_expr);
1906 com_shift_expr(c, CHILD(n, 0));
1907 for (i = 2; i < NCH(n); i += 2) {
1908 com_shift_expr(c, CHILD(n, i));
1909 if (TYPE(CHILD(n, i-1)) == AMPER) {
1910 op = BINARY_AND;
1911 }
1912 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001913 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001914 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001915 op = 255;
1916 }
1917 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001918 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001919 }
1920}
1921
1922static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001923com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001924{
1925 int i;
1926 int op;
1927 REQ(n, xor_expr);
1928 com_and_expr(c, CHILD(n, 0));
1929 for (i = 2; i < NCH(n); i += 2) {
1930 com_and_expr(c, CHILD(n, i));
1931 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1932 op = BINARY_XOR;
1933 }
1934 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001935 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001936 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001937 op = 255;
1938 }
1939 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001940 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001941 }
1942}
1943
1944static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001945com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001946{
1947 int i;
1948 int op;
1949 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001950 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001951 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001952 com_xor_expr(c, CHILD(n, i));
1953 if (TYPE(CHILD(n, i-1)) == VBAR) {
1954 op = BINARY_OR;
1955 }
1956 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001957 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001958 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001959 op = 255;
1960 }
1961 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001962 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001963 }
1964}
1965
1966static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001967cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001968{
1969 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001970 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001971 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1972 if (NCH(n) == 1) {
1973 n = CHILD(n, 0);
1974 switch (TYPE(n)) {
1975 case LESS: return LT;
1976 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001977 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001978 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001979 case LESSEQUAL: return LE;
1980 case GREATEREQUAL: return GE;
1981 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001982 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1983 if (strcmp(STR(n), "is") == 0) return IS;
1984 }
1985 }
1986 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001987 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001988 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1989 return NOT_IN;
1990 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1991 return IS_NOT;
1992 }
1993 }
1994 return BAD;
1995}
1996
1997static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001998com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001999{
2000 int i;
2001 enum cmp_op op;
2002 int anchor;
2003 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2004 com_expr(c, CHILD(n, 0));
2005 if (NCH(n) == 1)
2006 return;
2007
2008 /****************************************************************
2009 The following code is generated for all but the last
2010 comparison in a chain:
2011
2012 label: on stack: opcode: jump to:
2013
2014 a <code to load b>
2015 a, b DUP_TOP
2016 a, b, b ROT_THREE
2017 b, a, b COMPARE_OP
2018 b, 0-or-1 JUMP_IF_FALSE L1
2019 b, 1 POP_TOP
2020 b
2021
2022 We are now ready to repeat this sequence for the next
2023 comparison in the chain.
2024
2025 For the last we generate:
2026
2027 b <code to load c>
2028 b, c COMPARE_OP
2029 0-or-1
2030
2031 If there were any jumps to L1 (i.e., there was more than one
2032 comparison), we generate:
2033
2034 0-or-1 JUMP_FORWARD L2
2035 L1: b, 0 ROT_TWO
2036 0, b POP_TOP
2037 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002038 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002039 ****************************************************************/
2040
2041 anchor = 0;
2042
2043 for (i = 2; i < NCH(n); i += 2) {
2044 com_expr(c, CHILD(n, i));
2045 if (i+2 < NCH(n)) {
2046 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002047 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002048 com_addbyte(c, ROT_THREE);
2049 }
2050 op = cmp_type(CHILD(n, i-1));
2051 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002052 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002053 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002054 }
2055 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002056 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002057 if (i+2 < NCH(n)) {
2058 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2059 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002060 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002061 }
2062 }
2063
2064 if (anchor) {
2065 int anchor2 = 0;
2066 com_addfwref(c, JUMP_FORWARD, &anchor2);
2067 com_backpatch(c, anchor);
2068 com_addbyte(c, ROT_TWO);
2069 com_addbyte(c, POP_TOP);
2070 com_backpatch(c, anchor2);
2071 }
2072}
2073
2074static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002075com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002076{
2077 REQ(n, not_test); /* 'not' not_test | comparison */
2078 if (NCH(n) == 1) {
2079 com_comparison(c, CHILD(n, 0));
2080 }
2081 else {
2082 com_not_test(c, CHILD(n, 1));
2083 com_addbyte(c, UNARY_NOT);
2084 }
2085}
2086
2087static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002088com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002089{
2090 int i;
2091 int anchor;
2092 REQ(n, and_test); /* not_test ('and' not_test)* */
2093 anchor = 0;
2094 i = 0;
2095 for (;;) {
2096 com_not_test(c, CHILD(n, i));
2097 if ((i += 2) >= NCH(n))
2098 break;
2099 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2100 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002101 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002102 }
2103 if (anchor)
2104 com_backpatch(c, anchor);
2105}
2106
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002107static int
2108com_make_closure(struct compiling *c, PyCodeObject *co)
2109{
2110 int i, free = PyTuple_GET_SIZE(co->co_freevars);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002111 /* If the code is compiled with st->st_nested_scopes == 0,
2112 then no variable will ever be added to co_freevars.
2113 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002114 if (free == 0)
2115 return 0;
2116 for (i = 0; i < free; ++i) {
2117 /* Bypass com_addop_varname because it will generate
2118 LOAD_DEREF but LOAD_CLOSURE is needed.
2119 */
2120 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2121 int arg, reftype;
2122
2123 /* Special case: If a class contains a method with a
2124 free variable that has the same name as a method,
2125 the name will be considered free *and* local in the
2126 class. It should be handled by the closure, as
2127 well as by the normal name loookup logic.
2128 */
2129 reftype = get_ref_type(c, PyString_AS_STRING(name));
2130 if (reftype == CELL)
2131 arg = com_lookup_arg(c->c_cellvars, name);
2132 else /* (reftype == FREE) */
2133 arg = com_lookup_arg(c->c_freevars, name);
2134 if (arg == -1) {
2135 fprintf(stderr, "lookup %s in %s %d %d\n",
Jeremy Hylton483638c2001-02-01 20:20:45 +00002136 PyObject_REPR(name), c->c_name, reftype, arg);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002137 Py_FatalError("com_make_closure()");
2138 }
2139 com_addoparg(c, LOAD_CLOSURE, arg);
2140
2141 }
2142 com_push(c, free);
2143 return 1;
2144}
2145
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002146static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002147com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002148{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002149 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002150 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002151 PyObject *co;
2152 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002153 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002154 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2155 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002156 co = (PyObject *) icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002157 if (co == NULL) {
2158 c->c_errors++;
2159 return;
2160 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002161 symtable_exit_scope(c->c_symtable);
Tim Peters1e542112001-02-23 22:23:53 +00002162 i = com_addconst(c, co);
2163 closure = com_make_closure(c, (PyCodeObject *)co);
2164 Py_DECREF(co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002165 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002166 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002167 if (closure)
2168 com_addoparg(c, MAKE_CLOSURE, ndefs);
2169 else
2170 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002171 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002172 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002173 else {
2174 int anchor = 0;
2175 int i = 0;
2176 for (;;) {
2177 com_and_test(c, CHILD(n, i));
2178 if ((i += 2) >= NCH(n))
2179 break;
2180 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2181 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002182 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002183 }
2184 if (anchor)
2185 com_backpatch(c, anchor);
2186 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002187}
2188
2189static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002190com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002191{
2192 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002193 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002194 com_node(c, CHILD(n, 0));
2195 }
2196 else {
2197 int i;
2198 int len;
2199 len = (NCH(n) + 1) / 2;
2200 for (i = 0; i < NCH(n); i += 2)
2201 com_node(c, CHILD(n, i));
2202 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002203 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002204 }
2205}
2206
2207
2208/* Begin of assignment compilation */
2209
Thomas Wouters434d0822000-08-24 20:11:32 +00002210
2211static void
2212com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2213{
2214 com_addbyte(c, DUP_TOP);
2215 com_push(c, 1);
2216 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002217 com_node(c, augn);
2218 com_addbyte(c, opcode);
2219 com_pop(c, 1);
2220 com_addbyte(c, ROT_TWO);
2221 com_addopname(c, STORE_ATTR, n);
2222 com_pop(c, 2);
2223}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002224
2225static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002226com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002227{
2228 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002229 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002230}
2231
2232static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002233com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002234{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002235 REQ(n, trailer);
2236 switch (TYPE(CHILD(n, 0))) {
2237 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002238 com_error(c, PyExc_SyntaxError,
2239 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002240 break;
2241 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002242 if (assigning > OP_APPLY)
2243 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2244 else
2245 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002246 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002247 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002248 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002249 break;
2250 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002251 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002252 }
2253}
2254
2255static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002256com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002257{
2258 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002259 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002260 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002261 if (assigning) {
2262 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002263 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002264 com_push(c, i-1);
2265 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002266 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002267 com_assign(c, CHILD(n, i), assigning, NULL);
2268}
2269
2270static void
2271com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2272{
2273 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002274 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002275 com_push(c, 1);
2276 com_node(c, augn);
2277 com_addbyte(c, opcode);
2278 com_pop(c, 1);
2279 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002280}
2281
2282static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002283com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002284{
2285 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002286 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002287 if (assigning)
2288 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002289}
2290
2291static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002292com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002293{
2294 /* Loop to avoid trivial recursion */
2295 for (;;) {
2296 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002297
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002298 case exprlist:
2299 case testlist:
2300 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002301 if (assigning > OP_APPLY) {
2302 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002303 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002304 return;
2305 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002306 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002307 return;
2308 }
2309 n = CHILD(n, 0);
2310 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002311
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002312 case test:
2313 case and_test:
2314 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002315 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002316 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002317 case xor_expr:
2318 case and_expr:
2319 case shift_expr:
2320 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002321 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002322 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002323 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002324 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002325 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002326 return;
2327 }
2328 n = CHILD(n, 0);
2329 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002330
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002331 case power: /* atom trailer* ('**' power)*
2332 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002333 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002334 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002335 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002336 return;
2337 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002338 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002339 int i;
2340 com_node(c, CHILD(n, 0));
2341 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002342 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002343 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002344 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002345 return;
2346 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002347 com_apply_trailer(c, CHILD(n, i));
2348 } /* NB i is still alive */
2349 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002350 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002351 return;
2352 }
2353 n = CHILD(n, 0);
2354 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002355
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002356 case atom:
2357 switch (TYPE(CHILD(n, 0))) {
2358 case LPAR:
2359 n = CHILD(n, 1);
2360 if (TYPE(n) == RPAR) {
2361 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002362 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002363 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002364 return;
2365 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002366 if (assigning > OP_APPLY) {
2367 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002368 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002369 return;
2370 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002371 break;
2372 case LSQB:
2373 n = CHILD(n, 1);
2374 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002375 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002376 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002377 return;
2378 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002379 if (assigning > OP_APPLY) {
2380 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002381 "augmented assign to list not possible");
2382 return;
2383 }
2384 if (NCH(n) > 1
2385 && TYPE(CHILD(n, 1)) == list_for) {
2386 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002387 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002388 return;
2389 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002390 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002391 return;
2392 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002393 if (assigning > OP_APPLY)
2394 com_augassign_name(c, CHILD(n, 0),
2395 assigning, augn);
2396 else
2397 com_assign_name(c, CHILD(n, 0),
2398 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002399 return;
2400 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002401 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002402 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002403 return;
2404 }
2405 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002406
2407 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002408 com_error(c, PyExc_SyntaxError,
2409 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002410 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002411
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002412 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002413 com_error(c, PyExc_SystemError,
2414 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002415 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002416
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002417 }
2418 }
2419}
Guido van Rossum7c531111997-03-11 18:42:21 +00002420
Thomas Wouters434d0822000-08-24 20:11:32 +00002421static void
2422com_augassign(struct compiling *c, node *n)
2423{
2424 int opcode;
2425
2426 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2427 case '+': opcode = INPLACE_ADD; break;
2428 case '-': opcode = INPLACE_SUBTRACT; break;
2429 case '/': opcode = INPLACE_DIVIDE; break;
2430 case '%': opcode = INPLACE_MODULO; break;
2431 case '<': opcode = INPLACE_LSHIFT; break;
2432 case '>': opcode = INPLACE_RSHIFT; break;
2433 case '&': opcode = INPLACE_AND; break;
2434 case '^': opcode = INPLACE_XOR; break;
2435 case '|': opcode = INPLACE_OR; break;
2436 case '*':
2437 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2438 opcode = INPLACE_POWER;
2439 else
2440 opcode = INPLACE_MULTIPLY;
2441 break;
2442 default:
2443 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2444 return;
2445 }
2446 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2447}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002448
2449static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002450com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002451{
Thomas Wouters434d0822000-08-24 20:11:32 +00002452 REQ(n, expr_stmt);
2453 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002454 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002455 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002456 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002457 if (NCH(n) == 1) {
2458 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002459 if (c->c_interactive)
2460 com_addbyte(c, PRINT_EXPR);
2461 else
2462 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002463 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002464 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002465 else if (TYPE(CHILD(n,1)) == augassign)
2466 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002467 else {
2468 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002469 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002470 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002471 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002472 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002473 com_push(c, 1);
2474 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002475 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002476 }
2477 }
2478}
2479
2480static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002481com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002482{
2483 int a = 0, b = 0;
2484 int i;
2485 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2486 /* Generate code like for
2487
2488 if __debug__:
2489 if not <test>:
2490 raise AssertionError [, <message>]
2491
2492 where <message> is the second test, if present.
2493 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002494
Guido van Rossum228d7f31997-04-02 05:24:36 +00002495 if (Py_OptimizeFlag)
2496 return;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002497 com_addop_name(c, LOAD_GLOBAL, "__debug__");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002498 com_push(c, 1);
2499 com_addfwref(c, JUMP_IF_FALSE, &a);
2500 com_addbyte(c, POP_TOP);
2501 com_pop(c, 1);
2502 com_node(c, CHILD(n, 1));
2503 com_addfwref(c, JUMP_IF_TRUE, &b);
2504 com_addbyte(c, POP_TOP);
2505 com_pop(c, 1);
2506 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002507 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002508 com_push(c, 1);
2509 i = NCH(n)/2; /* Either 2 or 4 */
2510 if (i > 1)
2511 com_node(c, CHILD(n, 3));
2512 com_addoparg(c, RAISE_VARARGS, i);
2513 com_pop(c, i);
2514 /* The interpreter does not fall through */
2515 /* All jumps converge here */
2516 com_backpatch(c, a);
2517 com_backpatch(c, b);
2518 com_addbyte(c, POP_TOP);
2519}
2520
2521static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002522com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002523{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002524 int i = 1;
2525 node* stream = NULL;
2526
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002527 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002528
2529 /* are we using the extended print form? */
2530 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2531 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002532 com_node(c, stream);
2533 /* stack: [...] => [... stream] */
2534 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002535 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2536 i = 4;
2537 else
2538 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002539 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002540 for (; i < NCH(n); i += 2) {
2541 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002542 com_addbyte(c, DUP_TOP);
2543 /* stack: [stream] => [stream stream] */
2544 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002545 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002546 /* stack: [stream stream] => [stream stream obj] */
2547 com_addbyte(c, ROT_TWO);
2548 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002549 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002550 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002551 com_pop(c, 2);
2552 }
2553 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002554 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002555 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002556 com_addbyte(c, PRINT_ITEM);
2557 com_pop(c, 1);
2558 }
2559 }
2560 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002561 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002562 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002563 /* must pop the extra stream object off the stack */
2564 com_addbyte(c, POP_TOP);
2565 /* stack: [... stream] => [...] */
2566 com_pop(c, 1);
2567 }
2568 }
2569 else {
2570 if (stream != NULL) {
2571 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002572 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002573 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002574 com_pop(c, 1);
2575 }
2576 else
2577 com_addbyte(c, PRINT_NEWLINE);
2578 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002579}
2580
2581static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002582com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002583{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002584 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002585 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002586 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002587 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002588 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002589 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002590 com_push(c, 1);
2591 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002592 else
2593 com_node(c, CHILD(n, 1));
2594 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002595 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002596}
2597
2598static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002599com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002600{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002601 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002602 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2603 if (NCH(n) > 1) {
2604 com_node(c, CHILD(n, 1));
2605 if (NCH(n) > 3) {
2606 com_node(c, CHILD(n, 3));
2607 if (NCH(n) > 5)
2608 com_node(c, CHILD(n, 5));
2609 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002610 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002611 i = NCH(n)/2;
2612 com_addoparg(c, RAISE_VARARGS, i);
2613 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002614}
2615
2616static void
Thomas Wouters52152252000-08-17 22:55:00 +00002617com_from_import(struct compiling *c, node *n)
2618{
2619 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2620 com_push(c, 1);
2621 if (NCH(n) > 1) {
2622 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2623 com_error(c, PyExc_SyntaxError, "invalid syntax");
2624 return;
2625 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002626 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002627 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002628 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00002629 com_pop(c, 1);
2630}
2631
2632static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002633com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002634{
2635 int i;
2636 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002637 /* 'import' dotted_name (',' dotted_name)* |
2638 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002639 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00002640 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002641 /* 'from' dotted_name 'import' ... */
2642 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002643
2644 if (TYPE(CHILD(n, 3)) == STAR) {
2645 tup = Py_BuildValue("(s)", "*");
2646 } else {
2647 tup = PyTuple_New((NCH(n) - 2)/2);
2648 for (i = 3; i < NCH(n); i += 2) {
2649 PyTuple_SET_ITEM(tup, (i-3)/2,
2650 PyString_FromString(STR(
Jeremy Hylton4419ac12001-02-28 22:54:51 +00002651 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002652 }
2653 }
2654 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00002655 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002656 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002657 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00002658 if (TYPE(CHILD(n, 3)) == STAR)
2659 com_addbyte(c, IMPORT_STAR);
2660 else {
2661 for (i = 3; i < NCH(n); i += 2)
2662 com_from_import(c, CHILD(n, i));
2663 com_addbyte(c, POP_TOP);
2664 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002665 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002666 }
2667 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002668 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002669 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00002670 node *subn = CHILD(n, i);
2671 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002672 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002673 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002674 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00002675 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00002676 int j;
2677 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00002678 com_error(c, PyExc_SyntaxError,
2679 "invalid syntax");
2680 return;
2681 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00002682 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
2683 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002684 CHILD(CHILD(subn, 0),
2685 j));
2686 com_addop_varname(c, VAR_STORE,
2687 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002688 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002689 com_addop_varname(c, VAR_STORE,
2690 STR(CHILD(CHILD(subn, 0),
2691 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002692 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002693 }
2694 }
2695}
2696
2697static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002698com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002699{
2700 REQ(n, exec_stmt);
2701 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2702 com_node(c, CHILD(n, 1));
2703 if (NCH(n) >= 4)
2704 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002705 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002706 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002707 com_push(c, 1);
2708 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002709 if (NCH(n) >= 6)
2710 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002711 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002712 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002713 com_push(c, 1);
2714 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002715 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002716 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002717}
2718
Guido van Rossum7c531111997-03-11 18:42:21 +00002719static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002720is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002721{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002722 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002723 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002724 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00002725
2726 /* Label to avoid tail recursion */
2727 next:
2728 switch (TYPE(n)) {
2729
2730 case suite:
2731 if (NCH(n) == 1) {
2732 n = CHILD(n, 0);
2733 goto next;
2734 }
2735 /* Fall through */
2736 case file_input:
2737 for (i = 0; i < NCH(n); i++) {
2738 node *ch = CHILD(n, i);
2739 if (TYPE(ch) == stmt) {
2740 n = ch;
2741 goto next;
2742 }
2743 }
2744 break;
2745
2746 case stmt:
2747 case simple_stmt:
2748 case small_stmt:
2749 n = CHILD(n, 0);
2750 goto next;
2751
2752 case expr_stmt:
2753 case testlist:
2754 case test:
2755 case and_test:
2756 case not_test:
2757 case comparison:
2758 case expr:
2759 case xor_expr:
2760 case and_expr:
2761 case shift_expr:
2762 case arith_expr:
2763 case term:
2764 case factor:
2765 case power:
2766 case atom:
2767 if (NCH(n) == 1) {
2768 n = CHILD(n, 0);
2769 goto next;
2770 }
2771 break;
2772
2773 case NAME:
2774 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2775 return 1;
2776 break;
2777
2778 case NUMBER:
2779 v = parsenumber(c, STR(n));
2780 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002781 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002782 break;
2783 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002784 i = PyObject_IsTrue(v);
2785 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002786 return i == 0;
2787
2788 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002789 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002790 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002791 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002792 break;
2793 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002794 i = PyObject_IsTrue(v);
2795 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002796 return i == 0;
2797
2798 }
2799 return 0;
2800}
2801
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002802static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002803com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002804{
2805 int i;
2806 int anchor = 0;
2807 REQ(n, if_stmt);
2808 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2809 for (i = 0; i+3 < NCH(n); i+=4) {
2810 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002811 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002812 if (is_constant_false(c, ch))
2813 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002814 if (i > 0)
2815 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002816 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002817 com_addfwref(c, JUMP_IF_FALSE, &a);
2818 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002819 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002820 com_node(c, CHILD(n, i+3));
2821 com_addfwref(c, JUMP_FORWARD, &anchor);
2822 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002823 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002824 com_addbyte(c, POP_TOP);
2825 }
2826 if (i+2 < NCH(n))
2827 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002828 if (anchor)
2829 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002830}
2831
2832static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002833com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002834{
2835 int break_anchor = 0;
2836 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002837 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002838 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2839 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002840 block_push(c, SETUP_LOOP);
2841 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002842 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002843 com_node(c, CHILD(n, 1));
2844 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2845 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002846 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002847 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002848 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002849 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002850 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2851 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002852 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002853 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002854 com_addbyte(c, POP_TOP);
2855 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002856 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002857 if (NCH(n) > 4)
2858 com_node(c, CHILD(n, 6));
2859 com_backpatch(c, break_anchor);
2860}
2861
2862static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002863com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002864{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002865 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002866 int break_anchor = 0;
2867 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002868 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002869 REQ(n, for_stmt);
2870 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2871 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002872 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002873 com_node(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002874 v = PyInt_FromLong(0L);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002875 if (v == NULL)
2876 c->c_errors++;
2877 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002878 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002879 Py_XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002880 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002881 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002882 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002883 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00002884 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002885 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002886 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002887 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002888 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2889 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002890 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002891 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002892 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002893 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002894 if (NCH(n) > 8)
2895 com_node(c, CHILD(n, 8));
2896 com_backpatch(c, break_anchor);
2897}
2898
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002899/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002900
2901 SETUP_FINALLY L
2902 <code for S>
2903 POP_BLOCK
2904 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002905 L: <code for Sf>
2906 END_FINALLY
2907
2908 The special instructions use the block stack. Each block
2909 stack entry contains the instruction that created it (here
2910 SETUP_FINALLY), the level of the value stack at the time the
2911 block stack entry was created, and a label (here L).
2912
2913 SETUP_FINALLY:
2914 Pushes the current value stack level and the label
2915 onto the block stack.
2916 POP_BLOCK:
2917 Pops en entry from the block stack, and pops the value
2918 stack until its level is the same as indicated on the
2919 block stack. (The label is ignored.)
2920 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002921 Pops a variable number of entries from the *value* stack
2922 and re-raises the exception they specify. The number of
2923 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002924
2925 The block stack is unwound when an exception is raised:
2926 when a SETUP_FINALLY entry is found, the exception is pushed
2927 onto the value stack (and the exception condition is cleared),
2928 and the interpreter jumps to the label gotten from the block
2929 stack.
2930
2931 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002932 (The contents of the value stack is shown in [], with the top
2933 at the right; 'tb' is trace-back info, 'val' the exception's
2934 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002935
2936 Value stack Label Instruction Argument
2937 [] SETUP_EXCEPT L1
2938 [] <code for S>
2939 [] POP_BLOCK
2940 [] JUMP_FORWARD L0
2941
Guido van Rossum3f5da241990-12-20 15:06:42 +00002942 [tb, val, exc] L1: DUP )
2943 [tb, val, exc, exc] <evaluate E1> )
2944 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2945 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2946 [tb, val, exc, 1] POP )
2947 [tb, val, exc] POP
2948 [tb, val] <assign to V1> (or POP if no V1)
2949 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002950 [] <code for S1>
2951 JUMP_FORWARD L0
2952
Guido van Rossum3f5da241990-12-20 15:06:42 +00002953 [tb, val, exc, 0] L2: POP
2954 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002955 .............................etc.......................
2956
Guido van Rossum3f5da241990-12-20 15:06:42 +00002957 [tb, val, exc, 0] Ln+1: POP
2958 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002959
2960 [] L0: <next statement>
2961
2962 Of course, parts are not generated if Vi or Ei is not present.
2963*/
2964
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002965static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002966com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002967{
2968 int except_anchor = 0;
2969 int end_anchor = 0;
2970 int else_anchor = 0;
2971 int i;
2972 node *ch;
2973
2974 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2975 block_push(c, SETUP_EXCEPT);
2976 com_node(c, CHILD(n, 2));
2977 com_addbyte(c, POP_BLOCK);
2978 block_pop(c, SETUP_EXCEPT);
2979 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2980 com_backpatch(c, except_anchor);
2981 for (i = 3;
2982 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2983 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002984 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002985 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002986 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002987 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002988 break;
2989 }
2990 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002991 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002992 com_addoparg(c, SET_LINENO, ch->n_lineno);
2993 if (NCH(ch) > 1) {
2994 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002995 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002996 com_node(c, CHILD(ch, 1));
2997 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002998 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002999 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3000 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003001 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003002 }
3003 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003004 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003005 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003006 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003007 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003008 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003009 com_pop(c, 1);
3010 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003011 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003012 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003013 com_node(c, CHILD(n, i+2));
3014 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3015 if (except_anchor) {
3016 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003017 /* We come in with [tb, val, exc, 0] on the
3018 stack; one pop and it's the same as
3019 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003020 com_addbyte(c, POP_TOP);
3021 }
3022 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003023 /* We actually come in here with [tb, val, exc] but the
3024 END_FINALLY will zap those and jump around.
3025 The c_stacklevel does not reflect them so we need not pop
3026 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003027 com_addbyte(c, END_FINALLY);
3028 com_backpatch(c, else_anchor);
3029 if (i < NCH(n))
3030 com_node(c, CHILD(n, i+2));
3031 com_backpatch(c, end_anchor);
3032}
3033
3034static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003035com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003036{
3037 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003038 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003039
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003040 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3041 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003042 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003043 com_addbyte(c, POP_BLOCK);
3044 block_pop(c, SETUP_FINALLY);
3045 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003046 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003047 /* While the generated code pushes only one item,
3048 the try-finally handling can enter here with
3049 up to three items. OK, here are the details:
3050 3 for an exception, 2 for RETURN, 1 for BREAK. */
3051 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003052 com_backpatch(c, finally_anchor);
3053 ch = CHILD(n, NCH(n)-1);
3054 com_addoparg(c, SET_LINENO, ch->n_lineno);
3055 com_node(c, ch);
3056 com_addbyte(c, END_FINALLY);
3057 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003058 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003059}
3060
3061static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003062com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003063{
3064 REQ(n, try_stmt);
3065 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3066 | 'try' ':' suite 'finally' ':' suite */
3067 if (TYPE(CHILD(n, 3)) != except_clause)
3068 com_try_finally(c, n);
3069 else
3070 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003071}
3072
Guido van Rossum8b993a91997-01-17 21:04:03 +00003073static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003074get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003075{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003076 int i;
3077
Guido van Rossum8b993a91997-01-17 21:04:03 +00003078 /* Label to avoid tail recursion */
3079 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003080 switch (TYPE(n)) {
3081
3082 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003083 if (NCH(n) == 1) {
3084 n = CHILD(n, 0);
3085 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003086 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003087 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003088 case file_input:
3089 for (i = 0; i < NCH(n); i++) {
3090 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003091 if (TYPE(ch) == stmt) {
3092 n = ch;
3093 goto next;
3094 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003095 }
3096 break;
3097
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003098 case stmt:
3099 case simple_stmt:
3100 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003101 n = CHILD(n, 0);
3102 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003103
3104 case expr_stmt:
3105 case testlist:
3106 case test:
3107 case and_test:
3108 case not_test:
3109 case comparison:
3110 case expr:
3111 case xor_expr:
3112 case and_expr:
3113 case shift_expr:
3114 case arith_expr:
3115 case term:
3116 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003117 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003118 if (NCH(n) == 1) {
3119 n = CHILD(n, 0);
3120 goto next;
3121 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003122 break;
3123
3124 case atom:
3125 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003126 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003127 break;
3128
3129 }
3130 return NULL;
3131}
3132
Guido van Rossum79f25d91997-04-29 20:08:16 +00003133static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003134get_docstring(node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003135{
Guido van Rossum541563e1999-01-28 15:08:09 +00003136 /* Don't generate doc-strings if run with -OO */
3137 if (Py_OptimizeFlag > 1)
3138 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003139 n = get_rawdocstring(n);
3140 if (n == NULL)
3141 return NULL;
3142 return parsestrplus(n);
3143}
3144
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003145static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003146com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003147{
3148 REQ(n, suite);
3149 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3150 if (NCH(n) == 1) {
3151 com_node(c, CHILD(n, 0));
3152 }
3153 else {
3154 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003155 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003156 node *ch = CHILD(n, i);
3157 if (TYPE(ch) == stmt)
3158 com_node(c, ch);
3159 }
3160 }
3161}
3162
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003163/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003164static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003165com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003166{
3167 int i = c->c_nblocks;
3168 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3169 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3170 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003171 else if (i <= 0) {
3172 /* at the outer level */
3173 com_error(c, PyExc_SyntaxError,
3174 "'continue' not properly in loop");
3175 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003176 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003177 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003178 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003179 if (c->c_block[j] == SETUP_LOOP)
3180 break;
3181 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003182 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003183 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003184 for (; i > j; --i) {
3185 if (c->c_block[i] == SETUP_EXCEPT ||
3186 c->c_block[i] == SETUP_FINALLY) {
3187 com_addoparg(c, CONTINUE_LOOP,
3188 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003189 return;
3190 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003191 if (c->c_block[i] == END_FINALLY) {
3192 com_error(c, PyExc_SyntaxError,
3193 "'continue' not supported inside 'finally' clause");
3194 return;
3195 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003196 }
3197 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003198 com_error(c, PyExc_SyntaxError,
3199 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003200 }
3201 /* XXX Could allow it inside a 'finally' clause
3202 XXX if we could pop the exception still on the stack */
3203}
3204
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003205static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003206com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003207{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003208 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003209 if (TYPE(n) == lambdef) {
3210 /* lambdef: 'lambda' [varargslist] ':' test */
3211 n = CHILD(n, 1);
3212 }
3213 else {
3214 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3215 n = CHILD(n, 2);
3216 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3217 n = CHILD(n, 1);
3218 }
3219 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003220 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003221 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003222 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003223 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3224 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003225 nargs = 0;
3226 ndefs = 0;
3227 for (i = 0; i < nch; i++) {
3228 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003229 if (TYPE(CHILD(n, i)) == STAR ||
3230 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003231 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003232 nargs++;
3233 i++;
3234 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003235 t = RPAR; /* Anything except EQUAL or COMMA */
3236 else
3237 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003238 if (t == EQUAL) {
3239 i++;
3240 ndefs++;
3241 com_node(c, CHILD(n, i));
3242 i++;
3243 if (i >= nch)
3244 break;
3245 t = TYPE(CHILD(n, i));
3246 }
3247 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003248 /* Treat "(a=1, b)" as an error */
3249 if (ndefs)
3250 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003251 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003252 }
3253 if (t != COMMA)
3254 break;
3255 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003256 return ndefs;
3257}
3258
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003259static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003260com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003261{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003262 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003263 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003264 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003265 ndefs = com_argdefs(c, n);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003266 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3267 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003268 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003269 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003270 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003271 c->c_errors++;
3272 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003273 int closure = com_make_closure(c, (PyCodeObject *)co);
3274 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003275 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003276 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003277 if (closure)
3278 com_addoparg(c, MAKE_CLOSURE, ndefs);
3279 else
3280 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003281 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003282 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003283 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003284 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003285 }
3286}
3287
3288static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003289com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003290{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003291 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003292 REQ(n, testlist);
3293 /* testlist: test (',' test)* [','] */
3294 for (i = 0; i < NCH(n); i += 2)
3295 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003296 i = (NCH(n)+1) / 2;
3297 com_addoparg(c, BUILD_TUPLE, i);
3298 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003299}
3300
3301static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003302com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003303{
Guido van Rossum25831651993-05-19 14:50:45 +00003304 int i;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003305 PyObject *co, *v;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003306 char *name;
3307
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003308 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003309 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003310 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003311 c->c_errors++;
3312 return;
3313 }
3314 /* Push the class name on the stack */
3315 i = com_addconst(c, v);
3316 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003317 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003318 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003319 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003320 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003321 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003322 com_push(c, 1);
3323 }
Guido van Rossum25831651993-05-19 14:50:45 +00003324 else
3325 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003326 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003327 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003328 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003329 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003330 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003331 c->c_errors++;
3332 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003333 int closure = com_make_closure(c, (PyCodeObject *)co);
3334 i = com_addconst(c, co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003335 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003336 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003337 if (closure)
3338 com_addoparg(c, MAKE_CLOSURE, 0);
3339 else
3340 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003341 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003342 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003343 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003344 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003345 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003346 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003347}
3348
3349static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003350com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003351{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003352 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003353 if (c->c_errors)
3354 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003355 switch (TYPE(n)) {
3356
3357 /* Definition nodes */
3358
3359 case funcdef:
3360 com_funcdef(c, n);
3361 break;
3362 case classdef:
3363 com_classdef(c, n);
3364 break;
3365
3366 /* Trivial parse tree nodes */
3367
3368 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003369 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003370 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003371 n = CHILD(n, 0);
3372 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003373
3374 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003375 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
3376 com_addoparg(c, SET_LINENO, n->n_lineno);
3377 {
3378 int i;
3379 for (i = 0; i < NCH(n)-1; i += 2)
3380 com_node(c, CHILD(n, i));
3381 }
3382 break;
3383
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003384 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003385 com_addoparg(c, SET_LINENO, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003386 n = CHILD(n, 0);
3387 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003388
3389 /* Statement nodes */
3390
3391 case expr_stmt:
3392 com_expr_stmt(c, n);
3393 break;
3394 case print_stmt:
3395 com_print_stmt(c, n);
3396 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003397 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003398 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003399 break;
3400 case pass_stmt:
3401 break;
3402 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003403 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003404 com_error(c, PyExc_SyntaxError,
3405 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003406 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003407 com_addbyte(c, BREAK_LOOP);
3408 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003409 case continue_stmt:
3410 com_continue_stmt(c, n);
3411 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003412 case return_stmt:
3413 com_return_stmt(c, n);
3414 break;
3415 case raise_stmt:
3416 com_raise_stmt(c, n);
3417 break;
3418 case import_stmt:
3419 com_import_stmt(c, n);
3420 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003421 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003422 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003423 case exec_stmt:
3424 com_exec_stmt(c, n);
3425 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003426 case assert_stmt:
3427 com_assert_stmt(c, n);
3428 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003429 case if_stmt:
3430 com_if_stmt(c, n);
3431 break;
3432 case while_stmt:
3433 com_while_stmt(c, n);
3434 break;
3435 case for_stmt:
3436 com_for_stmt(c, n);
3437 break;
3438 case try_stmt:
3439 com_try_stmt(c, n);
3440 break;
3441 case suite:
3442 com_suite(c, n);
3443 break;
3444
3445 /* Expression nodes */
3446
3447 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003448 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003449 break;
3450 case test:
3451 com_test(c, n);
3452 break;
3453 case and_test:
3454 com_and_test(c, n);
3455 break;
3456 case not_test:
3457 com_not_test(c, n);
3458 break;
3459 case comparison:
3460 com_comparison(c, n);
3461 break;
3462 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003463 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003464 break;
3465 case expr:
3466 com_expr(c, n);
3467 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003468 case xor_expr:
3469 com_xor_expr(c, n);
3470 break;
3471 case and_expr:
3472 com_and_expr(c, n);
3473 break;
3474 case shift_expr:
3475 com_shift_expr(c, n);
3476 break;
3477 case arith_expr:
3478 com_arith_expr(c, n);
3479 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003480 case term:
3481 com_term(c, n);
3482 break;
3483 case factor:
3484 com_factor(c, n);
3485 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003486 case power:
3487 com_power(c, n);
3488 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003489 case atom:
3490 com_atom(c, n);
3491 break;
3492
3493 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003494 com_error(c, PyExc_SystemError,
3495 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003496 }
3497}
3498
Tim Petersdbd9ba62000-07-09 03:09:57 +00003499static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003500
3501static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003502com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003503{
3504 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3505 if (TYPE(CHILD(n, 0)) == LPAR)
3506 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003507 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003508 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003509 com_pop(c, 1);
3510 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003511}
3512
3513static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003514com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003515{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003516 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003517 if (NCH(n) == 1) {
3518 com_fpdef(c, CHILD(n, 0));
3519 }
3520 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003521 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003522 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003523 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003524 for (i = 0; i < NCH(n); i += 2)
3525 com_fpdef(c, CHILD(n, i));
3526 }
3527}
3528
3529static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003530com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003531{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003532 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003533 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003534 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003535 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003536 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003537 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003538 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003539 /* Enter all arguments in table of locals */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003540 for (i = 0, narg = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003541 node *ch = CHILD(n, i);
3542 node *fp;
3543 char *name;
Guido van Rossum50564e81996-01-12 01:13:16 +00003544 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003545 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003546 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3547 fp = CHILD(ch, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003548 if (TYPE(fp) == NAME) {
3549 PyObject *v;
3550 name = STR(fp);
3551 v = PyDict_GetItemString(c->c_cellvars, name);
3552 if (v) {
3553 com_addoparg(c, LOAD_FAST, narg);
3554 com_addoparg(c, STORE_DEREF,
3555 PyInt_AS_LONG(v));
3556 }
3557 } else {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003558 name = nbuf;
3559 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003560 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003561 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003562 narg++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003563 /* all name updates handled by symtable */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003564 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003565 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003566 ch = CHILD(n, i);
3567 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003568 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003569 else
3570 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003571 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003572 /* Handle *arguments */
3573 if (i < nch) {
3574 node *ch;
3575 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003576 if (TYPE(ch) != DOUBLESTAR) {
3577 REQ(ch, STAR);
3578 ch = CHILD(n, i+1);
3579 if (TYPE(ch) == NAME) {
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003580 PyObject *v;
Guido van Rossum50564e81996-01-12 01:13:16 +00003581 i += 3;
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003582 v = PyDict_GetItemString(c->c_cellvars,
3583 STR(ch));
3584 if (v) {
3585 com_addoparg(c, LOAD_FAST, narg);
3586 com_addoparg(c, STORE_DEREF,
3587 PyInt_AS_LONG(v));
Guido van Rossum50564e81996-01-12 01:13:16 +00003588 }
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003589 narg++;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003590 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003591 }
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003592 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003593 /* Handle **keywords */
3594 if (i < nch) {
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003595 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003596 node *ch;
3597 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003598 if (TYPE(ch) != DOUBLESTAR) {
3599 REQ(ch, STAR);
3600 ch = CHILD(n, i+1);
3601 REQ(ch, STAR);
3602 ch = CHILD(n, i+2);
3603 }
3604 else
3605 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003606 REQ(ch, NAME);
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003607 v = PyDict_GetItemString(c->c_cellvars, STR(ch));
3608 if (v) {
3609 com_addoparg(c, LOAD_FAST, narg);
3610 com_addoparg(c, STORE_DEREF, PyInt_AS_LONG(v));
3611 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003612 }
3613 if (complex) {
3614 /* Generate code for complex arguments only after
3615 having counted the simple arguments */
3616 int ilocal = 0;
3617 for (i = 0; i < nch; i++) {
3618 node *ch = CHILD(n, i);
3619 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003620 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003621 break;
3622 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3623 fp = CHILD(ch, 0);
3624 if (TYPE(fp) != NAME) {
3625 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003626 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003627 com_fpdef(c, ch);
3628 }
3629 ilocal++;
3630 if (++i >= nch)
3631 break;
3632 ch = CHILD(n, i);
3633 if (TYPE(ch) == EQUAL)
3634 i += 2;
3635 else
3636 REQ(ch, COMMA);
3637 }
3638 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003639}
3640
3641static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003642com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003643{
3644 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003645 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003646 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003647 doc = get_docstring(n);
3648 if (doc != NULL) {
3649 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003650 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003651 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003652 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003653 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003654 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003655 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003656 for (i = 0; i < NCH(n); i++) {
3657 node *ch = CHILD(n, i);
3658 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3659 com_node(c, ch);
3660 }
3661}
3662
3663/* Top-level compile-node interface */
3664
3665static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003666compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003667{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003668 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003669 node *ch;
3670 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003671 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003672 doc = get_docstring(CHILD(n, 4));
3673 if (doc != NULL) {
3674 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003675 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003676 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003677 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003678 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003679 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3680 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003681 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003682 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003683 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003684 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003685 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003686 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003687 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003688 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003689 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003690}
3691
3692static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003693compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003694{
Guido van Rossum590baa41993-11-30 13:40:46 +00003695 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003696 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003697 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003698
3699 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003700 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003701 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003702 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003703 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003704 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003705 else
3706 ch = CHILD(n, 2);
3707 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003708 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003709 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003710}
3711
3712static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003713compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003714{
3715 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003716 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003717 REQ(n, classdef);
3718 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3719 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003720 c->c_private = c->c_name;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003721 ch = CHILD(n, NCH(n)-1); /* The suite */
3722 doc = get_docstring(ch);
3723 if (doc != NULL) {
3724 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003725 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003726 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003727 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003728 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003729 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003730 }
3731 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003732 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003733 com_node(c, ch);
3734 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003735 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003736 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003737 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003738}
3739
3740static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003741compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003742{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003743 com_addoparg(c, SET_LINENO, n->n_lineno);
3744
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003745 switch (TYPE(n)) {
3746
Guido van Rossum4c417781991-01-21 16:09:22 +00003747 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003748 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003749 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003750 n = CHILD(n, 0);
3751 if (TYPE(n) != NEWLINE)
3752 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003753 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003754 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003755 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003756 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003757 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003758 break;
3759
Guido van Rossum4c417781991-01-21 16:09:22 +00003760 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003761 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003762 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003763 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003764 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003765 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003766 break;
3767
Guido van Rossum590baa41993-11-30 13:40:46 +00003768 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003769 com_node(c, CHILD(n, 0));
3770 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003771 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003772 break;
3773
Guido van Rossum590baa41993-11-30 13:40:46 +00003774 case lambdef: /* anonymous function definition */
3775 compile_lambdef(c, n);
3776 break;
3777
Guido van Rossum4c417781991-01-21 16:09:22 +00003778 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003779 compile_funcdef(c, n);
3780 break;
3781
Guido van Rossum4c417781991-01-21 16:09:22 +00003782 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003783 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003784 break;
3785
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003786 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003787 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003788 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003789 }
3790}
3791
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003792static PyObject *
3793dict_keys_inorder(PyObject *dict, int offset)
3794{
3795 PyObject *tuple, *k, *v;
3796 int i, pos = 0, size = PyDict_Size(dict);
3797
3798 tuple = PyTuple_New(size);
3799 if (tuple == NULL)
3800 return NULL;
3801 while (PyDict_Next(dict, &pos, &k, &v)) {
3802 i = PyInt_AS_LONG(v);
3803 Py_INCREF(k);
3804 PyTuple_SET_ITEM(tuple, i - offset, k);
3805 }
3806 return tuple;
3807}
3808
Guido van Rossum79f25d91997-04-29 20:08:16 +00003809PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003810PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003811{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003812 return jcompile(n, filename, NULL);
3813}
3814
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003815struct symtable *
3816PyNode_CompileSymtable(node *n, char *filename)
3817{
3818 struct symtable *st;
3819
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003820 st = symtable_init();
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003821 if (st == NULL)
3822 return NULL;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00003823 assert(st->st_symbols != NULL);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003824 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
3825 if (st->st_errors > 0) {
3826 PySymtable_Free(st);
3827 return NULL;
3828 }
3829 symtable_node(st, n);
3830 if (st->st_errors > 0) {
3831 PySymtable_Free(st);
3832 return NULL;
3833 }
3834 return st;
3835}
3836
Guido van Rossum79f25d91997-04-29 20:08:16 +00003837static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003838icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003839{
3840 return jcompile(n, base->c_filename, base);
3841}
3842
Guido van Rossum79f25d91997-04-29 20:08:16 +00003843static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003844jcompile(node *n, char *filename, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003845{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003846 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003847 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003848 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003849 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003850 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003851 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003852 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003853 /* c_symtable still points to parent's symbols */
3854 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003855 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003856 sc.c_nested = 1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003857 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003858 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00003859 sc.c_future = PyNode_Future(n, filename);
3860 if (sc.c_future == NULL || symtable_build(&sc, n) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003861 com_free(&sc);
3862 return NULL;
3863 }
3864 }
3865 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003866 if (symtable_load_symbols(&sc) < 0) {
3867 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003868 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003869 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003870 compile_node(&sc, n);
3871 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00003872 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003873 PyObject *consts, *names, *varnames, *filename, *name,
3874 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003875 consts = PyList_AsTuple(sc.c_consts);
3876 names = PyList_AsTuple(sc.c_names);
3877 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003878 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
3879 freevars = dict_keys_inorder(sc.c_freevars,
3880 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003881 filename = PyString_InternFromString(sc.c_filename);
3882 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003883 if (!PyErr_Occurred())
3884 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003885 sc.c_nlocals,
3886 sc.c_maxstacklevel,
3887 sc.c_flags,
3888 sc.c_code,
3889 consts,
3890 names,
3891 varnames,
3892 freevars,
3893 cellvars,
3894 filename,
3895 name,
3896 sc.c_firstlineno,
3897 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003898 Py_XDECREF(consts);
3899 Py_XDECREF(names);
3900 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003901 Py_XDECREF(freevars);
3902 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003903 Py_XDECREF(filename);
3904 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003905 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00003906 else if (!PyErr_Occurred()) {
3907 /* This could happen if someone called PyErr_Clear() after an
3908 error was reported above. That's not supposed to happen,
3909 but I just plugged one case and I'm not sure there can't be
3910 others. In that case, raise SystemError so that at least
3911 it gets reported instead dumping core. */
3912 PyErr_SetString(PyExc_SystemError, "lost syntax error");
3913 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003914 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00003915 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003916 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00003917 sc.c_symtable = NULL;
3918 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003919 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003920 return co;
3921}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003922
3923int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003924PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003925{
3926 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003927 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003928 int line = co->co_firstlineno;
3929 int addr = 0;
3930 while (--size >= 0) {
3931 addr += *p++;
3932 if (addr > addrq)
3933 break;
3934 line += *p++;
3935 }
3936 return line;
3937}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003938
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003939/* The test for LOCAL must come before the test for FREE in order to
3940 handle classes where name is both local and free. The local var is
3941 a method and the free var is a free var referenced within a method.
3942*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003943
3944static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003945get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003946{
3947 PyObject *v;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00003948 if (c->c_symtable->st_nested_scopes) {
3949 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
3950 return CELL;
3951 if (PyDict_GetItemString(c->c_locals, name) != NULL)
3952 return LOCAL;
3953 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
3954 return FREE;
3955 v = PyDict_GetItemString(c->c_globals, name);
3956 if (v) {
3957 if (v == Py_None)
3958 return GLOBAL_EXPLICIT;
3959 else {
3960 return GLOBAL_IMPLICIT;
3961 }
3962 }
3963 } else {
3964 if (PyDict_GetItemString(c->c_locals, name) != NULL)
3965 return LOCAL;
3966 v = PyDict_GetItemString(c->c_globals, name);
3967 if (v) {
3968 if (v == Py_None)
3969 return GLOBAL_EXPLICIT;
3970 else {
3971 return GLOBAL_IMPLICIT;
3972 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003973 }
3974 }
3975 {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003976 char buf[350];
3977 sprintf(buf,
Jeremy Hylton51257732001-03-01 00:42:55 +00003978 "unknown scope for %.100s in %.100s(%s) "
3979 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
Jeremy Hylton483638c2001-02-01 20:20:45 +00003980 name, c->c_name,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003981 PyObject_REPR(c->c_symtable->st_cur->ste_id),
Jeremy Hylton51257732001-03-01 00:42:55 +00003982 c->c_filename,
3983 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
3984 PyObject_REPR(c->c_locals),
3985 PyObject_REPR(c->c_globals)
3986 );
3987
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003988 Py_FatalError(buf);
3989 }
3990 return -1; /* can't get here */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003991}
3992
Guido van Rossumee34ac12001-02-28 22:08:12 +00003993/* Helper function to issue symbol table warnings */
3994
Jeremy Hylton4419ac12001-02-28 22:54:51 +00003995static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00003996symtable_warn(struct symtable *st, char *msg)
3997{
3998 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, st->st_filename,
3999 st->st_cur->ste_lineno, NULL, NULL) < 0) {
4000 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4001 PyErr_SetString(PyExc_SyntaxError, msg);
4002 PyErr_SyntaxLocation(st->st_filename,
4003 st->st_cur->ste_lineno);
4004 }
4005 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004006 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004007 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004008 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004009}
4010
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004011/* Helper function for setting lineno and filename */
4012
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004013static int
4014symtable_build(struct compiling *c, node *n)
4015{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004016 if ((c->c_symtable = symtable_init()) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004017 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004018 c->c_symtable->st_future = c->c_future;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004019 if (c->c_future->ff_nested_scopes)
4020 c->c_symtable->st_nested_scopes = 1;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004021 c->c_symtable->st_filename = c->c_filename;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004022 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
4023 if (c->c_symtable->st_errors > 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004024 return -1;
4025 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004026 if (c->c_symtable->st_errors > 0)
4027 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004028 /* reset for second pass */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004029 c->c_symtable->st_nscopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004030 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004031 return 0;
4032}
4033
4034static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004035symtable_init_compiling_symbols(struct compiling *c)
4036{
4037 PyObject *varnames;
4038
4039 varnames = c->c_symtable->st_cur->ste_varnames;
4040 if (varnames == NULL) {
4041 varnames = PyList_New(0);
4042 if (varnames == NULL)
4043 return -1;
4044 c->c_symtable->st_cur->ste_varnames = varnames;
4045 Py_INCREF(varnames);
4046 } else
4047 Py_INCREF(varnames);
4048 c->c_varnames = varnames;
4049
4050 c->c_globals = PyDict_New();
4051 if (c->c_globals == NULL)
4052 return -1;
4053 c->c_freevars = PyDict_New();
4054 if (c->c_freevars == NULL)
4055 return -1;
4056 c->c_cellvars = PyDict_New();
4057 if (c->c_cellvars == NULL)
4058 return -1;
4059 return 0;
4060}
4061
4062struct symbol_info {
4063 int si_nlocals;
4064 int si_ncells;
4065 int si_nfrees;
4066 int si_nimplicit;
4067};
4068
4069static void
4070symtable_init_info(struct symbol_info *si)
4071{
4072 si->si_nlocals = 0;
4073 si->si_ncells = 0;
4074 si->si_nfrees = 0;
4075 si->si_nimplicit = 0;
4076}
4077
4078static int
4079symtable_resolve_free(struct compiling *c, PyObject *name,
4080 struct symbol_info *si)
4081{
4082 PyObject *dict, *v;
4083
4084 /* Seperate logic for DEF_FREE. If it occurs in a function,
4085 it indicates a local that we must allocate storage for (a
4086 cell var). If it occurs in a class, then the class has a
4087 method and a free variable with the same name.
4088 */
4089
4090 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
4091 v = PyInt_FromLong(si->si_ncells++);
4092 dict = c->c_cellvars;
4093 } else {
4094 v = PyInt_FromLong(si->si_nfrees++);
4095 dict = c->c_freevars;
4096 }
4097 if (v == NULL)
4098 return -1;
4099 if (PyDict_SetItem(dict, name, v) < 0) {
4100 Py_DECREF(v);
4101 return -1;
4102 }
4103 Py_DECREF(v);
4104 return 0;
4105}
4106
4107static int
4108symtable_freevar_offsets(PyObject *freevars, int offset)
4109{
4110 PyObject *name, *v;
4111 int pos;
4112
4113 /* The cell vars are the first elements of the closure,
4114 followed by the free vars. Update the offsets in
4115 c_freevars to account for number of cellvars. */
4116 pos = 0;
4117 while (PyDict_Next(freevars, &pos, &name, &v)) {
4118 int i = PyInt_AS_LONG(v) + offset;
4119 PyObject *o = PyInt_FromLong(i);
4120 if (o == NULL)
4121 return -1;
4122 if (PyDict_SetItem(freevars, name, o) < 0) {
4123 Py_DECREF(o);
4124 return -1;
4125 }
4126 Py_DECREF(o);
4127 }
4128 return 0;
4129}
4130
4131static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004132symtable_check_unoptimized(struct compiling *c,
4133 PySymtableEntryObject *ste,
4134 struct symbol_info *si)
4135{
4136 char buf[300];
4137
4138 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4139 || (ste->ste_nested && si->si_nimplicit)))
4140 return 0;
4141
4142#define ILLEGAL_IMPORT_STAR \
4143"import * is not allowed in function '%.100s' " \
4144"because it contains a nested function with free variables"
4145
4146#define ILLEGAL_BARE_EXEC \
4147"unqualified exec is not allowed in function '%.100s' " \
4148"because it contains a nested function with free variables"
4149
4150#define ILLEGAL_EXEC_AND_IMPORT_STAR \
4151"function '%.100s' uses import * and bare exec, which are illegal" \
4152"because it contains a nested function with free variables"
4153
4154 /* XXX perhaps the linenos for these opt-breaking statements
4155 should be stored so the exception can point to them. */
4156
4157 if (ste->ste_optimized == OPT_IMPORT_STAR)
4158 sprintf(buf, ILLEGAL_IMPORT_STAR,
4159 PyString_AS_STRING(ste->ste_name));
4160 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
4161 sprintf(buf, ILLEGAL_BARE_EXEC,
4162 PyString_AS_STRING(ste->ste_name));
4163 else {
4164 sprintf(buf, ILLEGAL_EXEC_AND_IMPORT_STAR,
4165 PyString_AS_STRING(ste->ste_name));
4166 }
4167
4168 if (c->c_symtable->st_nested_scopes) {
4169 PyErr_SetString(PyExc_SyntaxError, buf);
4170 PyErr_SyntaxLocation(c->c_symtable->st_filename,
4171 ste->ste_lineno);
4172 return -1;
4173 } else {
4174 /* XXX if the warning becomes an exception, we should
4175 attached more info to it. */
4176 if (PyErr_Warn(PyExc_SyntaxWarning, buf) < 0)
4177 return -1;
4178 }
4179 return 0;
4180}
4181
4182static int
4183symtable_check_shadow(struct symtable *st, PyObject *name, int flags)
4184{
4185 char buf[500];
4186 PyObject *children, *v;
Jeremy Hyltonc1761322001-02-28 23:44:45 +00004187 PySymtableEntryObject *child = NULL;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004188 int i;
4189
4190 if (!(flags & DEF_BOUND))
4191 return 0;
4192 /* The semantics of this code will change with nested scopes.
4193 It is defined in the current scope and referenced in a
4194 child scope. Under the old rules, the child will see a
4195 global. Under the new rules, the child will see the
4196 binding in the current scope.
4197 */
4198
4199 /* Find name of child function that has free variable */
4200 children = st->st_cur->ste_children;
4201 for (i = 0; i < PyList_GET_SIZE(children); i++) {
4202 int cflags;
4203 child = (PySymtableEntryObject *)PyList_GET_ITEM(children, i);
4204 v = PyDict_GetItem(child->ste_symbols, name);
4205 if (v == NULL)
4206 continue;
4207 cflags = PyInt_AS_LONG(v);
4208 if (!(cflags & DEF_BOUND))
4209 break;
4210 }
Jeremy Hyltonc1761322001-02-28 23:44:45 +00004211
4212 assert(child != NULL);
4213
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004214 sprintf(buf, "local name '%.100s' in '%.100s' shadows "
4215 "use of '%.100s' as global in nested scope '%.100s'",
4216 PyString_AS_STRING(name),
4217 PyString_AS_STRING(st->st_cur->ste_name),
4218 PyString_AS_STRING(name),
4219 PyString_AS_STRING(child->ste_name)
4220 );
4221
4222 return symtable_warn(st, buf);
4223}
4224
4225static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004226symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4227 struct symbol_info *si)
4228{
4229 if (ste->ste_type != TYPE_MODULE)
4230 c->c_flags |= CO_NEWLOCALS;
4231 if (ste->ste_type == TYPE_FUNCTION) {
4232 c->c_nlocals = si->si_nlocals;
4233 if (ste->ste_optimized == 0)
4234 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004235 else if (ste->ste_optimized != OPT_EXEC)
4236 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004237 }
4238 return 0;
4239}
4240
4241static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004242symtable_load_symbols(struct compiling *c)
4243{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004244 static PyObject *implicit = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004245 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004246 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004247 PyObject *name, *varnames, *v;
4248 int i, flags, pos;
4249 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004250
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004251 if (implicit == NULL) {
4252 implicit = PyInt_FromLong(1);
4253 if (implicit == NULL)
4254 return -1;
4255 }
4256 v = NULL;
4257
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004258 if (symtable_init_compiling_symbols(c) < 0)
4259 goto fail;
4260 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004261 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004262 si.si_nlocals = PyList_GET_SIZE(varnames);
4263 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004264
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004265 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004266 v = PyInt_FromLong(i);
4267 if (PyDict_SetItem(c->c_locals,
4268 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004269 goto fail;
4270 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004271 }
4272
4273 /* XXX The cases below define the rules for whether a name is
4274 local or global. The logic could probably be clearer. */
4275 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004276 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4277 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004278
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004279 if (st->st_nested_scopes == 0
4280 && (flags & (DEF_FREE | DEF_FREE_CLASS))) {
4281 if (symtable_check_shadow(st, name, flags) < 0)
4282 goto fail;
4283 }
4284
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004285 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004286 /* undo the original DEF_FREE */
4287 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004288
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004289 if ((flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004290 && (flags & (DEF_LOCAL | DEF_PARAM)))
4291 symtable_resolve_free(c, name, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004292
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004293 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004294 c->c_argcount--;
4295 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004296 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004297 c->c_argcount--;
4298 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004299 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004300 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004301 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004302 if (flags & DEF_PARAM) {
4303 PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004304 PyString_AS_STRING(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004305 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004306 ste->ste_lineno);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004307 st->st_errors++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004308 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004309 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004310 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4311 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004312 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004313 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004314 if (PyDict_SetItem(c->c_globals, name, implicit) < 0)
4315 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004316 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004317 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004318 if (v == NULL)
4319 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004320 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004321 goto fail;
4322 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004323 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004324 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004325 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004326 } else if (is_free(flags)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004327 if (ste->ste_nested && st->st_nested_scopes) {
4328 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004329 if (v == NULL)
4330 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004331 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004332 goto fail;
4333 Py_DECREF(v);
4334 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004335 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004336 if (PyDict_SetItem(c->c_globals, name,
4337 implicit) < 0)
4338 goto fail;
Jeremy Hylton51257732001-03-01 00:42:55 +00004339 if (st->st_nscopes != 1) {
4340 v = PyInt_FromLong(flags);
4341 if (PyDict_SetItem(st->st_global,
4342 name, v))
4343 goto fail;
4344 Py_DECREF(v);
4345 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004346 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004347 }
4348 }
4349
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004350 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4351 return -1;
4352 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004353 fail:
4354 /* is this always the right thing to do? */
4355 Py_XDECREF(v);
4356 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004357}
4358
4359static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004360symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004361{
4362 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004363
4364 st = (struct symtable *)PyMem_Malloc(sizeof(struct symtable));
4365 if (st == NULL)
4366 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004367 st->st_pass = 1;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004368 st->st_nested_scopes = NESTED_SCOPES_DEFAULT;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004369 st->st_filename = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004370 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004371 goto fail;
4372 if ((st->st_symbols = PyDict_New()) == NULL)
4373 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004374 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004375 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004376 st->st_errors = 0;
4377 st->st_tmpname = 0;
4378 st->st_private = NULL;
4379 return st;
4380 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004381 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004382 return NULL;
4383}
4384
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004385void
4386PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004387{
4388 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004389 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004390 Py_XDECREF(st->st_cur);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004391 PyMem_Free((void *)st);
4392}
4393
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004394/* When the compiler exits a scope, it must should update the scope's
4395 free variable information with the list of free variables in its
4396 children.
4397
4398 Variables that are free in children and defined in the current
4399 scope are cellvars.
4400
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004401 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004402 false), free variables in children that are not defined here are
4403 implicit globals.
4404
4405*/
4406
4407static int
4408symtable_update_free_vars(struct symtable *st)
4409{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004410 int i, j, def;
4411 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004412 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004413
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004414 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004415 def = DEF_FREE_CLASS;
4416 else
4417 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004418 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004419 int pos = 0;
4420
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004421 if (list)
4422 PyList_SetSlice(list, 0,
4423 ((PyVarObject*)list)->ob_size, 0);
Barry Warsaw0372af72001-02-23 18:22:59 +00004424 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004425 PyList_GET_ITEM(ste->ste_children, i);
4426 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004427 int v = PyInt_AS_LONG(o);
4428 if (!(is_free(v)))
4429 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004430 if (list == NULL) {
4431 list = PyList_New(0);
4432 if (list == NULL)
4433 return -1;
4434 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004435 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004436 if (PyList_Append(list, name) < 0) {
4437 Py_DECREF(list);
4438 return -1;
4439 }
4440 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004441/*
4442 if (st->st_nested_scopes == 0
4443 && list && PyList_GET_SIZE(list) > 0) {
4444 fprintf(stderr, "function %s has children with "
4445 "the following free vars:\n%s\n",
4446 PyString_AS_STRING(ste->ste_name),
4447 PyObject_REPR(list));
4448 continue;
4449 }
4450*/
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004451 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
4452 name = PyList_GET_ITEM(list, j);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004453 if (ste->ste_nested) {
4454 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004455 name, def) < 0) {
4456 Py_DECREF(list);
4457 return -1;
4458 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004459 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004460 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004461 name) < 0) {
4462 Py_DECREF(list);
4463 return -1;
4464 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004465 }
4466 }
4467 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004468
4469 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004470 return 0;
4471}
4472
4473/* If the current scope is a non-nested class or if name is not
4474 defined in the current, non-nested scope, then it is an implicit
4475 global in all nested scopes.
4476*/
4477
4478static int
4479symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
4480{
4481 PyObject *o;
4482 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004483 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004484
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004485 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004486 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004487 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004488 if (o == NULL)
4489 return symtable_undo_free(st, child, name);
4490 v = PyInt_AS_LONG(o);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004491 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004492 return symtable_undo_free(st, child, name);
4493 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004494 return symtable_add_def_o(st, ste->ste_symbols,
4495 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004496}
4497
4498static int
4499symtable_undo_free(struct symtable *st, PyObject *id,
4500 PyObject *name)
4501{
4502 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004503 PyObject *info;
4504 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004505
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004506 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
4507 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004508 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004509 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004510 if (info == NULL)
4511 return 0;
4512 v = PyInt_AS_LONG(info);
4513 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004514 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004515 DEF_FREE_GLOBAL) < 0)
4516 return -1;
4517 } else
4518 /* If the name is defined here or declared global,
4519 then the recursion stops. */
4520 return 0;
4521
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004522 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
4523 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00004524 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004525 PyList_GET_ITEM(ste->ste_children, i);
4526 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004527 if (x < 0)
4528 return x;
4529 }
4530 return 0;
4531}
4532
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004533/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
4534 This reference is released when the scope is exited, via the DECREF
4535 in symtable_exit_scope().
4536*/
4537
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004538static int
4539symtable_exit_scope(struct symtable *st)
4540{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004541 int end;
4542
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004543 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004544 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004545 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004546 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004547 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
4548 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004549 if (PySequence_DelItem(st->st_stack, end) < 0)
4550 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004551 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004552}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004553
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004554static void
4555symtable_enter_scope(struct symtable *st, char *name, int type,
4556 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004557{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004558 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004559
4560 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004561 prev = st->st_cur;
4562 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
4563 Py_DECREF(st->st_cur);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004564 st->st_errors++;
4565 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004566 }
4567 }
Barry Warsaw0372af72001-02-23 18:22:59 +00004568 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004569 PySymtableEntry_New(st, name, type, lineno);
4570 if (strcmp(name, TOP) == 0)
4571 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004572 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004573 if (PyList_Append(prev->ste_children,
4574 (PyObject *)st->st_cur) < 0)
4575 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004576 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004577}
4578
4579static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004580symtable_lookup(struct symtable *st, char *name)
4581{
4582 char buffer[MANGLE_LEN];
4583 PyObject *v;
4584 int flags;
4585
4586 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
4587 name = buffer;
4588 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
4589 if (v == NULL) {
4590 if (PyErr_Occurred())
4591 return -1;
4592 else
4593 return 0;
4594 }
4595
4596 flags = PyInt_AS_LONG(v);
4597 return flags;
4598}
4599
4600static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004601symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004602{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004603 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004604 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004605 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004606
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004607 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004608 name = buffer;
4609 if ((s = PyString_InternFromString(name)) == NULL)
4610 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004611 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
4612 Py_DECREF(s);
4613 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004614}
4615
4616/* Must only be called with mangled names */
4617
4618static int
4619symtable_add_def_o(struct symtable *st, PyObject *dict,
4620 PyObject *name, int flag)
4621{
4622 PyObject *o;
4623 int val;
4624
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004625 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004626 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004627 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004628 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00004629 PyString_AsString(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004630 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004631 st->st_cur->ste_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004632 return -1;
4633 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004634 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004635 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004636 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004637 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004638 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004639 Py_DECREF(o);
4640 return -1;
4641 }
4642 Py_DECREF(o);
4643
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004644 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004645 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004646 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004647 } else if (flag & DEF_GLOBAL) {
4648 /* XXX need to update DEF_GLOBAL for other flags too;
4649 perhaps only DEF_FREE_GLOBAL */
4650 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004651 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004652 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004653 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004654 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004655 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004656 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004657 Py_DECREF(o);
4658 return -1;
4659 }
4660 Py_DECREF(o);
4661 }
4662 return 0;
4663}
4664
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004665#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004666
4667static void
4668symtable_node(struct symtable *st, node *n)
4669{
4670 int i, start = 0;
4671
4672 loop:
4673 switch (TYPE(n)) {
4674 case funcdef: {
4675 char *func_name = STR(CHILD(n, 1));
4676 symtable_add_def(st, func_name, DEF_LOCAL);
4677 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004678 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004679 symtable_funcdef(st, n);
4680 symtable_exit_scope(st);
4681 break;
4682 }
4683 case lambdef:
4684 if (NCH(n) == 4)
4685 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004686 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004687 symtable_funcdef(st, n);
4688 symtable_exit_scope(st);
4689 break;
4690 case classdef: {
4691 char *tmp, *class_name = STR(CHILD(n, 1));
4692 symtable_add_def(st, class_name, DEF_LOCAL);
4693 if (TYPE(CHILD(n, 2)) == LPAR) {
4694 node *bases = CHILD(n, 3);
4695 int i;
4696 for (i = 0; i < NCH(bases); i += 2) {
4697 symtable_node(st, CHILD(bases, i));
4698 }
4699 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004700 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004701 tmp = st->st_private;
4702 st->st_private = class_name;
4703 symtable_node(st, CHILD(n, NCH(n) - 1));
4704 st->st_private = tmp;
4705 symtable_exit_scope(st);
4706 break;
4707 }
4708 case if_stmt:
4709 for (i = 0; i + 3 < NCH(n); i += 4) {
4710 if (is_constant_false(NULL, (CHILD(n, i + 1))))
4711 continue;
4712 symtable_node(st, CHILD(n, i + 1));
4713 symtable_node(st, CHILD(n, i + 3));
4714 }
4715 if (i + 2 < NCH(n))
4716 symtable_node(st, CHILD(n, i + 2));
4717 break;
4718 case global_stmt:
4719 symtable_global(st, n);
4720 break;
4721 case import_stmt:
4722 symtable_import(st, n);
4723 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004724 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004725 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004726 symtable_node(st, CHILD(n, 1));
4727 if (NCH(n) > 2)
4728 symtable_node(st, CHILD(n, 3));
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004729 else
4730 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004731 if (NCH(n) > 4)
4732 symtable_node(st, CHILD(n, 5));
4733 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004734
4735 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00004736 case assert_stmt:
4737 if (Py_OptimizeFlag)
4738 return;
4739 if (NCH(n) == 2) {
4740 n = CHILD(n, 1);
4741 goto loop;
4742 } else {
4743 symtable_node(st, CHILD(n, 1));
4744 n = CHILD(n, 3);
4745 goto loop;
4746 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004747 case except_clause:
4748 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004749 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004750 if (NCH(n) > 1) {
4751 n = CHILD(n, 1);
4752 goto loop;
4753 }
4754 break;
4755 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004756 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004757 break;
4758 case expr_stmt:
4759 if (NCH(n) == 1)
4760 n = CHILD(n, 0);
4761 else {
4762 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004763 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004764 symtable_node(st, CHILD(n, 2));
4765 break;
4766 } else {
4767 int i;
4768 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004769 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004770 n = CHILD(n, NCH(n) - 1);
4771 }
4772 }
4773 goto loop;
4774 /* watchout for fall-through logic below */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004775 case argument:
4776 if (NCH(n) == 3) {
4777 n = CHILD(n, 2);
4778 goto loop;
4779 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004780 case listmaker:
4781 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
4782 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton5f827f42001-01-23 01:26:20 +00004783 n = CHILD(n, 0);
4784 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004785 }
4786 case atom:
4787 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
4788 symtable_add_use(st, STR(CHILD(n, 0)));
4789 break;
4790 }
4791 case for_stmt:
4792 if (TYPE(n) == for_stmt) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004793 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004794 start = 3;
4795 }
4796 default:
4797 if (NCH(n) == 1) {
4798 n = CHILD(n, 0);
4799 goto loop;
4800 }
4801 for (i = start; i < NCH(n); ++i)
4802 if (TYPE(CHILD(n, i)) >= single_input)
4803 symtable_node(st, CHILD(n, i));
4804 }
4805}
4806
4807static void
4808symtable_funcdef(struct symtable *st, node *n)
4809{
4810 node *body;
4811
4812 if (TYPE(n) == lambdef) {
4813 if (NCH(n) == 4)
4814 symtable_params(st, CHILD(n, 1));
4815 } else
4816 symtable_params(st, CHILD(n, 2));
4817 body = CHILD(n, NCH(n) - 1);
4818 symtable_node(st, body);
4819}
4820
4821/* The next two functions parse the argument tuple.
4822 symtable_default_arg() checks for names in the default arguments,
4823 which are references in the defining scope. symtable_params()
4824 parses the parameter names, which are defined in the function's
4825 body.
4826
4827 varargslist:
4828 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
4829 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
4830*/
4831
4832static void
4833symtable_default_args(struct symtable *st, node *n)
4834{
4835 node *c;
4836 int i;
4837
4838 if (TYPE(n) == parameters) {
4839 n = CHILD(n, 1);
4840 if (TYPE(n) == RPAR)
4841 return;
4842 }
4843 REQ(n, varargslist);
4844 for (i = 0; i < NCH(n); i += 2) {
4845 c = CHILD(n, i);
4846 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
4847 break;
4848 }
4849 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
4850 symtable_node(st, CHILD(n, i));
4851 }
4852}
4853
4854static void
4855symtable_params(struct symtable *st, node *n)
4856{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004857 int i, complex = -1, ext = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004858 node *c = NULL;
4859
4860 if (TYPE(n) == parameters) {
4861 n = CHILD(n, 1);
4862 if (TYPE(n) == RPAR)
4863 return;
4864 }
4865 REQ(n, varargslist);
4866 for (i = 0; i < NCH(n); i += 2) {
4867 c = CHILD(n, i);
4868 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
4869 ext = 1;
4870 break;
4871 }
4872 if (TYPE(c) == test) {
4873 continue;
4874 }
4875 if (TYPE(CHILD(c, 0)) == NAME)
4876 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
4877 else {
4878 char nbuf[10];
4879 sprintf(nbuf, ".%d", i);
4880 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004881 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004882 }
4883 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004884 if (ext) {
4885 c = CHILD(n, i);
4886 if (TYPE(c) == STAR) {
4887 i++;
4888 symtable_add_def(st, STR(CHILD(n, i)),
4889 DEF_PARAM | DEF_STAR);
4890 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00004891 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004892 c = NULL;
4893 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004894 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004895 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004896 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004897 i++;
4898 symtable_add_def(st, STR(CHILD(n, i)),
4899 DEF_PARAM | DEF_DOUBLESTAR);
4900 }
4901 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004902 if (complex >= 0) {
4903 int j;
4904 for (j = 0; j <= complex; j++) {
4905 c = CHILD(n, j);
4906 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00004907 c = CHILD(n, ++j);
4908 else if (TYPE(c) == EQUAL)
4909 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004910 if (TYPE(CHILD(c, 0)) == LPAR)
4911 symtable_params_fplist(st, CHILD(c, 1));
4912 }
4913 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004914}
4915
4916static void
4917symtable_params_fplist(struct symtable *st, node *n)
4918{
4919 int i;
4920 node *c;
4921
4922 REQ(n, fplist);
4923 for (i = 0; i < NCH(n); i += 2) {
4924 c = CHILD(n, i);
4925 REQ(c, fpdef);
4926 if (NCH(c) == 1)
4927 symtable_add_def(st, STR(CHILD(c, 0)),
4928 DEF_PARAM | DEF_INTUPLE);
4929 else
4930 symtable_params_fplist(st, CHILD(c, 1));
4931 }
4932
4933}
4934
4935static void
4936symtable_global(struct symtable *st, node *n)
4937{
4938 int i;
4939
Jeremy Hyltonc1761322001-02-28 23:44:45 +00004940 if (st->st_nscopes == 1) {
4941 if (symtable_warn(st,
4942 "global statement has no meaning at module level") < 0)
4943 return;
4944 }
4945
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004946 for (i = 1; i < NCH(n); i += 2) {
4947 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00004948 int flags;
4949
4950 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004951 if (flags < 0)
4952 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00004953 if (flags && flags != DEF_GLOBAL) {
4954 char buf[500];
4955 if (flags & DEF_PARAM) {
4956 PyErr_Format(PyExc_SyntaxError,
4957 "name '%.400s' is local and global",
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004958 name);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004959 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00004960 st->st_cur->ste_lineno);
4961 st->st_errors++;
4962 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00004963 }
4964 else {
4965 if (flags & DEF_LOCAL)
4966 sprintf(buf, GLOBAL_AFTER_ASSIGN,
4967 name);
4968 else
4969 sprintf(buf, GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00004970 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00004971 }
4972 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004973 symtable_add_def(st, name, DEF_GLOBAL);
4974 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004975}
4976
4977static void
4978symtable_list_comprehension(struct symtable *st, node *n)
4979{
4980 char tmpname[12];
4981
Tim Peters30814212001-02-17 05:30:26 +00004982 sprintf(tmpname, "_[%d]", ++st->st_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004983 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004984 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004985 symtable_node(st, CHILD(n, 3));
4986 if (NCH(n) == 5)
4987 symtable_node(st, CHILD(n, 4));
4988 --st->st_tmpname;
4989}
4990
4991static void
4992symtable_import(struct symtable *st, node *n)
4993{
4994 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004995 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004996 | 'from' dotted_name 'import'
4997 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00004998 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004999 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005000 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005001 node *dotname = CHILD(n, 1);
5002 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
5003 /* check for bogus imports */
5004 if (n->n_lineno >= st->st_future->ff_last_lineno) {
5005 PyErr_SetString(PyExc_SyntaxError,
5006 LATE_FUTURE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005007 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005008 n->n_lineno);
5009 st->st_errors++;
5010 return;
5011 }
5012 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005013 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005014 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005015 } else {
5016 for (i = 3; i < NCH(n); i += 2) {
5017 node *c = CHILD(n, i);
5018 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005019 symtable_assign(st, CHILD(c, 2),
5020 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005021 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005022 symtable_assign(st, CHILD(c, 0),
5023 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005024 }
5025 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005026 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005027 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005028 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005029 }
5030 }
5031}
5032
5033static void
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005034symtable_assign(struct symtable *st, node *n, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005035{
5036 node *tmp;
5037 int i;
5038
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005039 loop:
5040 switch (TYPE(n)) {
5041 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005042 /* invalid assignment, e.g. lambda x:x=2. The next
5043 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005044 return;
5045 case power:
5046 if (NCH(n) > 2) {
5047 for (i = 2; i < NCH(n); ++i)
5048 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
5049 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005050 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005051 if (NCH(n) > 1) {
5052 symtable_node(st, CHILD(n, 0));
5053 symtable_node(st, CHILD(n, 1));
5054 } else {
5055 n = CHILD(n, 0);
5056 goto loop;
5057 }
5058 return;
5059 case listmaker:
5060 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
5061 symtable_list_comprehension(st, CHILD(n, 1));
5062 else {
5063 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005064 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005065 }
5066 return;
5067 case exprlist:
5068 case testlist:
5069 if (NCH(n) == 1) {
5070 n = CHILD(n, 0);
5071 goto loop;
5072 }
5073 else {
5074 int i;
5075 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005076 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005077 return;
5078 }
5079 goto loop;
5080 case atom:
5081 tmp = CHILD(n, 0);
5082 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
5083 n = CHILD(n, 1);
5084 goto loop;
5085 } else if (TYPE(tmp) == NAME)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005086 symtable_add_def(st, STR(tmp), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005087 return;
5088 case dotted_as_name:
5089 if (NCH(n) == 3)
5090 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005091 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005092 else
5093 symtable_add_def(st,
5094 STR(CHILD(CHILD(n,
5095 0), 0)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005096 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005097 return;
5098 case dotted_name:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005099 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005100 return;
5101 case NAME:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005102 symtable_add_def(st, STR(n), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005103 return;
5104 default:
5105 if (NCH(n) == 0)
5106 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00005107 if (NCH(n) == 1) {
5108 n = CHILD(n, 0);
5109 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005110 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00005111 /* Should only occur for errors like x + 1 = 1,
5112 which will be caught in the next pass. */
5113 for (i = 0; i < NCH(n); ++i)
5114 if (TYPE(CHILD(n, i)) >= single_input)
5115 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005116 }
5117}