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