blob: c540d6b4e71a6993230c286e2865a22a59ee33ca [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002/* Compile an expression node to intermediate code */
3
Guido van Rossum3f5da241990-12-20 15:06:42 +00004/* XXX TO DO:
Guido van Rossum8b993a91997-01-17 21:04:03 +00005 XXX add __doc__ attribute == co_doc to code object attributes?
6 XXX (it's currently the first item of the co_const tuple)
Guido van Rossum3f5da241990-12-20 15:06:42 +00007 XXX Generate simple jump for break/return outside 'try...finally'
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00008 XXX Allow 'continue' inside finally clause of try-finally
Guido van Rossum8b993a91997-01-17 21:04:03 +00009 XXX New opcode for loading the initial index for a for loop
Guido van Rossum681d79a1995-07-18 14:51:37 +000010 XXX other JAR tricks?
Guido van Rossum3f5da241990-12-20 15:06:42 +000011*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +000012
Guido van Rossum79f25d91997-04-29 20:08:16 +000013#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000014
Guido van Rossum10dc2e81990-11-18 17:27:39 +000015#include "node.h"
16#include "token.h"
17#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000018#include "compile.h"
Jeremy Hylton4b38da62001-02-02 18:19:15 +000019#include "symtable.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000020#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000021#include "structmember.h"
22
23#include <ctype.h>
Guido van Rossum282914b1991-04-04 10:42:56 +000024
Guido van Rossumb05a5c71997-05-07 17:46:13 +000025/* Three symbols from graminit.h are also defined in Python.h, with
26 Py_ prefixes to their names. Python.h can't include graminit.h
27 (which defines too many confusing symbols), but we can check here
28 that they haven't changed (which is very unlikely, but possible). */
29#if Py_single_input != single_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000030 #error "single_input has changed -- update Py_single_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000031#endif
32#if Py_file_input != file_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000033 #error "file_input has changed -- update Py_file_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000034#endif
35#if Py_eval_input != eval_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000036 #error "eval_input has changed -- update Py_eval_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000037#endif
38
Guido van Rossum8e793d91997-03-03 19:13:14 +000039int Py_OptimizeFlag = 0;
40
Guido van Rossum8861b741996-07-30 16:49:37 +000041#define OP_DELETE 0
42#define OP_ASSIGN 1
43#define OP_APPLY 2
44
Jeremy Hyltone36f7782001-01-19 03:21:30 +000045#define VAR_LOAD 0
46#define VAR_STORE 1
47#define VAR_DELETE 2
48
Jeremy Hylton64949cb2001-01-25 20:06:59 +000049#define DEL_CLOSURE_ERROR \
Jeremy Hyltoneab156f2001-01-30 01:24:43 +000050"can not delete variable '%.400s' referenced in nested scope"
51
52#define DUPLICATE_ARGUMENT \
53"duplicate argument '%s' in function definition"
54
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000055#define ILLEGAL_DYNAMIC_SCOPE \
56"%.100s: exec or 'import *' makes names ambiguous in nested scope"
Jeremy Hyltoneab156f2001-01-30 01:24:43 +000057
Jeremy Hylton29906ee2001-02-27 04:23:34 +000058#define GLOBAL_AFTER_ASSIGN \
59"name '%.400s' is assigned to before global declaration"
60
61#define GLOBAL_AFTER_USE \
62"name '%.400s' is used prior to global declaration"
63
64#define LOCAL_GLOBAL \
65"name '%.400s' is a function paramter and declared global"
66
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +000067#define LATE_FUTURE \
68"from __future__ imports must occur at the beginning of the file"
69
Jeremy Hyltone36f7782001-01-19 03:21:30 +000070#define MANGLE_LEN 256
71
Guido van Rossum79f25d91997-04-29 20:08:16 +000072#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000073
74static struct memberlist code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000075 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
76 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000077 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000078 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000079 {"co_code", T_OBJECT, OFF(co_code), READONLY},
80 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
81 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000082 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Jeremy Hylton64949cb2001-01-25 20:06:59 +000083 {"co_freevars", T_OBJECT, OFF(co_freevars), READONLY},
84 {"co_cellvars", T_OBJECT, OFF(co_cellvars), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000085 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000086 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000087 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
88 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000089 {NULL} /* Sentinel */
90};
91
Guido van Rossum79f25d91997-04-29 20:08:16 +000092static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000093code_getattr(PyCodeObject *co, char *name)
Guido van Rossum3f5da241990-12-20 15:06:42 +000094{
Guido van Rossum79f25d91997-04-29 20:08:16 +000095 return PyMember_Get((char *)co, code_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +000096}
Guido van Rossum10dc2e81990-11-18 17:27:39 +000097
98static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000099code_dealloc(PyCodeObject *co)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000100{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000101 Py_XDECREF(co->co_code);
102 Py_XDECREF(co->co_consts);
103 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +0000104 Py_XDECREF(co->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000105 Py_XDECREF(co->co_freevars);
106 Py_XDECREF(co->co_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000107 Py_XDECREF(co->co_filename);
108 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +0000109 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000110 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000111}
112
Guido van Rossum79f25d91997-04-29 20:08:16 +0000113static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000114code_repr(PyCodeObject *co)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000115{
116 char buf[500];
117 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000118 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000119 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000120
Guido van Rossuma396a882000-04-07 01:21:36 +0000121 if (co->co_firstlineno != 0)
122 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000123 if (co->co_filename && PyString_Check(co->co_filename))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000124 filename = PyString_AS_STRING(co->co_filename);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000125 if (co->co_name && PyString_Check(co->co_name))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000126 name = PyString_AS_STRING(co->co_name);
Fred Drake615ae552000-06-30 16:20:13 +0000127 sprintf(buf, "<code object %.100s at %p, file \"%.300s\", line %d>",
128 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000129 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000130}
131
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000132static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000133code_compare(PyCodeObject *co, PyCodeObject *cp)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000134{
135 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000136 cmp = PyObject_Compare(co->co_name, cp->co_name);
137 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000138 cmp = co->co_argcount - cp->co_argcount;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000139 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000140 cmp = co->co_nlocals - cp->co_nlocals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000141 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000142 cmp = co->co_flags - cp->co_flags;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000143 if (cmp) return cmp;
Guido van Rossumd076c731998-10-07 19:42:25 +0000144 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000145 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000146 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000147 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000148 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000149 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000150 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000151 if (cmp) return cmp;
152 cmp = PyObject_Compare(co->co_freevars, cp->co_freevars);
153 if (cmp) return cmp;
154 cmp = PyObject_Compare(co->co_cellvars, cp->co_cellvars);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000155 return cmp;
156}
157
158static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000159code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000160{
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000161 long h, h0, h1, h2, h3, h4, h5, h6;
Guido van Rossum44679592000-04-10 16:20:31 +0000162 h0 = PyObject_Hash(co->co_name);
163 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000164 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000165 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000166 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000167 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000168 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000169 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000170 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000171 if (h4 == -1) return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000172 h5 = PyObject_Hash(co->co_freevars);
173 if (h5 == -1) return -1;
174 h6 = PyObject_Hash(co->co_cellvars);
175 if (h6 == -1) return -1;
176 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^ h5 ^ h6 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000177 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000178 if (h == -1) h = -2;
179 return h;
180}
181
Guido van Rossum79f25d91997-04-29 20:08:16 +0000182PyTypeObject PyCode_Type = {
183 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000184 0,
185 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000186 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000187 0,
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000188 (destructor)code_dealloc, /*tp_dealloc*/
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000189 0, /*tp_print*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000190 (getattrfunc)code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000191 0, /*tp_setattr*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000192 (cmpfunc)code_compare, /*tp_compare*/
193 (reprfunc)code_repr, /*tp_repr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000194 0, /*tp_as_number*/
195 0, /*tp_as_sequence*/
196 0, /*tp_as_mapping*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000197 (hashfunc)code_hash, /*tp_hash*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000198};
199
Guido van Rossum644a12b1997-04-09 19:24:53 +0000200#define NAME_CHARS \
201 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
202
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000203/* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
204
205static int
206all_name_chars(unsigned char *s)
207{
Guido van Rossumcd90c202001-02-09 15:06:42 +0000208 static char ok_name_char[256];
209 static unsigned char *name_chars = (unsigned char *)NAME_CHARS;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000210
Guido van Rossumcd90c202001-02-09 15:06:42 +0000211 if (ok_name_char[*name_chars] == 0) {
212 unsigned char *p;
213 for (p = name_chars; *p; p++)
214 ok_name_char[*p] = 1;
215 }
216 while (*s) {
217 if (ok_name_char[*s++] == 0)
218 return 0;
219 }
220 return 1;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000221}
222
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000223static int
224intern_strings(PyObject *tuple)
225{
226 int i;
227
228 for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) {
229 PyObject *v = PyTuple_GET_ITEM(tuple, i);
230 if (v == NULL || !PyString_Check(v)) {
231 Py_FatalError("non-string found in code slot");
232 PyErr_BadInternalCall();
233 return -1;
234 }
235 PyString_InternInPlace(&PyTuple_GET_ITEM(tuple, i));
236 }
237 return 0;
238}
239
Guido van Rossum79f25d91997-04-29 20:08:16 +0000240PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000241PyCode_New(int argcount, int nlocals, int stacksize, int flags,
242 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000243 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
244 PyObject *filename, PyObject *name, int firstlineno,
245 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000246{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000247 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000248 int i;
Guido van Rossumd076c731998-10-07 19:42:25 +0000249 PyBufferProcs *pb;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000250 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000251 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000252 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000253 consts == NULL || !PyTuple_Check(consts) ||
254 names == NULL || !PyTuple_Check(names) ||
255 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000256 freevars == NULL || !PyTuple_Check(freevars) ||
257 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000258 name == NULL || !PyString_Check(name) ||
259 filename == NULL || !PyString_Check(filename) ||
260 lnotab == NULL || !PyString_Check(lnotab)) {
261 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000262 return NULL;
263 }
Guido van Rossumd076c731998-10-07 19:42:25 +0000264 pb = code->ob_type->tp_as_buffer;
265 if (pb == NULL ||
266 pb->bf_getreadbuffer == NULL ||
267 pb->bf_getsegcount == NULL ||
268 (*pb->bf_getsegcount)(code, NULL) != 1)
269 {
270 PyErr_BadInternalCall();
271 return NULL;
272 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000273 intern_strings(names);
274 intern_strings(varnames);
275 if (freevars == NULL)
276 freevars = PyTuple_New(0);
277 intern_strings(freevars);
278 if (cellvars == NULL)
279 cellvars = PyTuple_New(0);
280 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000281 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000282 for (i = PyTuple_Size(consts); --i >= 0; ) {
283 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000284 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000285 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000286 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000287 continue;
288 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000289 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000290 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000291 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000292 co->co_argcount = argcount;
293 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000294 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000295 co->co_flags = flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000296 Py_INCREF(code);
Guido van Rossumd076c731998-10-07 19:42:25 +0000297 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000298 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000299 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000300 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000301 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000302 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000303 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000304 Py_INCREF(freevars);
305 co->co_freevars = freevars;
306 Py_INCREF(cellvars);
307 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000308 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000309 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000310 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000311 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000312 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000313 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000314 co->co_lnotab = lnotab;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000315/* PyObject_Print((PyObject *)co, stderr, 0); */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000316 }
317 return co;
318}
319
320
321/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000322
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000323/* The compiler uses two passes to generate bytecodes. The first pass
324 builds the symbol table. The second pass generates the bytecode.
325
326 The first pass uses a single symtable struct. The second pass uses
327 a compiling struct for each code block. The compiling structs
328 share a reference to the symtable.
329
330 The two passes communicate via symtable_load_symbols() and via
331 is_local() and is_global(). The former initializes several slots
332 in the compiling struct: c_varnames, c_locals, c_nlocals,
333 c_argcount, c_globals, and c_flags.
334*/
335
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000336struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000337 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000338 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000339 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000340 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000341 PyObject *c_name_dict; /* inverse of c_names */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000342 PyObject *c_globals; /* dictionary (value=None) */
343 PyObject *c_locals; /* dictionary (value=localID) */
344 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000345 PyObject *c_freevars; /* dictionary (value=None) */
346 PyObject *c_cellvars; /* list */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000347 int c_nlocals; /* index of next local */
348 int c_argcount; /* number of top-level arguments */
349 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000350 int c_nexti; /* index into c_code */
351 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000352 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000353 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000354 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000355 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000356 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000357 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000358 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000359 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000360 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000361 int c_stacklevel; /* Current stack level */
362 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000363 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000364 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000365 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000366 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000367 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000368 int c_nested; /* Is block nested funcdef or lamdef? */
369 int c_closure; /* Is nested w/freevars? */
370 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000371 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000372};
373
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000374int is_free(int v)
375{
376 if ((v & (USE | DEF_FREE))
377 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
378 return 1;
379 if (v & DEF_FREE_CLASS)
380 return 1;
381 return 0;
382}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000383
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000384/* com_fetch_program_text will attempt to load the line of text that
385 the exception refers to. If it fails, it will return NULL but will
386 not set an exception.
Guido van Rossum452a9831996-09-17 14:32:04 +0000387
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000388 XXX The functionality of this function is quite similar to the
389 functionality in tb_displayline() in traceback.c.
390*/
391
392static PyObject *
393fetch_program_text(char *filename, int lineno)
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000394{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000395 FILE *fp;
396 int i;
397 char linebuf[1000];
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000398
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000399 if (filename == NULL || lineno <= 0)
400 return NULL;
401 fp = fopen(filename, "r");
402 if (fp == NULL)
403 return NULL;
404 for (i = 0; i < lineno; i++) {
405 char *pLastChar = &linebuf[sizeof(linebuf) - 2];
406 do {
407 *pLastChar = '\0';
408 if (fgets(linebuf, sizeof linebuf, fp) == NULL)
409 break;
410 /* fgets read *something*; if it didn't get as
411 far as pLastChar, it must have found a newline
412 or hit the end of the file; if pLastChar is \n,
413 it obviously found a newline; else we haven't
414 yet seen a newline, so must continue */
415 } while (*pLastChar != '\0' && *pLastChar != '\n');
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000416 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000417 fclose(fp);
418 if (i == lineno) {
419 char *p = linebuf;
420 while (*p == ' ' || *p == '\t' || *p == '\014')
421 p++;
422 return PyString_FromString(p);
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000423 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000424 return NULL;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000425}
426
427static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000428com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000429{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000430 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
431
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000432 if (c == NULL) {
433 /* Error occurred via symtable call to
434 is_constant_false */
435 PyErr_SetString(exc, msg);
436 return;
437 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000438 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000439 if (c->c_lineno < 1 || c->c_interactive) {
440 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000441 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000442 return;
443 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000444 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000445 if (v == NULL)
446 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000447
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000448 line = fetch_program_text(c->c_filename, c->c_lineno);
449 if (line == NULL) {
450 Py_INCREF(Py_None);
451 line = Py_None;
452 }
453 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
454 Py_None, line);
455 if (t == NULL)
456 goto exit;
457 w = Py_BuildValue("(OO)", v, t);
458 if (w == NULL)
459 goto exit;
460 PyErr_SetObject(exc, w);
461 exit:
462 Py_XDECREF(t);
463 Py_XDECREF(v);
464 Py_XDECREF(w);
465 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000466}
467
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000468/* Interface to the block stack */
469
470static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000471block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000472{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000473 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000474 com_error(c, PyExc_SystemError,
475 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000476 }
477 else {
478 c->c_block[c->c_nblocks++] = type;
479 }
480}
481
482static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000483block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000484{
485 if (c->c_nblocks > 0)
486 c->c_nblocks--;
487 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000488 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000489 }
490}
491
Guido van Rossum681d79a1995-07-18 14:51:37 +0000492/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000493
Tim Petersdbd9ba62000-07-09 03:09:57 +0000494static int com_init(struct compiling *, char *);
495static void com_free(struct compiling *);
496static void com_push(struct compiling *, int);
497static void com_pop(struct compiling *, int);
498static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000499static void com_node(struct compiling *, node *);
500static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000501static void com_addbyte(struct compiling *, int);
502static void com_addint(struct compiling *, int);
503static void com_addoparg(struct compiling *, int, int);
504static void com_addfwref(struct compiling *, int, int *);
505static void com_backpatch(struct compiling *, int);
506static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
507static int com_addconst(struct compiling *, PyObject *);
508static int com_addname(struct compiling *, PyObject *);
509static void com_addopname(struct compiling *, int, node *);
510static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000511static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000512static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000513static void com_assign(struct compiling *, node *, int, node *);
514static void com_assign_name(struct compiling *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000515static PyCodeObject *icompile(node *, struct compiling *);
516static PyCodeObject *jcompile(node *, char *, struct compiling *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000517static PyObject *parsestrplus(node *);
518static PyObject *parsestr(char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000519static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000520
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000521static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000522
523/* symtable operations */
524static int symtable_build(struct compiling *, node *);
525static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000526static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000527static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000528static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000529static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000530static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000531
532static void symtable_node(struct symtable *, node *);
533static void symtable_funcdef(struct symtable *, node *);
534static void symtable_default_args(struct symtable *, node *);
535static void symtable_params(struct symtable *, node *);
536static void symtable_params_fplist(struct symtable *, node *n);
537static void symtable_global(struct symtable *, node *);
538static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000539static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000540static void symtable_list_comprehension(struct symtable *, node *);
541
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000542static int symtable_update_free_vars(struct symtable *);
543static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
544static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
545
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000546/* helper */
547static void
548do_pad(int pad)
549{
550 int i;
551 for (i = 0; i < pad; ++i)
552 fprintf(stderr, " ");
553}
554
555static void
556dump(node *n, int pad, int depth)
557{
558 int i;
559 if (depth == 0)
560 return;
561 do_pad(pad);
562 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
563 if (depth > 0)
564 depth--;
565 for (i = 0; i < NCH(n); ++i)
566 dump(CHILD(n, i), pad + 1, depth);
567}
568
569#define DUMP(N) dump(N, 0, -1)
570
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000571static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000572com_init(struct compiling *c, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000573{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000574 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000575 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
576 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000577 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000578 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000579 goto fail;
580 if ((c->c_const_dict = PyDict_New()) == NULL)
581 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000582 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000583 goto fail;
584 if ((c->c_name_dict = PyDict_New()) == NULL)
585 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000586 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000587 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000588 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
589 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000590 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000591 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000592 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000593 c->c_freevars = NULL;
594 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000595 c->c_nlocals = 0;
596 c->c_argcount = 0;
597 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000598 c->c_nexti = 0;
599 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000600 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000601 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000602 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000603 c->c_begin = 0;
604 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000605 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000606 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000607 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000608 c->c_stacklevel = 0;
609 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000610 c->c_firstlineno = 0;
611 c->c_last_addr = 0;
612 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000613 c->c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000614 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000615 c->c_nested = 0;
616 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000617 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000618 return 1;
619
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000620 fail:
621 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000622 return 0;
623}
624
625static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000626com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000627{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000628 Py_XDECREF(c->c_code);
629 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000630 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000631 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000632 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000633 Py_XDECREF(c->c_globals);
634 Py_XDECREF(c->c_locals);
635 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000636 Py_XDECREF(c->c_freevars);
637 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000638 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +0000639 if (c->c_future)
640 PyMem_Free((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000641}
642
643static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000644com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000645{
646 c->c_stacklevel += n;
647 if (c->c_stacklevel > c->c_maxstacklevel)
648 c->c_maxstacklevel = c->c_stacklevel;
649}
650
651static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000652com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000653{
654 if (c->c_stacklevel < n) {
Guido van Rossum90f827c1998-08-25 18:22:17 +0000655 /* fprintf(stderr,
Guido van Rossum8b993a91997-01-17 21:04:03 +0000656 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
657 c->c_filename, c->c_lineno,
Guido van Rossum90f827c1998-08-25 18:22:17 +0000658 c->c_nexti, c->c_stacklevel, n); */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000659 c->c_stacklevel = 0;
660 }
661 else
662 c->c_stacklevel -= n;
663}
664
665static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000666com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000667{
668 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000669 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000670 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000671 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000672}
673
674static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000675com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000676{
677 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000678 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000679 assert(byte >= 0 && byte <= 255);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000680 if (byte < 0 || byte > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000681 com_error(c, PyExc_SystemError,
682 "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000683 }
684 if (c->c_code == NULL)
685 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000686 len = PyString_Size(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000687 if (c->c_nexti >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000688 if (_PyString_Resize(&c->c_code, len+1000) != 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000689 c->c_errors++;
690 return;
691 }
692 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000693 PyString_AsString(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000694}
695
696static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000697com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000698{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000699 com_addbyte(c, x & 0xff);
700 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000701}
702
703static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000704com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000705{
706 int size;
707 char *p;
708 if (c->c_lnotab == NULL)
709 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000710 size = PyString_Size(c->c_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000711 if (c->c_lnotab_next+2 > size) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000712 if (_PyString_Resize(&c->c_lnotab, size + 1000) < 0) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000713 c->c_errors++;
714 return;
715 }
716 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000717 p = PyString_AsString(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000718 *p++ = addr;
719 *p++ = line;
720 c->c_lnotab_next += 2;
721}
722
723static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000724com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000725{
726 c->c_lineno = lineno;
727 if (c->c_firstlineno == 0) {
728 c->c_firstlineno = c->c_last_line = lineno;
729 }
730 else {
731 int incr_addr = c->c_nexti - c->c_last_addr;
732 int incr_line = lineno - c->c_last_line;
733 while (incr_addr > 0 || incr_line > 0) {
734 int trunc_addr = incr_addr;
735 int trunc_line = incr_line;
736 if (trunc_addr > 255)
737 trunc_addr = 255;
738 if (trunc_line > 255)
739 trunc_line = 255;
740 com_add_lnotab(c, trunc_addr, trunc_line);
741 incr_addr -= trunc_addr;
742 incr_line -= trunc_line;
743 }
744 c->c_last_addr = c->c_nexti;
745 c->c_last_line = lineno;
746 }
747}
748
749static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000750com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000751{
Fred Drakeef8ace32000-08-24 00:32:09 +0000752 int extended_arg = arg >> 16;
Guido van Rossum8e793d91997-03-03 19:13:14 +0000753 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000754 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000755 if (Py_OptimizeFlag)
756 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000757 }
Fred Drakeef8ace32000-08-24 00:32:09 +0000758 if (extended_arg){
759 com_addbyte(c, EXTENDED_ARG);
760 com_addint(c, extended_arg);
761 arg &= 0xffff;
762 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000763 com_addbyte(c, op);
764 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000765}
766
767static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000768com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000769{
770 /* Compile a forward reference for backpatching */
771 int here;
772 int anchor;
773 com_addbyte(c, op);
774 here = c->c_nexti;
775 anchor = *p_anchor;
776 *p_anchor = here;
777 com_addint(c, anchor == 0 ? 0 : here - anchor);
778}
779
780static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000781com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000782{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000783 unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000784 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000785 int dist;
786 int prev;
787 for (;;) {
788 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000789 prev = code[anchor] + (code[anchor+1] << 8);
790 dist = target - (anchor+2);
791 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +0000792 dist >>= 8;
793 code[anchor+1] = dist;
794 dist >>= 8;
795 if (dist) {
796 com_error(c, PyExc_SystemError,
797 "com_backpatch: offset too large");
798 break;
799 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000800 if (!prev)
801 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000802 anchor -= prev;
803 }
804}
805
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000806/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000807
808static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000809com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000810{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000811 PyObject *w, *t, *np=NULL;
812 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000813
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000814 t = Py_BuildValue("(OO)", v, v->ob_type);
815 if (t == NULL)
816 goto fail;
817 w = PyDict_GetItem(dict, t);
818 if (w != NULL) {
819 n = PyInt_AsLong(w);
820 } else {
821 n = PyList_Size(list);
822 np = PyInt_FromLong(n);
823 if (np == NULL)
824 goto fail;
825 if (PyList_Append(list, v) != 0)
826 goto fail;
827 if (PyDict_SetItem(dict, t, np) != 0)
828 goto fail;
829 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000830 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000831 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000832 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000833 fail:
834 Py_XDECREF(np);
835 Py_XDECREF(t);
836 c->c_errors++;
837 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000838}
839
840static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000841com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000842{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000843 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000844}
845
846static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000847com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000848{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000849 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000850}
851
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000852static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000853mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000854{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000855 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000856 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +0000857 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000858 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
859 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000860 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000861 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000862 return 0; /* Don't mangle __extremely_long_names */
863 if (name[nlen-1] == '_' && name[nlen-2] == '_')
864 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000865 /* Strip leading underscores from class name */
866 while (*p == '_')
867 p++;
868 if (*p == '\0')
869 return 0; /* Don't mangle if class is just underscores */
870 plen = strlen(p);
871 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000872 plen = maxlen-nlen-2; /* Truncate class name if too long */
873 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000874 buffer[0] = '_';
875 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000876 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000877 return 1;
878}
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000879
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000880static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000881com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000882{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000883 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000884 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000885 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000886
887 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000888 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000889 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000890 c->c_errors++;
891 i = 255;
892 }
893 else {
894 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000895 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000896 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000897 com_addoparg(c, op, i);
898}
899
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000900#define NAME_LOCAL 0
901#define NAME_GLOBAL 1
902#define NAME_DEFAULT 2
903#define NAME_CLOSURE 3
904
905static int
906com_lookup_arg(PyObject *dict, PyObject *name)
907{
908 PyObject *v = PyDict_GetItem(dict, name);
909 if (v == NULL)
910 return -1;
911 else
912 return PyInt_AS_LONG(v);
913}
914
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000915static void
916com_addop_varname(struct compiling *c, int kind, char *name)
917{
918 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000919 int i, reftype;
920 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000921 int op = STOP_CODE;
922 char buffer[MANGLE_LEN];
923
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000924 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000925 name = buffer;
926 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
927 c->c_errors++;
928 i = 255;
929 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000930 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000931
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000932 reftype = get_ref_type(c, name);
933 switch (reftype) {
934 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000935 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000936 scope = NAME_LOCAL;
937 break;
938 case GLOBAL_EXPLICIT:
939 scope = NAME_GLOBAL;
940 break;
941 case GLOBAL_IMPLICIT:
942 if (c->c_flags & CO_OPTIMIZED)
943 scope = NAME_GLOBAL;
944 break;
945 case FREE:
946 case CELL:
947 scope = NAME_CLOSURE;
948 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000949 }
950
951 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000952 if (scope == NAME_LOCAL)
953 i = com_lookup_arg(c->c_locals, v);
954 else if (reftype == FREE)
955 i = com_lookup_arg(c->c_freevars, v);
956 else if (reftype == CELL)
957 i = com_lookup_arg(c->c_cellvars, v);
958 if (i == -1) {
959 c->c_errors++; /* XXX no exception set */
960 i = 255;
961 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000962 }
963 Py_DECREF(v);
964
965 switch (kind) {
966 case VAR_LOAD:
967 switch (scope) {
968 case NAME_LOCAL:
969 op = LOAD_FAST;
970 break;
971 case NAME_GLOBAL:
972 op = LOAD_GLOBAL;
973 break;
974 case NAME_DEFAULT:
975 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000976 break;
977 case NAME_CLOSURE:
978 op = LOAD_DEREF;
979 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000980 }
981 break;
982 case VAR_STORE:
983 switch (scope) {
984 case NAME_LOCAL:
985 op = STORE_FAST;
986 break;
987 case NAME_GLOBAL:
988 op = STORE_GLOBAL;
989 break;
990 case NAME_DEFAULT:
991 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000992 break;
993 case NAME_CLOSURE:
994 op = STORE_DEREF;
995 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000996 }
997 break;
998 case VAR_DELETE:
999 switch (scope) {
1000 case NAME_LOCAL:
1001 op = DELETE_FAST;
1002 break;
1003 case NAME_GLOBAL:
1004 op = DELETE_GLOBAL;
1005 break;
1006 case NAME_DEFAULT:
1007 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001008 break;
1009 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001010 char buf[500];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001011 sprintf(buf, DEL_CLOSURE_ERROR, name);
1012 com_error(c, PyExc_SyntaxError, buf);
1013 i = 255;
1014 break;
1015 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001016 }
1017 break;
1018 }
1019done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001020 com_addoparg(c, op, i);
1021}
1022
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001023static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001024com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001025{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001026 char *name;
1027 char buffer[1000];
1028 /* XXX it is possible to write this code without the 1000
1029 chars on the total length of dotted names, I just can't be
1030 bothered right now */
1031 if (TYPE(n) == STAR)
1032 name = "*";
1033 else if (TYPE(n) == dotted_name) {
1034 char *p = buffer;
1035 int i;
1036 name = buffer;
1037 for (i = 0; i < NCH(n); i += 2) {
1038 char *s = STR(CHILD(n, i));
1039 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001040 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001041 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001042 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001043 break;
1044 }
1045 if (p != buffer)
1046 *p++ = '.';
1047 strcpy(p, s);
1048 p = strchr(p, '\0');
1049 }
1050 }
1051 else {
1052 REQ(n, NAME);
1053 name = STR(n);
1054 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001055 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001056}
1057
Guido van Rossum79f25d91997-04-29 20:08:16 +00001058static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001059parsenumber(struct compiling *co, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001060{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001061 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001062 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001063 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001064#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +00001065 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +00001066 int imflag;
1067#endif
1068
Guido van Rossum282914b1991-04-04 10:42:56 +00001069 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001070 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001071#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001072 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001073#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001074 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001075 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001076 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001077 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001078 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001079 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001080 if (*end == '\0') {
1081 if (errno != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001082 com_error(co, PyExc_OverflowError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001083 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +00001084 return NULL;
1085 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001086 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001087 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001088 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001089#ifndef WITHOUT_COMPLEX
1090 if (imflag) {
1091 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001092 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +00001093 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001094 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001095 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +00001096 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001097 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001098#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001099 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001100 PyFPE_START_PROTECT("atof", return 0)
1101 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001102 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001103 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001104 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001105}
1106
Guido van Rossum79f25d91997-04-29 20:08:16 +00001107static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001108parsestr(char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001109{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001110 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001111 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001112 char *buf;
1113 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001114 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001115 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001116 int first = *s;
1117 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001118 int rawmode = 0;
1119 int unicode = 0;
1120 if (isalpha(quote) || quote == '_') {
1121 if (quote == 'u' || quote == 'U') {
1122 quote = *++s;
1123 unicode = 1;
1124 }
1125 if (quote == 'r' || quote == 'R') {
1126 quote = *++s;
1127 rawmode = 1;
1128 }
1129 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001130 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001131 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001132 return NULL;
1133 }
1134 s++;
1135 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001136 if (len > INT_MAX) {
1137 PyErr_SetString(PyExc_OverflowError, "string to parse is too long");
1138 return NULL;
1139 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001140 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001141 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001142 return NULL;
1143 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001144 if (len >= 4 && s[0] == quote && s[1] == quote) {
1145 s += 2;
1146 len -= 2;
1147 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001148 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001149 return NULL;
1150 }
1151 }
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001152 if (unicode || Py_UnicodeFlag) {
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001153 if (rawmode)
1154 return PyUnicode_DecodeRawUnicodeEscape(
1155 s, len, NULL);
1156 else
1157 return PyUnicode_DecodeUnicodeEscape(
1158 s, len, NULL);
1159 }
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001160 if (rawmode || strchr(s, '\\') == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001161 return PyString_FromStringAndSize(s, len);
1162 v = PyString_FromStringAndSize((char *)NULL, len);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001163 if (v == NULL)
1164 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001165 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001166 end = s + len;
1167 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001168 if (*s != '\\') {
1169 *p++ = *s++;
1170 continue;
1171 }
1172 s++;
1173 switch (*s++) {
1174 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001175 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001176 case '\\': *p++ = '\\'; break;
1177 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +00001178 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001179 case 'b': *p++ = '\b'; break;
1180 case 'f': *p++ = '\014'; break; /* FF */
1181 case 't': *p++ = '\t'; break;
1182 case 'n': *p++ = '\n'; break;
1183 case 'r': *p++ = '\r'; break;
1184 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001185 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
1186 case '0': case '1': case '2': case '3':
1187 case '4': case '5': case '6': case '7':
1188 c = s[-1] - '0';
1189 if ('0' <= *s && *s <= '7') {
1190 c = (c<<3) + *s++ - '0';
1191 if ('0' <= *s && *s <= '7')
1192 c = (c<<3) + *s++ - '0';
1193 }
1194 *p++ = c;
1195 break;
1196 case 'x':
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001197 if (isxdigit(Py_CHARMASK(s[0])) && isxdigit(Py_CHARMASK(s[1]))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +00001198 unsigned int x = 0;
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001199 c = Py_CHARMASK(*s);
1200 s++;
1201 if (isdigit(c))
1202 x = c - '0';
1203 else if (islower(c))
1204 x = 10 + c - 'a';
1205 else
1206 x = 10 + c - 'A';
1207 x = x << 4;
1208 c = Py_CHARMASK(*s);
1209 s++;
1210 if (isdigit(c))
1211 x += c - '0';
1212 else if (islower(c))
1213 x += 10 + c - 'a';
1214 else
1215 x += 10 + c - 'A';
Guido van Rossumed1100f1997-10-20 23:24:07 +00001216 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001217 break;
1218 }
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001219 PyErr_SetString(PyExc_ValueError, "invalid \\x escape");
1220 Py_DECREF(v);
1221 return NULL;
1222 default:
1223 *p++ = '\\';
1224 *p++ = s[-1];
1225 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001226 }
1227 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001228 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001229 return v;
1230}
1231
Guido van Rossum79f25d91997-04-29 20:08:16 +00001232static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001233parsestrplus(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001234{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001235 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001236 int i;
1237 REQ(CHILD(n, 0), STRING);
1238 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
1239 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001240 for (i = 1; i < NCH(n); i++) {
1241 PyObject *s;
1242 s = parsestr(STR(CHILD(n, i)));
1243 if (s == NULL)
1244 goto onError;
1245 if (PyString_Check(v) && PyString_Check(s)) {
1246 PyString_ConcatAndDel(&v, s);
1247 if (v == NULL)
1248 goto onError;
1249 }
1250 else {
1251 PyObject *temp;
1252 temp = PyUnicode_Concat(v, s);
1253 Py_DECREF(s);
1254 if (temp == NULL)
1255 goto onError;
1256 Py_DECREF(v);
1257 v = temp;
1258 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001259 }
1260 }
1261 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001262
1263 onError:
1264 Py_XDECREF(v);
1265 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001266}
1267
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001268static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001269com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001270{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001271 PyObject *v;
1272 int anchor = 0;
1273 int save_begin = c->c_begin;
1274
1275 /* list_iter: for v in expr [list_iter] */
1276 com_node(c, CHILD(n, 3)); /* expr */
1277 v = PyInt_FromLong(0L);
1278 if (v == NULL)
1279 c->c_errors++;
1280 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
1281 com_push(c, 1);
1282 Py_XDECREF(v);
1283 c->c_begin = c->c_nexti;
1284 com_addoparg(c, SET_LINENO, n->n_lineno);
1285 com_addfwref(c, FOR_LOOP, &anchor);
1286 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001287 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001288 c->c_loops++;
1289 com_list_iter(c, n, e, t);
1290 c->c_loops--;
1291 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1292 c->c_begin = save_begin;
1293 com_backpatch(c, anchor);
1294 com_pop(c, 2); /* FOR_LOOP has popped these */
1295}
1296
1297static void
1298com_list_if(struct compiling *c, node *n, node *e, char *t)
1299{
1300 int anchor = 0;
1301 int a = 0;
1302 /* list_iter: 'if' test [list_iter] */
1303 com_addoparg(c, SET_LINENO, n->n_lineno);
1304 com_node(c, CHILD(n, 1));
1305 com_addfwref(c, JUMP_IF_FALSE, &a);
1306 com_addbyte(c, POP_TOP);
1307 com_pop(c, 1);
1308 com_list_iter(c, n, e, t);
1309 com_addfwref(c, JUMP_FORWARD, &anchor);
1310 com_backpatch(c, a);
1311 /* We jump here with an extra entry which we now pop */
1312 com_addbyte(c, POP_TOP);
1313 com_backpatch(c, anchor);
1314}
1315
1316static void
1317com_list_iter(struct compiling *c,
1318 node *p, /* parent of list_iter node */
1319 node *e, /* element expression node */
1320 char *t /* name of result list temp local */)
1321{
1322 /* list_iter is the last child in a listmaker, list_for, or list_if */
1323 node *n = CHILD(p, NCH(p)-1);
1324 if (TYPE(n) == list_iter) {
1325 n = CHILD(n, 0);
1326 switch (TYPE(n)) {
1327 case list_for:
1328 com_list_for(c, n, e, t);
1329 break;
1330 case list_if:
1331 com_list_if(c, n, e, t);
1332 break;
1333 default:
1334 com_error(c, PyExc_SystemError,
1335 "invalid list_iter node type");
1336 }
1337 }
1338 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001339 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001340 com_push(c, 1);
1341 com_node(c, e);
1342 com_addoparg(c, CALL_FUNCTION, 1);
1343 com_addbyte(c, POP_TOP);
1344 com_pop(c, 2);
1345 }
1346}
1347
1348static void
1349com_list_comprehension(struct compiling *c, node *n)
1350{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001351 /* listmaker: test list_for */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001352 char tmpname[12];
Tim Peters30814212001-02-17 05:30:26 +00001353 sprintf(tmpname, "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001354 com_addoparg(c, BUILD_LIST, 0);
1355 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1356 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001357 com_addop_name(c, LOAD_ATTR, "append");
1358 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001359 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001360 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001361 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001362 --c->c_tmpname;
1363}
1364
1365static void
1366com_listmaker(struct compiling *c, node *n)
1367{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001368 /* listmaker: test ( list_for | (',' test)* [','] ) */
1369 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001370 com_list_comprehension(c, n);
1371 else {
1372 int len = 0;
1373 int i;
1374 for (i = 0; i < NCH(n); i += 2, len++)
1375 com_node(c, CHILD(n, i));
1376 com_addoparg(c, BUILD_LIST, len);
1377 com_pop(c, len-1);
1378 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001379}
1380
1381static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001382com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001383{
1384 int i;
1385 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1386 for (i = 0; i+2 < NCH(n); i += 4) {
1387 /* We must arrange things just right for STORE_SUBSCR.
1388 It wants the stack to look like (value) (dict) (key) */
1389 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001390 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001391 com_node(c, CHILD(n, i+2)); /* value */
1392 com_addbyte(c, ROT_TWO);
1393 com_node(c, CHILD(n, i)); /* key */
1394 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001395 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001396 }
1397}
1398
1399static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001400com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001401{
1402 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001403 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001404 int i;
1405 REQ(n, atom);
1406 ch = CHILD(n, 0);
1407 switch (TYPE(ch)) {
1408 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001409 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001410 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001411 com_push(c, 1);
1412 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001413 else
1414 com_node(c, CHILD(n, 1));
1415 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001416 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001417 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001418 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001419 com_push(c, 1);
1420 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001421 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001422 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001423 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001424 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001425 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001426 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001427 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001428 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001429 break;
1430 case BACKQUOTE:
1431 com_node(c, CHILD(n, 1));
1432 com_addbyte(c, UNARY_CONVERT);
1433 break;
1434 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001435 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001436 i = 255;
1437 }
1438 else {
1439 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001440 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001441 }
1442 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001443 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001444 break;
1445 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001446 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001447 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001448 c->c_errors++;
1449 i = 255;
1450 }
1451 else {
1452 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001453 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001454 }
1455 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001456 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001457 break;
1458 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001459 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001460 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001461 break;
1462 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001463 com_error(c, PyExc_SystemError,
1464 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001465 }
1466}
1467
1468static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001469com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001470{
1471 if (NCH(n) == 1) {
1472 com_addbyte(c, op);
1473 }
1474 else if (NCH(n) == 2) {
1475 if (TYPE(CHILD(n, 0)) != COLON) {
1476 com_node(c, CHILD(n, 0));
1477 com_addbyte(c, op+1);
1478 }
1479 else {
1480 com_node(c, CHILD(n, 1));
1481 com_addbyte(c, op+2);
1482 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001483 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001484 }
1485 else {
1486 com_node(c, CHILD(n, 0));
1487 com_node(c, CHILD(n, 2));
1488 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001489 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001490 }
1491}
1492
Guido van Rossum635abd21997-01-06 22:56:52 +00001493static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001494com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1495{
1496 if (NCH(n) == 1) {
1497 com_addbyte(c, DUP_TOP);
1498 com_push(c, 1);
1499 com_addbyte(c, SLICE);
1500 com_node(c, augn);
1501 com_addbyte(c, opcode);
1502 com_pop(c, 1);
1503 com_addbyte(c, ROT_TWO);
1504 com_addbyte(c, STORE_SLICE);
1505 com_pop(c, 2);
1506 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1507 com_node(c, CHILD(n, 0));
1508 com_addoparg(c, DUP_TOPX, 2);
1509 com_push(c, 2);
1510 com_addbyte(c, SLICE+1);
1511 com_pop(c, 1);
1512 com_node(c, augn);
1513 com_addbyte(c, opcode);
1514 com_pop(c, 1);
1515 com_addbyte(c, ROT_THREE);
1516 com_addbyte(c, STORE_SLICE+1);
1517 com_pop(c, 3);
1518 } else if (NCH(n) == 2) {
1519 com_node(c, CHILD(n, 1));
1520 com_addoparg(c, DUP_TOPX, 2);
1521 com_push(c, 2);
1522 com_addbyte(c, SLICE+2);
1523 com_pop(c, 1);
1524 com_node(c, augn);
1525 com_addbyte(c, opcode);
1526 com_pop(c, 1);
1527 com_addbyte(c, ROT_THREE);
1528 com_addbyte(c, STORE_SLICE+2);
1529 com_pop(c, 3);
1530 } else {
1531 com_node(c, CHILD(n, 0));
1532 com_node(c, CHILD(n, 2));
1533 com_addoparg(c, DUP_TOPX, 3);
1534 com_push(c, 3);
1535 com_addbyte(c, SLICE+3);
1536 com_pop(c, 2);
1537 com_node(c, augn);
1538 com_addbyte(c, opcode);
1539 com_pop(c, 1);
1540 com_addbyte(c, ROT_FOUR);
1541 com_addbyte(c, STORE_SLICE+3);
1542 com_pop(c, 4);
1543 }
1544}
1545
1546static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001547com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001548{
1549 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001550 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001551 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001552 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001553 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001554 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001555 }
1556 else {
1557 com_node(c, CHILD(n, 0));
1558 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001559 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001560 }
1561 m = n;
1562 do {
1563 m = CHILD(m, 0);
1564 } while (NCH(m) == 1);
1565 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00001566 /* f(lambda x: x[0] = 3) ends up getting parsed with
1567 * LHS test = lambda x: x[0], and RHS test = 3.
1568 * SF bug 132313 points out that complaining about a keyword
1569 * then is very confusing.
1570 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001571 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00001572 TYPE(m) == lambdef ?
1573 "lambda cannot contain assignment" :
1574 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001575 }
1576 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001577 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001578 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001579 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001580 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001581 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001582 else if (*pkeywords == NULL) {
1583 c->c_errors++;
1584 Py_DECREF(v);
1585 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001586 if (PyDict_GetItem(*pkeywords, v) != NULL)
1587 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001588 "duplicate keyword argument");
1589 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001590 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001591 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001592 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001593 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001594 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001595 }
1596 }
1597 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001598}
1599
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001600static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001601com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001602{
1603 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001604 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001605 }
1606 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001607 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001608 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001609 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001610 int star_flag = 0;
1611 int starstar_flag = 0;
1612 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001613 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001614 na = 0;
1615 nk = 0;
1616 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001617 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001618 if (TYPE(ch) == STAR ||
1619 TYPE(ch) == DOUBLESTAR)
1620 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001621 if (ch->n_lineno != lineno) {
1622 lineno = ch->n_lineno;
1623 com_addoparg(c, SET_LINENO, lineno);
1624 }
1625 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001626 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001627 na++;
1628 else
1629 nk++;
1630 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001631 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001632 while (i < NCH(n)) {
1633 node *tok = CHILD(n, i);
1634 node *ch = CHILD(n, i+1);
1635 i += 3;
1636 switch (TYPE(tok)) {
1637 case STAR: star_flag = 1; break;
1638 case DOUBLESTAR: starstar_flag = 1; break;
1639 }
1640 com_node(c, ch);
1641 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001642 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001643 com_error(c, PyExc_SyntaxError,
1644 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001645 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001646 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001647 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001648 star_flag + (starstar_flag << 1);
1649 else
1650 opcode = CALL_FUNCTION;
1651 com_addoparg(c, opcode, na | (nk << 8));
1652 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001653 }
1654}
1655
1656static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001657com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001658{
1659 com_addopname(c, LOAD_ATTR, n);
1660}
1661
1662static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001663com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001664{
1665 int i=0;
1666 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001667 node *ch;
1668
1669 /* first argument */
1670 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001671 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001672 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001673 i++;
1674 }
1675 else {
1676 com_node(c, CHILD(n,i));
1677 i++;
1678 REQ(CHILD(n,i),COLON);
1679 i++;
1680 }
1681 /* second argument */
1682 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1683 com_node(c, CHILD(n,i));
1684 i++;
1685 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001686 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001687 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001688 com_push(c, 1);
1689 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001690 /* remaining arguments */
1691 for (; i < NCH(n); i++) {
1692 ns++;
1693 ch=CHILD(n,i);
1694 REQ(ch, sliceop);
1695 if (NCH(ch) == 1) {
1696 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001697 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001698 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001699 }
1700 else
1701 com_node(c, CHILD(ch,1));
1702 }
1703 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001704 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001705}
1706
1707static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001708com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001709{
1710 node *ch;
1711 REQ(n, subscript);
1712 ch = CHILD(n,0);
1713 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001714 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001715 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001716 com_push(c, 1);
1717 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001718 else {
1719 /* check for slice */
1720 if ((TYPE(ch) == COLON || NCH(n) > 1))
1721 com_sliceobj(c, n);
1722 else {
1723 REQ(ch, test);
1724 com_node(c, ch);
1725 }
1726 }
1727}
1728
1729static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001730com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001731{
1732 int i, op;
1733 REQ(n, subscriptlist);
1734 /* Check to make backward compatible slice behavior for '[i:j]' */
1735 if (NCH(n) == 1) {
1736 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001737 /* 'Basic' slice, should have exactly one colon. */
1738 if ((TYPE(CHILD(sub, 0)) == COLON
1739 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1740 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1741 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001742 switch (assigning) {
1743 case OP_DELETE:
1744 op = DELETE_SLICE;
1745 break;
1746 case OP_ASSIGN:
1747 op = STORE_SLICE;
1748 break;
1749 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001750 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001751 break;
1752 default:
1753 com_augassign_slice(c, sub, assigning, augn);
1754 return;
1755 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001756 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001757 if (op == STORE_SLICE)
1758 com_pop(c, 2);
1759 else if (op == DELETE_SLICE)
1760 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001761 return;
1762 }
1763 }
1764 /* Else normal subscriptlist. Compile each subscript. */
1765 for (i = 0; i < NCH(n); i += 2)
1766 com_subscript(c, CHILD(n, i));
1767 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001768 if (NCH(n) > 1) {
1769 i = (NCH(n)+1) / 2;
1770 com_addoparg(c, BUILD_TUPLE, i);
1771 com_pop(c, i-1);
1772 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001773 switch (assigning) {
1774 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001775 op = DELETE_SUBSCR;
1776 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00001777 break;
1778 default:
1779 case OP_ASSIGN:
1780 op = STORE_SUBSCR;
1781 i = 3;
1782 break;
1783 case OP_APPLY:
1784 op = BINARY_SUBSCR;
1785 i = 1;
1786 break;
1787 }
1788 if (assigning > OP_APPLY) {
1789 com_addoparg(c, DUP_TOPX, 2);
1790 com_push(c, 2);
1791 com_addbyte(c, BINARY_SUBSCR);
1792 com_pop(c, 1);
1793 com_node(c, augn);
1794 com_addbyte(c, assigning);
1795 com_pop(c, 1);
1796 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001797 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001798 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001799 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001800}
1801
1802static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001803com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001804{
1805 REQ(n, trailer);
1806 switch (TYPE(CHILD(n, 0))) {
1807 case LPAR:
1808 com_call_function(c, CHILD(n, 1));
1809 break;
1810 case DOT:
1811 com_select_member(c, CHILD(n, 1));
1812 break;
1813 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00001814 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001815 break;
1816 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001817 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001818 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001819 }
1820}
1821
1822static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001823com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001824{
1825 int i;
1826 REQ(n, power);
1827 com_atom(c, CHILD(n, 0));
1828 for (i = 1; i < NCH(n); i++) {
1829 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1830 com_factor(c, CHILD(n, i+1));
1831 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001832 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001833 break;
1834 }
1835 else
1836 com_apply_trailer(c, CHILD(n, i));
1837 }
1838}
1839
1840static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001841com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001842{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001843 REQ(n, factor);
1844 if (TYPE(CHILD(n, 0)) == PLUS) {
1845 com_factor(c, CHILD(n, 1));
1846 com_addbyte(c, UNARY_POSITIVE);
1847 }
1848 else if (TYPE(CHILD(n, 0)) == MINUS) {
1849 com_factor(c, CHILD(n, 1));
1850 com_addbyte(c, UNARY_NEGATIVE);
1851 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001852 else if (TYPE(CHILD(n, 0)) == TILDE) {
1853 com_factor(c, CHILD(n, 1));
1854 com_addbyte(c, UNARY_INVERT);
1855 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001856 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001857 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001858 }
1859}
1860
1861static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001862com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001863{
1864 int i;
1865 int op;
1866 REQ(n, term);
1867 com_factor(c, CHILD(n, 0));
1868 for (i = 2; i < NCH(n); i += 2) {
1869 com_factor(c, CHILD(n, i));
1870 switch (TYPE(CHILD(n, i-1))) {
1871 case STAR:
1872 op = BINARY_MULTIPLY;
1873 break;
1874 case SLASH:
1875 op = BINARY_DIVIDE;
1876 break;
1877 case PERCENT:
1878 op = BINARY_MODULO;
1879 break;
1880 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001881 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001882 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001883 op = 255;
1884 }
1885 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001886 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001887 }
1888}
1889
1890static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001891com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001892{
1893 int i;
1894 int op;
1895 REQ(n, arith_expr);
1896 com_term(c, CHILD(n, 0));
1897 for (i = 2; i < NCH(n); i += 2) {
1898 com_term(c, CHILD(n, i));
1899 switch (TYPE(CHILD(n, i-1))) {
1900 case PLUS:
1901 op = BINARY_ADD;
1902 break;
1903 case MINUS:
1904 op = BINARY_SUBTRACT;
1905 break;
1906 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001907 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001908 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001909 op = 255;
1910 }
1911 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001912 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001913 }
1914}
1915
1916static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001917com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001918{
1919 int i;
1920 int op;
1921 REQ(n, shift_expr);
1922 com_arith_expr(c, CHILD(n, 0));
1923 for (i = 2; i < NCH(n); i += 2) {
1924 com_arith_expr(c, CHILD(n, i));
1925 switch (TYPE(CHILD(n, i-1))) {
1926 case LEFTSHIFT:
1927 op = BINARY_LSHIFT;
1928 break;
1929 case RIGHTSHIFT:
1930 op = BINARY_RSHIFT;
1931 break;
1932 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001933 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001934 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001935 op = 255;
1936 }
1937 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001938 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001939 }
1940}
1941
1942static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001943com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001944{
1945 int i;
1946 int op;
1947 REQ(n, and_expr);
1948 com_shift_expr(c, CHILD(n, 0));
1949 for (i = 2; i < NCH(n); i += 2) {
1950 com_shift_expr(c, CHILD(n, i));
1951 if (TYPE(CHILD(n, i-1)) == AMPER) {
1952 op = BINARY_AND;
1953 }
1954 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001955 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001956 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001957 op = 255;
1958 }
1959 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001960 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001961 }
1962}
1963
1964static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001965com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001966{
1967 int i;
1968 int op;
1969 REQ(n, xor_expr);
1970 com_and_expr(c, CHILD(n, 0));
1971 for (i = 2; i < NCH(n); i += 2) {
1972 com_and_expr(c, CHILD(n, i));
1973 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1974 op = BINARY_XOR;
1975 }
1976 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001977 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001978 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001979 op = 255;
1980 }
1981 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001982 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001983 }
1984}
1985
1986static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001987com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001988{
1989 int i;
1990 int op;
1991 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001992 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001993 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001994 com_xor_expr(c, CHILD(n, i));
1995 if (TYPE(CHILD(n, i-1)) == VBAR) {
1996 op = BINARY_OR;
1997 }
1998 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001999 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002000 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002001 op = 255;
2002 }
2003 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002004 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002005 }
2006}
2007
2008static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002009cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002010{
2011 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00002012 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002013 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2014 if (NCH(n) == 1) {
2015 n = CHILD(n, 0);
2016 switch (TYPE(n)) {
2017 case LESS: return LT;
2018 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00002019 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002020 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00002021 case LESSEQUAL: return LE;
2022 case GREATEREQUAL: return GE;
2023 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002024 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
2025 if (strcmp(STR(n), "is") == 0) return IS;
2026 }
2027 }
2028 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002029 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002030 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
2031 return NOT_IN;
2032 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
2033 return IS_NOT;
2034 }
2035 }
2036 return BAD;
2037}
2038
2039static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002040com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002041{
2042 int i;
2043 enum cmp_op op;
2044 int anchor;
2045 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2046 com_expr(c, CHILD(n, 0));
2047 if (NCH(n) == 1)
2048 return;
2049
2050 /****************************************************************
2051 The following code is generated for all but the last
2052 comparison in a chain:
2053
2054 label: on stack: opcode: jump to:
2055
2056 a <code to load b>
2057 a, b DUP_TOP
2058 a, b, b ROT_THREE
2059 b, a, b COMPARE_OP
2060 b, 0-or-1 JUMP_IF_FALSE L1
2061 b, 1 POP_TOP
2062 b
2063
2064 We are now ready to repeat this sequence for the next
2065 comparison in the chain.
2066
2067 For the last we generate:
2068
2069 b <code to load c>
2070 b, c COMPARE_OP
2071 0-or-1
2072
2073 If there were any jumps to L1 (i.e., there was more than one
2074 comparison), we generate:
2075
2076 0-or-1 JUMP_FORWARD L2
2077 L1: b, 0 ROT_TWO
2078 0, b POP_TOP
2079 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002080 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002081 ****************************************************************/
2082
2083 anchor = 0;
2084
2085 for (i = 2; i < NCH(n); i += 2) {
2086 com_expr(c, CHILD(n, i));
2087 if (i+2 < NCH(n)) {
2088 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002089 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002090 com_addbyte(c, ROT_THREE);
2091 }
2092 op = cmp_type(CHILD(n, i-1));
2093 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002094 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002095 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002096 }
2097 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002098 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002099 if (i+2 < NCH(n)) {
2100 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2101 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002102 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002103 }
2104 }
2105
2106 if (anchor) {
2107 int anchor2 = 0;
2108 com_addfwref(c, JUMP_FORWARD, &anchor2);
2109 com_backpatch(c, anchor);
2110 com_addbyte(c, ROT_TWO);
2111 com_addbyte(c, POP_TOP);
2112 com_backpatch(c, anchor2);
2113 }
2114}
2115
2116static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002117com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002118{
2119 REQ(n, not_test); /* 'not' not_test | comparison */
2120 if (NCH(n) == 1) {
2121 com_comparison(c, CHILD(n, 0));
2122 }
2123 else {
2124 com_not_test(c, CHILD(n, 1));
2125 com_addbyte(c, UNARY_NOT);
2126 }
2127}
2128
2129static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002130com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002131{
2132 int i;
2133 int anchor;
2134 REQ(n, and_test); /* not_test ('and' not_test)* */
2135 anchor = 0;
2136 i = 0;
2137 for (;;) {
2138 com_not_test(c, CHILD(n, i));
2139 if ((i += 2) >= NCH(n))
2140 break;
2141 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2142 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002143 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002144 }
2145 if (anchor)
2146 com_backpatch(c, anchor);
2147}
2148
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002149static int
2150com_make_closure(struct compiling *c, PyCodeObject *co)
2151{
2152 int i, free = PyTuple_GET_SIZE(co->co_freevars);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002153 /* If the code is compiled with st->st_nested_scopes == 0,
2154 then no variable will ever be added to co_freevars.
2155 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002156 if (free == 0)
2157 return 0;
2158 for (i = 0; i < free; ++i) {
2159 /* Bypass com_addop_varname because it will generate
2160 LOAD_DEREF but LOAD_CLOSURE is needed.
2161 */
2162 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2163 int arg, reftype;
2164
2165 /* Special case: If a class contains a method with a
2166 free variable that has the same name as a method,
2167 the name will be considered free *and* local in the
2168 class. It should be handled by the closure, as
2169 well as by the normal name loookup logic.
2170 */
2171 reftype = get_ref_type(c, PyString_AS_STRING(name));
2172 if (reftype == CELL)
2173 arg = com_lookup_arg(c->c_cellvars, name);
2174 else /* (reftype == FREE) */
2175 arg = com_lookup_arg(c->c_freevars, name);
2176 if (arg == -1) {
2177 fprintf(stderr, "lookup %s in %s %d %d\n",
Jeremy Hylton483638c2001-02-01 20:20:45 +00002178 PyObject_REPR(name), c->c_name, reftype, arg);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002179 Py_FatalError("com_make_closure()");
2180 }
2181 com_addoparg(c, LOAD_CLOSURE, arg);
2182
2183 }
2184 com_push(c, free);
2185 return 1;
2186}
2187
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002188static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002189com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002190{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002191 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002192 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002193 PyObject *co;
2194 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002195 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002196 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2197 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002198 co = (PyObject *) icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002199 if (co == NULL) {
2200 c->c_errors++;
2201 return;
2202 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002203 symtable_exit_scope(c->c_symtable);
Tim Peters1e542112001-02-23 22:23:53 +00002204 i = com_addconst(c, co);
2205 closure = com_make_closure(c, (PyCodeObject *)co);
2206 Py_DECREF(co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002207 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002208 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002209 if (closure)
2210 com_addoparg(c, MAKE_CLOSURE, ndefs);
2211 else
2212 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002213 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002214 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002215 else {
2216 int anchor = 0;
2217 int i = 0;
2218 for (;;) {
2219 com_and_test(c, CHILD(n, i));
2220 if ((i += 2) >= NCH(n))
2221 break;
2222 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2223 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002224 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002225 }
2226 if (anchor)
2227 com_backpatch(c, anchor);
2228 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002229}
2230
2231static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002232com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002233{
2234 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002235 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002236 com_node(c, CHILD(n, 0));
2237 }
2238 else {
2239 int i;
2240 int len;
2241 len = (NCH(n) + 1) / 2;
2242 for (i = 0; i < NCH(n); i += 2)
2243 com_node(c, CHILD(n, i));
2244 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002245 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002246 }
2247}
2248
2249
2250/* Begin of assignment compilation */
2251
Thomas Wouters434d0822000-08-24 20:11:32 +00002252
2253static void
2254com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2255{
2256 com_addbyte(c, DUP_TOP);
2257 com_push(c, 1);
2258 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002259 com_node(c, augn);
2260 com_addbyte(c, opcode);
2261 com_pop(c, 1);
2262 com_addbyte(c, ROT_TWO);
2263 com_addopname(c, STORE_ATTR, n);
2264 com_pop(c, 2);
2265}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002266
2267static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002268com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002269{
2270 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002271 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002272}
2273
2274static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002275com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002276{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002277 REQ(n, trailer);
2278 switch (TYPE(CHILD(n, 0))) {
2279 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002280 com_error(c, PyExc_SyntaxError,
2281 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002282 break;
2283 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002284 if (assigning > OP_APPLY)
2285 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2286 else
2287 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002288 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002289 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002290 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002291 break;
2292 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002293 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002294 }
2295}
2296
2297static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002298com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002299{
2300 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002301 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002302 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002303 if (assigning) {
2304 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002305 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002306 com_push(c, i-1);
2307 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002308 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002309 com_assign(c, CHILD(n, i), assigning, NULL);
2310}
2311
2312static void
2313com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2314{
2315 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002316 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002317 com_push(c, 1);
2318 com_node(c, augn);
2319 com_addbyte(c, opcode);
2320 com_pop(c, 1);
2321 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002322}
2323
2324static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002325com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002326{
2327 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002328 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002329 if (assigning)
2330 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002331}
2332
2333static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002334com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002335{
2336 /* Loop to avoid trivial recursion */
2337 for (;;) {
2338 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002339
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002340 case exprlist:
2341 case testlist:
2342 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002343 if (assigning > OP_APPLY) {
2344 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002345 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002346 return;
2347 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002348 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002349 return;
2350 }
2351 n = CHILD(n, 0);
2352 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002353
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002354 case test:
2355 case and_test:
2356 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002357 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002358 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002359 case xor_expr:
2360 case and_expr:
2361 case shift_expr:
2362 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002363 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002364 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002365 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002366 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002367 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002368 return;
2369 }
2370 n = CHILD(n, 0);
2371 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002372
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002373 case power: /* atom trailer* ('**' power)*
2374 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002375 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002376 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002377 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002378 return;
2379 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002380 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002381 int i;
2382 com_node(c, CHILD(n, 0));
2383 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002384 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002385 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002386 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002387 return;
2388 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002389 com_apply_trailer(c, CHILD(n, i));
2390 } /* NB i is still alive */
2391 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002392 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002393 return;
2394 }
2395 n = CHILD(n, 0);
2396 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002397
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002398 case atom:
2399 switch (TYPE(CHILD(n, 0))) {
2400 case LPAR:
2401 n = CHILD(n, 1);
2402 if (TYPE(n) == RPAR) {
2403 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002404 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002405 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002406 return;
2407 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002408 if (assigning > OP_APPLY) {
2409 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002410 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002411 return;
2412 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002413 break;
2414 case LSQB:
2415 n = CHILD(n, 1);
2416 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002417 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002418 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002419 return;
2420 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002421 if (assigning > OP_APPLY) {
2422 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002423 "augmented assign to list not possible");
2424 return;
2425 }
2426 if (NCH(n) > 1
2427 && TYPE(CHILD(n, 1)) == list_for) {
2428 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002429 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002430 return;
2431 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002432 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002433 return;
2434 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002435 if (assigning > OP_APPLY)
2436 com_augassign_name(c, CHILD(n, 0),
2437 assigning, augn);
2438 else
2439 com_assign_name(c, CHILD(n, 0),
2440 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002441 return;
2442 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002443 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002444 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002445 return;
2446 }
2447 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002448
2449 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002450 com_error(c, PyExc_SyntaxError,
2451 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002452 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002453
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002454 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002455 com_error(c, PyExc_SystemError,
2456 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002457 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002458
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002459 }
2460 }
2461}
Guido van Rossum7c531111997-03-11 18:42:21 +00002462
Thomas Wouters434d0822000-08-24 20:11:32 +00002463static void
2464com_augassign(struct compiling *c, node *n)
2465{
2466 int opcode;
2467
2468 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2469 case '+': opcode = INPLACE_ADD; break;
2470 case '-': opcode = INPLACE_SUBTRACT; break;
2471 case '/': opcode = INPLACE_DIVIDE; break;
2472 case '%': opcode = INPLACE_MODULO; break;
2473 case '<': opcode = INPLACE_LSHIFT; break;
2474 case '>': opcode = INPLACE_RSHIFT; break;
2475 case '&': opcode = INPLACE_AND; break;
2476 case '^': opcode = INPLACE_XOR; break;
2477 case '|': opcode = INPLACE_OR; break;
2478 case '*':
2479 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2480 opcode = INPLACE_POWER;
2481 else
2482 opcode = INPLACE_MULTIPLY;
2483 break;
2484 default:
2485 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2486 return;
2487 }
2488 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2489}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002490
2491static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002492com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002493{
Thomas Wouters434d0822000-08-24 20:11:32 +00002494 REQ(n, expr_stmt);
2495 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002496 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002497 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002498 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002499 if (NCH(n) == 1) {
2500 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002501 if (c->c_interactive)
2502 com_addbyte(c, PRINT_EXPR);
2503 else
2504 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002505 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002506 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002507 else if (TYPE(CHILD(n,1)) == augassign)
2508 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002509 else {
2510 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002511 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002512 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002513 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002514 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002515 com_push(c, 1);
2516 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002517 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002518 }
2519 }
2520}
2521
2522static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002523com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002524{
2525 int a = 0, b = 0;
2526 int i;
2527 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2528 /* Generate code like for
2529
2530 if __debug__:
2531 if not <test>:
2532 raise AssertionError [, <message>]
2533
2534 where <message> is the second test, if present.
2535 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002536
Guido van Rossum228d7f31997-04-02 05:24:36 +00002537 if (Py_OptimizeFlag)
2538 return;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002539 com_addop_name(c, LOAD_GLOBAL, "__debug__");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002540 com_push(c, 1);
2541 com_addfwref(c, JUMP_IF_FALSE, &a);
2542 com_addbyte(c, POP_TOP);
2543 com_pop(c, 1);
2544 com_node(c, CHILD(n, 1));
2545 com_addfwref(c, JUMP_IF_TRUE, &b);
2546 com_addbyte(c, POP_TOP);
2547 com_pop(c, 1);
2548 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002549 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002550 com_push(c, 1);
2551 i = NCH(n)/2; /* Either 2 or 4 */
2552 if (i > 1)
2553 com_node(c, CHILD(n, 3));
2554 com_addoparg(c, RAISE_VARARGS, i);
2555 com_pop(c, i);
2556 /* The interpreter does not fall through */
2557 /* All jumps converge here */
2558 com_backpatch(c, a);
2559 com_backpatch(c, b);
2560 com_addbyte(c, POP_TOP);
2561}
2562
2563static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002564com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002565{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002566 int i = 1;
2567 node* stream = NULL;
2568
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002569 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002570
2571 /* are we using the extended print form? */
2572 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2573 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002574 com_node(c, stream);
2575 /* stack: [...] => [... stream] */
2576 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002577 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2578 i = 4;
2579 else
2580 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002581 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002582 for (; i < NCH(n); i += 2) {
2583 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002584 com_addbyte(c, DUP_TOP);
2585 /* stack: [stream] => [stream stream] */
2586 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002587 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002588 /* stack: [stream stream] => [stream stream obj] */
2589 com_addbyte(c, ROT_TWO);
2590 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002591 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002592 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002593 com_pop(c, 2);
2594 }
2595 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002596 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002597 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002598 com_addbyte(c, PRINT_ITEM);
2599 com_pop(c, 1);
2600 }
2601 }
2602 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002603 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002604 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002605 /* must pop the extra stream object off the stack */
2606 com_addbyte(c, POP_TOP);
2607 /* stack: [... stream] => [...] */
2608 com_pop(c, 1);
2609 }
2610 }
2611 else {
2612 if (stream != NULL) {
2613 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002614 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002615 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002616 com_pop(c, 1);
2617 }
2618 else
2619 com_addbyte(c, PRINT_NEWLINE);
2620 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002621}
2622
2623static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002624com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002625{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002626 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002627 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002628 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002629 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002630 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002631 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002632 com_push(c, 1);
2633 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002634 else
2635 com_node(c, CHILD(n, 1));
2636 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002637 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002638}
2639
2640static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002641com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002642{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002643 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002644 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2645 if (NCH(n) > 1) {
2646 com_node(c, CHILD(n, 1));
2647 if (NCH(n) > 3) {
2648 com_node(c, CHILD(n, 3));
2649 if (NCH(n) > 5)
2650 com_node(c, CHILD(n, 5));
2651 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002652 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002653 i = NCH(n)/2;
2654 com_addoparg(c, RAISE_VARARGS, i);
2655 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002656}
2657
2658static void
Thomas Wouters52152252000-08-17 22:55:00 +00002659com_from_import(struct compiling *c, node *n)
2660{
2661 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2662 com_push(c, 1);
2663 if (NCH(n) > 1) {
2664 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2665 com_error(c, PyExc_SyntaxError, "invalid syntax");
2666 return;
2667 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002668 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002669 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002670 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00002671 com_pop(c, 1);
2672}
2673
2674static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002675com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002676{
2677 int i;
2678 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002679 /* 'import' dotted_name (',' dotted_name)* |
2680 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002681 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00002682 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002683 /* 'from' dotted_name 'import' ... */
2684 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002685
2686 if (TYPE(CHILD(n, 3)) == STAR) {
2687 tup = Py_BuildValue("(s)", "*");
2688 } else {
2689 tup = PyTuple_New((NCH(n) - 2)/2);
2690 for (i = 3; i < NCH(n); i += 2) {
2691 PyTuple_SET_ITEM(tup, (i-3)/2,
2692 PyString_FromString(STR(
2693 CHILD(CHILD(n, i), 0))));
2694 }
2695 }
2696 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00002697 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002698 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002699 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00002700 if (TYPE(CHILD(n, 3)) == STAR)
2701 com_addbyte(c, IMPORT_STAR);
2702 else {
2703 for (i = 3; i < NCH(n); i += 2)
2704 com_from_import(c, CHILD(n, i));
2705 com_addbyte(c, POP_TOP);
2706 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002707 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002708 }
2709 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002710 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002711 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00002712 node *subn = CHILD(n, i);
2713 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002714 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002715 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002716 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00002717 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00002718 int j;
2719 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00002720 com_error(c, PyExc_SyntaxError,
2721 "invalid syntax");
2722 return;
2723 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00002724 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
2725 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002726 CHILD(CHILD(subn, 0),
2727 j));
2728 com_addop_varname(c, VAR_STORE,
2729 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002730 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002731 com_addop_varname(c, VAR_STORE,
2732 STR(CHILD(CHILD(subn, 0),
2733 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002734 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002735 }
2736 }
2737}
2738
2739static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002740com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002741{
2742 REQ(n, exec_stmt);
2743 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2744 com_node(c, CHILD(n, 1));
2745 if (NCH(n) >= 4)
2746 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002747 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002748 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002749 com_push(c, 1);
2750 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002751 if (NCH(n) >= 6)
2752 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002753 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002754 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002755 com_push(c, 1);
2756 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002757 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002758 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002759}
2760
Guido van Rossum7c531111997-03-11 18:42:21 +00002761static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002762is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002763{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002764 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002765 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002766 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00002767
2768 /* Label to avoid tail recursion */
2769 next:
2770 switch (TYPE(n)) {
2771
2772 case suite:
2773 if (NCH(n) == 1) {
2774 n = CHILD(n, 0);
2775 goto next;
2776 }
2777 /* Fall through */
2778 case file_input:
2779 for (i = 0; i < NCH(n); i++) {
2780 node *ch = CHILD(n, i);
2781 if (TYPE(ch) == stmt) {
2782 n = ch;
2783 goto next;
2784 }
2785 }
2786 break;
2787
2788 case stmt:
2789 case simple_stmt:
2790 case small_stmt:
2791 n = CHILD(n, 0);
2792 goto next;
2793
2794 case expr_stmt:
2795 case testlist:
2796 case test:
2797 case and_test:
2798 case not_test:
2799 case comparison:
2800 case expr:
2801 case xor_expr:
2802 case and_expr:
2803 case shift_expr:
2804 case arith_expr:
2805 case term:
2806 case factor:
2807 case power:
2808 case atom:
2809 if (NCH(n) == 1) {
2810 n = CHILD(n, 0);
2811 goto next;
2812 }
2813 break;
2814
2815 case NAME:
2816 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2817 return 1;
2818 break;
2819
2820 case NUMBER:
2821 v = parsenumber(c, STR(n));
2822 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002823 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002824 break;
2825 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002826 i = PyObject_IsTrue(v);
2827 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002828 return i == 0;
2829
2830 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002831 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002832 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002833 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002834 break;
2835 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002836 i = PyObject_IsTrue(v);
2837 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002838 return i == 0;
2839
2840 }
2841 return 0;
2842}
2843
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002844static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002845com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002846{
2847 int i;
2848 int anchor = 0;
2849 REQ(n, if_stmt);
2850 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2851 for (i = 0; i+3 < NCH(n); i+=4) {
2852 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002853 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002854 if (is_constant_false(c, ch))
2855 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002856 if (i > 0)
2857 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002858 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002859 com_addfwref(c, JUMP_IF_FALSE, &a);
2860 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002861 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002862 com_node(c, CHILD(n, i+3));
2863 com_addfwref(c, JUMP_FORWARD, &anchor);
2864 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002865 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002866 com_addbyte(c, POP_TOP);
2867 }
2868 if (i+2 < NCH(n))
2869 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002870 if (anchor)
2871 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002872}
2873
2874static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002875com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002876{
2877 int break_anchor = 0;
2878 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002879 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002880 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2881 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002882 block_push(c, SETUP_LOOP);
2883 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002884 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002885 com_node(c, CHILD(n, 1));
2886 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2887 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002888 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002889 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002890 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002891 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002892 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2893 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002894 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002895 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002896 com_addbyte(c, POP_TOP);
2897 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002898 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002899 if (NCH(n) > 4)
2900 com_node(c, CHILD(n, 6));
2901 com_backpatch(c, break_anchor);
2902}
2903
2904static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002905com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002906{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002907 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002908 int break_anchor = 0;
2909 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002910 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002911 REQ(n, for_stmt);
2912 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2913 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002914 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002915 com_node(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002916 v = PyInt_FromLong(0L);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002917 if (v == NULL)
2918 c->c_errors++;
2919 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002920 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002921 Py_XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002922 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002923 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002924 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002925 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00002926 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002927 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002928 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002929 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002930 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2931 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002932 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002933 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002934 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002935 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002936 if (NCH(n) > 8)
2937 com_node(c, CHILD(n, 8));
2938 com_backpatch(c, break_anchor);
2939}
2940
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002941/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002942
2943 SETUP_FINALLY L
2944 <code for S>
2945 POP_BLOCK
2946 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002947 L: <code for Sf>
2948 END_FINALLY
2949
2950 The special instructions use the block stack. Each block
2951 stack entry contains the instruction that created it (here
2952 SETUP_FINALLY), the level of the value stack at the time the
2953 block stack entry was created, and a label (here L).
2954
2955 SETUP_FINALLY:
2956 Pushes the current value stack level and the label
2957 onto the block stack.
2958 POP_BLOCK:
2959 Pops en entry from the block stack, and pops the value
2960 stack until its level is the same as indicated on the
2961 block stack. (The label is ignored.)
2962 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002963 Pops a variable number of entries from the *value* stack
2964 and re-raises the exception they specify. The number of
2965 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002966
2967 The block stack is unwound when an exception is raised:
2968 when a SETUP_FINALLY entry is found, the exception is pushed
2969 onto the value stack (and the exception condition is cleared),
2970 and the interpreter jumps to the label gotten from the block
2971 stack.
2972
2973 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002974 (The contents of the value stack is shown in [], with the top
2975 at the right; 'tb' is trace-back info, 'val' the exception's
2976 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002977
2978 Value stack Label Instruction Argument
2979 [] SETUP_EXCEPT L1
2980 [] <code for S>
2981 [] POP_BLOCK
2982 [] JUMP_FORWARD L0
2983
Guido van Rossum3f5da241990-12-20 15:06:42 +00002984 [tb, val, exc] L1: DUP )
2985 [tb, val, exc, exc] <evaluate E1> )
2986 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2987 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2988 [tb, val, exc, 1] POP )
2989 [tb, val, exc] POP
2990 [tb, val] <assign to V1> (or POP if no V1)
2991 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002992 [] <code for S1>
2993 JUMP_FORWARD L0
2994
Guido van Rossum3f5da241990-12-20 15:06:42 +00002995 [tb, val, exc, 0] L2: POP
2996 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002997 .............................etc.......................
2998
Guido van Rossum3f5da241990-12-20 15:06:42 +00002999 [tb, val, exc, 0] Ln+1: POP
3000 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003001
3002 [] L0: <next statement>
3003
3004 Of course, parts are not generated if Vi or Ei is not present.
3005*/
3006
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003007static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003008com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003009{
3010 int except_anchor = 0;
3011 int end_anchor = 0;
3012 int else_anchor = 0;
3013 int i;
3014 node *ch;
3015
3016 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3017 block_push(c, SETUP_EXCEPT);
3018 com_node(c, CHILD(n, 2));
3019 com_addbyte(c, POP_BLOCK);
3020 block_pop(c, SETUP_EXCEPT);
3021 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3022 com_backpatch(c, except_anchor);
3023 for (i = 3;
3024 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3025 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003026 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003027 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003028 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003029 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003030 break;
3031 }
3032 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003033 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003034 com_addoparg(c, SET_LINENO, ch->n_lineno);
3035 if (NCH(ch) > 1) {
3036 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003037 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003038 com_node(c, CHILD(ch, 1));
3039 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003040 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003041 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3042 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003043 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003044 }
3045 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003046 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003047 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003048 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003049 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003050 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003051 com_pop(c, 1);
3052 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003053 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003054 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003055 com_node(c, CHILD(n, i+2));
3056 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3057 if (except_anchor) {
3058 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003059 /* We come in with [tb, val, exc, 0] on the
3060 stack; one pop and it's the same as
3061 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003062 com_addbyte(c, POP_TOP);
3063 }
3064 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003065 /* We actually come in here with [tb, val, exc] but the
3066 END_FINALLY will zap those and jump around.
3067 The c_stacklevel does not reflect them so we need not pop
3068 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003069 com_addbyte(c, END_FINALLY);
3070 com_backpatch(c, else_anchor);
3071 if (i < NCH(n))
3072 com_node(c, CHILD(n, i+2));
3073 com_backpatch(c, end_anchor);
3074}
3075
3076static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003077com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003078{
3079 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003080 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003081
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003082 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3083 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003084 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003085 com_addbyte(c, POP_BLOCK);
3086 block_pop(c, SETUP_FINALLY);
3087 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003088 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003089 /* While the generated code pushes only one item,
3090 the try-finally handling can enter here with
3091 up to three items. OK, here are the details:
3092 3 for an exception, 2 for RETURN, 1 for BREAK. */
3093 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003094 com_backpatch(c, finally_anchor);
3095 ch = CHILD(n, NCH(n)-1);
3096 com_addoparg(c, SET_LINENO, ch->n_lineno);
3097 com_node(c, ch);
3098 com_addbyte(c, END_FINALLY);
3099 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003100 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003101}
3102
3103static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003104com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003105{
3106 REQ(n, try_stmt);
3107 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3108 | 'try' ':' suite 'finally' ':' suite */
3109 if (TYPE(CHILD(n, 3)) != except_clause)
3110 com_try_finally(c, n);
3111 else
3112 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003113}
3114
Guido van Rossum8b993a91997-01-17 21:04:03 +00003115static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003116get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003117{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003118 int i;
3119
Guido van Rossum8b993a91997-01-17 21:04:03 +00003120 /* Label to avoid tail recursion */
3121 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003122 switch (TYPE(n)) {
3123
3124 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003125 if (NCH(n) == 1) {
3126 n = CHILD(n, 0);
3127 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003128 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003129 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003130 case file_input:
3131 for (i = 0; i < NCH(n); i++) {
3132 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003133 if (TYPE(ch) == stmt) {
3134 n = ch;
3135 goto next;
3136 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003137 }
3138 break;
3139
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003140 case stmt:
3141 case simple_stmt:
3142 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003143 n = CHILD(n, 0);
3144 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003145
3146 case expr_stmt:
3147 case testlist:
3148 case test:
3149 case and_test:
3150 case not_test:
3151 case comparison:
3152 case expr:
3153 case xor_expr:
3154 case and_expr:
3155 case shift_expr:
3156 case arith_expr:
3157 case term:
3158 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003159 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003160 if (NCH(n) == 1) {
3161 n = CHILD(n, 0);
3162 goto next;
3163 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003164 break;
3165
3166 case atom:
3167 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003168 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003169 break;
3170
3171 }
3172 return NULL;
3173}
3174
Guido van Rossum79f25d91997-04-29 20:08:16 +00003175static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003176get_docstring(node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003177{
Guido van Rossum541563e1999-01-28 15:08:09 +00003178 /* Don't generate doc-strings if run with -OO */
3179 if (Py_OptimizeFlag > 1)
3180 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003181 n = get_rawdocstring(n);
3182 if (n == NULL)
3183 return NULL;
3184 return parsestrplus(n);
3185}
3186
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003187static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003188com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003189{
3190 REQ(n, suite);
3191 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3192 if (NCH(n) == 1) {
3193 com_node(c, CHILD(n, 0));
3194 }
3195 else {
3196 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003197 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003198 node *ch = CHILD(n, i);
3199 if (TYPE(ch) == stmt)
3200 com_node(c, ch);
3201 }
3202 }
3203}
3204
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003205/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003206static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003207com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003208{
3209 int i = c->c_nblocks;
3210 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3211 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3212 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003213 else if (i <= 0) {
3214 /* at the outer level */
3215 com_error(c, PyExc_SyntaxError,
3216 "'continue' not properly in loop");
3217 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003218 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003219 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003220 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003221 if (c->c_block[j] == SETUP_LOOP)
3222 break;
3223 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003224 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003225 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003226 for (; i > j; --i) {
3227 if (c->c_block[i] == SETUP_EXCEPT ||
3228 c->c_block[i] == SETUP_FINALLY) {
3229 com_addoparg(c, CONTINUE_LOOP,
3230 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003231 return;
3232 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003233 if (c->c_block[i] == END_FINALLY) {
3234 com_error(c, PyExc_SyntaxError,
3235 "'continue' not supported inside 'finally' clause");
3236 return;
3237 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003238 }
3239 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003240 com_error(c, PyExc_SyntaxError,
3241 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003242 }
3243 /* XXX Could allow it inside a 'finally' clause
3244 XXX if we could pop the exception still on the stack */
3245}
3246
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003247static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003248com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003249{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003250 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003251 if (TYPE(n) == lambdef) {
3252 /* lambdef: 'lambda' [varargslist] ':' test */
3253 n = CHILD(n, 1);
3254 }
3255 else {
3256 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3257 n = CHILD(n, 2);
3258 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3259 n = CHILD(n, 1);
3260 }
3261 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003262 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003263 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003264 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003265 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3266 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003267 nargs = 0;
3268 ndefs = 0;
3269 for (i = 0; i < nch; i++) {
3270 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003271 if (TYPE(CHILD(n, i)) == STAR ||
3272 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003273 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003274 nargs++;
3275 i++;
3276 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003277 t = RPAR; /* Anything except EQUAL or COMMA */
3278 else
3279 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003280 if (t == EQUAL) {
3281 i++;
3282 ndefs++;
3283 com_node(c, CHILD(n, i));
3284 i++;
3285 if (i >= nch)
3286 break;
3287 t = TYPE(CHILD(n, i));
3288 }
3289 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003290 /* Treat "(a=1, b)" as an error */
3291 if (ndefs)
3292 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003293 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003294 }
3295 if (t != COMMA)
3296 break;
3297 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003298 return ndefs;
3299}
3300
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003301static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003302com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003303{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003304 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003305 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003306 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003307 ndefs = com_argdefs(c, n);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003308 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3309 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003310 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003311 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003312 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003313 c->c_errors++;
3314 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003315 int closure = com_make_closure(c, (PyCodeObject *)co);
3316 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003317 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003318 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003319 if (closure)
3320 com_addoparg(c, MAKE_CLOSURE, ndefs);
3321 else
3322 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003323 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003324 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003325 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003326 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003327 }
3328}
3329
3330static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003331com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003332{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003333 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003334 REQ(n, testlist);
3335 /* testlist: test (',' test)* [','] */
3336 for (i = 0; i < NCH(n); i += 2)
3337 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003338 i = (NCH(n)+1) / 2;
3339 com_addoparg(c, BUILD_TUPLE, i);
3340 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003341}
3342
3343static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003344com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003345{
Guido van Rossum25831651993-05-19 14:50:45 +00003346 int i;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003347 PyObject *co, *v;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003348 char *name;
3349
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003350 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003351 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003352 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003353 c->c_errors++;
3354 return;
3355 }
3356 /* Push the class name on the stack */
3357 i = com_addconst(c, v);
3358 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003359 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003360 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003361 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003362 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003363 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003364 com_push(c, 1);
3365 }
Guido van Rossum25831651993-05-19 14:50:45 +00003366 else
3367 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003368 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003369 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003370 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003371 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003372 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003373 c->c_errors++;
3374 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003375 int closure = com_make_closure(c, (PyCodeObject *)co);
3376 i = com_addconst(c, co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003377 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003378 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003379 if (closure)
3380 com_addoparg(c, MAKE_CLOSURE, 0);
3381 else
3382 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003383 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003384 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003385 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003386 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003387 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003388 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003389}
3390
3391static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003392com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003393{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003394 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003395 if (c->c_errors)
3396 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003397 switch (TYPE(n)) {
3398
3399 /* Definition nodes */
3400
3401 case funcdef:
3402 com_funcdef(c, n);
3403 break;
3404 case classdef:
3405 com_classdef(c, n);
3406 break;
3407
3408 /* Trivial parse tree nodes */
3409
3410 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003411 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003412 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003413 n = CHILD(n, 0);
3414 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003415
3416 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003417 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
3418 com_addoparg(c, SET_LINENO, n->n_lineno);
3419 {
3420 int i;
3421 for (i = 0; i < NCH(n)-1; i += 2)
3422 com_node(c, CHILD(n, i));
3423 }
3424 break;
3425
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003426 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003427 com_addoparg(c, SET_LINENO, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003428 n = CHILD(n, 0);
3429 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003430
3431 /* Statement nodes */
3432
3433 case expr_stmt:
3434 com_expr_stmt(c, n);
3435 break;
3436 case print_stmt:
3437 com_print_stmt(c, n);
3438 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003439 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003440 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003441 break;
3442 case pass_stmt:
3443 break;
3444 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003445 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003446 com_error(c, PyExc_SyntaxError,
3447 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003448 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003449 com_addbyte(c, BREAK_LOOP);
3450 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003451 case continue_stmt:
3452 com_continue_stmt(c, n);
3453 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003454 case return_stmt:
3455 com_return_stmt(c, n);
3456 break;
3457 case raise_stmt:
3458 com_raise_stmt(c, n);
3459 break;
3460 case import_stmt:
3461 com_import_stmt(c, n);
3462 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003463 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003464 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003465 case exec_stmt:
3466 com_exec_stmt(c, n);
3467 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003468 case assert_stmt:
3469 com_assert_stmt(c, n);
3470 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003471 case if_stmt:
3472 com_if_stmt(c, n);
3473 break;
3474 case while_stmt:
3475 com_while_stmt(c, n);
3476 break;
3477 case for_stmt:
3478 com_for_stmt(c, n);
3479 break;
3480 case try_stmt:
3481 com_try_stmt(c, n);
3482 break;
3483 case suite:
3484 com_suite(c, n);
3485 break;
3486
3487 /* Expression nodes */
3488
3489 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003490 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003491 break;
3492 case test:
3493 com_test(c, n);
3494 break;
3495 case and_test:
3496 com_and_test(c, n);
3497 break;
3498 case not_test:
3499 com_not_test(c, n);
3500 break;
3501 case comparison:
3502 com_comparison(c, n);
3503 break;
3504 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003505 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003506 break;
3507 case expr:
3508 com_expr(c, n);
3509 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003510 case xor_expr:
3511 com_xor_expr(c, n);
3512 break;
3513 case and_expr:
3514 com_and_expr(c, n);
3515 break;
3516 case shift_expr:
3517 com_shift_expr(c, n);
3518 break;
3519 case arith_expr:
3520 com_arith_expr(c, n);
3521 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003522 case term:
3523 com_term(c, n);
3524 break;
3525 case factor:
3526 com_factor(c, n);
3527 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003528 case power:
3529 com_power(c, n);
3530 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003531 case atom:
3532 com_atom(c, n);
3533 break;
3534
3535 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003536 com_error(c, PyExc_SystemError,
3537 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003538 }
3539}
3540
Tim Petersdbd9ba62000-07-09 03:09:57 +00003541static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003542
3543static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003544com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003545{
3546 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3547 if (TYPE(CHILD(n, 0)) == LPAR)
3548 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003549 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003550 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003551 com_pop(c, 1);
3552 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003553}
3554
3555static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003556com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003557{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003558 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003559 if (NCH(n) == 1) {
3560 com_fpdef(c, CHILD(n, 0));
3561 }
3562 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003563 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003564 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003565 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003566 for (i = 0; i < NCH(n); i += 2)
3567 com_fpdef(c, CHILD(n, i));
3568 }
3569}
3570
3571static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003572com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003573{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003574 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003575 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003576 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003577 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003578 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003579 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003580 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003581 /* Enter all arguments in table of locals */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003582 for (i = 0, narg = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003583 node *ch = CHILD(n, i);
3584 node *fp;
3585 char *name;
Guido van Rossum50564e81996-01-12 01:13:16 +00003586 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003587 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003588 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3589 fp = CHILD(ch, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003590 if (TYPE(fp) == NAME) {
3591 PyObject *v;
3592 name = STR(fp);
3593 v = PyDict_GetItemString(c->c_cellvars, name);
3594 if (v) {
3595 com_addoparg(c, LOAD_FAST, narg);
3596 com_addoparg(c, STORE_DEREF,
3597 PyInt_AS_LONG(v));
3598 }
3599 } else {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003600 name = nbuf;
3601 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003602 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003603 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003604 narg++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003605 /* all name updates handled by symtable */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003606 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003607 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003608 ch = CHILD(n, i);
3609 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003610 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003611 else
3612 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003613 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003614 /* Handle *arguments */
3615 if (i < nch) {
3616 node *ch;
3617 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003618 if (TYPE(ch) != DOUBLESTAR) {
3619 REQ(ch, STAR);
3620 ch = CHILD(n, i+1);
3621 if (TYPE(ch) == NAME) {
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003622 PyObject *v;
Guido van Rossum50564e81996-01-12 01:13:16 +00003623 i += 3;
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003624 v = PyDict_GetItemString(c->c_cellvars,
3625 STR(ch));
3626 if (v) {
3627 com_addoparg(c, LOAD_FAST, narg);
3628 com_addoparg(c, STORE_DEREF,
3629 PyInt_AS_LONG(v));
Guido van Rossum50564e81996-01-12 01:13:16 +00003630 }
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003631 narg++;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003632 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003633 }
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003634 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003635 /* Handle **keywords */
3636 if (i < nch) {
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003637 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003638 node *ch;
3639 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003640 if (TYPE(ch) != DOUBLESTAR) {
3641 REQ(ch, STAR);
3642 ch = CHILD(n, i+1);
3643 REQ(ch, STAR);
3644 ch = CHILD(n, i+2);
3645 }
3646 else
3647 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003648 REQ(ch, NAME);
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003649 v = PyDict_GetItemString(c->c_cellvars, STR(ch));
3650 if (v) {
3651 com_addoparg(c, LOAD_FAST, narg);
3652 com_addoparg(c, STORE_DEREF, PyInt_AS_LONG(v));
3653 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003654 }
3655 if (complex) {
3656 /* Generate code for complex arguments only after
3657 having counted the simple arguments */
3658 int ilocal = 0;
3659 for (i = 0; i < nch; i++) {
3660 node *ch = CHILD(n, i);
3661 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003662 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003663 break;
3664 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3665 fp = CHILD(ch, 0);
3666 if (TYPE(fp) != NAME) {
3667 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003668 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003669 com_fpdef(c, ch);
3670 }
3671 ilocal++;
3672 if (++i >= nch)
3673 break;
3674 ch = CHILD(n, i);
3675 if (TYPE(ch) == EQUAL)
3676 i += 2;
3677 else
3678 REQ(ch, COMMA);
3679 }
3680 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003681}
3682
3683static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003684com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003685{
3686 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003687 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003688 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003689 doc = get_docstring(n);
3690 if (doc != NULL) {
3691 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003692 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003693 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003694 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003695 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003696 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003697 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003698 for (i = 0; i < NCH(n); i++) {
3699 node *ch = CHILD(n, i);
3700 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3701 com_node(c, ch);
3702 }
3703}
3704
3705/* Top-level compile-node interface */
3706
3707static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003708compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003709{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003710 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003711 node *ch;
3712 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003713 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003714 doc = get_docstring(CHILD(n, 4));
3715 if (doc != NULL) {
3716 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003717 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003718 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003719 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003720 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003721 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3722 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003723 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003724 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003725 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003726 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003727 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003728 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003729 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003730 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003731 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003732}
3733
3734static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003735compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003736{
Guido van Rossum590baa41993-11-30 13:40:46 +00003737 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003738 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003739 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003740
3741 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003742 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003743 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003744 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003745 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003746 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003747 else
3748 ch = CHILD(n, 2);
3749 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003750 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003751 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003752}
3753
3754static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003755compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003756{
3757 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003758 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003759 REQ(n, classdef);
3760 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3761 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003762 c->c_private = c->c_name;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003763 ch = CHILD(n, NCH(n)-1); /* The suite */
3764 doc = get_docstring(ch);
3765 if (doc != NULL) {
3766 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003767 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003768 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003769 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003770 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003771 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003772 }
3773 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003774 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003775 com_node(c, ch);
3776 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003777 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003778 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003779 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003780}
3781
3782static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003783compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003784{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003785 com_addoparg(c, SET_LINENO, n->n_lineno);
3786
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003787 switch (TYPE(n)) {
3788
Guido van Rossum4c417781991-01-21 16:09:22 +00003789 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003790 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003791 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003792 n = CHILD(n, 0);
3793 if (TYPE(n) != NEWLINE)
3794 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003795 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003796 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003797 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003798 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003799 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003800 break;
3801
Guido van Rossum4c417781991-01-21 16:09:22 +00003802 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003803 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003804 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003805 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003806 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003807 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003808 break;
3809
Guido van Rossum590baa41993-11-30 13:40:46 +00003810 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003811 com_node(c, CHILD(n, 0));
3812 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003813 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003814 break;
3815
Guido van Rossum590baa41993-11-30 13:40:46 +00003816 case lambdef: /* anonymous function definition */
3817 compile_lambdef(c, n);
3818 break;
3819
Guido van Rossum4c417781991-01-21 16:09:22 +00003820 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003821 compile_funcdef(c, n);
3822 break;
3823
Guido van Rossum4c417781991-01-21 16:09:22 +00003824 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003825 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003826 break;
3827
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003828 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003829 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003830 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003831 }
3832}
3833
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003834static PyObject *
3835dict_keys_inorder(PyObject *dict, int offset)
3836{
3837 PyObject *tuple, *k, *v;
3838 int i, pos = 0, size = PyDict_Size(dict);
3839
3840 tuple = PyTuple_New(size);
3841 if (tuple == NULL)
3842 return NULL;
3843 while (PyDict_Next(dict, &pos, &k, &v)) {
3844 i = PyInt_AS_LONG(v);
3845 Py_INCREF(k);
3846 PyTuple_SET_ITEM(tuple, i - offset, k);
3847 }
3848 return tuple;
3849}
3850
Guido van Rossum79f25d91997-04-29 20:08:16 +00003851PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003852PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003853{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003854 return jcompile(n, filename, NULL);
3855}
3856
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003857struct symtable *
3858PyNode_CompileSymtable(node *n, char *filename)
3859{
3860 struct symtable *st;
3861
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003862 st = symtable_init();
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003863 if (st == NULL)
3864 return NULL;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00003865 assert(st->st_symbols != NULL);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003866 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
3867 if (st->st_errors > 0) {
3868 PySymtable_Free(st);
3869 return NULL;
3870 }
3871 symtable_node(st, n);
3872 if (st->st_errors > 0) {
3873 PySymtable_Free(st);
3874 return NULL;
3875 }
3876 return st;
3877}
3878
Guido van Rossum79f25d91997-04-29 20:08:16 +00003879static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003880icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003881{
3882 return jcompile(n, base->c_filename, base);
3883}
3884
Guido van Rossum79f25d91997-04-29 20:08:16 +00003885static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003886jcompile(node *n, char *filename, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003887{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003888 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003889 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003890 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003891 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003892 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003893 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003894 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003895 /* c_symtable still points to parent's symbols */
3896 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003897 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003898 sc.c_nested = 1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003899 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003900 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00003901 sc.c_future = PyNode_Future(n, filename);
3902 if (sc.c_future == NULL || symtable_build(&sc, n) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003903 com_free(&sc);
3904 return NULL;
3905 }
3906 }
3907 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003908 if (symtable_load_symbols(&sc) < 0) {
3909 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003910 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003911 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003912 compile_node(&sc, n);
3913 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00003914 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003915 PyObject *consts, *names, *varnames, *filename, *name,
3916 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003917 consts = PyList_AsTuple(sc.c_consts);
3918 names = PyList_AsTuple(sc.c_names);
3919 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003920 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
3921 freevars = dict_keys_inorder(sc.c_freevars,
3922 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003923 filename = PyString_InternFromString(sc.c_filename);
3924 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003925 if (!PyErr_Occurred())
3926 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003927 sc.c_nlocals,
3928 sc.c_maxstacklevel,
3929 sc.c_flags,
3930 sc.c_code,
3931 consts,
3932 names,
3933 varnames,
3934 freevars,
3935 cellvars,
3936 filename,
3937 name,
3938 sc.c_firstlineno,
3939 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003940 Py_XDECREF(consts);
3941 Py_XDECREF(names);
3942 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003943 Py_XDECREF(freevars);
3944 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003945 Py_XDECREF(filename);
3946 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003947 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00003948 else if (!PyErr_Occurred()) {
3949 /* This could happen if someone called PyErr_Clear() after an
3950 error was reported above. That's not supposed to happen,
3951 but I just plugged one case and I'm not sure there can't be
3952 others. In that case, raise SystemError so that at least
3953 it gets reported instead dumping core. */
3954 PyErr_SetString(PyExc_SystemError, "lost syntax error");
3955 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003956 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00003957 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003958 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00003959 sc.c_symtable = NULL;
3960 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003961 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003962 return co;
3963}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003964
3965int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003966PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003967{
3968 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003969 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003970 int line = co->co_firstlineno;
3971 int addr = 0;
3972 while (--size >= 0) {
3973 addr += *p++;
3974 if (addr > addrq)
3975 break;
3976 line += *p++;
3977 }
3978 return line;
3979}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003980
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003981/* The test for LOCAL must come before the test for FREE in order to
3982 handle classes where name is both local and free. The local var is
3983 a method and the free var is a free var referenced within a method.
3984*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003985
3986static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003987get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003988{
3989 PyObject *v;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00003990 if (c->c_symtable->st_nested_scopes) {
3991 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
3992 return CELL;
3993 if (PyDict_GetItemString(c->c_locals, name) != NULL)
3994 return LOCAL;
3995 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
3996 return FREE;
3997 v = PyDict_GetItemString(c->c_globals, name);
3998 if (v) {
3999 if (v == Py_None)
4000 return GLOBAL_EXPLICIT;
4001 else {
4002 return GLOBAL_IMPLICIT;
4003 }
4004 }
4005 } else {
4006 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4007 return LOCAL;
4008 v = PyDict_GetItemString(c->c_globals, name);
4009 if (v) {
4010 if (v == Py_None)
4011 return GLOBAL_EXPLICIT;
4012 else {
4013 return GLOBAL_IMPLICIT;
4014 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004015 }
4016 }
4017 {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004018 char buf[350];
4019 sprintf(buf,
4020 "unknown scope for %.100s in %.100s(%s) in %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00004021 name, c->c_name,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004022 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4023 c->c_filename);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004024 Py_FatalError(buf);
4025 }
4026 return -1; /* can't get here */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004027}
4028
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004029/* Helper function for setting lineno and filename */
4030
4031static void
4032set_error_location(char *filename, int lineno)
4033{
4034 PyObject *exc, *v, *tb, *tmp;
4035
4036 /* add attributes for the line number and filename for the error */
4037 PyErr_Fetch(&exc, &v, &tb);
4038 PyErr_NormalizeException(&exc, &v, &tb);
4039 tmp = PyInt_FromLong(lineno);
4040 if (tmp == NULL)
4041 PyErr_Clear();
4042 else {
4043 if (PyObject_SetAttrString(v, "lineno", tmp))
4044 PyErr_Clear();
4045 Py_DECREF(tmp);
4046 }
4047 if (filename != NULL) {
4048 tmp = PyString_FromString(filename);
4049 if (tmp == NULL)
4050 PyErr_Clear();
4051 else {
4052 if (PyObject_SetAttrString(v, "filename", tmp))
4053 PyErr_Clear();
4054 Py_DECREF(tmp);
4055 }
4056
4057 tmp = fetch_program_text(filename, lineno);
4058 if (tmp) {
4059 PyObject_SetAttrString(v, "text", tmp);
4060 Py_DECREF(tmp);
4061 }
4062 }
4063 PyErr_Restore(exc, v, tb);
4064}
4065
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004066static int
4067symtable_build(struct compiling *c, node *n)
4068{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004069 if ((c->c_symtable = symtable_init()) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004070 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004071 c->c_symtable->st_future = c->c_future;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004072 if (c->c_future->ff_nested_scopes)
4073 c->c_symtable->st_nested_scopes = 1;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004074 c->c_symtable->st_filename = c->c_filename;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004075 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
4076 if (c->c_symtable->st_errors > 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004077 return -1;
4078 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004079 if (c->c_symtable->st_errors > 0)
4080 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004081 /* reset for second pass */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004082 c->c_symtable->st_nscopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004083 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004084 return 0;
4085}
4086
4087static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004088symtable_init_compiling_symbols(struct compiling *c)
4089{
4090 PyObject *varnames;
4091
4092 varnames = c->c_symtable->st_cur->ste_varnames;
4093 if (varnames == NULL) {
4094 varnames = PyList_New(0);
4095 if (varnames == NULL)
4096 return -1;
4097 c->c_symtable->st_cur->ste_varnames = varnames;
4098 Py_INCREF(varnames);
4099 } else
4100 Py_INCREF(varnames);
4101 c->c_varnames = varnames;
4102
4103 c->c_globals = PyDict_New();
4104 if (c->c_globals == NULL)
4105 return -1;
4106 c->c_freevars = PyDict_New();
4107 if (c->c_freevars == NULL)
4108 return -1;
4109 c->c_cellvars = PyDict_New();
4110 if (c->c_cellvars == NULL)
4111 return -1;
4112 return 0;
4113}
4114
4115struct symbol_info {
4116 int si_nlocals;
4117 int si_ncells;
4118 int si_nfrees;
4119 int si_nimplicit;
4120};
4121
4122static void
4123symtable_init_info(struct symbol_info *si)
4124{
4125 si->si_nlocals = 0;
4126 si->si_ncells = 0;
4127 si->si_nfrees = 0;
4128 si->si_nimplicit = 0;
4129}
4130
4131static int
4132symtable_resolve_free(struct compiling *c, PyObject *name,
4133 struct symbol_info *si)
4134{
4135 PyObject *dict, *v;
4136
4137 /* Seperate logic for DEF_FREE. If it occurs in a function,
4138 it indicates a local that we must allocate storage for (a
4139 cell var). If it occurs in a class, then the class has a
4140 method and a free variable with the same name.
4141 */
4142
4143 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
4144 v = PyInt_FromLong(si->si_ncells++);
4145 dict = c->c_cellvars;
4146 } else {
4147 v = PyInt_FromLong(si->si_nfrees++);
4148 dict = c->c_freevars;
4149 }
4150 if (v == NULL)
4151 return -1;
4152 if (PyDict_SetItem(dict, name, v) < 0) {
4153 Py_DECREF(v);
4154 return -1;
4155 }
4156 Py_DECREF(v);
4157 return 0;
4158}
4159
4160static int
4161symtable_freevar_offsets(PyObject *freevars, int offset)
4162{
4163 PyObject *name, *v;
4164 int pos;
4165
4166 /* The cell vars are the first elements of the closure,
4167 followed by the free vars. Update the offsets in
4168 c_freevars to account for number of cellvars. */
4169 pos = 0;
4170 while (PyDict_Next(freevars, &pos, &name, &v)) {
4171 int i = PyInt_AS_LONG(v) + offset;
4172 PyObject *o = PyInt_FromLong(i);
4173 if (o == NULL)
4174 return -1;
4175 if (PyDict_SetItem(freevars, name, o) < 0) {
4176 Py_DECREF(o);
4177 return -1;
4178 }
4179 Py_DECREF(o);
4180 }
4181 return 0;
4182}
4183
4184static int
4185symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4186 struct symbol_info *si)
4187{
4188 if (ste->ste_type != TYPE_MODULE)
4189 c->c_flags |= CO_NEWLOCALS;
4190 if (ste->ste_type == TYPE_FUNCTION) {
4191 c->c_nlocals = si->si_nlocals;
4192 if (ste->ste_optimized == 0)
4193 c->c_flags |= CO_OPTIMIZED;
4194 else if (si->si_ncells || si->si_nfrees
4195 || (ste->ste_nested && si->si_nimplicit)
4196 || ste->ste_child_free) {
4197 if (c->c_symtable->st_nested_scopes) {
4198 PyErr_Format(PyExc_SyntaxError,
4199 ILLEGAL_DYNAMIC_SCOPE,
4200 PyString_AS_STRING(ste->ste_name));
4201 set_error_location(c->c_symtable->st_filename,
4202 ste->ste_lineno);
4203 return -1;
4204 } else {
4205 char buf[200];
4206 sprintf(buf, ILLEGAL_DYNAMIC_SCOPE,
4207 PyString_AS_STRING(ste->ste_name));
4208 if (PyErr_Warn(PyExc_SyntaxWarning,
4209 buf) < 0) {
4210 return -1;
4211 }
4212 }
4213 }
4214 }
4215 return 0;
4216}
4217
4218static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004219symtable_load_symbols(struct compiling *c)
4220{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004221 static PyObject *implicit = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004222 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004223 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004224 PyObject *name, *varnames, *v;
4225 int i, flags, pos;
4226 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004227
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004228 if (implicit == NULL) {
4229 implicit = PyInt_FromLong(1);
4230 if (implicit == NULL)
4231 return -1;
4232 }
4233 v = NULL;
4234
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004235 if (symtable_init_compiling_symbols(c) < 0)
4236 goto fail;
4237 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004238 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004239 si.si_nlocals = PyList_GET_SIZE(varnames);
4240 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004241
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004242 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004243 v = PyInt_FromLong(i);
4244 if (PyDict_SetItem(c->c_locals,
4245 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004246 goto fail;
4247 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004248 }
4249
4250 /* XXX The cases below define the rules for whether a name is
4251 local or global. The logic could probably be clearer. */
4252 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004253 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4254 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004255
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004256 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004257 /* undo the original DEF_FREE */
4258 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004259
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004260 if ((flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004261 && (flags & (DEF_LOCAL | DEF_PARAM)))
4262 symtable_resolve_free(c, name, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004263
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004264 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004265 c->c_argcount--;
4266 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004267 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004268 c->c_argcount--;
4269 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004270 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004271 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004272 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004273 if (flags & DEF_PARAM) {
4274 PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004275 PyString_AS_STRING(name));
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004276 set_error_location(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004277 ste->ste_lineno);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004278 st->st_errors++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004279 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004280 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004281 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4282 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004283 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004284 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004285 if (PyDict_SetItem(c->c_globals, name, implicit) < 0)
4286 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004287 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004288 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004289 if (v == NULL)
4290 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004291 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004292 goto fail;
4293 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004294 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004295 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004296 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004297 } else if (is_free(flags)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004298 if (ste->ste_nested && st->st_nested_scopes) {
4299 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004300 if (v == NULL)
4301 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004302 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004303 goto fail;
4304 Py_DECREF(v);
4305 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004306 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004307 if (PyDict_SetItem(c->c_globals, name,
4308 implicit) < 0)
4309 goto fail;
4310 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004311 }
4312 }
4313
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004314 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4315 return -1;
4316 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004317 fail:
4318 /* is this always the right thing to do? */
4319 Py_XDECREF(v);
4320 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004321}
4322
4323static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004324symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004325{
4326 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004327
4328 st = (struct symtable *)PyMem_Malloc(sizeof(struct symtable));
4329 if (st == NULL)
4330 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004331 st->st_pass = 1;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004332 st->st_nested_scopes = NESTED_SCOPES_DEFAULT;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004333 st->st_filename = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004334 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004335 goto fail;
4336 if ((st->st_symbols = PyDict_New()) == NULL)
4337 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004338 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004339 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004340 st->st_errors = 0;
4341 st->st_tmpname = 0;
4342 st->st_private = NULL;
4343 return st;
4344 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004345 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004346 return NULL;
4347}
4348
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004349void
4350PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004351{
4352 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004353 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004354 Py_XDECREF(st->st_cur);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004355 PyMem_Free((void *)st);
4356}
4357
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004358/* When the compiler exits a scope, it must should update the scope's
4359 free variable information with the list of free variables in its
4360 children.
4361
4362 Variables that are free in children and defined in the current
4363 scope are cellvars.
4364
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004365 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004366 false), free variables in children that are not defined here are
4367 implicit globals.
4368
4369*/
4370
4371static int
4372symtable_update_free_vars(struct symtable *st)
4373{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004374 int i, j, def;
4375 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004376 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004377
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004378 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004379 def = DEF_FREE_CLASS;
4380 else
4381 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004382 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004383 int pos = 0;
4384
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004385 if (list)
4386 PyList_SetSlice(list, 0,
4387 ((PyVarObject*)list)->ob_size, 0);
Barry Warsaw0372af72001-02-23 18:22:59 +00004388 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004389 PyList_GET_ITEM(ste->ste_children, i);
4390 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004391 int v = PyInt_AS_LONG(o);
4392 if (!(is_free(v)))
4393 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004394 if (list == NULL) {
4395 list = PyList_New(0);
4396 if (list == NULL)
4397 return -1;
4398 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004399 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004400 if (PyList_Append(list, name) < 0) {
4401 Py_DECREF(list);
4402 return -1;
4403 }
4404 }
4405 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
4406 name = PyList_GET_ITEM(list, j);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004407 if (ste->ste_nested) {
4408 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004409 name, def) < 0) {
4410 Py_DECREF(list);
4411 return -1;
4412 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004413 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004414 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004415 name) < 0) {
4416 Py_DECREF(list);
4417 return -1;
4418 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004419 }
4420 }
4421 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004422
4423 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004424 return 0;
4425}
4426
4427/* If the current scope is a non-nested class or if name is not
4428 defined in the current, non-nested scope, then it is an implicit
4429 global in all nested scopes.
4430*/
4431
4432static int
4433symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
4434{
4435 PyObject *o;
4436 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004437 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004438
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004439 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004440 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004441 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004442 if (o == NULL)
4443 return symtable_undo_free(st, child, name);
4444 v = PyInt_AS_LONG(o);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004445 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004446 return symtable_undo_free(st, child, name);
4447 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004448 return symtable_add_def_o(st, ste->ste_symbols,
4449 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004450}
4451
4452static int
4453symtable_undo_free(struct symtable *st, PyObject *id,
4454 PyObject *name)
4455{
4456 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004457 PyObject *info;
4458 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004459
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004460 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
4461 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004462 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004463 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004464 if (info == NULL)
4465 return 0;
4466 v = PyInt_AS_LONG(info);
4467 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004468 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004469 DEF_FREE_GLOBAL) < 0)
4470 return -1;
4471 } else
4472 /* If the name is defined here or declared global,
4473 then the recursion stops. */
4474 return 0;
4475
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004476 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
4477 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00004478 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004479 PyList_GET_ITEM(ste->ste_children, i);
4480 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004481 if (x < 0)
4482 return x;
4483 }
4484 return 0;
4485}
4486
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004487/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
4488 This reference is released when the scope is exited, via the DECREF
4489 in symtable_exit_scope().
4490*/
4491
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004492static int
4493symtable_exit_scope(struct symtable *st)
4494{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004495 int end;
4496
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004497 if (st->st_pass == 1 && st->st_nested_scopes)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004498 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004499 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004500 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004501 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
4502 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004503 if (PySequence_DelItem(st->st_stack, end) < 0)
4504 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004505 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004506}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004507
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004508static void
4509symtable_enter_scope(struct symtable *st, char *name, int type,
4510 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004511{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004512 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004513
4514 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004515 prev = st->st_cur;
4516 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
4517 Py_DECREF(st->st_cur);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004518 st->st_errors++;
4519 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004520 }
4521 }
Barry Warsaw0372af72001-02-23 18:22:59 +00004522 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004523 PySymtableEntry_New(st, name, type, lineno);
4524 if (strcmp(name, TOP) == 0)
4525 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004526 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004527 if (PyList_Append(prev->ste_children,
4528 (PyObject *)st->st_cur) < 0)
4529 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004530 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004531}
4532
4533static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004534symtable_lookup(struct symtable *st, char *name)
4535{
4536 char buffer[MANGLE_LEN];
4537 PyObject *v;
4538 int flags;
4539
4540 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
4541 name = buffer;
4542 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
4543 if (v == NULL) {
4544 if (PyErr_Occurred())
4545 return -1;
4546 else
4547 return 0;
4548 }
4549
4550 flags = PyInt_AS_LONG(v);
4551 return flags;
4552}
4553
4554static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004555symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004556{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004557 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004558 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004559 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004560
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004561 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004562 name = buffer;
4563 if ((s = PyString_InternFromString(name)) == NULL)
4564 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004565 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
4566 Py_DECREF(s);
4567 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004568}
4569
4570/* Must only be called with mangled names */
4571
4572static int
4573symtable_add_def_o(struct symtable *st, PyObject *dict,
4574 PyObject *name, int flag)
4575{
4576 PyObject *o;
4577 int val;
4578
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004579 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004580 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004581 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004582 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00004583 PyString_AsString(name));
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004584 set_error_location(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004585 st->st_cur->ste_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004586 return -1;
4587 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004588 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004589 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004590 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004591 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004592 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004593 Py_DECREF(o);
4594 return -1;
4595 }
4596 Py_DECREF(o);
4597
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004598 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004599 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004600 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004601 } else if (flag & DEF_GLOBAL) {
4602 /* XXX need to update DEF_GLOBAL for other flags too;
4603 perhaps only DEF_FREE_GLOBAL */
4604 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004605 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004606 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004607 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004608 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004609 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004610 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004611 Py_DECREF(o);
4612 return -1;
4613 }
4614 Py_DECREF(o);
4615 }
4616 return 0;
4617}
4618
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004619#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004620
4621static void
4622symtable_node(struct symtable *st, node *n)
4623{
4624 int i, start = 0;
4625
4626 loop:
4627 switch (TYPE(n)) {
4628 case funcdef: {
4629 char *func_name = STR(CHILD(n, 1));
4630 symtable_add_def(st, func_name, DEF_LOCAL);
4631 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004632 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004633 symtable_funcdef(st, n);
4634 symtable_exit_scope(st);
4635 break;
4636 }
4637 case lambdef:
4638 if (NCH(n) == 4)
4639 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004640 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004641 symtable_funcdef(st, n);
4642 symtable_exit_scope(st);
4643 break;
4644 case classdef: {
4645 char *tmp, *class_name = STR(CHILD(n, 1));
4646 symtable_add_def(st, class_name, DEF_LOCAL);
4647 if (TYPE(CHILD(n, 2)) == LPAR) {
4648 node *bases = CHILD(n, 3);
4649 int i;
4650 for (i = 0; i < NCH(bases); i += 2) {
4651 symtable_node(st, CHILD(bases, i));
4652 }
4653 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004654 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004655 tmp = st->st_private;
4656 st->st_private = class_name;
4657 symtable_node(st, CHILD(n, NCH(n) - 1));
4658 st->st_private = tmp;
4659 symtable_exit_scope(st);
4660 break;
4661 }
4662 case if_stmt:
4663 for (i = 0; i + 3 < NCH(n); i += 4) {
4664 if (is_constant_false(NULL, (CHILD(n, i + 1))))
4665 continue;
4666 symtable_node(st, CHILD(n, i + 1));
4667 symtable_node(st, CHILD(n, i + 3));
4668 }
4669 if (i + 2 < NCH(n))
4670 symtable_node(st, CHILD(n, i + 2));
4671 break;
4672 case global_stmt:
4673 symtable_global(st, n);
4674 break;
4675 case import_stmt:
4676 symtable_import(st, n);
4677 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004678 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004679 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004680 symtable_node(st, CHILD(n, 1));
4681 if (NCH(n) > 2)
4682 symtable_node(st, CHILD(n, 3));
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004683 else
4684 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004685 if (NCH(n) > 4)
4686 symtable_node(st, CHILD(n, 5));
4687 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004688
4689 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00004690 case assert_stmt:
4691 if (Py_OptimizeFlag)
4692 return;
4693 if (NCH(n) == 2) {
4694 n = CHILD(n, 1);
4695 goto loop;
4696 } else {
4697 symtable_node(st, CHILD(n, 1));
4698 n = CHILD(n, 3);
4699 goto loop;
4700 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004701 case except_clause:
4702 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004703 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004704 if (NCH(n) > 1) {
4705 n = CHILD(n, 1);
4706 goto loop;
4707 }
4708 break;
4709 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004710 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004711 break;
4712 case expr_stmt:
4713 if (NCH(n) == 1)
4714 n = CHILD(n, 0);
4715 else {
4716 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004717 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004718 symtable_node(st, CHILD(n, 2));
4719 break;
4720 } else {
4721 int i;
4722 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004723 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004724 n = CHILD(n, NCH(n) - 1);
4725 }
4726 }
4727 goto loop;
4728 /* watchout for fall-through logic below */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004729 case argument:
4730 if (NCH(n) == 3) {
4731 n = CHILD(n, 2);
4732 goto loop;
4733 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004734 case listmaker:
4735 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
4736 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton5f827f42001-01-23 01:26:20 +00004737 n = CHILD(n, 0);
4738 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004739 }
4740 case atom:
4741 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
4742 symtable_add_use(st, STR(CHILD(n, 0)));
4743 break;
4744 }
4745 case for_stmt:
4746 if (TYPE(n) == for_stmt) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004747 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004748 start = 3;
4749 }
4750 default:
4751 if (NCH(n) == 1) {
4752 n = CHILD(n, 0);
4753 goto loop;
4754 }
4755 for (i = start; i < NCH(n); ++i)
4756 if (TYPE(CHILD(n, i)) >= single_input)
4757 symtable_node(st, CHILD(n, i));
4758 }
4759}
4760
4761static void
4762symtable_funcdef(struct symtable *st, node *n)
4763{
4764 node *body;
4765
4766 if (TYPE(n) == lambdef) {
4767 if (NCH(n) == 4)
4768 symtable_params(st, CHILD(n, 1));
4769 } else
4770 symtable_params(st, CHILD(n, 2));
4771 body = CHILD(n, NCH(n) - 1);
4772 symtable_node(st, body);
4773}
4774
4775/* The next two functions parse the argument tuple.
4776 symtable_default_arg() checks for names in the default arguments,
4777 which are references in the defining scope. symtable_params()
4778 parses the parameter names, which are defined in the function's
4779 body.
4780
4781 varargslist:
4782 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
4783 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
4784*/
4785
4786static void
4787symtable_default_args(struct symtable *st, node *n)
4788{
4789 node *c;
4790 int i;
4791
4792 if (TYPE(n) == parameters) {
4793 n = CHILD(n, 1);
4794 if (TYPE(n) == RPAR)
4795 return;
4796 }
4797 REQ(n, varargslist);
4798 for (i = 0; i < NCH(n); i += 2) {
4799 c = CHILD(n, i);
4800 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
4801 break;
4802 }
4803 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
4804 symtable_node(st, CHILD(n, i));
4805 }
4806}
4807
4808static void
4809symtable_params(struct symtable *st, node *n)
4810{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004811 int i, complex = -1, ext = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004812 node *c = NULL;
4813
4814 if (TYPE(n) == parameters) {
4815 n = CHILD(n, 1);
4816 if (TYPE(n) == RPAR)
4817 return;
4818 }
4819 REQ(n, varargslist);
4820 for (i = 0; i < NCH(n); i += 2) {
4821 c = CHILD(n, i);
4822 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
4823 ext = 1;
4824 break;
4825 }
4826 if (TYPE(c) == test) {
4827 continue;
4828 }
4829 if (TYPE(CHILD(c, 0)) == NAME)
4830 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
4831 else {
4832 char nbuf[10];
4833 sprintf(nbuf, ".%d", i);
4834 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004835 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004836 }
4837 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004838 if (ext) {
4839 c = CHILD(n, i);
4840 if (TYPE(c) == STAR) {
4841 i++;
4842 symtable_add_def(st, STR(CHILD(n, i)),
4843 DEF_PARAM | DEF_STAR);
4844 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00004845 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004846 c = NULL;
4847 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004848 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004849 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004850 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004851 i++;
4852 symtable_add_def(st, STR(CHILD(n, i)),
4853 DEF_PARAM | DEF_DOUBLESTAR);
4854 }
4855 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004856 if (complex >= 0) {
4857 int j;
4858 for (j = 0; j <= complex; j++) {
4859 c = CHILD(n, j);
4860 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00004861 c = CHILD(n, ++j);
4862 else if (TYPE(c) == EQUAL)
4863 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004864 if (TYPE(CHILD(c, 0)) == LPAR)
4865 symtable_params_fplist(st, CHILD(c, 1));
4866 }
4867 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004868}
4869
4870static void
4871symtable_params_fplist(struct symtable *st, node *n)
4872{
4873 int i;
4874 node *c;
4875
4876 REQ(n, fplist);
4877 for (i = 0; i < NCH(n); i += 2) {
4878 c = CHILD(n, i);
4879 REQ(c, fpdef);
4880 if (NCH(c) == 1)
4881 symtable_add_def(st, STR(CHILD(c, 0)),
4882 DEF_PARAM | DEF_INTUPLE);
4883 else
4884 symtable_params_fplist(st, CHILD(c, 1));
4885 }
4886
4887}
4888
4889static void
4890symtable_global(struct symtable *st, node *n)
4891{
4892 int i;
4893
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004894 for (i = 1; i < NCH(n); i += 2) {
4895 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00004896 int flags;
4897
4898 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004899 if (flags < 0)
4900 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00004901 if (flags && flags != DEF_GLOBAL) {
4902 char buf[500];
4903 if (flags & DEF_PARAM) {
4904 PyErr_Format(PyExc_SyntaxError,
4905 "name '%.400s' is local and global",
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004906 name);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00004907 set_error_location(st->st_filename,
4908 st->st_cur->ste_lineno);
4909 st->st_errors++;
4910 return;
4911 } else if (flags & DEF_LOCAL) {
4912 sprintf(buf, GLOBAL_AFTER_ASSIGN, name);
4913 if (PyErr_Warn(PyExc_SyntaxWarning,
4914 buf) < 0) {
4915 /* XXX set line number? */
4916 st->st_errors++;
4917 }
4918 } else {
4919 sprintf(buf, GLOBAL_AFTER_USE, name);
4920 if (PyErr_Warn(PyExc_SyntaxWarning,
4921 buf) < 0) {
4922 /* XXX set line number? */
4923 st->st_errors++;
4924 }
4925 }
4926 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004927 symtable_add_def(st, name, DEF_GLOBAL);
4928 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004929}
4930
4931static void
4932symtable_list_comprehension(struct symtable *st, node *n)
4933{
4934 char tmpname[12];
4935
Tim Peters30814212001-02-17 05:30:26 +00004936 sprintf(tmpname, "_[%d]", ++st->st_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004937 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004938 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004939 symtable_node(st, CHILD(n, 3));
4940 if (NCH(n) == 5)
4941 symtable_node(st, CHILD(n, 4));
4942 --st->st_tmpname;
4943}
4944
4945static void
4946symtable_import(struct symtable *st, node *n)
4947{
4948 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004949 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004950 | 'from' dotted_name 'import'
4951 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00004952 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004953 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004954 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004955 node *dotname = CHILD(n, 1);
4956 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
4957 /* check for bogus imports */
4958 if (n->n_lineno >= st->st_future->ff_last_lineno) {
4959 PyErr_SetString(PyExc_SyntaxError,
4960 LATE_FUTURE);
4961 set_error_location(st->st_filename,
4962 n->n_lineno);
4963 st->st_errors++;
4964 return;
4965 }
4966 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004967 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004968 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004969 } else {
4970 for (i = 3; i < NCH(n); i += 2) {
4971 node *c = CHILD(n, i);
4972 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004973 symtable_assign(st, CHILD(c, 2),
4974 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004975 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004976 symtable_assign(st, CHILD(c, 0),
4977 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004978 }
4979 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004980 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004981 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004982 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004983 }
4984 }
4985}
4986
4987static void
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004988symtable_assign(struct symtable *st, node *n, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004989{
4990 node *tmp;
4991 int i;
4992
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004993 loop:
4994 switch (TYPE(n)) {
4995 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004996 /* invalid assignment, e.g. lambda x:x=2. The next
4997 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004998 return;
4999 case power:
5000 if (NCH(n) > 2) {
5001 for (i = 2; i < NCH(n); ++i)
5002 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
5003 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005004 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005005 if (NCH(n) > 1) {
5006 symtable_node(st, CHILD(n, 0));
5007 symtable_node(st, CHILD(n, 1));
5008 } else {
5009 n = CHILD(n, 0);
5010 goto loop;
5011 }
5012 return;
5013 case listmaker:
5014 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
5015 symtable_list_comprehension(st, CHILD(n, 1));
5016 else {
5017 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005018 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005019 }
5020 return;
5021 case exprlist:
5022 case testlist:
5023 if (NCH(n) == 1) {
5024 n = CHILD(n, 0);
5025 goto loop;
5026 }
5027 else {
5028 int i;
5029 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005030 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005031 return;
5032 }
5033 goto loop;
5034 case atom:
5035 tmp = CHILD(n, 0);
5036 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
5037 n = CHILD(n, 1);
5038 goto loop;
5039 } else if (TYPE(tmp) == NAME)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005040 symtable_add_def(st, STR(tmp), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005041 return;
5042 case dotted_as_name:
5043 if (NCH(n) == 3)
5044 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005045 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005046 else
5047 symtable_add_def(st,
5048 STR(CHILD(CHILD(n,
5049 0), 0)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005050 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005051 return;
5052 case dotted_name:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005053 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005054 return;
5055 case NAME:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005056 symtable_add_def(st, STR(n), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005057 return;
5058 default:
5059 if (NCH(n) == 0)
5060 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00005061 if (NCH(n) == 1) {
5062 n = CHILD(n, 0);
5063 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005064 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00005065 /* Should only occur for errors like x + 1 = 1,
5066 which will be caught in the next pass. */
5067 for (i = 0; i < NCH(n); ++i)
5068 if (TYPE(CHILD(n, i)) >= single_input)
5069 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005070 }
5071}