blob: f553262de14bdc53162b602cfed1b549d335fb49 [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
Jeremy Hylton78891072001-03-01 06:09:34 +0000182/* XXX code objects need to participate in GC? */
183
Guido van Rossum79f25d91997-04-29 20:08:16 +0000184PyTypeObject PyCode_Type = {
185 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000186 0,
187 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000188 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000189 0,
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000190 (destructor)code_dealloc, /*tp_dealloc*/
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000191 0, /*tp_print*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000192 (getattrfunc)code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000193 0, /*tp_setattr*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000194 (cmpfunc)code_compare, /*tp_compare*/
195 (reprfunc)code_repr, /*tp_repr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000196 0, /*tp_as_number*/
197 0, /*tp_as_sequence*/
198 0, /*tp_as_mapping*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000199 (hashfunc)code_hash, /*tp_hash*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000200};
201
Guido van Rossum644a12b1997-04-09 19:24:53 +0000202#define NAME_CHARS \
203 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
204
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000205/* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
206
207static int
208all_name_chars(unsigned char *s)
209{
Guido van Rossumcd90c202001-02-09 15:06:42 +0000210 static char ok_name_char[256];
211 static unsigned char *name_chars = (unsigned char *)NAME_CHARS;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000212
Guido van Rossumcd90c202001-02-09 15:06:42 +0000213 if (ok_name_char[*name_chars] == 0) {
214 unsigned char *p;
215 for (p = name_chars; *p; p++)
216 ok_name_char[*p] = 1;
217 }
218 while (*s) {
219 if (ok_name_char[*s++] == 0)
220 return 0;
221 }
222 return 1;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000223}
224
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000225static int
226intern_strings(PyObject *tuple)
227{
228 int i;
229
230 for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) {
231 PyObject *v = PyTuple_GET_ITEM(tuple, i);
232 if (v == NULL || !PyString_Check(v)) {
233 Py_FatalError("non-string found in code slot");
234 PyErr_BadInternalCall();
235 return -1;
236 }
237 PyString_InternInPlace(&PyTuple_GET_ITEM(tuple, i));
238 }
239 return 0;
240}
241
Guido van Rossum79f25d91997-04-29 20:08:16 +0000242PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000243PyCode_New(int argcount, int nlocals, int stacksize, int flags,
244 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000245 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
246 PyObject *filename, PyObject *name, int firstlineno,
247 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000248{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000249 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000250 int i;
Guido van Rossumd076c731998-10-07 19:42:25 +0000251 PyBufferProcs *pb;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000252 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000253 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000254 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000255 consts == NULL || !PyTuple_Check(consts) ||
256 names == NULL || !PyTuple_Check(names) ||
257 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000258 freevars == NULL || !PyTuple_Check(freevars) ||
259 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000260 name == NULL || !PyString_Check(name) ||
261 filename == NULL || !PyString_Check(filename) ||
262 lnotab == NULL || !PyString_Check(lnotab)) {
263 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000264 return NULL;
265 }
Guido van Rossumd076c731998-10-07 19:42:25 +0000266 pb = code->ob_type->tp_as_buffer;
267 if (pb == NULL ||
268 pb->bf_getreadbuffer == NULL ||
269 pb->bf_getsegcount == NULL ||
270 (*pb->bf_getsegcount)(code, NULL) != 1)
271 {
272 PyErr_BadInternalCall();
273 return NULL;
274 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000275 intern_strings(names);
276 intern_strings(varnames);
277 if (freevars == NULL)
278 freevars = PyTuple_New(0);
279 intern_strings(freevars);
280 if (cellvars == NULL)
281 cellvars = PyTuple_New(0);
282 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000283 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000284 for (i = PyTuple_Size(consts); --i >= 0; ) {
285 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000286 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000287 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000288 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000289 continue;
290 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000291 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000292 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000293 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000294 co->co_argcount = argcount;
295 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000296 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000297 co->co_flags = flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000298 Py_INCREF(code);
Guido van Rossumd076c731998-10-07 19:42:25 +0000299 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000300 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000301 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000302 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000303 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000304 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000305 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000306 Py_INCREF(freevars);
307 co->co_freevars = freevars;
308 Py_INCREF(cellvars);
309 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000310 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000311 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000312 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000313 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000314 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000315 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000316 co->co_lnotab = lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000317 }
318 return co;
319}
320
321
322/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000323
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000324/* The compiler uses two passes to generate bytecodes. The first pass
325 builds the symbol table. The second pass generates the bytecode.
326
327 The first pass uses a single symtable struct. The second pass uses
328 a compiling struct for each code block. The compiling structs
329 share a reference to the symtable.
330
331 The two passes communicate via symtable_load_symbols() and via
332 is_local() and is_global(). The former initializes several slots
333 in the compiling struct: c_varnames, c_locals, c_nlocals,
334 c_argcount, c_globals, and c_flags.
335*/
336
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000337struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000338 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000339 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000340 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000341 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000342 PyObject *c_name_dict; /* inverse of c_names */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000343 PyObject *c_globals; /* dictionary (value=None) */
344 PyObject *c_locals; /* dictionary (value=localID) */
345 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000346 PyObject *c_freevars; /* dictionary (value=None) */
347 PyObject *c_cellvars; /* list */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000348 int c_nlocals; /* index of next local */
349 int c_argcount; /* number of top-level arguments */
350 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000351 int c_nexti; /* index into c_code */
352 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000353 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000354 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000355 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000356 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000357 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000358 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000359 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000360 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000361 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000362 int c_stacklevel; /* Current stack level */
363 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000364 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000365 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000366 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000367 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000368 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000369 int c_nested; /* Is block nested funcdef or lamdef? */
370 int c_closure; /* Is nested w/freevars? */
371 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000372 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000373};
374
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000375int is_free(int v)
376{
377 if ((v & (USE | DEF_FREE))
378 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
379 return 1;
380 if (v & DEF_FREE_CLASS)
381 return 1;
382 return 0;
383}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000384
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000385static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000386com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000387{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000388 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
389
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000390 if (c == NULL) {
391 /* Error occurred via symtable call to
392 is_constant_false */
393 PyErr_SetString(exc, msg);
394 return;
395 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000396 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000397 if (c->c_lineno < 1 || c->c_interactive) {
398 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000399 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000400 return;
401 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000402 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000403 if (v == NULL)
404 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000405
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000406 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000407 if (line == NULL) {
408 Py_INCREF(Py_None);
409 line = Py_None;
410 }
411 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
412 Py_None, line);
413 if (t == NULL)
414 goto exit;
415 w = Py_BuildValue("(OO)", v, t);
416 if (w == NULL)
417 goto exit;
418 PyErr_SetObject(exc, w);
419 exit:
420 Py_XDECREF(t);
421 Py_XDECREF(v);
422 Py_XDECREF(w);
423 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000424}
425
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000426/* Interface to the block stack */
427
428static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000429block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000430{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000431 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000432 com_error(c, PyExc_SystemError,
433 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000434 }
435 else {
436 c->c_block[c->c_nblocks++] = type;
437 }
438}
439
440static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000441block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000442{
443 if (c->c_nblocks > 0)
444 c->c_nblocks--;
445 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000446 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000447 }
448}
449
Guido van Rossum681d79a1995-07-18 14:51:37 +0000450/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000451
Tim Petersdbd9ba62000-07-09 03:09:57 +0000452static int com_init(struct compiling *, char *);
453static void com_free(struct compiling *);
454static void com_push(struct compiling *, int);
455static void com_pop(struct compiling *, int);
456static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000457static void com_node(struct compiling *, node *);
458static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000459static void com_addbyte(struct compiling *, int);
460static void com_addint(struct compiling *, int);
461static void com_addoparg(struct compiling *, int, int);
462static void com_addfwref(struct compiling *, int, int *);
463static void com_backpatch(struct compiling *, int);
464static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
465static int com_addconst(struct compiling *, PyObject *);
466static int com_addname(struct compiling *, PyObject *);
467static void com_addopname(struct compiling *, int, node *);
468static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000469static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000470static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000471static void com_assign(struct compiling *, node *, int, node *);
472static void com_assign_name(struct compiling *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000473static PyCodeObject *icompile(node *, struct compiling *);
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000474static PyCodeObject *jcompile(node *, char *, struct compiling *,
475 PyCompilerFlags *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000476static PyObject *parsestrplus(node *);
477static PyObject *parsestr(char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000478static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000479
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000480static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000481
482/* symtable operations */
483static int symtable_build(struct compiling *, node *);
484static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000485static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000486static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000487static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000488static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000489static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000490
491static void symtable_node(struct symtable *, node *);
492static void symtable_funcdef(struct symtable *, node *);
493static void symtable_default_args(struct symtable *, node *);
494static void symtable_params(struct symtable *, node *);
495static void symtable_params_fplist(struct symtable *, node *n);
496static void symtable_global(struct symtable *, node *);
497static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000498static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000499static void symtable_list_comprehension(struct symtable *, node *);
500
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000501static int symtable_update_free_vars(struct symtable *);
502static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
503static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
504
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000505/* helper */
506static void
507do_pad(int pad)
508{
509 int i;
510 for (i = 0; i < pad; ++i)
511 fprintf(stderr, " ");
512}
513
514static void
515dump(node *n, int pad, int depth)
516{
517 int i;
518 if (depth == 0)
519 return;
520 do_pad(pad);
521 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
522 if (depth > 0)
523 depth--;
524 for (i = 0; i < NCH(n); ++i)
525 dump(CHILD(n, i), pad + 1, depth);
526}
527
528#define DUMP(N) dump(N, 0, -1)
529
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000530static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000531com_init(struct compiling *c, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000532{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000533 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000534 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
535 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000536 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000537 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000538 goto fail;
539 if ((c->c_const_dict = PyDict_New()) == NULL)
540 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000541 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000542 goto fail;
543 if ((c->c_name_dict = PyDict_New()) == NULL)
544 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000545 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000546 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000547 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
548 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000549 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000550 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000551 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000552 c->c_freevars = NULL;
553 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000554 c->c_nlocals = 0;
555 c->c_argcount = 0;
556 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000557 c->c_nexti = 0;
558 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000559 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000560 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000561 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000562 c->c_begin = 0;
563 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000564 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000565 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000566 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000567 c->c_stacklevel = 0;
568 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000569 c->c_firstlineno = 0;
570 c->c_last_addr = 0;
571 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000572 c->c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000573 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000574 c->c_nested = 0;
575 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000576 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000577 return 1;
578
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000579 fail:
580 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000581 return 0;
582}
583
584static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000585com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000586{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000587 Py_XDECREF(c->c_code);
588 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000589 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000590 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000591 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000592 Py_XDECREF(c->c_globals);
593 Py_XDECREF(c->c_locals);
594 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000595 Py_XDECREF(c->c_freevars);
596 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000597 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +0000598 if (c->c_future)
599 PyMem_Free((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000600}
601
602static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000603com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000604{
605 c->c_stacklevel += n;
606 if (c->c_stacklevel > c->c_maxstacklevel)
607 c->c_maxstacklevel = c->c_stacklevel;
608}
609
610static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000611com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000612{
613 if (c->c_stacklevel < n) {
Guido van Rossum90f827c1998-08-25 18:22:17 +0000614 /* fprintf(stderr,
Guido van Rossum8b993a91997-01-17 21:04:03 +0000615 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
616 c->c_filename, c->c_lineno,
Guido van Rossum90f827c1998-08-25 18:22:17 +0000617 c->c_nexti, c->c_stacklevel, n); */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000618 c->c_stacklevel = 0;
619 }
620 else
621 c->c_stacklevel -= n;
622}
623
624static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000625com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000626{
627 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000628 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000629 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000630 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000631}
632
633static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000634com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000635{
636 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000637 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000638 assert(byte >= 0 && byte <= 255);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000639 if (byte < 0 || byte > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000640 com_error(c, PyExc_SystemError,
641 "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000642 }
643 if (c->c_code == NULL)
644 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000645 len = PyString_Size(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000646 if (c->c_nexti >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000647 if (_PyString_Resize(&c->c_code, len+1000) != 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000648 c->c_errors++;
649 return;
650 }
651 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000652 PyString_AsString(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000653}
654
655static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000656com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000657{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000658 com_addbyte(c, x & 0xff);
659 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000660}
661
662static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000663com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000664{
665 int size;
666 char *p;
667 if (c->c_lnotab == NULL)
668 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000669 size = PyString_Size(c->c_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000670 if (c->c_lnotab_next+2 > size) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000671 if (_PyString_Resize(&c->c_lnotab, size + 1000) < 0) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000672 c->c_errors++;
673 return;
674 }
675 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000676 p = PyString_AsString(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000677 *p++ = addr;
678 *p++ = line;
679 c->c_lnotab_next += 2;
680}
681
682static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000683com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000684{
685 c->c_lineno = lineno;
686 if (c->c_firstlineno == 0) {
687 c->c_firstlineno = c->c_last_line = lineno;
688 }
689 else {
690 int incr_addr = c->c_nexti - c->c_last_addr;
691 int incr_line = lineno - c->c_last_line;
692 while (incr_addr > 0 || incr_line > 0) {
693 int trunc_addr = incr_addr;
694 int trunc_line = incr_line;
695 if (trunc_addr > 255)
696 trunc_addr = 255;
697 if (trunc_line > 255)
698 trunc_line = 255;
699 com_add_lnotab(c, trunc_addr, trunc_line);
700 incr_addr -= trunc_addr;
701 incr_line -= trunc_line;
702 }
703 c->c_last_addr = c->c_nexti;
704 c->c_last_line = lineno;
705 }
706}
707
708static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000709com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000710{
Fred Drakeef8ace32000-08-24 00:32:09 +0000711 int extended_arg = arg >> 16;
Guido van Rossum8e793d91997-03-03 19:13:14 +0000712 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000713 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000714 if (Py_OptimizeFlag)
715 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000716 }
Fred Drakeef8ace32000-08-24 00:32:09 +0000717 if (extended_arg){
718 com_addbyte(c, EXTENDED_ARG);
719 com_addint(c, extended_arg);
720 arg &= 0xffff;
721 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000722 com_addbyte(c, op);
723 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000724}
725
726static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000727com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000728{
729 /* Compile a forward reference for backpatching */
730 int here;
731 int anchor;
732 com_addbyte(c, op);
733 here = c->c_nexti;
734 anchor = *p_anchor;
735 *p_anchor = here;
736 com_addint(c, anchor == 0 ? 0 : here - anchor);
737}
738
739static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000740com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000741{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000742 unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000743 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000744 int dist;
745 int prev;
746 for (;;) {
747 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000748 prev = code[anchor] + (code[anchor+1] << 8);
749 dist = target - (anchor+2);
750 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +0000751 dist >>= 8;
752 code[anchor+1] = dist;
753 dist >>= 8;
754 if (dist) {
755 com_error(c, PyExc_SystemError,
756 "com_backpatch: offset too large");
757 break;
758 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000759 if (!prev)
760 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000761 anchor -= prev;
762 }
763}
764
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000765/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000766
767static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000768com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000769{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000770 PyObject *w, *t, *np=NULL;
771 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000772
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000773 t = Py_BuildValue("(OO)", v, v->ob_type);
774 if (t == NULL)
775 goto fail;
776 w = PyDict_GetItem(dict, t);
777 if (w != NULL) {
778 n = PyInt_AsLong(w);
779 } else {
780 n = PyList_Size(list);
781 np = PyInt_FromLong(n);
782 if (np == NULL)
783 goto fail;
784 if (PyList_Append(list, v) != 0)
785 goto fail;
786 if (PyDict_SetItem(dict, t, np) != 0)
787 goto fail;
788 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000789 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000790 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000791 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000792 fail:
793 Py_XDECREF(np);
794 Py_XDECREF(t);
795 c->c_errors++;
796 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000797}
798
799static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000800com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000801{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000802 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000803}
804
805static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000806com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000807{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000808 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000809}
810
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000811static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000812mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000813{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000814 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000815 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +0000816 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000817 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
818 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000819 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000820 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000821 return 0; /* Don't mangle __extremely_long_names */
822 if (name[nlen-1] == '_' && name[nlen-2] == '_')
823 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000824 /* Strip leading underscores from class name */
825 while (*p == '_')
826 p++;
827 if (*p == '\0')
828 return 0; /* Don't mangle if class is just underscores */
829 plen = strlen(p);
830 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000831 plen = maxlen-nlen-2; /* Truncate class name if too long */
832 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000833 buffer[0] = '_';
834 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000835 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000836 return 1;
837}
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000838
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000839static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000840com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000841{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000842 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000843 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000844 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000845
846 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000847 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000848 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000849 c->c_errors++;
850 i = 255;
851 }
852 else {
853 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000854 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000855 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000856 com_addoparg(c, op, i);
857}
858
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000859#define NAME_LOCAL 0
860#define NAME_GLOBAL 1
861#define NAME_DEFAULT 2
862#define NAME_CLOSURE 3
863
864static int
865com_lookup_arg(PyObject *dict, PyObject *name)
866{
867 PyObject *v = PyDict_GetItem(dict, name);
868 if (v == NULL)
869 return -1;
870 else
871 return PyInt_AS_LONG(v);
872}
873
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000874static void
875com_addop_varname(struct compiling *c, int kind, char *name)
876{
877 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000878 int i, reftype;
879 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000880 int op = STOP_CODE;
881 char buffer[MANGLE_LEN];
882
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000883 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000884 name = buffer;
885 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
886 c->c_errors++;
887 i = 255;
888 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000889 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000890
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000891 reftype = get_ref_type(c, name);
892 switch (reftype) {
893 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000894 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000895 scope = NAME_LOCAL;
896 break;
897 case GLOBAL_EXPLICIT:
898 scope = NAME_GLOBAL;
899 break;
900 case GLOBAL_IMPLICIT:
901 if (c->c_flags & CO_OPTIMIZED)
902 scope = NAME_GLOBAL;
903 break;
904 case FREE:
905 case CELL:
906 scope = NAME_CLOSURE;
907 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000908 }
909
910 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000911 if (scope == NAME_LOCAL)
912 i = com_lookup_arg(c->c_locals, v);
913 else if (reftype == FREE)
914 i = com_lookup_arg(c->c_freevars, v);
915 else if (reftype == CELL)
916 i = com_lookup_arg(c->c_cellvars, v);
917 if (i == -1) {
918 c->c_errors++; /* XXX no exception set */
919 i = 255;
920 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000921 }
922 Py_DECREF(v);
923
924 switch (kind) {
925 case VAR_LOAD:
926 switch (scope) {
927 case NAME_LOCAL:
928 op = LOAD_FAST;
929 break;
930 case NAME_GLOBAL:
931 op = LOAD_GLOBAL;
932 break;
933 case NAME_DEFAULT:
934 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000935 break;
936 case NAME_CLOSURE:
937 op = LOAD_DEREF;
938 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000939 }
940 break;
941 case VAR_STORE:
942 switch (scope) {
943 case NAME_LOCAL:
944 op = STORE_FAST;
945 break;
946 case NAME_GLOBAL:
947 op = STORE_GLOBAL;
948 break;
949 case NAME_DEFAULT:
950 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000951 break;
952 case NAME_CLOSURE:
953 op = STORE_DEREF;
954 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000955 }
956 break;
957 case VAR_DELETE:
958 switch (scope) {
959 case NAME_LOCAL:
960 op = DELETE_FAST;
961 break;
962 case NAME_GLOBAL:
963 op = DELETE_GLOBAL;
964 break;
965 case NAME_DEFAULT:
966 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000967 break;
968 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000969 char buf[500];
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000970 sprintf(buf, DEL_CLOSURE_ERROR, name);
971 com_error(c, PyExc_SyntaxError, buf);
972 i = 255;
973 break;
974 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000975 }
976 break;
977 }
978done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000979 com_addoparg(c, op, i);
980}
981
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000982static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000983com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000984{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000985 char *name;
986 char buffer[1000];
987 /* XXX it is possible to write this code without the 1000
988 chars on the total length of dotted names, I just can't be
989 bothered right now */
990 if (TYPE(n) == STAR)
991 name = "*";
992 else if (TYPE(n) == dotted_name) {
993 char *p = buffer;
994 int i;
995 name = buffer;
996 for (i = 0; i < NCH(n); i += 2) {
997 char *s = STR(CHILD(n, i));
998 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000999 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001000 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001001 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001002 break;
1003 }
1004 if (p != buffer)
1005 *p++ = '.';
1006 strcpy(p, s);
1007 p = strchr(p, '\0');
1008 }
1009 }
1010 else {
1011 REQ(n, NAME);
1012 name = STR(n);
1013 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001014 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001015}
1016
Guido van Rossum79f25d91997-04-29 20:08:16 +00001017static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001018parsenumber(struct compiling *co, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001019{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001020 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001021 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001022 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001023#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +00001024 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +00001025 int imflag;
1026#endif
1027
Guido van Rossum282914b1991-04-04 10:42:56 +00001028 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001029 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001030#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001031 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001032#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001033 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001034 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001035 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001036 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001037 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001038 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001039 if (*end == '\0') {
1040 if (errno != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001041 com_error(co, PyExc_OverflowError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001042 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +00001043 return NULL;
1044 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001045 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001046 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001047 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001048#ifndef WITHOUT_COMPLEX
1049 if (imflag) {
1050 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001051 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +00001052 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001053 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001054 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +00001055 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001056 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001057#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001058 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001059 PyFPE_START_PROTECT("atof", return 0)
1060 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001061 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001062 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001063 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001064}
1065
Guido van Rossum79f25d91997-04-29 20:08:16 +00001066static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001067parsestr(char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001068{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001069 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001070 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001071 char *buf;
1072 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001073 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001074 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001075 int first = *s;
1076 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001077 int rawmode = 0;
1078 int unicode = 0;
1079 if (isalpha(quote) || quote == '_') {
1080 if (quote == 'u' || quote == 'U') {
1081 quote = *++s;
1082 unicode = 1;
1083 }
1084 if (quote == 'r' || quote == 'R') {
1085 quote = *++s;
1086 rawmode = 1;
1087 }
1088 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001089 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001090 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001091 return NULL;
1092 }
1093 s++;
1094 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001095 if (len > INT_MAX) {
1096 PyErr_SetString(PyExc_OverflowError, "string to parse is too long");
1097 return NULL;
1098 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001099 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001100 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001101 return NULL;
1102 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001103 if (len >= 4 && s[0] == quote && s[1] == quote) {
1104 s += 2;
1105 len -= 2;
1106 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001107 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001108 return NULL;
1109 }
1110 }
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001111 if (unicode || Py_UnicodeFlag) {
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001112 if (rawmode)
1113 return PyUnicode_DecodeRawUnicodeEscape(
1114 s, len, NULL);
1115 else
1116 return PyUnicode_DecodeUnicodeEscape(
1117 s, len, NULL);
1118 }
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001119 if (rawmode || strchr(s, '\\') == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001120 return PyString_FromStringAndSize(s, len);
1121 v = PyString_FromStringAndSize((char *)NULL, len);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001122 if (v == NULL)
1123 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001124 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001125 end = s + len;
1126 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001127 if (*s != '\\') {
1128 *p++ = *s++;
1129 continue;
1130 }
1131 s++;
1132 switch (*s++) {
1133 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001134 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001135 case '\\': *p++ = '\\'; break;
1136 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +00001137 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001138 case 'b': *p++ = '\b'; break;
1139 case 'f': *p++ = '\014'; break; /* FF */
1140 case 't': *p++ = '\t'; break;
1141 case 'n': *p++ = '\n'; break;
1142 case 'r': *p++ = '\r'; break;
1143 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001144 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
1145 case '0': case '1': case '2': case '3':
1146 case '4': case '5': case '6': case '7':
1147 c = s[-1] - '0';
1148 if ('0' <= *s && *s <= '7') {
1149 c = (c<<3) + *s++ - '0';
1150 if ('0' <= *s && *s <= '7')
1151 c = (c<<3) + *s++ - '0';
1152 }
1153 *p++ = c;
1154 break;
1155 case 'x':
Jeremy Hylton4419ac12001-02-28 22:54:51 +00001156 if (isxdigit(Py_CHARMASK(s[0]))
1157 && isxdigit(Py_CHARMASK(s[1]))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +00001158 unsigned int x = 0;
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001159 c = Py_CHARMASK(*s);
1160 s++;
1161 if (isdigit(c))
1162 x = c - '0';
1163 else if (islower(c))
1164 x = 10 + c - 'a';
1165 else
1166 x = 10 + c - 'A';
1167 x = x << 4;
1168 c = Py_CHARMASK(*s);
1169 s++;
1170 if (isdigit(c))
1171 x += c - '0';
1172 else if (islower(c))
1173 x += 10 + c - 'a';
1174 else
1175 x += 10 + c - 'A';
Guido van Rossumed1100f1997-10-20 23:24:07 +00001176 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001177 break;
1178 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00001179 PyErr_SetString(PyExc_ValueError,
1180 "invalid \\x escape");
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001181 Py_DECREF(v);
1182 return NULL;
1183 default:
1184 *p++ = '\\';
1185 *p++ = s[-1];
1186 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001187 }
1188 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001189 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001190 return v;
1191}
1192
Guido van Rossum79f25d91997-04-29 20:08:16 +00001193static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001194parsestrplus(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001195{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001196 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001197 int i;
1198 REQ(CHILD(n, 0), STRING);
1199 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
1200 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001201 for (i = 1; i < NCH(n); i++) {
1202 PyObject *s;
1203 s = parsestr(STR(CHILD(n, i)));
1204 if (s == NULL)
1205 goto onError;
1206 if (PyString_Check(v) && PyString_Check(s)) {
1207 PyString_ConcatAndDel(&v, s);
1208 if (v == NULL)
1209 goto onError;
1210 }
1211 else {
1212 PyObject *temp;
1213 temp = PyUnicode_Concat(v, s);
1214 Py_DECREF(s);
1215 if (temp == NULL)
1216 goto onError;
1217 Py_DECREF(v);
1218 v = temp;
1219 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001220 }
1221 }
1222 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001223
1224 onError:
1225 Py_XDECREF(v);
1226 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001227}
1228
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001229static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001230com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001231{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001232 PyObject *v;
1233 int anchor = 0;
1234 int save_begin = c->c_begin;
1235
1236 /* list_iter: for v in expr [list_iter] */
1237 com_node(c, CHILD(n, 3)); /* expr */
1238 v = PyInt_FromLong(0L);
1239 if (v == NULL)
1240 c->c_errors++;
1241 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
1242 com_push(c, 1);
1243 Py_XDECREF(v);
1244 c->c_begin = c->c_nexti;
1245 com_addoparg(c, SET_LINENO, n->n_lineno);
1246 com_addfwref(c, FOR_LOOP, &anchor);
1247 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001248 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001249 c->c_loops++;
1250 com_list_iter(c, n, e, t);
1251 c->c_loops--;
1252 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1253 c->c_begin = save_begin;
1254 com_backpatch(c, anchor);
1255 com_pop(c, 2); /* FOR_LOOP has popped these */
1256}
1257
1258static void
1259com_list_if(struct compiling *c, node *n, node *e, char *t)
1260{
1261 int anchor = 0;
1262 int a = 0;
1263 /* list_iter: 'if' test [list_iter] */
1264 com_addoparg(c, SET_LINENO, n->n_lineno);
1265 com_node(c, CHILD(n, 1));
1266 com_addfwref(c, JUMP_IF_FALSE, &a);
1267 com_addbyte(c, POP_TOP);
1268 com_pop(c, 1);
1269 com_list_iter(c, n, e, t);
1270 com_addfwref(c, JUMP_FORWARD, &anchor);
1271 com_backpatch(c, a);
1272 /* We jump here with an extra entry which we now pop */
1273 com_addbyte(c, POP_TOP);
1274 com_backpatch(c, anchor);
1275}
1276
1277static void
1278com_list_iter(struct compiling *c,
1279 node *p, /* parent of list_iter node */
1280 node *e, /* element expression node */
1281 char *t /* name of result list temp local */)
1282{
1283 /* list_iter is the last child in a listmaker, list_for, or list_if */
1284 node *n = CHILD(p, NCH(p)-1);
1285 if (TYPE(n) == list_iter) {
1286 n = CHILD(n, 0);
1287 switch (TYPE(n)) {
1288 case list_for:
1289 com_list_for(c, n, e, t);
1290 break;
1291 case list_if:
1292 com_list_if(c, n, e, t);
1293 break;
1294 default:
1295 com_error(c, PyExc_SystemError,
1296 "invalid list_iter node type");
1297 }
1298 }
1299 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001300 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001301 com_push(c, 1);
1302 com_node(c, e);
1303 com_addoparg(c, CALL_FUNCTION, 1);
1304 com_addbyte(c, POP_TOP);
1305 com_pop(c, 2);
1306 }
1307}
1308
1309static void
1310com_list_comprehension(struct compiling *c, node *n)
1311{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001312 /* listmaker: test list_for */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001313 char tmpname[12];
Tim Peters30814212001-02-17 05:30:26 +00001314 sprintf(tmpname, "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001315 com_addoparg(c, BUILD_LIST, 0);
1316 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1317 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001318 com_addop_name(c, LOAD_ATTR, "append");
1319 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001320 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001321 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001322 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001323 --c->c_tmpname;
1324}
1325
1326static void
1327com_listmaker(struct compiling *c, node *n)
1328{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001329 /* listmaker: test ( list_for | (',' test)* [','] ) */
1330 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001331 com_list_comprehension(c, n);
1332 else {
1333 int len = 0;
1334 int i;
1335 for (i = 0; i < NCH(n); i += 2, len++)
1336 com_node(c, CHILD(n, i));
1337 com_addoparg(c, BUILD_LIST, len);
1338 com_pop(c, len-1);
1339 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001340}
1341
1342static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001343com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001344{
1345 int i;
1346 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1347 for (i = 0; i+2 < NCH(n); i += 4) {
1348 /* We must arrange things just right for STORE_SUBSCR.
1349 It wants the stack to look like (value) (dict) (key) */
1350 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001351 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001352 com_node(c, CHILD(n, i+2)); /* value */
1353 com_addbyte(c, ROT_TWO);
1354 com_node(c, CHILD(n, i)); /* key */
1355 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001356 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001357 }
1358}
1359
1360static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001361com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001362{
1363 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001364 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001365 int i;
1366 REQ(n, atom);
1367 ch = CHILD(n, 0);
1368 switch (TYPE(ch)) {
1369 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001370 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001371 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001372 com_push(c, 1);
1373 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001374 else
1375 com_node(c, CHILD(n, 1));
1376 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001377 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001378 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001379 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001380 com_push(c, 1);
1381 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001382 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001383 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001384 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001385 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001386 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001387 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001388 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001389 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001390 break;
1391 case BACKQUOTE:
1392 com_node(c, CHILD(n, 1));
1393 com_addbyte(c, UNARY_CONVERT);
1394 break;
1395 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001396 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001397 i = 255;
1398 }
1399 else {
1400 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001401 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001402 }
1403 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001404 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001405 break;
1406 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001407 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001408 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001409 c->c_errors++;
1410 i = 255;
1411 }
1412 else {
1413 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001414 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001415 }
1416 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001417 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001418 break;
1419 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001420 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001421 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001422 break;
1423 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001424 com_error(c, PyExc_SystemError,
1425 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001426 }
1427}
1428
1429static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001430com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001431{
1432 if (NCH(n) == 1) {
1433 com_addbyte(c, op);
1434 }
1435 else if (NCH(n) == 2) {
1436 if (TYPE(CHILD(n, 0)) != COLON) {
1437 com_node(c, CHILD(n, 0));
1438 com_addbyte(c, op+1);
1439 }
1440 else {
1441 com_node(c, CHILD(n, 1));
1442 com_addbyte(c, op+2);
1443 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001444 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001445 }
1446 else {
1447 com_node(c, CHILD(n, 0));
1448 com_node(c, CHILD(n, 2));
1449 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001450 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001451 }
1452}
1453
Guido van Rossum635abd21997-01-06 22:56:52 +00001454static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001455com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1456{
1457 if (NCH(n) == 1) {
1458 com_addbyte(c, DUP_TOP);
1459 com_push(c, 1);
1460 com_addbyte(c, SLICE);
1461 com_node(c, augn);
1462 com_addbyte(c, opcode);
1463 com_pop(c, 1);
1464 com_addbyte(c, ROT_TWO);
1465 com_addbyte(c, STORE_SLICE);
1466 com_pop(c, 2);
1467 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1468 com_node(c, CHILD(n, 0));
1469 com_addoparg(c, DUP_TOPX, 2);
1470 com_push(c, 2);
1471 com_addbyte(c, SLICE+1);
1472 com_pop(c, 1);
1473 com_node(c, augn);
1474 com_addbyte(c, opcode);
1475 com_pop(c, 1);
1476 com_addbyte(c, ROT_THREE);
1477 com_addbyte(c, STORE_SLICE+1);
1478 com_pop(c, 3);
1479 } else if (NCH(n) == 2) {
1480 com_node(c, CHILD(n, 1));
1481 com_addoparg(c, DUP_TOPX, 2);
1482 com_push(c, 2);
1483 com_addbyte(c, SLICE+2);
1484 com_pop(c, 1);
1485 com_node(c, augn);
1486 com_addbyte(c, opcode);
1487 com_pop(c, 1);
1488 com_addbyte(c, ROT_THREE);
1489 com_addbyte(c, STORE_SLICE+2);
1490 com_pop(c, 3);
1491 } else {
1492 com_node(c, CHILD(n, 0));
1493 com_node(c, CHILD(n, 2));
1494 com_addoparg(c, DUP_TOPX, 3);
1495 com_push(c, 3);
1496 com_addbyte(c, SLICE+3);
1497 com_pop(c, 2);
1498 com_node(c, augn);
1499 com_addbyte(c, opcode);
1500 com_pop(c, 1);
1501 com_addbyte(c, ROT_FOUR);
1502 com_addbyte(c, STORE_SLICE+3);
1503 com_pop(c, 4);
1504 }
1505}
1506
1507static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001508com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001509{
1510 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001511 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001512 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001513 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001514 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001515 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001516 }
1517 else {
1518 com_node(c, CHILD(n, 0));
1519 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001520 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001521 }
1522 m = n;
1523 do {
1524 m = CHILD(m, 0);
1525 } while (NCH(m) == 1);
1526 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00001527 /* f(lambda x: x[0] = 3) ends up getting parsed with
1528 * LHS test = lambda x: x[0], and RHS test = 3.
1529 * SF bug 132313 points out that complaining about a keyword
1530 * then is very confusing.
1531 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001532 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00001533 TYPE(m) == lambdef ?
1534 "lambda cannot contain assignment" :
1535 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001536 }
1537 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001538 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001539 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001540 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001541 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001542 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001543 else if (*pkeywords == NULL) {
1544 c->c_errors++;
1545 Py_DECREF(v);
1546 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001547 if (PyDict_GetItem(*pkeywords, v) != NULL)
1548 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001549 "duplicate keyword argument");
1550 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001551 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001552 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001553 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001554 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001555 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001556 }
1557 }
1558 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001559}
1560
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001561static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001562com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001563{
1564 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001565 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001566 }
1567 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001568 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001569 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001570 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001571 int star_flag = 0;
1572 int starstar_flag = 0;
1573 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001574 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001575 na = 0;
1576 nk = 0;
1577 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001578 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001579 if (TYPE(ch) == STAR ||
1580 TYPE(ch) == DOUBLESTAR)
1581 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001582 if (ch->n_lineno != lineno) {
1583 lineno = ch->n_lineno;
1584 com_addoparg(c, SET_LINENO, lineno);
1585 }
1586 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001587 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001588 na++;
1589 else
1590 nk++;
1591 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001592 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001593 while (i < NCH(n)) {
1594 node *tok = CHILD(n, i);
1595 node *ch = CHILD(n, i+1);
1596 i += 3;
1597 switch (TYPE(tok)) {
1598 case STAR: star_flag = 1; break;
1599 case DOUBLESTAR: starstar_flag = 1; break;
1600 }
1601 com_node(c, ch);
1602 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001603 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001604 com_error(c, PyExc_SyntaxError,
1605 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001606 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001607 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001608 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001609 star_flag + (starstar_flag << 1);
1610 else
1611 opcode = CALL_FUNCTION;
1612 com_addoparg(c, opcode, na | (nk << 8));
1613 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001614 }
1615}
1616
1617static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001618com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001619{
1620 com_addopname(c, LOAD_ATTR, n);
1621}
1622
1623static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001624com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001625{
1626 int i=0;
1627 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001628 node *ch;
1629
1630 /* first argument */
1631 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001632 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001633 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001634 i++;
1635 }
1636 else {
1637 com_node(c, CHILD(n,i));
1638 i++;
1639 REQ(CHILD(n,i),COLON);
1640 i++;
1641 }
1642 /* second argument */
1643 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1644 com_node(c, CHILD(n,i));
1645 i++;
1646 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001647 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001648 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001649 com_push(c, 1);
1650 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001651 /* remaining arguments */
1652 for (; i < NCH(n); i++) {
1653 ns++;
1654 ch=CHILD(n,i);
1655 REQ(ch, sliceop);
1656 if (NCH(ch) == 1) {
1657 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001658 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001659 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001660 }
1661 else
1662 com_node(c, CHILD(ch,1));
1663 }
1664 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001665 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001666}
1667
1668static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001669com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001670{
1671 node *ch;
1672 REQ(n, subscript);
1673 ch = CHILD(n,0);
1674 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001675 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001676 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001677 com_push(c, 1);
1678 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001679 else {
1680 /* check for slice */
1681 if ((TYPE(ch) == COLON || NCH(n) > 1))
1682 com_sliceobj(c, n);
1683 else {
1684 REQ(ch, test);
1685 com_node(c, ch);
1686 }
1687 }
1688}
1689
1690static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001691com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001692{
1693 int i, op;
1694 REQ(n, subscriptlist);
1695 /* Check to make backward compatible slice behavior for '[i:j]' */
1696 if (NCH(n) == 1) {
1697 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001698 /* 'Basic' slice, should have exactly one colon. */
1699 if ((TYPE(CHILD(sub, 0)) == COLON
1700 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1701 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1702 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001703 switch (assigning) {
1704 case OP_DELETE:
1705 op = DELETE_SLICE;
1706 break;
1707 case OP_ASSIGN:
1708 op = STORE_SLICE;
1709 break;
1710 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001711 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001712 break;
1713 default:
1714 com_augassign_slice(c, sub, assigning, augn);
1715 return;
1716 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001717 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001718 if (op == STORE_SLICE)
1719 com_pop(c, 2);
1720 else if (op == DELETE_SLICE)
1721 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001722 return;
1723 }
1724 }
1725 /* Else normal subscriptlist. Compile each subscript. */
1726 for (i = 0; i < NCH(n); i += 2)
1727 com_subscript(c, CHILD(n, i));
1728 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001729 if (NCH(n) > 1) {
1730 i = (NCH(n)+1) / 2;
1731 com_addoparg(c, BUILD_TUPLE, i);
1732 com_pop(c, i-1);
1733 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001734 switch (assigning) {
1735 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001736 op = DELETE_SUBSCR;
1737 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00001738 break;
1739 default:
1740 case OP_ASSIGN:
1741 op = STORE_SUBSCR;
1742 i = 3;
1743 break;
1744 case OP_APPLY:
1745 op = BINARY_SUBSCR;
1746 i = 1;
1747 break;
1748 }
1749 if (assigning > OP_APPLY) {
1750 com_addoparg(c, DUP_TOPX, 2);
1751 com_push(c, 2);
1752 com_addbyte(c, BINARY_SUBSCR);
1753 com_pop(c, 1);
1754 com_node(c, augn);
1755 com_addbyte(c, assigning);
1756 com_pop(c, 1);
1757 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001758 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001759 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001760 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001761}
1762
1763static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001764com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001765{
1766 REQ(n, trailer);
1767 switch (TYPE(CHILD(n, 0))) {
1768 case LPAR:
1769 com_call_function(c, CHILD(n, 1));
1770 break;
1771 case DOT:
1772 com_select_member(c, CHILD(n, 1));
1773 break;
1774 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00001775 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001776 break;
1777 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001778 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001779 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001780 }
1781}
1782
1783static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001784com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001785{
1786 int i;
1787 REQ(n, power);
1788 com_atom(c, CHILD(n, 0));
1789 for (i = 1; i < NCH(n); i++) {
1790 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1791 com_factor(c, CHILD(n, i+1));
1792 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001793 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001794 break;
1795 }
1796 else
1797 com_apply_trailer(c, CHILD(n, i));
1798 }
1799}
1800
1801static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001802com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001803{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001804 REQ(n, factor);
1805 if (TYPE(CHILD(n, 0)) == PLUS) {
1806 com_factor(c, CHILD(n, 1));
1807 com_addbyte(c, UNARY_POSITIVE);
1808 }
1809 else if (TYPE(CHILD(n, 0)) == MINUS) {
1810 com_factor(c, CHILD(n, 1));
1811 com_addbyte(c, UNARY_NEGATIVE);
1812 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001813 else if (TYPE(CHILD(n, 0)) == TILDE) {
1814 com_factor(c, CHILD(n, 1));
1815 com_addbyte(c, UNARY_INVERT);
1816 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001817 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001818 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001819 }
1820}
1821
1822static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001823com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001824{
1825 int i;
1826 int op;
1827 REQ(n, term);
1828 com_factor(c, CHILD(n, 0));
1829 for (i = 2; i < NCH(n); i += 2) {
1830 com_factor(c, CHILD(n, i));
1831 switch (TYPE(CHILD(n, i-1))) {
1832 case STAR:
1833 op = BINARY_MULTIPLY;
1834 break;
1835 case SLASH:
1836 op = BINARY_DIVIDE;
1837 break;
1838 case PERCENT:
1839 op = BINARY_MODULO;
1840 break;
1841 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001842 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001843 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001844 op = 255;
1845 }
1846 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001847 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001848 }
1849}
1850
1851static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001852com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001853{
1854 int i;
1855 int op;
1856 REQ(n, arith_expr);
1857 com_term(c, CHILD(n, 0));
1858 for (i = 2; i < NCH(n); i += 2) {
1859 com_term(c, CHILD(n, i));
1860 switch (TYPE(CHILD(n, i-1))) {
1861 case PLUS:
1862 op = BINARY_ADD;
1863 break;
1864 case MINUS:
1865 op = BINARY_SUBTRACT;
1866 break;
1867 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001868 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001869 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001870 op = 255;
1871 }
1872 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001873 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001874 }
1875}
1876
1877static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001878com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001879{
1880 int i;
1881 int op;
1882 REQ(n, shift_expr);
1883 com_arith_expr(c, CHILD(n, 0));
1884 for (i = 2; i < NCH(n); i += 2) {
1885 com_arith_expr(c, CHILD(n, i));
1886 switch (TYPE(CHILD(n, i-1))) {
1887 case LEFTSHIFT:
1888 op = BINARY_LSHIFT;
1889 break;
1890 case RIGHTSHIFT:
1891 op = BINARY_RSHIFT;
1892 break;
1893 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001894 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001895 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001896 op = 255;
1897 }
1898 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001899 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001900 }
1901}
1902
1903static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001904com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001905{
1906 int i;
1907 int op;
1908 REQ(n, and_expr);
1909 com_shift_expr(c, CHILD(n, 0));
1910 for (i = 2; i < NCH(n); i += 2) {
1911 com_shift_expr(c, CHILD(n, i));
1912 if (TYPE(CHILD(n, i-1)) == AMPER) {
1913 op = BINARY_AND;
1914 }
1915 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001916 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001917 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001918 op = 255;
1919 }
1920 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001921 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001922 }
1923}
1924
1925static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001926com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001927{
1928 int i;
1929 int op;
1930 REQ(n, xor_expr);
1931 com_and_expr(c, CHILD(n, 0));
1932 for (i = 2; i < NCH(n); i += 2) {
1933 com_and_expr(c, CHILD(n, i));
1934 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1935 op = BINARY_XOR;
1936 }
1937 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001938 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001939 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001940 op = 255;
1941 }
1942 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001943 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001944 }
1945}
1946
1947static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001948com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001949{
1950 int i;
1951 int op;
1952 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001953 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001954 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001955 com_xor_expr(c, CHILD(n, i));
1956 if (TYPE(CHILD(n, i-1)) == VBAR) {
1957 op = BINARY_OR;
1958 }
1959 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001960 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001961 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001962 op = 255;
1963 }
1964 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001965 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001966 }
1967}
1968
1969static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001970cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001971{
1972 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001973 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001974 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1975 if (NCH(n) == 1) {
1976 n = CHILD(n, 0);
1977 switch (TYPE(n)) {
1978 case LESS: return LT;
1979 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001980 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001981 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001982 case LESSEQUAL: return LE;
1983 case GREATEREQUAL: return GE;
1984 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001985 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1986 if (strcmp(STR(n), "is") == 0) return IS;
1987 }
1988 }
1989 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001990 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001991 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1992 return NOT_IN;
1993 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1994 return IS_NOT;
1995 }
1996 }
1997 return BAD;
1998}
1999
2000static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002001com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002002{
2003 int i;
2004 enum cmp_op op;
2005 int anchor;
2006 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2007 com_expr(c, CHILD(n, 0));
2008 if (NCH(n) == 1)
2009 return;
2010
2011 /****************************************************************
2012 The following code is generated for all but the last
2013 comparison in a chain:
2014
2015 label: on stack: opcode: jump to:
2016
2017 a <code to load b>
2018 a, b DUP_TOP
2019 a, b, b ROT_THREE
2020 b, a, b COMPARE_OP
2021 b, 0-or-1 JUMP_IF_FALSE L1
2022 b, 1 POP_TOP
2023 b
2024
2025 We are now ready to repeat this sequence for the next
2026 comparison in the chain.
2027
2028 For the last we generate:
2029
2030 b <code to load c>
2031 b, c COMPARE_OP
2032 0-or-1
2033
2034 If there were any jumps to L1 (i.e., there was more than one
2035 comparison), we generate:
2036
2037 0-or-1 JUMP_FORWARD L2
2038 L1: b, 0 ROT_TWO
2039 0, b POP_TOP
2040 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002041 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002042 ****************************************************************/
2043
2044 anchor = 0;
2045
2046 for (i = 2; i < NCH(n); i += 2) {
2047 com_expr(c, CHILD(n, i));
2048 if (i+2 < NCH(n)) {
2049 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002050 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002051 com_addbyte(c, ROT_THREE);
2052 }
2053 op = cmp_type(CHILD(n, i-1));
2054 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002055 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002056 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002057 }
2058 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002059 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002060 if (i+2 < NCH(n)) {
2061 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2062 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002063 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002064 }
2065 }
2066
2067 if (anchor) {
2068 int anchor2 = 0;
2069 com_addfwref(c, JUMP_FORWARD, &anchor2);
2070 com_backpatch(c, anchor);
2071 com_addbyte(c, ROT_TWO);
2072 com_addbyte(c, POP_TOP);
2073 com_backpatch(c, anchor2);
2074 }
2075}
2076
2077static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002078com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002079{
2080 REQ(n, not_test); /* 'not' not_test | comparison */
2081 if (NCH(n) == 1) {
2082 com_comparison(c, CHILD(n, 0));
2083 }
2084 else {
2085 com_not_test(c, CHILD(n, 1));
2086 com_addbyte(c, UNARY_NOT);
2087 }
2088}
2089
2090static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002091com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002092{
2093 int i;
2094 int anchor;
2095 REQ(n, and_test); /* not_test ('and' not_test)* */
2096 anchor = 0;
2097 i = 0;
2098 for (;;) {
2099 com_not_test(c, CHILD(n, i));
2100 if ((i += 2) >= NCH(n))
2101 break;
2102 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2103 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002104 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002105 }
2106 if (anchor)
2107 com_backpatch(c, anchor);
2108}
2109
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002110static int
2111com_make_closure(struct compiling *c, PyCodeObject *co)
2112{
2113 int i, free = PyTuple_GET_SIZE(co->co_freevars);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002114 /* If the code is compiled with st->st_nested_scopes == 0,
2115 then no variable will ever be added to co_freevars.
2116 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002117 if (free == 0)
2118 return 0;
2119 for (i = 0; i < free; ++i) {
2120 /* Bypass com_addop_varname because it will generate
2121 LOAD_DEREF but LOAD_CLOSURE is needed.
2122 */
2123 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2124 int arg, reftype;
2125
2126 /* Special case: If a class contains a method with a
2127 free variable that has the same name as a method,
2128 the name will be considered free *and* local in the
2129 class. It should be handled by the closure, as
2130 well as by the normal name loookup logic.
2131 */
2132 reftype = get_ref_type(c, PyString_AS_STRING(name));
2133 if (reftype == CELL)
2134 arg = com_lookup_arg(c->c_cellvars, name);
2135 else /* (reftype == FREE) */
2136 arg = com_lookup_arg(c->c_freevars, name);
2137 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002138 fprintf(stderr, "lookup %s in %s %d %d\n"
2139 "freevars of %s: %s\n",
2140 PyObject_REPR(name),
2141 c->c_name,
2142 reftype, arg,
2143 PyString_AS_STRING(co->co_name),
2144 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002145 Py_FatalError("com_make_closure()");
2146 }
2147 com_addoparg(c, LOAD_CLOSURE, arg);
2148
2149 }
2150 com_push(c, free);
2151 return 1;
2152}
2153
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002154static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002155com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002156{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002157 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002158 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002159 PyObject *co;
2160 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002161 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002162 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2163 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002164 co = (PyObject *) icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002165 if (co == NULL) {
2166 c->c_errors++;
2167 return;
2168 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002169 symtable_exit_scope(c->c_symtable);
Tim Peters1e542112001-02-23 22:23:53 +00002170 i = com_addconst(c, co);
2171 closure = com_make_closure(c, (PyCodeObject *)co);
2172 Py_DECREF(co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002173 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002174 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002175 if (closure)
2176 com_addoparg(c, MAKE_CLOSURE, ndefs);
2177 else
2178 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002179 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002180 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002181 else {
2182 int anchor = 0;
2183 int i = 0;
2184 for (;;) {
2185 com_and_test(c, CHILD(n, i));
2186 if ((i += 2) >= NCH(n))
2187 break;
2188 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2189 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002190 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002191 }
2192 if (anchor)
2193 com_backpatch(c, anchor);
2194 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002195}
2196
2197static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002198com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002199{
2200 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002201 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002202 com_node(c, CHILD(n, 0));
2203 }
2204 else {
2205 int i;
2206 int len;
2207 len = (NCH(n) + 1) / 2;
2208 for (i = 0; i < NCH(n); i += 2)
2209 com_node(c, CHILD(n, i));
2210 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002211 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002212 }
2213}
2214
2215
2216/* Begin of assignment compilation */
2217
Thomas Wouters434d0822000-08-24 20:11:32 +00002218
2219static void
2220com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2221{
2222 com_addbyte(c, DUP_TOP);
2223 com_push(c, 1);
2224 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002225 com_node(c, augn);
2226 com_addbyte(c, opcode);
2227 com_pop(c, 1);
2228 com_addbyte(c, ROT_TWO);
2229 com_addopname(c, STORE_ATTR, n);
2230 com_pop(c, 2);
2231}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002232
2233static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002234com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002235{
2236 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002237 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002238}
2239
2240static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002241com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002242{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002243 REQ(n, trailer);
2244 switch (TYPE(CHILD(n, 0))) {
2245 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002246 com_error(c, PyExc_SyntaxError,
2247 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002248 break;
2249 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002250 if (assigning > OP_APPLY)
2251 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2252 else
2253 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002254 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002255 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002256 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002257 break;
2258 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002259 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002260 }
2261}
2262
2263static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002264com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002265{
2266 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002267 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002268 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002269 if (assigning) {
2270 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002271 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002272 com_push(c, i-1);
2273 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002274 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002275 com_assign(c, CHILD(n, i), assigning, NULL);
2276}
2277
2278static void
2279com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2280{
2281 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002282 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002283 com_push(c, 1);
2284 com_node(c, augn);
2285 com_addbyte(c, opcode);
2286 com_pop(c, 1);
2287 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002288}
2289
2290static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002291com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002292{
2293 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002294 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002295 if (assigning)
2296 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002297}
2298
2299static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002300com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002301{
2302 /* Loop to avoid trivial recursion */
2303 for (;;) {
2304 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002305
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002306 case exprlist:
2307 case testlist:
2308 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002309 if (assigning > OP_APPLY) {
2310 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002311 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002312 return;
2313 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002314 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002315 return;
2316 }
2317 n = CHILD(n, 0);
2318 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002319
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002320 case test:
2321 case and_test:
2322 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002323 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002324 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002325 case xor_expr:
2326 case and_expr:
2327 case shift_expr:
2328 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002329 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002330 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002331 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002332 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002333 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002334 return;
2335 }
2336 n = CHILD(n, 0);
2337 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002338
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002339 case power: /* atom trailer* ('**' power)*
2340 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002341 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002342 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002343 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002344 return;
2345 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002346 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002347 int i;
2348 com_node(c, CHILD(n, 0));
2349 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002350 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002351 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002352 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002353 return;
2354 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002355 com_apply_trailer(c, CHILD(n, i));
2356 } /* NB i is still alive */
2357 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002358 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002359 return;
2360 }
2361 n = CHILD(n, 0);
2362 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002363
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002364 case atom:
2365 switch (TYPE(CHILD(n, 0))) {
2366 case LPAR:
2367 n = CHILD(n, 1);
2368 if (TYPE(n) == RPAR) {
2369 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002370 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002371 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002372 return;
2373 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002374 if (assigning > OP_APPLY) {
2375 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002376 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002377 return;
2378 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002379 break;
2380 case LSQB:
2381 n = CHILD(n, 1);
2382 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002383 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002384 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002385 return;
2386 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002387 if (assigning > OP_APPLY) {
2388 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002389 "augmented assign to list not possible");
2390 return;
2391 }
2392 if (NCH(n) > 1
2393 && TYPE(CHILD(n, 1)) == list_for) {
2394 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002395 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002396 return;
2397 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002398 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002399 return;
2400 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002401 if (assigning > OP_APPLY)
2402 com_augassign_name(c, CHILD(n, 0),
2403 assigning, augn);
2404 else
2405 com_assign_name(c, CHILD(n, 0),
2406 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002407 return;
2408 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002409 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002410 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002411 return;
2412 }
2413 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002414
2415 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002416 com_error(c, PyExc_SyntaxError,
2417 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002418 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002419
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002420 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002421 com_error(c, PyExc_SystemError,
2422 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002423 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002424
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002425 }
2426 }
2427}
Guido van Rossum7c531111997-03-11 18:42:21 +00002428
Thomas Wouters434d0822000-08-24 20:11:32 +00002429static void
2430com_augassign(struct compiling *c, node *n)
2431{
2432 int opcode;
2433
2434 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2435 case '+': opcode = INPLACE_ADD; break;
2436 case '-': opcode = INPLACE_SUBTRACT; break;
2437 case '/': opcode = INPLACE_DIVIDE; break;
2438 case '%': opcode = INPLACE_MODULO; break;
2439 case '<': opcode = INPLACE_LSHIFT; break;
2440 case '>': opcode = INPLACE_RSHIFT; break;
2441 case '&': opcode = INPLACE_AND; break;
2442 case '^': opcode = INPLACE_XOR; break;
2443 case '|': opcode = INPLACE_OR; break;
2444 case '*':
2445 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2446 opcode = INPLACE_POWER;
2447 else
2448 opcode = INPLACE_MULTIPLY;
2449 break;
2450 default:
2451 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2452 return;
2453 }
2454 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2455}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002456
2457static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002458com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002459{
Thomas Wouters434d0822000-08-24 20:11:32 +00002460 REQ(n, expr_stmt);
2461 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002462 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002463 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002464 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002465 if (NCH(n) == 1) {
2466 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002467 if (c->c_interactive)
2468 com_addbyte(c, PRINT_EXPR);
2469 else
2470 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002471 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002472 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002473 else if (TYPE(CHILD(n,1)) == augassign)
2474 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002475 else {
2476 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002477 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002478 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002479 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002480 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002481 com_push(c, 1);
2482 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002483 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002484 }
2485 }
2486}
2487
2488static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002489com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002490{
2491 int a = 0, b = 0;
2492 int i;
2493 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2494 /* Generate code like for
2495
2496 if __debug__:
2497 if not <test>:
2498 raise AssertionError [, <message>]
2499
2500 where <message> is the second test, if present.
2501 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002502
Guido van Rossum228d7f31997-04-02 05:24:36 +00002503 if (Py_OptimizeFlag)
2504 return;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002505 com_addop_name(c, LOAD_GLOBAL, "__debug__");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002506 com_push(c, 1);
2507 com_addfwref(c, JUMP_IF_FALSE, &a);
2508 com_addbyte(c, POP_TOP);
2509 com_pop(c, 1);
2510 com_node(c, CHILD(n, 1));
2511 com_addfwref(c, JUMP_IF_TRUE, &b);
2512 com_addbyte(c, POP_TOP);
2513 com_pop(c, 1);
2514 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002515 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002516 com_push(c, 1);
2517 i = NCH(n)/2; /* Either 2 or 4 */
2518 if (i > 1)
2519 com_node(c, CHILD(n, 3));
2520 com_addoparg(c, RAISE_VARARGS, i);
2521 com_pop(c, i);
2522 /* The interpreter does not fall through */
2523 /* All jumps converge here */
2524 com_backpatch(c, a);
2525 com_backpatch(c, b);
2526 com_addbyte(c, POP_TOP);
2527}
2528
2529static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002530com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002531{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002532 int i = 1;
2533 node* stream = NULL;
2534
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002535 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002536
2537 /* are we using the extended print form? */
2538 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2539 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002540 com_node(c, stream);
2541 /* stack: [...] => [... stream] */
2542 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002543 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2544 i = 4;
2545 else
2546 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002547 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002548 for (; i < NCH(n); i += 2) {
2549 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002550 com_addbyte(c, DUP_TOP);
2551 /* stack: [stream] => [stream stream] */
2552 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002553 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002554 /* stack: [stream stream] => [stream stream obj] */
2555 com_addbyte(c, ROT_TWO);
2556 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002557 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002558 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002559 com_pop(c, 2);
2560 }
2561 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002562 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002563 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002564 com_addbyte(c, PRINT_ITEM);
2565 com_pop(c, 1);
2566 }
2567 }
2568 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002569 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002570 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002571 /* must pop the extra stream object off the stack */
2572 com_addbyte(c, POP_TOP);
2573 /* stack: [... stream] => [...] */
2574 com_pop(c, 1);
2575 }
2576 }
2577 else {
2578 if (stream != NULL) {
2579 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002580 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002581 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002582 com_pop(c, 1);
2583 }
2584 else
2585 com_addbyte(c, PRINT_NEWLINE);
2586 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002587}
2588
2589static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002590com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002591{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002592 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002593 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002594 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002595 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002596 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002597 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002598 com_push(c, 1);
2599 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002600 else
2601 com_node(c, CHILD(n, 1));
2602 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002603 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002604}
2605
2606static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002607com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002608{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002609 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002610 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2611 if (NCH(n) > 1) {
2612 com_node(c, CHILD(n, 1));
2613 if (NCH(n) > 3) {
2614 com_node(c, CHILD(n, 3));
2615 if (NCH(n) > 5)
2616 com_node(c, CHILD(n, 5));
2617 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002618 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002619 i = NCH(n)/2;
2620 com_addoparg(c, RAISE_VARARGS, i);
2621 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002622}
2623
2624static void
Thomas Wouters52152252000-08-17 22:55:00 +00002625com_from_import(struct compiling *c, node *n)
2626{
2627 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2628 com_push(c, 1);
2629 if (NCH(n) > 1) {
2630 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2631 com_error(c, PyExc_SyntaxError, "invalid syntax");
2632 return;
2633 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002634 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002635 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002636 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00002637 com_pop(c, 1);
2638}
2639
2640static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002641com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002642{
2643 int i;
2644 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002645 /* 'import' dotted_name (',' dotted_name)* |
2646 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002647 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00002648 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002649 /* 'from' dotted_name 'import' ... */
2650 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002651
2652 if (TYPE(CHILD(n, 3)) == STAR) {
2653 tup = Py_BuildValue("(s)", "*");
2654 } else {
2655 tup = PyTuple_New((NCH(n) - 2)/2);
2656 for (i = 3; i < NCH(n); i += 2) {
2657 PyTuple_SET_ITEM(tup, (i-3)/2,
2658 PyString_FromString(STR(
Jeremy Hylton4419ac12001-02-28 22:54:51 +00002659 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002660 }
2661 }
2662 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00002663 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002664 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002665 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00002666 if (TYPE(CHILD(n, 3)) == STAR)
2667 com_addbyte(c, IMPORT_STAR);
2668 else {
2669 for (i = 3; i < NCH(n); i += 2)
2670 com_from_import(c, CHILD(n, i));
2671 com_addbyte(c, POP_TOP);
2672 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002673 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002674 }
2675 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002676 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002677 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00002678 node *subn = CHILD(n, i);
2679 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002680 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002681 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002682 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00002683 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00002684 int j;
2685 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00002686 com_error(c, PyExc_SyntaxError,
2687 "invalid syntax");
2688 return;
2689 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00002690 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
2691 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002692 CHILD(CHILD(subn, 0),
2693 j));
2694 com_addop_varname(c, VAR_STORE,
2695 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002696 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002697 com_addop_varname(c, VAR_STORE,
2698 STR(CHILD(CHILD(subn, 0),
2699 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002700 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002701 }
2702 }
2703}
2704
2705static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002706com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002707{
2708 REQ(n, exec_stmt);
2709 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2710 com_node(c, CHILD(n, 1));
2711 if (NCH(n) >= 4)
2712 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002713 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002714 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002715 com_push(c, 1);
2716 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002717 if (NCH(n) >= 6)
2718 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002719 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002720 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002721 com_push(c, 1);
2722 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002723 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002724 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002725}
2726
Guido van Rossum7c531111997-03-11 18:42:21 +00002727static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002728is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002729{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002730 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002731 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002732 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00002733
2734 /* Label to avoid tail recursion */
2735 next:
2736 switch (TYPE(n)) {
2737
2738 case suite:
2739 if (NCH(n) == 1) {
2740 n = CHILD(n, 0);
2741 goto next;
2742 }
2743 /* Fall through */
2744 case file_input:
2745 for (i = 0; i < NCH(n); i++) {
2746 node *ch = CHILD(n, i);
2747 if (TYPE(ch) == stmt) {
2748 n = ch;
2749 goto next;
2750 }
2751 }
2752 break;
2753
2754 case stmt:
2755 case simple_stmt:
2756 case small_stmt:
2757 n = CHILD(n, 0);
2758 goto next;
2759
2760 case expr_stmt:
2761 case testlist:
2762 case test:
2763 case and_test:
2764 case not_test:
2765 case comparison:
2766 case expr:
2767 case xor_expr:
2768 case and_expr:
2769 case shift_expr:
2770 case arith_expr:
2771 case term:
2772 case factor:
2773 case power:
2774 case atom:
2775 if (NCH(n) == 1) {
2776 n = CHILD(n, 0);
2777 goto next;
2778 }
2779 break;
2780
2781 case NAME:
2782 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2783 return 1;
2784 break;
2785
2786 case NUMBER:
2787 v = parsenumber(c, STR(n));
2788 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002789 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002790 break;
2791 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002792 i = PyObject_IsTrue(v);
2793 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002794 return i == 0;
2795
2796 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002797 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002798 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002799 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002800 break;
2801 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002802 i = PyObject_IsTrue(v);
2803 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002804 return i == 0;
2805
2806 }
2807 return 0;
2808}
2809
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002810static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002811com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002812{
2813 int i;
2814 int anchor = 0;
2815 REQ(n, if_stmt);
2816 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2817 for (i = 0; i+3 < NCH(n); i+=4) {
2818 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002819 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002820 if (is_constant_false(c, ch))
2821 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002822 if (i > 0)
2823 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002824 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002825 com_addfwref(c, JUMP_IF_FALSE, &a);
2826 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002827 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002828 com_node(c, CHILD(n, i+3));
2829 com_addfwref(c, JUMP_FORWARD, &anchor);
2830 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002831 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002832 com_addbyte(c, POP_TOP);
2833 }
2834 if (i+2 < NCH(n))
2835 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002836 if (anchor)
2837 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002838}
2839
2840static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002841com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002842{
2843 int break_anchor = 0;
2844 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002845 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002846 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2847 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002848 block_push(c, SETUP_LOOP);
2849 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002850 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002851 com_node(c, CHILD(n, 1));
2852 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2853 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002854 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002855 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002856 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002857 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002858 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2859 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002860 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002861 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002862 com_addbyte(c, POP_TOP);
2863 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002864 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002865 if (NCH(n) > 4)
2866 com_node(c, CHILD(n, 6));
2867 com_backpatch(c, break_anchor);
2868}
2869
2870static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002871com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002872{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002873 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002874 int break_anchor = 0;
2875 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002876 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002877 REQ(n, for_stmt);
2878 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2879 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002880 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002881 com_node(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002882 v = PyInt_FromLong(0L);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002883 if (v == NULL)
2884 c->c_errors++;
2885 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002886 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002887 Py_XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002888 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002889 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002890 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002891 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00002892 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002893 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002894 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002895 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002896 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2897 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002898 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002899 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002900 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002901 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002902 if (NCH(n) > 8)
2903 com_node(c, CHILD(n, 8));
2904 com_backpatch(c, break_anchor);
2905}
2906
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002907/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002908
2909 SETUP_FINALLY L
2910 <code for S>
2911 POP_BLOCK
2912 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002913 L: <code for Sf>
2914 END_FINALLY
2915
2916 The special instructions use the block stack. Each block
2917 stack entry contains the instruction that created it (here
2918 SETUP_FINALLY), the level of the value stack at the time the
2919 block stack entry was created, and a label (here L).
2920
2921 SETUP_FINALLY:
2922 Pushes the current value stack level and the label
2923 onto the block stack.
2924 POP_BLOCK:
2925 Pops en entry from the block stack, and pops the value
2926 stack until its level is the same as indicated on the
2927 block stack. (The label is ignored.)
2928 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002929 Pops a variable number of entries from the *value* stack
2930 and re-raises the exception they specify. The number of
2931 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002932
2933 The block stack is unwound when an exception is raised:
2934 when a SETUP_FINALLY entry is found, the exception is pushed
2935 onto the value stack (and the exception condition is cleared),
2936 and the interpreter jumps to the label gotten from the block
2937 stack.
2938
2939 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002940 (The contents of the value stack is shown in [], with the top
2941 at the right; 'tb' is trace-back info, 'val' the exception's
2942 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002943
2944 Value stack Label Instruction Argument
2945 [] SETUP_EXCEPT L1
2946 [] <code for S>
2947 [] POP_BLOCK
2948 [] JUMP_FORWARD L0
2949
Guido van Rossum3f5da241990-12-20 15:06:42 +00002950 [tb, val, exc] L1: DUP )
2951 [tb, val, exc, exc] <evaluate E1> )
2952 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2953 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2954 [tb, val, exc, 1] POP )
2955 [tb, val, exc] POP
2956 [tb, val] <assign to V1> (or POP if no V1)
2957 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002958 [] <code for S1>
2959 JUMP_FORWARD L0
2960
Guido van Rossum3f5da241990-12-20 15:06:42 +00002961 [tb, val, exc, 0] L2: POP
2962 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002963 .............................etc.......................
2964
Guido van Rossum3f5da241990-12-20 15:06:42 +00002965 [tb, val, exc, 0] Ln+1: POP
2966 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002967
2968 [] L0: <next statement>
2969
2970 Of course, parts are not generated if Vi or Ei is not present.
2971*/
2972
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002973static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002974com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002975{
2976 int except_anchor = 0;
2977 int end_anchor = 0;
2978 int else_anchor = 0;
2979 int i;
2980 node *ch;
2981
2982 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2983 block_push(c, SETUP_EXCEPT);
2984 com_node(c, CHILD(n, 2));
2985 com_addbyte(c, POP_BLOCK);
2986 block_pop(c, SETUP_EXCEPT);
2987 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2988 com_backpatch(c, except_anchor);
2989 for (i = 3;
2990 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2991 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002992 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002993 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002994 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002995 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002996 break;
2997 }
2998 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002999 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003000 com_addoparg(c, SET_LINENO, ch->n_lineno);
3001 if (NCH(ch) > 1) {
3002 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003003 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003004 com_node(c, CHILD(ch, 1));
3005 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003006 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003007 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3008 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003009 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003010 }
3011 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003012 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003013 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003014 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003015 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003016 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003017 com_pop(c, 1);
3018 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003019 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003020 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003021 com_node(c, CHILD(n, i+2));
3022 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3023 if (except_anchor) {
3024 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003025 /* We come in with [tb, val, exc, 0] on the
3026 stack; one pop and it's the same as
3027 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003028 com_addbyte(c, POP_TOP);
3029 }
3030 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003031 /* We actually come in here with [tb, val, exc] but the
3032 END_FINALLY will zap those and jump around.
3033 The c_stacklevel does not reflect them so we need not pop
3034 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003035 com_addbyte(c, END_FINALLY);
3036 com_backpatch(c, else_anchor);
3037 if (i < NCH(n))
3038 com_node(c, CHILD(n, i+2));
3039 com_backpatch(c, end_anchor);
3040}
3041
3042static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003043com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003044{
3045 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003046 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003047
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003048 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3049 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003050 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003051 com_addbyte(c, POP_BLOCK);
3052 block_pop(c, SETUP_FINALLY);
3053 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003054 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003055 /* While the generated code pushes only one item,
3056 the try-finally handling can enter here with
3057 up to three items. OK, here are the details:
3058 3 for an exception, 2 for RETURN, 1 for BREAK. */
3059 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003060 com_backpatch(c, finally_anchor);
3061 ch = CHILD(n, NCH(n)-1);
3062 com_addoparg(c, SET_LINENO, ch->n_lineno);
3063 com_node(c, ch);
3064 com_addbyte(c, END_FINALLY);
3065 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003066 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003067}
3068
3069static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003070com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003071{
3072 REQ(n, try_stmt);
3073 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3074 | 'try' ':' suite 'finally' ':' suite */
3075 if (TYPE(CHILD(n, 3)) != except_clause)
3076 com_try_finally(c, n);
3077 else
3078 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003079}
3080
Guido van Rossum8b993a91997-01-17 21:04:03 +00003081static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003082get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003083{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003084 int i;
3085
Guido van Rossum8b993a91997-01-17 21:04:03 +00003086 /* Label to avoid tail recursion */
3087 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003088 switch (TYPE(n)) {
3089
3090 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003091 if (NCH(n) == 1) {
3092 n = CHILD(n, 0);
3093 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003094 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003095 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003096 case file_input:
3097 for (i = 0; i < NCH(n); i++) {
3098 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003099 if (TYPE(ch) == stmt) {
3100 n = ch;
3101 goto next;
3102 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003103 }
3104 break;
3105
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003106 case stmt:
3107 case simple_stmt:
3108 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003109 n = CHILD(n, 0);
3110 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003111
3112 case expr_stmt:
3113 case testlist:
3114 case test:
3115 case and_test:
3116 case not_test:
3117 case comparison:
3118 case expr:
3119 case xor_expr:
3120 case and_expr:
3121 case shift_expr:
3122 case arith_expr:
3123 case term:
3124 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003125 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003126 if (NCH(n) == 1) {
3127 n = CHILD(n, 0);
3128 goto next;
3129 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003130 break;
3131
3132 case atom:
3133 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003134 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003135 break;
3136
3137 }
3138 return NULL;
3139}
3140
Guido van Rossum79f25d91997-04-29 20:08:16 +00003141static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003142get_docstring(node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003143{
Guido van Rossum541563e1999-01-28 15:08:09 +00003144 /* Don't generate doc-strings if run with -OO */
3145 if (Py_OptimizeFlag > 1)
3146 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003147 n = get_rawdocstring(n);
3148 if (n == NULL)
3149 return NULL;
3150 return parsestrplus(n);
3151}
3152
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003153static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003154com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003155{
3156 REQ(n, suite);
3157 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3158 if (NCH(n) == 1) {
3159 com_node(c, CHILD(n, 0));
3160 }
3161 else {
3162 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003163 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003164 node *ch = CHILD(n, i);
3165 if (TYPE(ch) == stmt)
3166 com_node(c, ch);
3167 }
3168 }
3169}
3170
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003171/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003172static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003173com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003174{
3175 int i = c->c_nblocks;
3176 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3177 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3178 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003179 else if (i <= 0) {
3180 /* at the outer level */
3181 com_error(c, PyExc_SyntaxError,
3182 "'continue' not properly in loop");
3183 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003184 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003185 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003186 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003187 if (c->c_block[j] == SETUP_LOOP)
3188 break;
3189 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003190 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003191 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003192 for (; i > j; --i) {
3193 if (c->c_block[i] == SETUP_EXCEPT ||
3194 c->c_block[i] == SETUP_FINALLY) {
3195 com_addoparg(c, CONTINUE_LOOP,
3196 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003197 return;
3198 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003199 if (c->c_block[i] == END_FINALLY) {
3200 com_error(c, PyExc_SyntaxError,
3201 "'continue' not supported inside 'finally' clause");
3202 return;
3203 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003204 }
3205 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003206 com_error(c, PyExc_SyntaxError,
3207 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003208 }
3209 /* XXX Could allow it inside a 'finally' clause
3210 XXX if we could pop the exception still on the stack */
3211}
3212
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003213static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003214com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003215{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003216 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003217 if (TYPE(n) == lambdef) {
3218 /* lambdef: 'lambda' [varargslist] ':' test */
3219 n = CHILD(n, 1);
3220 }
3221 else {
3222 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3223 n = CHILD(n, 2);
3224 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3225 n = CHILD(n, 1);
3226 }
3227 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003228 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003229 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003230 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003231 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3232 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003233 nargs = 0;
3234 ndefs = 0;
3235 for (i = 0; i < nch; i++) {
3236 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003237 if (TYPE(CHILD(n, i)) == STAR ||
3238 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003239 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003240 nargs++;
3241 i++;
3242 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003243 t = RPAR; /* Anything except EQUAL or COMMA */
3244 else
3245 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003246 if (t == EQUAL) {
3247 i++;
3248 ndefs++;
3249 com_node(c, CHILD(n, i));
3250 i++;
3251 if (i >= nch)
3252 break;
3253 t = TYPE(CHILD(n, i));
3254 }
3255 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003256 /* Treat "(a=1, b)" as an error */
3257 if (ndefs)
3258 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003259 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003260 }
3261 if (t != COMMA)
3262 break;
3263 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003264 return ndefs;
3265}
3266
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003267static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003268com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003269{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003270 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003271 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003272 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003273 ndefs = com_argdefs(c, n);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003274 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3275 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003276 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003277 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003278 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003279 c->c_errors++;
3280 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003281 int closure = com_make_closure(c, (PyCodeObject *)co);
3282 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003283 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003284 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003285 if (closure)
3286 com_addoparg(c, MAKE_CLOSURE, ndefs);
3287 else
3288 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003289 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003290 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003291 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003292 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003293 }
3294}
3295
3296static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003297com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003298{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003299 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003300 REQ(n, testlist);
3301 /* testlist: test (',' test)* [','] */
3302 for (i = 0; i < NCH(n); i += 2)
3303 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003304 i = (NCH(n)+1) / 2;
3305 com_addoparg(c, BUILD_TUPLE, i);
3306 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003307}
3308
3309static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003310com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003311{
Guido van Rossum25831651993-05-19 14:50:45 +00003312 int i;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003313 PyObject *co, *v;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003314 char *name;
3315
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003316 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003317 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003318 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003319 c->c_errors++;
3320 return;
3321 }
3322 /* Push the class name on the stack */
3323 i = com_addconst(c, v);
3324 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003325 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003326 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003327 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003328 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003329 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003330 com_push(c, 1);
3331 }
Guido van Rossum25831651993-05-19 14:50:45 +00003332 else
3333 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003334 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003335 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003336 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003337 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003338 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003339 c->c_errors++;
3340 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003341 int closure = com_make_closure(c, (PyCodeObject *)co);
3342 i = com_addconst(c, co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003343 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003344 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003345 if (closure)
3346 com_addoparg(c, MAKE_CLOSURE, 0);
3347 else
3348 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003349 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003350 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003351 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003352 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003353 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003354 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003355}
3356
3357static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003358com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003359{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003360 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003361 if (c->c_errors)
3362 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003363 switch (TYPE(n)) {
3364
3365 /* Definition nodes */
3366
3367 case funcdef:
3368 com_funcdef(c, n);
3369 break;
3370 case classdef:
3371 com_classdef(c, n);
3372 break;
3373
3374 /* Trivial parse tree nodes */
3375
3376 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003377 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003378 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003379 n = CHILD(n, 0);
3380 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003381
3382 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003383 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
3384 com_addoparg(c, SET_LINENO, n->n_lineno);
3385 {
3386 int i;
3387 for (i = 0; i < NCH(n)-1; i += 2)
3388 com_node(c, CHILD(n, i));
3389 }
3390 break;
3391
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003392 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003393 com_addoparg(c, SET_LINENO, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003394 n = CHILD(n, 0);
3395 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003396
3397 /* Statement nodes */
3398
3399 case expr_stmt:
3400 com_expr_stmt(c, n);
3401 break;
3402 case print_stmt:
3403 com_print_stmt(c, n);
3404 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003405 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003406 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003407 break;
3408 case pass_stmt:
3409 break;
3410 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003411 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003412 com_error(c, PyExc_SyntaxError,
3413 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003414 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003415 com_addbyte(c, BREAK_LOOP);
3416 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003417 case continue_stmt:
3418 com_continue_stmt(c, n);
3419 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003420 case return_stmt:
3421 com_return_stmt(c, n);
3422 break;
3423 case raise_stmt:
3424 com_raise_stmt(c, n);
3425 break;
3426 case import_stmt:
3427 com_import_stmt(c, n);
3428 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003429 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003430 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003431 case exec_stmt:
3432 com_exec_stmt(c, n);
3433 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003434 case assert_stmt:
3435 com_assert_stmt(c, n);
3436 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003437 case if_stmt:
3438 com_if_stmt(c, n);
3439 break;
3440 case while_stmt:
3441 com_while_stmt(c, n);
3442 break;
3443 case for_stmt:
3444 com_for_stmt(c, n);
3445 break;
3446 case try_stmt:
3447 com_try_stmt(c, n);
3448 break;
3449 case suite:
3450 com_suite(c, n);
3451 break;
3452
3453 /* Expression nodes */
3454
3455 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003456 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003457 break;
3458 case test:
3459 com_test(c, n);
3460 break;
3461 case and_test:
3462 com_and_test(c, n);
3463 break;
3464 case not_test:
3465 com_not_test(c, n);
3466 break;
3467 case comparison:
3468 com_comparison(c, n);
3469 break;
3470 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003471 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003472 break;
3473 case expr:
3474 com_expr(c, n);
3475 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003476 case xor_expr:
3477 com_xor_expr(c, n);
3478 break;
3479 case and_expr:
3480 com_and_expr(c, n);
3481 break;
3482 case shift_expr:
3483 com_shift_expr(c, n);
3484 break;
3485 case arith_expr:
3486 com_arith_expr(c, n);
3487 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003488 case term:
3489 com_term(c, n);
3490 break;
3491 case factor:
3492 com_factor(c, n);
3493 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003494 case power:
3495 com_power(c, n);
3496 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003497 case atom:
3498 com_atom(c, n);
3499 break;
3500
3501 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003502 com_error(c, PyExc_SystemError,
3503 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003504 }
3505}
3506
Tim Petersdbd9ba62000-07-09 03:09:57 +00003507static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003508
3509static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003510com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003511{
3512 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3513 if (TYPE(CHILD(n, 0)) == LPAR)
3514 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003515 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003516 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003517 com_pop(c, 1);
3518 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003519}
3520
3521static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003522com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003523{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003524 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003525 if (NCH(n) == 1) {
3526 com_fpdef(c, CHILD(n, 0));
3527 }
3528 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003529 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003530 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003531 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003532 for (i = 0; i < NCH(n); i += 2)
3533 com_fpdef(c, CHILD(n, i));
3534 }
3535}
3536
3537static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003538com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003539{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003540 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003541 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003542 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003543 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003544 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003545 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003546 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003547 /* Enter all arguments in table of locals */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003548 for (i = 0, narg = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003549 node *ch = CHILD(n, i);
3550 node *fp;
3551 char *name;
Guido van Rossum50564e81996-01-12 01:13:16 +00003552 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003553 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003554 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3555 fp = CHILD(ch, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003556 if (TYPE(fp) == NAME) {
3557 PyObject *v;
3558 name = STR(fp);
3559 v = PyDict_GetItemString(c->c_cellvars, name);
3560 if (v) {
3561 com_addoparg(c, LOAD_FAST, narg);
3562 com_addoparg(c, STORE_DEREF,
3563 PyInt_AS_LONG(v));
3564 }
3565 } else {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003566 name = nbuf;
3567 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003568 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003569 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003570 narg++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003571 /* all name updates handled by symtable */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003572 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003573 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003574 ch = CHILD(n, i);
3575 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003576 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003577 else
3578 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003579 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003580 /* Handle *arguments */
3581 if (i < nch) {
3582 node *ch;
3583 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003584 if (TYPE(ch) != DOUBLESTAR) {
3585 REQ(ch, STAR);
3586 ch = CHILD(n, i+1);
3587 if (TYPE(ch) == NAME) {
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003588 PyObject *v;
Guido van Rossum50564e81996-01-12 01:13:16 +00003589 i += 3;
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003590 v = PyDict_GetItemString(c->c_cellvars,
3591 STR(ch));
3592 if (v) {
3593 com_addoparg(c, LOAD_FAST, narg);
3594 com_addoparg(c, STORE_DEREF,
3595 PyInt_AS_LONG(v));
Guido van Rossum50564e81996-01-12 01:13:16 +00003596 }
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003597 narg++;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003598 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003599 }
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003600 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003601 /* Handle **keywords */
3602 if (i < nch) {
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003603 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003604 node *ch;
3605 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003606 if (TYPE(ch) != DOUBLESTAR) {
3607 REQ(ch, STAR);
3608 ch = CHILD(n, i+1);
3609 REQ(ch, STAR);
3610 ch = CHILD(n, i+2);
3611 }
3612 else
3613 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003614 REQ(ch, NAME);
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003615 v = PyDict_GetItemString(c->c_cellvars, STR(ch));
3616 if (v) {
3617 com_addoparg(c, LOAD_FAST, narg);
3618 com_addoparg(c, STORE_DEREF, PyInt_AS_LONG(v));
3619 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003620 }
3621 if (complex) {
3622 /* Generate code for complex arguments only after
3623 having counted the simple arguments */
3624 int ilocal = 0;
3625 for (i = 0; i < nch; i++) {
3626 node *ch = CHILD(n, i);
3627 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003628 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003629 break;
3630 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3631 fp = CHILD(ch, 0);
3632 if (TYPE(fp) != NAME) {
3633 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003634 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003635 com_fpdef(c, ch);
3636 }
3637 ilocal++;
3638 if (++i >= nch)
3639 break;
3640 ch = CHILD(n, i);
3641 if (TYPE(ch) == EQUAL)
3642 i += 2;
3643 else
3644 REQ(ch, COMMA);
3645 }
3646 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003647}
3648
3649static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003650com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003651{
3652 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003653 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003654 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003655 doc = get_docstring(n);
3656 if (doc != NULL) {
3657 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003658 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003659 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003660 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003661 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003662 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003663 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003664 for (i = 0; i < NCH(n); i++) {
3665 node *ch = CHILD(n, i);
3666 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3667 com_node(c, ch);
3668 }
3669}
3670
3671/* Top-level compile-node interface */
3672
3673static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003674compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003675{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003676 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003677 node *ch;
3678 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003679 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003680 doc = get_docstring(CHILD(n, 4));
3681 if (doc != NULL) {
3682 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003683 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003684 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003685 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003686 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003687 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3688 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003689 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003690 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003691 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003692 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003693 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003694 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003695 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003696 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003697 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003698}
3699
3700static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003701compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003702{
Guido van Rossum590baa41993-11-30 13:40:46 +00003703 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003704 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003705 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003706
3707 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003708 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003709 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003710 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003711 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003712 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003713 else
3714 ch = CHILD(n, 2);
3715 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003716 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003717 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003718}
3719
3720static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003721compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003722{
3723 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003724 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003725 REQ(n, classdef);
3726 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3727 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003728 c->c_private = c->c_name;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003729 ch = CHILD(n, NCH(n)-1); /* The suite */
3730 doc = get_docstring(ch);
3731 if (doc != NULL) {
3732 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003733 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003734 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003735 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003736 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003737 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003738 }
3739 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003740 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003741 com_node(c, ch);
3742 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003743 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003744 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003745 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003746}
3747
3748static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003749compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003750{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003751 com_addoparg(c, SET_LINENO, n->n_lineno);
3752
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003753 switch (TYPE(n)) {
3754
Guido van Rossum4c417781991-01-21 16:09:22 +00003755 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003756 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003757 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003758 n = CHILD(n, 0);
3759 if (TYPE(n) != NEWLINE)
3760 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003761 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003762 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003763 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003764 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003765 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003766 break;
3767
Guido van Rossum4c417781991-01-21 16:09:22 +00003768 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003769 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003770 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003771 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003772 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003773 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003774 break;
3775
Guido van Rossum590baa41993-11-30 13:40:46 +00003776 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003777 com_node(c, CHILD(n, 0));
3778 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003779 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003780 break;
3781
Guido van Rossum590baa41993-11-30 13:40:46 +00003782 case lambdef: /* anonymous function definition */
3783 compile_lambdef(c, n);
3784 break;
3785
Guido van Rossum4c417781991-01-21 16:09:22 +00003786 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003787 compile_funcdef(c, n);
3788 break;
3789
Guido van Rossum4c417781991-01-21 16:09:22 +00003790 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003791 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003792 break;
3793
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003794 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003795 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003796 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003797 }
3798}
3799
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003800static PyObject *
3801dict_keys_inorder(PyObject *dict, int offset)
3802{
3803 PyObject *tuple, *k, *v;
3804 int i, pos = 0, size = PyDict_Size(dict);
3805
3806 tuple = PyTuple_New(size);
3807 if (tuple == NULL)
3808 return NULL;
3809 while (PyDict_Next(dict, &pos, &k, &v)) {
3810 i = PyInt_AS_LONG(v);
3811 Py_INCREF(k);
3812 PyTuple_SET_ITEM(tuple, i - offset, k);
3813 }
3814 return tuple;
3815}
3816
Guido van Rossum79f25d91997-04-29 20:08:16 +00003817PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003818PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003819{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003820 return PyNode_CompileFlags(n, filename, NULL);
3821}
3822
3823PyCodeObject *
3824PyNode_CompileFlags(node *n, char *filename, PyCompilerFlags *flags)
3825{
3826 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003827}
3828
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003829struct symtable *
3830PyNode_CompileSymtable(node *n, char *filename)
3831{
3832 struct symtable *st;
3833
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003834 st = symtable_init();
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003835 if (st == NULL)
3836 return NULL;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00003837 assert(st->st_symbols != NULL);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003838 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
3839 if (st->st_errors > 0) {
3840 PySymtable_Free(st);
3841 return NULL;
3842 }
3843 symtable_node(st, n);
3844 if (st->st_errors > 0) {
3845 PySymtable_Free(st);
3846 return NULL;
3847 }
3848 return st;
3849}
3850
Guido van Rossum79f25d91997-04-29 20:08:16 +00003851static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003852icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003853{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003854 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003855}
3856
Guido van Rossum79f25d91997-04-29 20:08:16 +00003857static PyCodeObject *
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003858jcompile(node *n, char *filename, struct compiling *base,
3859 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003860{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003861 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003862 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003863 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003864 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003865 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003866 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003867 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003868 /* c_symtable still points to parent's symbols */
3869 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003870 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003871 sc.c_nested = 1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003872 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003873 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00003874 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003875 if (sc.c_future == NULL) {
3876 com_free(&sc);
3877 return NULL;
3878 }
3879 if (flags) {
3880 if (flags->cf_nested_scopes)
3881 sc.c_future->ff_nested_scopes = 1;
3882 else if (sc.c_future->ff_nested_scopes)
3883 flags->cf_nested_scopes = 1;
3884 }
3885 if (symtable_build(&sc, n) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003886 com_free(&sc);
3887 return NULL;
3888 }
3889 }
3890 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003891 if (symtable_load_symbols(&sc) < 0) {
3892 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003893 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003894 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003895 compile_node(&sc, n);
3896 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00003897 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003898 PyObject *consts, *names, *varnames, *filename, *name,
3899 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003900 consts = PyList_AsTuple(sc.c_consts);
3901 names = PyList_AsTuple(sc.c_names);
3902 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003903 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
3904 freevars = dict_keys_inorder(sc.c_freevars,
3905 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003906 filename = PyString_InternFromString(sc.c_filename);
3907 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003908 if (!PyErr_Occurred())
3909 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003910 sc.c_nlocals,
3911 sc.c_maxstacklevel,
3912 sc.c_flags,
3913 sc.c_code,
3914 consts,
3915 names,
3916 varnames,
3917 freevars,
3918 cellvars,
3919 filename,
3920 name,
3921 sc.c_firstlineno,
3922 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003923 Py_XDECREF(consts);
3924 Py_XDECREF(names);
3925 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003926 Py_XDECREF(freevars);
3927 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003928 Py_XDECREF(filename);
3929 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003930 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00003931 else if (!PyErr_Occurred()) {
3932 /* This could happen if someone called PyErr_Clear() after an
3933 error was reported above. That's not supposed to happen,
3934 but I just plugged one case and I'm not sure there can't be
3935 others. In that case, raise SystemError so that at least
3936 it gets reported instead dumping core. */
3937 PyErr_SetString(PyExc_SystemError, "lost syntax error");
3938 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003939 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00003940 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003941 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00003942 sc.c_symtable = NULL;
3943 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003944 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003945 return co;
3946}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003947
3948int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003949PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003950{
3951 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003952 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003953 int line = co->co_firstlineno;
3954 int addr = 0;
3955 while (--size >= 0) {
3956 addr += *p++;
3957 if (addr > addrq)
3958 break;
3959 line += *p++;
3960 }
3961 return line;
3962}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003963
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003964/* The test for LOCAL must come before the test for FREE in order to
3965 handle classes where name is both local and free. The local var is
3966 a method and the free var is a free var referenced within a method.
3967*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003968
3969static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003970get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003971{
3972 PyObject *v;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00003973 if (c->c_symtable->st_nested_scopes) {
3974 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
3975 return CELL;
3976 if (PyDict_GetItemString(c->c_locals, name) != NULL)
3977 return LOCAL;
3978 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
3979 return FREE;
3980 v = PyDict_GetItemString(c->c_globals, name);
3981 if (v) {
3982 if (v == Py_None)
3983 return GLOBAL_EXPLICIT;
3984 else {
3985 return GLOBAL_IMPLICIT;
3986 }
3987 }
3988 } else {
3989 if (PyDict_GetItemString(c->c_locals, name) != NULL)
3990 return LOCAL;
3991 v = PyDict_GetItemString(c->c_globals, name);
3992 if (v) {
3993 if (v == Py_None)
3994 return GLOBAL_EXPLICIT;
3995 else {
3996 return GLOBAL_IMPLICIT;
3997 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003998 }
3999 }
4000 {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004001 char buf[350];
4002 sprintf(buf,
Jeremy Hylton51257732001-03-01 00:42:55 +00004003 "unknown scope for %.100s in %.100s(%s) "
4004 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
Jeremy Hylton483638c2001-02-01 20:20:45 +00004005 name, c->c_name,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004006 PyObject_REPR(c->c_symtable->st_cur->ste_id),
Jeremy Hylton51257732001-03-01 00:42:55 +00004007 c->c_filename,
4008 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4009 PyObject_REPR(c->c_locals),
4010 PyObject_REPR(c->c_globals)
4011 );
4012
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004013 Py_FatalError(buf);
4014 }
4015 return -1; /* can't get here */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004016}
4017
Guido van Rossum207fda62001-03-02 03:30:41 +00004018/* Helper functions to issue warnings */
4019
4020static int
4021issue_warning(char *msg, char *filename, int lineno)
4022{
4023 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4024 lineno, NULL, NULL) < 0) {
4025 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4026 PyErr_SetString(PyExc_SyntaxError, msg);
4027 PyErr_SyntaxLocation(filename, lineno);
4028 }
4029 return -1;
4030 }
4031 return 0;
4032}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004033
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004034static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004035symtable_warn(struct symtable *st, char *msg)
4036{
Guido van Rossum207fda62001-03-02 03:30:41 +00004037 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004038 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004039 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004040 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004041 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004042}
4043
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004044/* Helper function for setting lineno and filename */
4045
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004046static int
4047symtable_build(struct compiling *c, node *n)
4048{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004049 if ((c->c_symtable = symtable_init()) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004050 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004051 c->c_symtable->st_future = c->c_future;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004052 if (c->c_future->ff_nested_scopes)
4053 c->c_symtable->st_nested_scopes = 1;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004054 c->c_symtable->st_filename = c->c_filename;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004055 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
4056 if (c->c_symtable->st_errors > 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004057 return -1;
4058 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004059 if (c->c_symtable->st_errors > 0)
4060 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004061 /* reset for second pass */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004062 c->c_symtable->st_nscopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004063 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004064 return 0;
4065}
4066
4067static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004068symtable_init_compiling_symbols(struct compiling *c)
4069{
4070 PyObject *varnames;
4071
4072 varnames = c->c_symtable->st_cur->ste_varnames;
4073 if (varnames == NULL) {
4074 varnames = PyList_New(0);
4075 if (varnames == NULL)
4076 return -1;
4077 c->c_symtable->st_cur->ste_varnames = varnames;
4078 Py_INCREF(varnames);
4079 } else
4080 Py_INCREF(varnames);
4081 c->c_varnames = varnames;
4082
4083 c->c_globals = PyDict_New();
4084 if (c->c_globals == NULL)
4085 return -1;
4086 c->c_freevars = PyDict_New();
4087 if (c->c_freevars == NULL)
4088 return -1;
4089 c->c_cellvars = PyDict_New();
4090 if (c->c_cellvars == NULL)
4091 return -1;
4092 return 0;
4093}
4094
4095struct symbol_info {
4096 int si_nlocals;
4097 int si_ncells;
4098 int si_nfrees;
4099 int si_nimplicit;
4100};
4101
4102static void
4103symtable_init_info(struct symbol_info *si)
4104{
4105 si->si_nlocals = 0;
4106 si->si_ncells = 0;
4107 si->si_nfrees = 0;
4108 si->si_nimplicit = 0;
4109}
4110
4111static int
4112symtable_resolve_free(struct compiling *c, PyObject *name,
4113 struct symbol_info *si)
4114{
4115 PyObject *dict, *v;
4116
4117 /* Seperate logic for DEF_FREE. If it occurs in a function,
4118 it indicates a local that we must allocate storage for (a
4119 cell var). If it occurs in a class, then the class has a
4120 method and a free variable with the same name.
4121 */
4122
4123 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
4124 v = PyInt_FromLong(si->si_ncells++);
4125 dict = c->c_cellvars;
4126 } else {
4127 v = PyInt_FromLong(si->si_nfrees++);
4128 dict = c->c_freevars;
4129 }
4130 if (v == NULL)
4131 return -1;
4132 if (PyDict_SetItem(dict, name, v) < 0) {
4133 Py_DECREF(v);
4134 return -1;
4135 }
4136 Py_DECREF(v);
4137 return 0;
4138}
4139
4140static int
4141symtable_freevar_offsets(PyObject *freevars, int offset)
4142{
4143 PyObject *name, *v;
4144 int pos;
4145
4146 /* The cell vars are the first elements of the closure,
4147 followed by the free vars. Update the offsets in
4148 c_freevars to account for number of cellvars. */
4149 pos = 0;
4150 while (PyDict_Next(freevars, &pos, &name, &v)) {
4151 int i = PyInt_AS_LONG(v) + offset;
4152 PyObject *o = PyInt_FromLong(i);
4153 if (o == NULL)
4154 return -1;
4155 if (PyDict_SetItem(freevars, name, o) < 0) {
4156 Py_DECREF(o);
4157 return -1;
4158 }
4159 Py_DECREF(o);
4160 }
4161 return 0;
4162}
4163
4164static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004165symtable_check_unoptimized(struct compiling *c,
4166 PySymtableEntryObject *ste,
4167 struct symbol_info *si)
4168{
4169 char buf[300];
4170
4171 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4172 || (ste->ste_nested && si->si_nimplicit)))
4173 return 0;
4174
4175#define ILLEGAL_IMPORT_STAR \
4176"import * is not allowed in function '%.100s' " \
4177"because it contains a nested function with free variables"
4178
4179#define ILLEGAL_BARE_EXEC \
4180"unqualified exec is not allowed in function '%.100s' " \
4181"because it contains a nested function with free variables"
4182
4183#define ILLEGAL_EXEC_AND_IMPORT_STAR \
4184"function '%.100s' uses import * and bare exec, which are illegal" \
4185"because it contains a nested function with free variables"
4186
4187 /* XXX perhaps the linenos for these opt-breaking statements
4188 should be stored so the exception can point to them. */
4189
4190 if (ste->ste_optimized == OPT_IMPORT_STAR)
4191 sprintf(buf, ILLEGAL_IMPORT_STAR,
4192 PyString_AS_STRING(ste->ste_name));
4193 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
4194 sprintf(buf, ILLEGAL_BARE_EXEC,
4195 PyString_AS_STRING(ste->ste_name));
4196 else {
4197 sprintf(buf, ILLEGAL_EXEC_AND_IMPORT_STAR,
4198 PyString_AS_STRING(ste->ste_name));
4199 }
4200
4201 if (c->c_symtable->st_nested_scopes) {
4202 PyErr_SetString(PyExc_SyntaxError, buf);
4203 PyErr_SyntaxLocation(c->c_symtable->st_filename,
4204 ste->ste_lineno);
4205 return -1;
Guido van Rossum207fda62001-03-02 03:30:41 +00004206 }
4207 else {
4208 return issue_warning(buf, c->c_filename, ste->ste_lineno);
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004209 }
4210 return 0;
4211}
4212
4213static int
4214symtable_check_shadow(struct symtable *st, PyObject *name, int flags)
4215{
4216 char buf[500];
4217 PyObject *children, *v;
Jeremy Hyltonc1761322001-02-28 23:44:45 +00004218 PySymtableEntryObject *child = NULL;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004219 int i;
4220
4221 if (!(flags & DEF_BOUND))
4222 return 0;
4223 /* The semantics of this code will change with nested scopes.
4224 It is defined in the current scope and referenced in a
4225 child scope. Under the old rules, the child will see a
4226 global. Under the new rules, the child will see the
4227 binding in the current scope.
4228 */
4229
4230 /* Find name of child function that has free variable */
4231 children = st->st_cur->ste_children;
4232 for (i = 0; i < PyList_GET_SIZE(children); i++) {
4233 int cflags;
4234 child = (PySymtableEntryObject *)PyList_GET_ITEM(children, i);
4235 v = PyDict_GetItem(child->ste_symbols, name);
4236 if (v == NULL)
4237 continue;
4238 cflags = PyInt_AS_LONG(v);
4239 if (!(cflags & DEF_BOUND))
4240 break;
4241 }
Jeremy Hyltonc1761322001-02-28 23:44:45 +00004242
4243 assert(child != NULL);
4244
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004245 sprintf(buf, "local name '%.100s' in '%.100s' shadows "
4246 "use of '%.100s' as global in nested scope '%.100s'",
4247 PyString_AS_STRING(name),
4248 PyString_AS_STRING(st->st_cur->ste_name),
4249 PyString_AS_STRING(name),
4250 PyString_AS_STRING(child->ste_name)
4251 );
4252
4253 return symtable_warn(st, buf);
4254}
4255
4256static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004257symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4258 struct symbol_info *si)
4259{
4260 if (ste->ste_type != TYPE_MODULE)
4261 c->c_flags |= CO_NEWLOCALS;
4262 if (ste->ste_type == TYPE_FUNCTION) {
4263 c->c_nlocals = si->si_nlocals;
4264 if (ste->ste_optimized == 0)
4265 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004266 else if (ste->ste_optimized != OPT_EXEC)
4267 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004268 }
4269 return 0;
4270}
4271
4272static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004273symtable_load_symbols(struct compiling *c)
4274{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004275 static PyObject *implicit = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004276 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004277 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004278 PyObject *name, *varnames, *v;
4279 int i, flags, pos;
4280 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004281
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004282 if (implicit == NULL) {
4283 implicit = PyInt_FromLong(1);
4284 if (implicit == NULL)
4285 return -1;
4286 }
4287 v = NULL;
4288
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004289 if (symtable_init_compiling_symbols(c) < 0)
4290 goto fail;
4291 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004292 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004293 si.si_nlocals = PyList_GET_SIZE(varnames);
4294 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004295
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004296 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004297 v = PyInt_FromLong(i);
4298 if (PyDict_SetItem(c->c_locals,
4299 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004300 goto fail;
4301 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004302 }
4303
4304 /* XXX The cases below define the rules for whether a name is
4305 local or global. The logic could probably be clearer. */
4306 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004307 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4308 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004309
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004310 if (st->st_nested_scopes == 0
4311 && (flags & (DEF_FREE | DEF_FREE_CLASS))) {
4312 if (symtable_check_shadow(st, name, flags) < 0)
4313 goto fail;
4314 }
4315
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004316 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004317 /* undo the original DEF_FREE */
4318 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004319
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004320 if ((flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004321 && (flags & (DEF_LOCAL | DEF_PARAM)))
4322 symtable_resolve_free(c, name, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004323
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004324 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004325 c->c_argcount--;
4326 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004327 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004328 c->c_argcount--;
4329 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004330 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004331 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004332 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004333 if (flags & DEF_PARAM) {
4334 PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004335 PyString_AS_STRING(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004336 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004337 ste->ste_lineno);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004338 st->st_errors++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004339 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004340 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004341 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4342 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004343 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004344 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004345 if (PyDict_SetItem(c->c_globals, name, implicit) < 0)
4346 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004347 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004348 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004349 if (v == NULL)
4350 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004351 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004352 goto fail;
4353 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004354 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004355 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004356 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004357 } else if (is_free(flags)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004358 if (ste->ste_nested && st->st_nested_scopes) {
4359 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004360 if (v == NULL)
4361 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004362 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004363 goto fail;
4364 Py_DECREF(v);
4365 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004366 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004367 if (PyDict_SetItem(c->c_globals, name,
4368 implicit) < 0)
4369 goto fail;
Jeremy Hylton51257732001-03-01 00:42:55 +00004370 if (st->st_nscopes != 1) {
4371 v = PyInt_FromLong(flags);
4372 if (PyDict_SetItem(st->st_global,
4373 name, v))
4374 goto fail;
4375 Py_DECREF(v);
4376 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004377 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004378 }
4379 }
4380
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004381 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4382 return -1;
4383 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004384 fail:
4385 /* is this always the right thing to do? */
4386 Py_XDECREF(v);
4387 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004388}
4389
4390static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004391symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004392{
4393 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004394
4395 st = (struct symtable *)PyMem_Malloc(sizeof(struct symtable));
4396 if (st == NULL)
4397 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004398 st->st_pass = 1;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004399 st->st_nested_scopes = NESTED_SCOPES_DEFAULT;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004400 st->st_filename = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004401 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004402 goto fail;
4403 if ((st->st_symbols = PyDict_New()) == NULL)
4404 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004405 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004406 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004407 st->st_errors = 0;
4408 st->st_tmpname = 0;
4409 st->st_private = NULL;
4410 return st;
4411 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004412 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004413 return NULL;
4414}
4415
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004416void
4417PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004418{
4419 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004420 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004421 Py_XDECREF(st->st_cur);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004422 PyMem_Free((void *)st);
4423}
4424
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004425/* When the compiler exits a scope, it must should update the scope's
4426 free variable information with the list of free variables in its
4427 children.
4428
4429 Variables that are free in children and defined in the current
4430 scope are cellvars.
4431
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004432 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004433 false), free variables in children that are not defined here are
4434 implicit globals.
4435
4436*/
4437
4438static int
4439symtable_update_free_vars(struct symtable *st)
4440{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004441 int i, j, def;
4442 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004443 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004444
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004445 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004446 def = DEF_FREE_CLASS;
4447 else
4448 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004449 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004450 int pos = 0;
4451
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004452 if (list)
4453 PyList_SetSlice(list, 0,
4454 ((PyVarObject*)list)->ob_size, 0);
Barry Warsaw0372af72001-02-23 18:22:59 +00004455 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004456 PyList_GET_ITEM(ste->ste_children, i);
4457 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004458 int flags = PyInt_AS_LONG(o);
4459 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004460 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004461 if (list == NULL) {
4462 list = PyList_New(0);
4463 if (list == NULL)
4464 return -1;
4465 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004466 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004467 if (PyList_Append(list, name) < 0) {
4468 Py_DECREF(list);
4469 return -1;
4470 }
4471 }
4472 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004473 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004474 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00004475 v = PyDict_GetItem(ste->ste_symbols, name);
4476 /* If a name N is declared global in scope A and
4477 referenced in scope B contained (perhaps
4478 indirectly) in A and there are no scopes
4479 with bindings for N between B and A, then N
4480 is global in B.
4481 */
4482 if (v) {
4483 int flags = PyInt_AS_LONG(v);
4484 if (flags & DEF_GLOBAL) {
4485 symtable_undo_free(st, child->ste_id,
4486 name);
4487 continue;
4488 }
4489 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004490 if (ste->ste_nested) {
4491 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004492 name, def) < 0) {
4493 Py_DECREF(list);
4494 return -1;
4495 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004496 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004497 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004498 name) < 0) {
4499 Py_DECREF(list);
4500 return -1;
4501 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004502 }
4503 }
4504 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004505
4506 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004507 return 0;
4508}
4509
4510/* If the current scope is a non-nested class or if name is not
4511 defined in the current, non-nested scope, then it is an implicit
4512 global in all nested scopes.
4513*/
4514
4515static int
4516symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
4517{
4518 PyObject *o;
4519 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004520 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00004521
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004522 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004523 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004524 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004525 if (o == NULL)
4526 return symtable_undo_free(st, child, name);
4527 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00004528
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004529 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004530 return symtable_undo_free(st, child, name);
4531 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004532 return symtable_add_def_o(st, ste->ste_symbols,
4533 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004534}
4535
4536static int
4537symtable_undo_free(struct symtable *st, PyObject *id,
4538 PyObject *name)
4539{
4540 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004541 PyObject *info;
4542 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004543
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004544 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
4545 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004546 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00004547
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004548 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004549 if (info == NULL)
4550 return 0;
4551 v = PyInt_AS_LONG(info);
4552 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004553 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004554 DEF_FREE_GLOBAL) < 0)
4555 return -1;
4556 } else
4557 /* If the name is defined here or declared global,
4558 then the recursion stops. */
4559 return 0;
4560
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004561 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
4562 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00004563 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004564 PyList_GET_ITEM(ste->ste_children, i);
4565 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004566 if (x < 0)
4567 return x;
4568 }
4569 return 0;
4570}
4571
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004572/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
4573 This reference is released when the scope is exited, via the DECREF
4574 in symtable_exit_scope().
4575*/
4576
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004577static int
4578symtable_exit_scope(struct symtable *st)
4579{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004580 int end;
4581
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004582 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004583 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004584 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004585 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004586 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
4587 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004588 if (PySequence_DelItem(st->st_stack, end) < 0)
4589 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004590 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004591}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004592
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004593static void
4594symtable_enter_scope(struct symtable *st, char *name, int type,
4595 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004596{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004597 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004598
4599 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004600 prev = st->st_cur;
4601 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
4602 Py_DECREF(st->st_cur);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004603 st->st_errors++;
4604 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004605 }
4606 }
Barry Warsaw0372af72001-02-23 18:22:59 +00004607 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004608 PySymtableEntry_New(st, name, type, lineno);
4609 if (strcmp(name, TOP) == 0)
4610 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004611 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004612 if (PyList_Append(prev->ste_children,
4613 (PyObject *)st->st_cur) < 0)
4614 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004615 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004616}
4617
4618static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004619symtable_lookup(struct symtable *st, char *name)
4620{
4621 char buffer[MANGLE_LEN];
4622 PyObject *v;
4623 int flags;
4624
4625 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
4626 name = buffer;
4627 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
4628 if (v == NULL) {
4629 if (PyErr_Occurred())
4630 return -1;
4631 else
4632 return 0;
4633 }
4634
4635 flags = PyInt_AS_LONG(v);
4636 return flags;
4637}
4638
4639static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004640symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004641{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004642 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004643 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004644 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004645
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004646 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004647 name = buffer;
4648 if ((s = PyString_InternFromString(name)) == NULL)
4649 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004650 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
4651 Py_DECREF(s);
4652 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004653}
4654
4655/* Must only be called with mangled names */
4656
4657static int
4658symtable_add_def_o(struct symtable *st, PyObject *dict,
4659 PyObject *name, int flag)
4660{
4661 PyObject *o;
4662 int val;
4663
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004664 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004665 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004666 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004667 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00004668 PyString_AsString(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004669 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004670 st->st_cur->ste_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004671 return -1;
4672 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004673 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004674 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004675 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004676 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004677 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004678 Py_DECREF(o);
4679 return -1;
4680 }
4681 Py_DECREF(o);
4682
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004683 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004684 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004685 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004686 } else if (flag & DEF_GLOBAL) {
4687 /* XXX need to update DEF_GLOBAL for other flags too;
4688 perhaps only DEF_FREE_GLOBAL */
4689 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004690 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004691 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004692 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004693 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004694 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004695 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004696 Py_DECREF(o);
4697 return -1;
4698 }
4699 Py_DECREF(o);
4700 }
4701 return 0;
4702}
4703
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004704#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004705
4706static void
4707symtable_node(struct symtable *st, node *n)
4708{
4709 int i, start = 0;
4710
4711 loop:
4712 switch (TYPE(n)) {
4713 case funcdef: {
4714 char *func_name = STR(CHILD(n, 1));
4715 symtable_add_def(st, func_name, DEF_LOCAL);
4716 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004717 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004718 symtable_funcdef(st, n);
4719 symtable_exit_scope(st);
4720 break;
4721 }
4722 case lambdef:
4723 if (NCH(n) == 4)
4724 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004725 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004726 symtable_funcdef(st, n);
4727 symtable_exit_scope(st);
4728 break;
4729 case classdef: {
4730 char *tmp, *class_name = STR(CHILD(n, 1));
4731 symtable_add_def(st, class_name, DEF_LOCAL);
4732 if (TYPE(CHILD(n, 2)) == LPAR) {
4733 node *bases = CHILD(n, 3);
4734 int i;
4735 for (i = 0; i < NCH(bases); i += 2) {
4736 symtable_node(st, CHILD(bases, i));
4737 }
4738 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004739 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004740 tmp = st->st_private;
4741 st->st_private = class_name;
4742 symtable_node(st, CHILD(n, NCH(n) - 1));
4743 st->st_private = tmp;
4744 symtable_exit_scope(st);
4745 break;
4746 }
4747 case if_stmt:
4748 for (i = 0; i + 3 < NCH(n); i += 4) {
4749 if (is_constant_false(NULL, (CHILD(n, i + 1))))
4750 continue;
4751 symtable_node(st, CHILD(n, i + 1));
4752 symtable_node(st, CHILD(n, i + 3));
4753 }
4754 if (i + 2 < NCH(n))
4755 symtable_node(st, CHILD(n, i + 2));
4756 break;
4757 case global_stmt:
4758 symtable_global(st, n);
4759 break;
4760 case import_stmt:
4761 symtable_import(st, n);
4762 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004763 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004764 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004765 symtable_node(st, CHILD(n, 1));
4766 if (NCH(n) > 2)
4767 symtable_node(st, CHILD(n, 3));
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004768 else
4769 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004770 if (NCH(n) > 4)
4771 symtable_node(st, CHILD(n, 5));
4772 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004773
4774 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00004775 case assert_stmt:
4776 if (Py_OptimizeFlag)
4777 return;
4778 if (NCH(n) == 2) {
4779 n = CHILD(n, 1);
4780 goto loop;
4781 } else {
4782 symtable_node(st, CHILD(n, 1));
4783 n = CHILD(n, 3);
4784 goto loop;
4785 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004786 case except_clause:
4787 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004788 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004789 if (NCH(n) > 1) {
4790 n = CHILD(n, 1);
4791 goto loop;
4792 }
4793 break;
4794 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004795 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004796 break;
4797 case expr_stmt:
4798 if (NCH(n) == 1)
4799 n = CHILD(n, 0);
4800 else {
4801 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004802 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004803 symtable_node(st, CHILD(n, 2));
4804 break;
4805 } else {
4806 int i;
4807 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004808 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004809 n = CHILD(n, NCH(n) - 1);
4810 }
4811 }
4812 goto loop;
4813 /* watchout for fall-through logic below */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004814 case argument:
4815 if (NCH(n) == 3) {
4816 n = CHILD(n, 2);
4817 goto loop;
4818 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004819 case listmaker:
4820 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
4821 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton5f827f42001-01-23 01:26:20 +00004822 n = CHILD(n, 0);
4823 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004824 }
4825 case atom:
4826 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
4827 symtable_add_use(st, STR(CHILD(n, 0)));
4828 break;
4829 }
4830 case for_stmt:
4831 if (TYPE(n) == for_stmt) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004832 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004833 start = 3;
4834 }
4835 default:
4836 if (NCH(n) == 1) {
4837 n = CHILD(n, 0);
4838 goto loop;
4839 }
4840 for (i = start; i < NCH(n); ++i)
4841 if (TYPE(CHILD(n, i)) >= single_input)
4842 symtable_node(st, CHILD(n, i));
4843 }
4844}
4845
4846static void
4847symtable_funcdef(struct symtable *st, node *n)
4848{
4849 node *body;
4850
4851 if (TYPE(n) == lambdef) {
4852 if (NCH(n) == 4)
4853 symtable_params(st, CHILD(n, 1));
4854 } else
4855 symtable_params(st, CHILD(n, 2));
4856 body = CHILD(n, NCH(n) - 1);
4857 symtable_node(st, body);
4858}
4859
4860/* The next two functions parse the argument tuple.
4861 symtable_default_arg() checks for names in the default arguments,
4862 which are references in the defining scope. symtable_params()
4863 parses the parameter names, which are defined in the function's
4864 body.
4865
4866 varargslist:
4867 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
4868 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
4869*/
4870
4871static void
4872symtable_default_args(struct symtable *st, node *n)
4873{
4874 node *c;
4875 int i;
4876
4877 if (TYPE(n) == parameters) {
4878 n = CHILD(n, 1);
4879 if (TYPE(n) == RPAR)
4880 return;
4881 }
4882 REQ(n, varargslist);
4883 for (i = 0; i < NCH(n); i += 2) {
4884 c = CHILD(n, i);
4885 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
4886 break;
4887 }
4888 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
4889 symtable_node(st, CHILD(n, i));
4890 }
4891}
4892
4893static void
4894symtable_params(struct symtable *st, node *n)
4895{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004896 int i, complex = -1, ext = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004897 node *c = NULL;
4898
4899 if (TYPE(n) == parameters) {
4900 n = CHILD(n, 1);
4901 if (TYPE(n) == RPAR)
4902 return;
4903 }
4904 REQ(n, varargslist);
4905 for (i = 0; i < NCH(n); i += 2) {
4906 c = CHILD(n, i);
4907 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
4908 ext = 1;
4909 break;
4910 }
4911 if (TYPE(c) == test) {
4912 continue;
4913 }
4914 if (TYPE(CHILD(c, 0)) == NAME)
4915 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
4916 else {
4917 char nbuf[10];
4918 sprintf(nbuf, ".%d", i);
4919 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004920 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004921 }
4922 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004923 if (ext) {
4924 c = CHILD(n, i);
4925 if (TYPE(c) == STAR) {
4926 i++;
4927 symtable_add_def(st, STR(CHILD(n, i)),
4928 DEF_PARAM | DEF_STAR);
4929 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00004930 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004931 c = NULL;
4932 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004933 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004934 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004935 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004936 i++;
4937 symtable_add_def(st, STR(CHILD(n, i)),
4938 DEF_PARAM | DEF_DOUBLESTAR);
4939 }
4940 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004941 if (complex >= 0) {
4942 int j;
4943 for (j = 0; j <= complex; j++) {
4944 c = CHILD(n, j);
4945 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00004946 c = CHILD(n, ++j);
4947 else if (TYPE(c) == EQUAL)
4948 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004949 if (TYPE(CHILD(c, 0)) == LPAR)
4950 symtable_params_fplist(st, CHILD(c, 1));
4951 }
4952 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004953}
4954
4955static void
4956symtable_params_fplist(struct symtable *st, node *n)
4957{
4958 int i;
4959 node *c;
4960
4961 REQ(n, fplist);
4962 for (i = 0; i < NCH(n); i += 2) {
4963 c = CHILD(n, i);
4964 REQ(c, fpdef);
4965 if (NCH(c) == 1)
4966 symtable_add_def(st, STR(CHILD(c, 0)),
4967 DEF_PARAM | DEF_INTUPLE);
4968 else
4969 symtable_params_fplist(st, CHILD(c, 1));
4970 }
4971
4972}
4973
4974static void
4975symtable_global(struct symtable *st, node *n)
4976{
4977 int i;
4978
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004979 /* XXX It might be helpful to warn about module-level global
4980 statements, but it's hard to tell the difference between
4981 module-level and a string passed to exec.
4982 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00004983
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004984 for (i = 1; i < NCH(n); i += 2) {
4985 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00004986 int flags;
4987
4988 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004989 if (flags < 0)
4990 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00004991 if (flags && flags != DEF_GLOBAL) {
4992 char buf[500];
4993 if (flags & DEF_PARAM) {
4994 PyErr_Format(PyExc_SyntaxError,
4995 "name '%.400s' is local and global",
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004996 name);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004997 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00004998 st->st_cur->ste_lineno);
4999 st->st_errors++;
5000 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005001 }
5002 else {
5003 if (flags & DEF_LOCAL)
5004 sprintf(buf, GLOBAL_AFTER_ASSIGN,
5005 name);
5006 else
5007 sprintf(buf, GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005008 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005009 }
5010 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005011 symtable_add_def(st, name, DEF_GLOBAL);
5012 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005013}
5014
5015static void
5016symtable_list_comprehension(struct symtable *st, node *n)
5017{
5018 char tmpname[12];
5019
Tim Peters30814212001-02-17 05:30:26 +00005020 sprintf(tmpname, "_[%d]", ++st->st_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005021 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005022 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005023 symtable_node(st, CHILD(n, 3));
5024 if (NCH(n) == 5)
5025 symtable_node(st, CHILD(n, 4));
5026 --st->st_tmpname;
5027}
5028
5029static void
5030symtable_import(struct symtable *st, node *n)
5031{
5032 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005033 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005034 | 'from' dotted_name 'import'
5035 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00005036 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005037 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005038 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005039 node *dotname = CHILD(n, 1);
5040 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
5041 /* check for bogus imports */
5042 if (n->n_lineno >= st->st_future->ff_last_lineno) {
5043 PyErr_SetString(PyExc_SyntaxError,
5044 LATE_FUTURE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005045 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005046 n->n_lineno);
5047 st->st_errors++;
5048 return;
5049 }
5050 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005051 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005052 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005053 } else {
5054 for (i = 3; i < NCH(n); i += 2) {
5055 node *c = CHILD(n, i);
5056 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005057 symtable_assign(st, CHILD(c, 2),
5058 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005059 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005060 symtable_assign(st, CHILD(c, 0),
5061 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005062 }
5063 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005064 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005065 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005066 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005067 }
5068 }
5069}
5070
5071static void
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005072symtable_assign(struct symtable *st, node *n, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005073{
5074 node *tmp;
5075 int i;
5076
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005077 loop:
5078 switch (TYPE(n)) {
5079 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005080 /* invalid assignment, e.g. lambda x:x=2. The next
5081 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005082 return;
5083 case power:
5084 if (NCH(n) > 2) {
5085 for (i = 2; i < NCH(n); ++i)
5086 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
5087 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005088 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005089 if (NCH(n) > 1) {
5090 symtable_node(st, CHILD(n, 0));
5091 symtable_node(st, CHILD(n, 1));
5092 } else {
5093 n = CHILD(n, 0);
5094 goto loop;
5095 }
5096 return;
5097 case listmaker:
5098 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
5099 symtable_list_comprehension(st, CHILD(n, 1));
5100 else {
5101 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005102 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005103 }
5104 return;
5105 case exprlist:
5106 case testlist:
5107 if (NCH(n) == 1) {
5108 n = CHILD(n, 0);
5109 goto loop;
5110 }
5111 else {
5112 int i;
5113 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005114 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005115 return;
5116 }
5117 goto loop;
5118 case atom:
5119 tmp = CHILD(n, 0);
5120 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
5121 n = CHILD(n, 1);
5122 goto loop;
5123 } else if (TYPE(tmp) == NAME)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005124 symtable_add_def(st, STR(tmp), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005125 return;
5126 case dotted_as_name:
5127 if (NCH(n) == 3)
5128 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005129 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005130 else
5131 symtable_add_def(st,
5132 STR(CHILD(CHILD(n,
5133 0), 0)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005134 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005135 return;
5136 case dotted_name:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005137 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005138 return;
5139 case NAME:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005140 symtable_add_def(st, STR(n), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005141 return;
5142 default:
5143 if (NCH(n) == 0)
5144 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00005145 if (NCH(n) == 1) {
5146 n = CHILD(n, 0);
5147 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005148 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00005149 /* Should only occur for errors like x + 1 = 1,
5150 which will be caught in the next pass. */
5151 for (i = 0; i < NCH(n); ++i)
5152 if (TYPE(CHILD(n, i)) >= single_input)
5153 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005154 }
5155}