blob: efef05b25a9265c3a58b61bc9b59b787d331d5e3 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002/* Compile an expression node to intermediate code */
3
Guido van Rossum3f5da241990-12-20 15:06:42 +00004/* XXX TO DO:
Guido van Rossum8b993a91997-01-17 21:04:03 +00005 XXX add __doc__ attribute == co_doc to code object attributes?
6 XXX (it's currently the first item of the co_const tuple)
Guido van Rossum3f5da241990-12-20 15:06:42 +00007 XXX Generate simple jump for break/return outside 'try...finally'
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00008 XXX Allow 'continue' inside finally clause of try-finally
Guido van Rossum8b993a91997-01-17 21:04:03 +00009 XXX New opcode for loading the initial index for a for loop
Guido van Rossum681d79a1995-07-18 14:51:37 +000010 XXX other JAR tricks?
Guido van Rossum3f5da241990-12-20 15:06:42 +000011*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +000012
Guido van Rossum79f25d91997-04-29 20:08:16 +000013#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000014
Guido van Rossum10dc2e81990-11-18 17:27:39 +000015#include "node.h"
16#include "token.h"
17#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000018#include "compile.h"
Jeremy Hylton4b38da62001-02-02 18:19:15 +000019#include "symtable.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000020#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000021#include "structmember.h"
22
23#include <ctype.h>
Guido van Rossum282914b1991-04-04 10:42:56 +000024
Guido van Rossumb05a5c71997-05-07 17:46:13 +000025/* Three symbols from graminit.h are also defined in Python.h, with
26 Py_ prefixes to their names. Python.h can't include graminit.h
27 (which defines too many confusing symbols), but we can check here
28 that they haven't changed (which is very unlikely, but possible). */
29#if Py_single_input != single_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000030 #error "single_input has changed -- update Py_single_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000031#endif
32#if Py_file_input != file_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000033 #error "file_input has changed -- update Py_file_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000034#endif
35#if Py_eval_input != eval_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000036 #error "eval_input has changed -- update Py_eval_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000037#endif
38
Guido van Rossum8e793d91997-03-03 19:13:14 +000039int Py_OptimizeFlag = 0;
40
Guido van Rossum8861b741996-07-30 16:49:37 +000041#define OP_DELETE 0
42#define OP_ASSIGN 1
43#define OP_APPLY 2
44
Jeremy Hyltone36f7782001-01-19 03:21:30 +000045#define VAR_LOAD 0
46#define VAR_STORE 1
47#define VAR_DELETE 2
48
Jeremy Hylton64949cb2001-01-25 20:06:59 +000049#define DEL_CLOSURE_ERROR \
Jeremy Hyltoneab156f2001-01-30 01:24:43 +000050"can not delete variable '%.400s' referenced in nested scope"
51
52#define DUPLICATE_ARGUMENT \
53"duplicate argument '%s' in function definition"
54
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000055#define ILLEGAL_DYNAMIC_SCOPE \
56"%.100s: exec or 'import *' makes names ambiguous in nested scope"
Jeremy Hyltoneab156f2001-01-30 01:24:43 +000057
Jeremy Hylton29906ee2001-02-27 04:23:34 +000058#define GLOBAL_AFTER_ASSIGN \
59"name '%.400s' is assigned to before global declaration"
60
61#define GLOBAL_AFTER_USE \
62"name '%.400s' is used prior to global declaration"
63
64#define LOCAL_GLOBAL \
65"name '%.400s' is a function paramter and declared global"
66
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +000067#define LATE_FUTURE \
68"from __future__ imports must occur at the beginning of the file"
69
Jeremy Hyltone36f7782001-01-19 03:21:30 +000070#define MANGLE_LEN 256
71
Guido van Rossum79f25d91997-04-29 20:08:16 +000072#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000073
74static struct memberlist code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000075 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
76 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000077 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000078 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000079 {"co_code", T_OBJECT, OFF(co_code), READONLY},
80 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
81 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000082 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Jeremy Hylton64949cb2001-01-25 20:06:59 +000083 {"co_freevars", T_OBJECT, OFF(co_freevars), READONLY},
84 {"co_cellvars", T_OBJECT, OFF(co_cellvars), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000085 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000086 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000087 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
88 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000089 {NULL} /* Sentinel */
90};
91
Guido van Rossum79f25d91997-04-29 20:08:16 +000092static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000093code_getattr(PyCodeObject *co, char *name)
Guido van Rossum3f5da241990-12-20 15:06:42 +000094{
Guido van Rossum79f25d91997-04-29 20:08:16 +000095 return PyMember_Get((char *)co, code_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +000096}
Guido van Rossum10dc2e81990-11-18 17:27:39 +000097
98static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000099code_dealloc(PyCodeObject *co)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000100{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000101 Py_XDECREF(co->co_code);
102 Py_XDECREF(co->co_consts);
103 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +0000104 Py_XDECREF(co->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000105 Py_XDECREF(co->co_freevars);
106 Py_XDECREF(co->co_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000107 Py_XDECREF(co->co_filename);
108 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +0000109 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000110 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000111}
112
Guido van Rossum79f25d91997-04-29 20:08:16 +0000113static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000114code_repr(PyCodeObject *co)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000115{
116 char buf[500];
117 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000118 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000119 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000120
Guido van Rossuma396a882000-04-07 01:21:36 +0000121 if (co->co_firstlineno != 0)
122 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000123 if (co->co_filename && PyString_Check(co->co_filename))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000124 filename = PyString_AS_STRING(co->co_filename);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000125 if (co->co_name && PyString_Check(co->co_name))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000126 name = PyString_AS_STRING(co->co_name);
Fred Drake615ae552000-06-30 16:20:13 +0000127 sprintf(buf, "<code object %.100s at %p, file \"%.300s\", line %d>",
128 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000129 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000130}
131
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000132static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000133code_compare(PyCodeObject *co, PyCodeObject *cp)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000134{
135 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000136 cmp = PyObject_Compare(co->co_name, cp->co_name);
137 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000138 cmp = co->co_argcount - cp->co_argcount;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000139 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000140 cmp = co->co_nlocals - cp->co_nlocals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000141 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000142 cmp = co->co_flags - cp->co_flags;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000143 if (cmp) return cmp;
Guido van Rossumd076c731998-10-07 19:42:25 +0000144 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000145 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000146 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000147 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000148 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000149 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000150 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000151 if (cmp) return cmp;
152 cmp = PyObject_Compare(co->co_freevars, cp->co_freevars);
153 if (cmp) return cmp;
154 cmp = PyObject_Compare(co->co_cellvars, cp->co_cellvars);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000155 return cmp;
156}
157
158static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000159code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000160{
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000161 long h, h0, h1, h2, h3, h4, h5, h6;
Guido van Rossum44679592000-04-10 16:20:31 +0000162 h0 = PyObject_Hash(co->co_name);
163 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000164 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000165 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000166 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000167 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000168 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000169 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000170 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000171 if (h4 == -1) return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000172 h5 = PyObject_Hash(co->co_freevars);
173 if (h5 == -1) return -1;
174 h6 = PyObject_Hash(co->co_cellvars);
175 if (h6 == -1) return -1;
176 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^ h5 ^ h6 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000177 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000178 if (h == -1) h = -2;
179 return h;
180}
181
Jeremy Hylton78891072001-03-01 06:09:34 +0000182/* XXX code objects need to participate in GC? */
183
Guido van Rossum79f25d91997-04-29 20:08:16 +0000184PyTypeObject PyCode_Type = {
185 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000186 0,
187 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000188 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000189 0,
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000190 (destructor)code_dealloc, /*tp_dealloc*/
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000191 0, /*tp_print*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000192 (getattrfunc)code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000193 0, /*tp_setattr*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000194 (cmpfunc)code_compare, /*tp_compare*/
195 (reprfunc)code_repr, /*tp_repr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000196 0, /*tp_as_number*/
197 0, /*tp_as_sequence*/
198 0, /*tp_as_mapping*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000199 (hashfunc)code_hash, /*tp_hash*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000200};
201
Guido van Rossum644a12b1997-04-09 19:24:53 +0000202#define NAME_CHARS \
203 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
204
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000205/* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
206
207static int
208all_name_chars(unsigned char *s)
209{
Guido van Rossumcd90c202001-02-09 15:06:42 +0000210 static char ok_name_char[256];
211 static unsigned char *name_chars = (unsigned char *)NAME_CHARS;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000212
Guido van Rossumcd90c202001-02-09 15:06:42 +0000213 if (ok_name_char[*name_chars] == 0) {
214 unsigned char *p;
215 for (p = name_chars; *p; p++)
216 ok_name_char[*p] = 1;
217 }
218 while (*s) {
219 if (ok_name_char[*s++] == 0)
220 return 0;
221 }
222 return 1;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000223}
224
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000225static int
226intern_strings(PyObject *tuple)
227{
228 int i;
229
230 for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) {
231 PyObject *v = PyTuple_GET_ITEM(tuple, i);
232 if (v == NULL || !PyString_Check(v)) {
233 Py_FatalError("non-string found in code slot");
234 PyErr_BadInternalCall();
235 return -1;
236 }
237 PyString_InternInPlace(&PyTuple_GET_ITEM(tuple, i));
238 }
239 return 0;
240}
241
Guido van Rossum79f25d91997-04-29 20:08:16 +0000242PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000243PyCode_New(int argcount, int nlocals, int stacksize, int flags,
244 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000245 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
246 PyObject *filename, PyObject *name, int firstlineno,
247 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000248{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000249 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000250 int i;
Guido van Rossumd076c731998-10-07 19:42:25 +0000251 PyBufferProcs *pb;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000252 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000253 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000254 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000255 consts == NULL || !PyTuple_Check(consts) ||
256 names == NULL || !PyTuple_Check(names) ||
257 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000258 freevars == NULL || !PyTuple_Check(freevars) ||
259 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000260 name == NULL || !PyString_Check(name) ||
261 filename == NULL || !PyString_Check(filename) ||
262 lnotab == NULL || !PyString_Check(lnotab)) {
263 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000264 return NULL;
265 }
Guido van Rossumd076c731998-10-07 19:42:25 +0000266 pb = code->ob_type->tp_as_buffer;
267 if (pb == NULL ||
268 pb->bf_getreadbuffer == NULL ||
269 pb->bf_getsegcount == NULL ||
270 (*pb->bf_getsegcount)(code, NULL) != 1)
271 {
272 PyErr_BadInternalCall();
273 return NULL;
274 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000275 intern_strings(names);
276 intern_strings(varnames);
277 if (freevars == NULL)
278 freevars = PyTuple_New(0);
279 intern_strings(freevars);
280 if (cellvars == NULL)
281 cellvars = PyTuple_New(0);
282 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000283 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000284 for (i = PyTuple_Size(consts); --i >= 0; ) {
285 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000286 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000287 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000288 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000289 continue;
290 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000291 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000292 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000293 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000294 co->co_argcount = argcount;
295 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000296 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000297 co->co_flags = flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000298 Py_INCREF(code);
Guido van Rossumd076c731998-10-07 19:42:25 +0000299 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000300 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000301 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000302 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000303 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000304 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000305 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000306 Py_INCREF(freevars);
307 co->co_freevars = freevars;
308 Py_INCREF(cellvars);
309 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000310 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000311 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000312 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000313 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000314 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000315 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000316 co->co_lnotab = lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000317 }
318 return co;
319}
320
321
322/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000323
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000324/* The compiler uses two passes to generate bytecodes. The first pass
325 builds the symbol table. The second pass generates the bytecode.
326
327 The first pass uses a single symtable struct. The second pass uses
328 a compiling struct for each code block. The compiling structs
329 share a reference to the symtable.
330
331 The two passes communicate via symtable_load_symbols() and via
332 is_local() and is_global(). The former initializes several slots
333 in the compiling struct: c_varnames, c_locals, c_nlocals,
334 c_argcount, c_globals, and c_flags.
335*/
336
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000337struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000338 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000339 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000340 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000341 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000342 PyObject *c_name_dict; /* inverse of c_names */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000343 PyObject *c_globals; /* dictionary (value=None) */
344 PyObject *c_locals; /* dictionary (value=localID) */
345 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000346 PyObject *c_freevars; /* dictionary (value=None) */
347 PyObject *c_cellvars; /* list */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000348 int c_nlocals; /* index of next local */
349 int c_argcount; /* number of top-level arguments */
350 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000351 int c_nexti; /* index into c_code */
352 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000353 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000354 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000355 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000356 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000357 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000358 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000359 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000360 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000361 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000362 int c_stacklevel; /* Current stack level */
363 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000364 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000365 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000366 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000367 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000368 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000369 int c_nested; /* Is block nested funcdef or lamdef? */
370 int c_closure; /* Is nested w/freevars? */
371 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000372 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000373};
374
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000375int is_free(int v)
376{
377 if ((v & (USE | DEF_FREE))
378 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
379 return 1;
380 if (v & DEF_FREE_CLASS)
381 return 1;
382 return 0;
383}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000384
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000385static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000386com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000387{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000388 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
389
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000390 if (c == NULL) {
391 /* Error occurred via symtable call to
392 is_constant_false */
393 PyErr_SetString(exc, msg);
394 return;
395 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000396 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000397 if (c->c_lineno < 1 || c->c_interactive) {
398 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000399 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000400 return;
401 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000402 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000403 if (v == NULL)
404 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000405
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000406 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000407 if (line == NULL) {
408 Py_INCREF(Py_None);
409 line = Py_None;
410 }
411 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
412 Py_None, line);
413 if (t == NULL)
414 goto exit;
415 w = Py_BuildValue("(OO)", v, t);
416 if (w == NULL)
417 goto exit;
418 PyErr_SetObject(exc, w);
419 exit:
420 Py_XDECREF(t);
421 Py_XDECREF(v);
422 Py_XDECREF(w);
423 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000424}
425
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000426/* Interface to the block stack */
427
428static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000429block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000430{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000431 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000432 com_error(c, PyExc_SystemError,
433 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000434 }
435 else {
436 c->c_block[c->c_nblocks++] = type;
437 }
438}
439
440static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000441block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000442{
443 if (c->c_nblocks > 0)
444 c->c_nblocks--;
445 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000446 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000447 }
448}
449
Guido van Rossum681d79a1995-07-18 14:51:37 +0000450/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000451
Tim Petersdbd9ba62000-07-09 03:09:57 +0000452static int com_init(struct compiling *, char *);
453static void com_free(struct compiling *);
454static void com_push(struct compiling *, int);
455static void com_pop(struct compiling *, int);
456static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000457static void com_node(struct compiling *, node *);
458static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000459static void com_addbyte(struct compiling *, int);
460static void com_addint(struct compiling *, int);
461static void com_addoparg(struct compiling *, int, int);
462static void com_addfwref(struct compiling *, int, int *);
463static void com_backpatch(struct compiling *, int);
464static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
465static int com_addconst(struct compiling *, PyObject *);
466static int com_addname(struct compiling *, PyObject *);
467static void com_addopname(struct compiling *, int, node *);
468static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000469static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000470static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000471static void com_assign(struct compiling *, node *, int, node *);
472static void com_assign_name(struct compiling *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000473static PyCodeObject *icompile(node *, struct compiling *);
474static PyCodeObject *jcompile(node *, char *, struct compiling *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000475static PyObject *parsestrplus(node *);
476static PyObject *parsestr(char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000477static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000478
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000479static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000480
481/* symtable operations */
482static int symtable_build(struct compiling *, node *);
483static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000484static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000485static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000486static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000487static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000488static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000489
490static void symtable_node(struct symtable *, node *);
491static void symtable_funcdef(struct symtable *, node *);
492static void symtable_default_args(struct symtable *, node *);
493static void symtable_params(struct symtable *, node *);
494static void symtable_params_fplist(struct symtable *, node *n);
495static void symtable_global(struct symtable *, node *);
496static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000497static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000498static void symtable_list_comprehension(struct symtable *, node *);
499
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000500static int symtable_update_free_vars(struct symtable *);
501static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
502static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
503
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000504/* helper */
505static void
506do_pad(int pad)
507{
508 int i;
509 for (i = 0; i < pad; ++i)
510 fprintf(stderr, " ");
511}
512
513static void
514dump(node *n, int pad, int depth)
515{
516 int i;
517 if (depth == 0)
518 return;
519 do_pad(pad);
520 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
521 if (depth > 0)
522 depth--;
523 for (i = 0; i < NCH(n); ++i)
524 dump(CHILD(n, i), pad + 1, depth);
525}
526
527#define DUMP(N) dump(N, 0, -1)
528
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000529static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000530com_init(struct compiling *c, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000531{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000532 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000533 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
534 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000535 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000536 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000537 goto fail;
538 if ((c->c_const_dict = PyDict_New()) == NULL)
539 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000540 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000541 goto fail;
542 if ((c->c_name_dict = PyDict_New()) == NULL)
543 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000544 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000545 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000546 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
547 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000548 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000549 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000550 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000551 c->c_freevars = NULL;
552 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000553 c->c_nlocals = 0;
554 c->c_argcount = 0;
555 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000556 c->c_nexti = 0;
557 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000558 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000559 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000560 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000561 c->c_begin = 0;
562 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000563 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000564 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000565 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000566 c->c_stacklevel = 0;
567 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000568 c->c_firstlineno = 0;
569 c->c_last_addr = 0;
570 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000571 c->c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000572 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000573 c->c_nested = 0;
574 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000575 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000576 return 1;
577
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000578 fail:
579 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000580 return 0;
581}
582
583static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000584com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000585{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000586 Py_XDECREF(c->c_code);
587 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000588 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000589 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000590 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000591 Py_XDECREF(c->c_globals);
592 Py_XDECREF(c->c_locals);
593 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000594 Py_XDECREF(c->c_freevars);
595 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000596 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +0000597 if (c->c_future)
598 PyMem_Free((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000599}
600
601static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000602com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000603{
604 c->c_stacklevel += n;
605 if (c->c_stacklevel > c->c_maxstacklevel)
606 c->c_maxstacklevel = c->c_stacklevel;
607}
608
609static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000610com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000611{
612 if (c->c_stacklevel < n) {
Guido van Rossum90f827c1998-08-25 18:22:17 +0000613 /* fprintf(stderr,
Guido van Rossum8b993a91997-01-17 21:04:03 +0000614 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
615 c->c_filename, c->c_lineno,
Guido van Rossum90f827c1998-08-25 18:22:17 +0000616 c->c_nexti, c->c_stacklevel, n); */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000617 c->c_stacklevel = 0;
618 }
619 else
620 c->c_stacklevel -= n;
621}
622
623static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000624com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000625{
626 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000627 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000628 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000629 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000630}
631
632static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000633com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000634{
635 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000636 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000637 assert(byte >= 0 && byte <= 255);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000638 if (byte < 0 || byte > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000639 com_error(c, PyExc_SystemError,
640 "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000641 }
642 if (c->c_code == NULL)
643 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000644 len = PyString_Size(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000645 if (c->c_nexti >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000646 if (_PyString_Resize(&c->c_code, len+1000) != 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000647 c->c_errors++;
648 return;
649 }
650 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000651 PyString_AsString(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000652}
653
654static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000655com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000656{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000657 com_addbyte(c, x & 0xff);
658 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000659}
660
661static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000662com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000663{
664 int size;
665 char *p;
666 if (c->c_lnotab == NULL)
667 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000668 size = PyString_Size(c->c_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000669 if (c->c_lnotab_next+2 > size) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000670 if (_PyString_Resize(&c->c_lnotab, size + 1000) < 0) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000671 c->c_errors++;
672 return;
673 }
674 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000675 p = PyString_AsString(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000676 *p++ = addr;
677 *p++ = line;
678 c->c_lnotab_next += 2;
679}
680
681static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000682com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000683{
684 c->c_lineno = lineno;
685 if (c->c_firstlineno == 0) {
686 c->c_firstlineno = c->c_last_line = lineno;
687 }
688 else {
689 int incr_addr = c->c_nexti - c->c_last_addr;
690 int incr_line = lineno - c->c_last_line;
691 while (incr_addr > 0 || incr_line > 0) {
692 int trunc_addr = incr_addr;
693 int trunc_line = incr_line;
694 if (trunc_addr > 255)
695 trunc_addr = 255;
696 if (trunc_line > 255)
697 trunc_line = 255;
698 com_add_lnotab(c, trunc_addr, trunc_line);
699 incr_addr -= trunc_addr;
700 incr_line -= trunc_line;
701 }
702 c->c_last_addr = c->c_nexti;
703 c->c_last_line = lineno;
704 }
705}
706
707static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000708com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000709{
Fred Drakeef8ace32000-08-24 00:32:09 +0000710 int extended_arg = arg >> 16;
Guido van Rossum8e793d91997-03-03 19:13:14 +0000711 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000712 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000713 if (Py_OptimizeFlag)
714 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000715 }
Fred Drakeef8ace32000-08-24 00:32:09 +0000716 if (extended_arg){
717 com_addbyte(c, EXTENDED_ARG);
718 com_addint(c, extended_arg);
719 arg &= 0xffff;
720 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000721 com_addbyte(c, op);
722 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000723}
724
725static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000726com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000727{
728 /* Compile a forward reference for backpatching */
729 int here;
730 int anchor;
731 com_addbyte(c, op);
732 here = c->c_nexti;
733 anchor = *p_anchor;
734 *p_anchor = here;
735 com_addint(c, anchor == 0 ? 0 : here - anchor);
736}
737
738static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000739com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000740{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000741 unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000742 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000743 int dist;
744 int prev;
745 for (;;) {
746 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000747 prev = code[anchor] + (code[anchor+1] << 8);
748 dist = target - (anchor+2);
749 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +0000750 dist >>= 8;
751 code[anchor+1] = dist;
752 dist >>= 8;
753 if (dist) {
754 com_error(c, PyExc_SystemError,
755 "com_backpatch: offset too large");
756 break;
757 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000758 if (!prev)
759 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000760 anchor -= prev;
761 }
762}
763
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000764/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000765
766static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000767com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000768{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000769 PyObject *w, *t, *np=NULL;
770 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000771
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000772 t = Py_BuildValue("(OO)", v, v->ob_type);
773 if (t == NULL)
774 goto fail;
775 w = PyDict_GetItem(dict, t);
776 if (w != NULL) {
777 n = PyInt_AsLong(w);
778 } else {
779 n = PyList_Size(list);
780 np = PyInt_FromLong(n);
781 if (np == NULL)
782 goto fail;
783 if (PyList_Append(list, v) != 0)
784 goto fail;
785 if (PyDict_SetItem(dict, t, np) != 0)
786 goto fail;
787 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000788 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000789 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000790 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000791 fail:
792 Py_XDECREF(np);
793 Py_XDECREF(t);
794 c->c_errors++;
795 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000796}
797
798static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000799com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000800{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000801 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000802}
803
804static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000805com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000806{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000807 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000808}
809
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000810static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000811mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000812{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000813 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000814 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +0000815 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000816 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
817 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000818 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000819 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000820 return 0; /* Don't mangle __extremely_long_names */
821 if (name[nlen-1] == '_' && name[nlen-2] == '_')
822 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000823 /* Strip leading underscores from class name */
824 while (*p == '_')
825 p++;
826 if (*p == '\0')
827 return 0; /* Don't mangle if class is just underscores */
828 plen = strlen(p);
829 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000830 plen = maxlen-nlen-2; /* Truncate class name if too long */
831 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000832 buffer[0] = '_';
833 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000834 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000835 return 1;
836}
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000837
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000838static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000839com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000840{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000841 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000842 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000843 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000844
845 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000846 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000847 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000848 c->c_errors++;
849 i = 255;
850 }
851 else {
852 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000853 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000854 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000855 com_addoparg(c, op, i);
856}
857
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000858#define NAME_LOCAL 0
859#define NAME_GLOBAL 1
860#define NAME_DEFAULT 2
861#define NAME_CLOSURE 3
862
863static int
864com_lookup_arg(PyObject *dict, PyObject *name)
865{
866 PyObject *v = PyDict_GetItem(dict, name);
867 if (v == NULL)
868 return -1;
869 else
870 return PyInt_AS_LONG(v);
871}
872
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000873static void
874com_addop_varname(struct compiling *c, int kind, char *name)
875{
876 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000877 int i, reftype;
878 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000879 int op = STOP_CODE;
880 char buffer[MANGLE_LEN];
881
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000882 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000883 name = buffer;
884 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
885 c->c_errors++;
886 i = 255;
887 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000888 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000889
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000890 reftype = get_ref_type(c, name);
891 switch (reftype) {
892 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000893 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000894 scope = NAME_LOCAL;
895 break;
896 case GLOBAL_EXPLICIT:
897 scope = NAME_GLOBAL;
898 break;
899 case GLOBAL_IMPLICIT:
900 if (c->c_flags & CO_OPTIMIZED)
901 scope = NAME_GLOBAL;
902 break;
903 case FREE:
904 case CELL:
905 scope = NAME_CLOSURE;
906 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000907 }
908
909 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000910 if (scope == NAME_LOCAL)
911 i = com_lookup_arg(c->c_locals, v);
912 else if (reftype == FREE)
913 i = com_lookup_arg(c->c_freevars, v);
914 else if (reftype == CELL)
915 i = com_lookup_arg(c->c_cellvars, v);
916 if (i == -1) {
917 c->c_errors++; /* XXX no exception set */
918 i = 255;
919 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000920 }
921 Py_DECREF(v);
922
923 switch (kind) {
924 case VAR_LOAD:
925 switch (scope) {
926 case NAME_LOCAL:
927 op = LOAD_FAST;
928 break;
929 case NAME_GLOBAL:
930 op = LOAD_GLOBAL;
931 break;
932 case NAME_DEFAULT:
933 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000934 break;
935 case NAME_CLOSURE:
936 op = LOAD_DEREF;
937 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000938 }
939 break;
940 case VAR_STORE:
941 switch (scope) {
942 case NAME_LOCAL:
943 op = STORE_FAST;
944 break;
945 case NAME_GLOBAL:
946 op = STORE_GLOBAL;
947 break;
948 case NAME_DEFAULT:
949 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000950 break;
951 case NAME_CLOSURE:
952 op = STORE_DEREF;
953 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000954 }
955 break;
956 case VAR_DELETE:
957 switch (scope) {
958 case NAME_LOCAL:
959 op = DELETE_FAST;
960 break;
961 case NAME_GLOBAL:
962 op = DELETE_GLOBAL;
963 break;
964 case NAME_DEFAULT:
965 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000966 break;
967 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000968 char buf[500];
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000969 sprintf(buf, DEL_CLOSURE_ERROR, name);
970 com_error(c, PyExc_SyntaxError, buf);
971 i = 255;
972 break;
973 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000974 }
975 break;
976 }
977done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000978 com_addoparg(c, op, i);
979}
980
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000981static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000982com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000983{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000984 char *name;
985 char buffer[1000];
986 /* XXX it is possible to write this code without the 1000
987 chars on the total length of dotted names, I just can't be
988 bothered right now */
989 if (TYPE(n) == STAR)
990 name = "*";
991 else if (TYPE(n) == dotted_name) {
992 char *p = buffer;
993 int i;
994 name = buffer;
995 for (i = 0; i < NCH(n); i += 2) {
996 char *s = STR(CHILD(n, i));
997 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000998 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000999 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001000 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001001 break;
1002 }
1003 if (p != buffer)
1004 *p++ = '.';
1005 strcpy(p, s);
1006 p = strchr(p, '\0');
1007 }
1008 }
1009 else {
1010 REQ(n, NAME);
1011 name = STR(n);
1012 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001013 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001014}
1015
Guido van Rossum79f25d91997-04-29 20:08:16 +00001016static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001017parsenumber(struct compiling *co, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001018{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001019 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001020 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001021 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001022#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +00001023 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +00001024 int imflag;
1025#endif
1026
Guido van Rossum282914b1991-04-04 10:42:56 +00001027 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001028 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001029#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001030 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001031#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001032 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001033 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001034 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001035 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001036 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001037 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001038 if (*end == '\0') {
1039 if (errno != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001040 com_error(co, PyExc_OverflowError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001041 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +00001042 return NULL;
1043 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001044 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001045 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001046 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001047#ifndef WITHOUT_COMPLEX
1048 if (imflag) {
1049 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001050 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +00001051 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001052 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001053 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +00001054 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001055 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001056#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001057 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001058 PyFPE_START_PROTECT("atof", return 0)
1059 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001060 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001061 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001062 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001063}
1064
Guido van Rossum79f25d91997-04-29 20:08:16 +00001065static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001066parsestr(char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001067{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001068 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001069 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001070 char *buf;
1071 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001072 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001073 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001074 int first = *s;
1075 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001076 int rawmode = 0;
1077 int unicode = 0;
1078 if (isalpha(quote) || quote == '_') {
1079 if (quote == 'u' || quote == 'U') {
1080 quote = *++s;
1081 unicode = 1;
1082 }
1083 if (quote == 'r' || quote == 'R') {
1084 quote = *++s;
1085 rawmode = 1;
1086 }
1087 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001088 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001089 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001090 return NULL;
1091 }
1092 s++;
1093 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001094 if (len > INT_MAX) {
1095 PyErr_SetString(PyExc_OverflowError, "string to parse is too long");
1096 return NULL;
1097 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001098 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001099 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001100 return NULL;
1101 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001102 if (len >= 4 && s[0] == quote && s[1] == quote) {
1103 s += 2;
1104 len -= 2;
1105 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001106 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001107 return NULL;
1108 }
1109 }
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001110 if (unicode || Py_UnicodeFlag) {
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001111 if (rawmode)
1112 return PyUnicode_DecodeRawUnicodeEscape(
1113 s, len, NULL);
1114 else
1115 return PyUnicode_DecodeUnicodeEscape(
1116 s, len, NULL);
1117 }
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001118 if (rawmode || strchr(s, '\\') == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001119 return PyString_FromStringAndSize(s, len);
1120 v = PyString_FromStringAndSize((char *)NULL, len);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001121 if (v == NULL)
1122 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001123 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001124 end = s + len;
1125 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001126 if (*s != '\\') {
1127 *p++ = *s++;
1128 continue;
1129 }
1130 s++;
1131 switch (*s++) {
1132 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001133 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001134 case '\\': *p++ = '\\'; break;
1135 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +00001136 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001137 case 'b': *p++ = '\b'; break;
1138 case 'f': *p++ = '\014'; break; /* FF */
1139 case 't': *p++ = '\t'; break;
1140 case 'n': *p++ = '\n'; break;
1141 case 'r': *p++ = '\r'; break;
1142 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001143 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
1144 case '0': case '1': case '2': case '3':
1145 case '4': case '5': case '6': case '7':
1146 c = s[-1] - '0';
1147 if ('0' <= *s && *s <= '7') {
1148 c = (c<<3) + *s++ - '0';
1149 if ('0' <= *s && *s <= '7')
1150 c = (c<<3) + *s++ - '0';
1151 }
1152 *p++ = c;
1153 break;
1154 case 'x':
Jeremy Hylton4419ac12001-02-28 22:54:51 +00001155 if (isxdigit(Py_CHARMASK(s[0]))
1156 && isxdigit(Py_CHARMASK(s[1]))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +00001157 unsigned int x = 0;
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001158 c = Py_CHARMASK(*s);
1159 s++;
1160 if (isdigit(c))
1161 x = c - '0';
1162 else if (islower(c))
1163 x = 10 + c - 'a';
1164 else
1165 x = 10 + c - 'A';
1166 x = x << 4;
1167 c = Py_CHARMASK(*s);
1168 s++;
1169 if (isdigit(c))
1170 x += c - '0';
1171 else if (islower(c))
1172 x += 10 + c - 'a';
1173 else
1174 x += 10 + c - 'A';
Guido van Rossumed1100f1997-10-20 23:24:07 +00001175 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001176 break;
1177 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00001178 PyErr_SetString(PyExc_ValueError,
1179 "invalid \\x escape");
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001180 Py_DECREF(v);
1181 return NULL;
1182 default:
1183 *p++ = '\\';
1184 *p++ = s[-1];
1185 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001186 }
1187 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001188 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001189 return v;
1190}
1191
Guido van Rossum79f25d91997-04-29 20:08:16 +00001192static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001193parsestrplus(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001194{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001195 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001196 int i;
1197 REQ(CHILD(n, 0), STRING);
1198 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
1199 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001200 for (i = 1; i < NCH(n); i++) {
1201 PyObject *s;
1202 s = parsestr(STR(CHILD(n, i)));
1203 if (s == NULL)
1204 goto onError;
1205 if (PyString_Check(v) && PyString_Check(s)) {
1206 PyString_ConcatAndDel(&v, s);
1207 if (v == NULL)
1208 goto onError;
1209 }
1210 else {
1211 PyObject *temp;
1212 temp = PyUnicode_Concat(v, s);
1213 Py_DECREF(s);
1214 if (temp == NULL)
1215 goto onError;
1216 Py_DECREF(v);
1217 v = temp;
1218 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001219 }
1220 }
1221 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001222
1223 onError:
1224 Py_XDECREF(v);
1225 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001226}
1227
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001228static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001229com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001230{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001231 PyObject *v;
1232 int anchor = 0;
1233 int save_begin = c->c_begin;
1234
1235 /* list_iter: for v in expr [list_iter] */
1236 com_node(c, CHILD(n, 3)); /* expr */
1237 v = PyInt_FromLong(0L);
1238 if (v == NULL)
1239 c->c_errors++;
1240 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
1241 com_push(c, 1);
1242 Py_XDECREF(v);
1243 c->c_begin = c->c_nexti;
1244 com_addoparg(c, SET_LINENO, n->n_lineno);
1245 com_addfwref(c, FOR_LOOP, &anchor);
1246 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001247 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001248 c->c_loops++;
1249 com_list_iter(c, n, e, t);
1250 c->c_loops--;
1251 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1252 c->c_begin = save_begin;
1253 com_backpatch(c, anchor);
1254 com_pop(c, 2); /* FOR_LOOP has popped these */
1255}
1256
1257static void
1258com_list_if(struct compiling *c, node *n, node *e, char *t)
1259{
1260 int anchor = 0;
1261 int a = 0;
1262 /* list_iter: 'if' test [list_iter] */
1263 com_addoparg(c, SET_LINENO, n->n_lineno);
1264 com_node(c, CHILD(n, 1));
1265 com_addfwref(c, JUMP_IF_FALSE, &a);
1266 com_addbyte(c, POP_TOP);
1267 com_pop(c, 1);
1268 com_list_iter(c, n, e, t);
1269 com_addfwref(c, JUMP_FORWARD, &anchor);
1270 com_backpatch(c, a);
1271 /* We jump here with an extra entry which we now pop */
1272 com_addbyte(c, POP_TOP);
1273 com_backpatch(c, anchor);
1274}
1275
1276static void
1277com_list_iter(struct compiling *c,
1278 node *p, /* parent of list_iter node */
1279 node *e, /* element expression node */
1280 char *t /* name of result list temp local */)
1281{
1282 /* list_iter is the last child in a listmaker, list_for, or list_if */
1283 node *n = CHILD(p, NCH(p)-1);
1284 if (TYPE(n) == list_iter) {
1285 n = CHILD(n, 0);
1286 switch (TYPE(n)) {
1287 case list_for:
1288 com_list_for(c, n, e, t);
1289 break;
1290 case list_if:
1291 com_list_if(c, n, e, t);
1292 break;
1293 default:
1294 com_error(c, PyExc_SystemError,
1295 "invalid list_iter node type");
1296 }
1297 }
1298 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001299 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001300 com_push(c, 1);
1301 com_node(c, e);
1302 com_addoparg(c, CALL_FUNCTION, 1);
1303 com_addbyte(c, POP_TOP);
1304 com_pop(c, 2);
1305 }
1306}
1307
1308static void
1309com_list_comprehension(struct compiling *c, node *n)
1310{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001311 /* listmaker: test list_for */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001312 char tmpname[12];
Tim Peters30814212001-02-17 05:30:26 +00001313 sprintf(tmpname, "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001314 com_addoparg(c, BUILD_LIST, 0);
1315 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1316 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001317 com_addop_name(c, LOAD_ATTR, "append");
1318 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001319 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001320 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001321 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001322 --c->c_tmpname;
1323}
1324
1325static void
1326com_listmaker(struct compiling *c, node *n)
1327{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001328 /* listmaker: test ( list_for | (',' test)* [','] ) */
1329 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001330 com_list_comprehension(c, n);
1331 else {
1332 int len = 0;
1333 int i;
1334 for (i = 0; i < NCH(n); i += 2, len++)
1335 com_node(c, CHILD(n, i));
1336 com_addoparg(c, BUILD_LIST, len);
1337 com_pop(c, len-1);
1338 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001339}
1340
1341static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001342com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001343{
1344 int i;
1345 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1346 for (i = 0; i+2 < NCH(n); i += 4) {
1347 /* We must arrange things just right for STORE_SUBSCR.
1348 It wants the stack to look like (value) (dict) (key) */
1349 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001350 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001351 com_node(c, CHILD(n, i+2)); /* value */
1352 com_addbyte(c, ROT_TWO);
1353 com_node(c, CHILD(n, i)); /* key */
1354 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001355 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001356 }
1357}
1358
1359static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001360com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001361{
1362 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001363 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001364 int i;
1365 REQ(n, atom);
1366 ch = CHILD(n, 0);
1367 switch (TYPE(ch)) {
1368 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001369 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001370 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001371 com_push(c, 1);
1372 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001373 else
1374 com_node(c, CHILD(n, 1));
1375 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001376 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001377 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001378 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001379 com_push(c, 1);
1380 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001381 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001382 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001383 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001384 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001385 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001386 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001387 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001388 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001389 break;
1390 case BACKQUOTE:
1391 com_node(c, CHILD(n, 1));
1392 com_addbyte(c, UNARY_CONVERT);
1393 break;
1394 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001395 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001396 i = 255;
1397 }
1398 else {
1399 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001400 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001401 }
1402 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001403 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001404 break;
1405 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001406 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001407 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001408 c->c_errors++;
1409 i = 255;
1410 }
1411 else {
1412 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001413 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001414 }
1415 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001416 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001417 break;
1418 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001419 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001420 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001421 break;
1422 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001423 com_error(c, PyExc_SystemError,
1424 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001425 }
1426}
1427
1428static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001429com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001430{
1431 if (NCH(n) == 1) {
1432 com_addbyte(c, op);
1433 }
1434 else if (NCH(n) == 2) {
1435 if (TYPE(CHILD(n, 0)) != COLON) {
1436 com_node(c, CHILD(n, 0));
1437 com_addbyte(c, op+1);
1438 }
1439 else {
1440 com_node(c, CHILD(n, 1));
1441 com_addbyte(c, op+2);
1442 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001443 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001444 }
1445 else {
1446 com_node(c, CHILD(n, 0));
1447 com_node(c, CHILD(n, 2));
1448 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001449 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001450 }
1451}
1452
Guido van Rossum635abd21997-01-06 22:56:52 +00001453static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001454com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1455{
1456 if (NCH(n) == 1) {
1457 com_addbyte(c, DUP_TOP);
1458 com_push(c, 1);
1459 com_addbyte(c, SLICE);
1460 com_node(c, augn);
1461 com_addbyte(c, opcode);
1462 com_pop(c, 1);
1463 com_addbyte(c, ROT_TWO);
1464 com_addbyte(c, STORE_SLICE);
1465 com_pop(c, 2);
1466 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1467 com_node(c, CHILD(n, 0));
1468 com_addoparg(c, DUP_TOPX, 2);
1469 com_push(c, 2);
1470 com_addbyte(c, SLICE+1);
1471 com_pop(c, 1);
1472 com_node(c, augn);
1473 com_addbyte(c, opcode);
1474 com_pop(c, 1);
1475 com_addbyte(c, ROT_THREE);
1476 com_addbyte(c, STORE_SLICE+1);
1477 com_pop(c, 3);
1478 } else if (NCH(n) == 2) {
1479 com_node(c, CHILD(n, 1));
1480 com_addoparg(c, DUP_TOPX, 2);
1481 com_push(c, 2);
1482 com_addbyte(c, SLICE+2);
1483 com_pop(c, 1);
1484 com_node(c, augn);
1485 com_addbyte(c, opcode);
1486 com_pop(c, 1);
1487 com_addbyte(c, ROT_THREE);
1488 com_addbyte(c, STORE_SLICE+2);
1489 com_pop(c, 3);
1490 } else {
1491 com_node(c, CHILD(n, 0));
1492 com_node(c, CHILD(n, 2));
1493 com_addoparg(c, DUP_TOPX, 3);
1494 com_push(c, 3);
1495 com_addbyte(c, SLICE+3);
1496 com_pop(c, 2);
1497 com_node(c, augn);
1498 com_addbyte(c, opcode);
1499 com_pop(c, 1);
1500 com_addbyte(c, ROT_FOUR);
1501 com_addbyte(c, STORE_SLICE+3);
1502 com_pop(c, 4);
1503 }
1504}
1505
1506static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001507com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001508{
1509 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001510 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001511 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001512 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001513 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001514 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001515 }
1516 else {
1517 com_node(c, CHILD(n, 0));
1518 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001519 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001520 }
1521 m = n;
1522 do {
1523 m = CHILD(m, 0);
1524 } while (NCH(m) == 1);
1525 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00001526 /* f(lambda x: x[0] = 3) ends up getting parsed with
1527 * LHS test = lambda x: x[0], and RHS test = 3.
1528 * SF bug 132313 points out that complaining about a keyword
1529 * then is very confusing.
1530 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001531 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00001532 TYPE(m) == lambdef ?
1533 "lambda cannot contain assignment" :
1534 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001535 }
1536 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001537 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001538 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001539 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001540 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001541 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001542 else if (*pkeywords == NULL) {
1543 c->c_errors++;
1544 Py_DECREF(v);
1545 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001546 if (PyDict_GetItem(*pkeywords, v) != NULL)
1547 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001548 "duplicate keyword argument");
1549 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001550 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001551 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001552 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001553 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001554 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001555 }
1556 }
1557 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001558}
1559
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001560static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001561com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001562{
1563 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001564 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001565 }
1566 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001567 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001568 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001569 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001570 int star_flag = 0;
1571 int starstar_flag = 0;
1572 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001573 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001574 na = 0;
1575 nk = 0;
1576 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001577 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001578 if (TYPE(ch) == STAR ||
1579 TYPE(ch) == DOUBLESTAR)
1580 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001581 if (ch->n_lineno != lineno) {
1582 lineno = ch->n_lineno;
1583 com_addoparg(c, SET_LINENO, lineno);
1584 }
1585 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001586 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001587 na++;
1588 else
1589 nk++;
1590 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001591 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001592 while (i < NCH(n)) {
1593 node *tok = CHILD(n, i);
1594 node *ch = CHILD(n, i+1);
1595 i += 3;
1596 switch (TYPE(tok)) {
1597 case STAR: star_flag = 1; break;
1598 case DOUBLESTAR: starstar_flag = 1; break;
1599 }
1600 com_node(c, ch);
1601 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001602 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001603 com_error(c, PyExc_SyntaxError,
1604 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001605 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001606 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001607 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001608 star_flag + (starstar_flag << 1);
1609 else
1610 opcode = CALL_FUNCTION;
1611 com_addoparg(c, opcode, na | (nk << 8));
1612 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001613 }
1614}
1615
1616static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001617com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001618{
1619 com_addopname(c, LOAD_ATTR, n);
1620}
1621
1622static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001623com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001624{
1625 int i=0;
1626 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001627 node *ch;
1628
1629 /* first argument */
1630 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001631 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001632 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001633 i++;
1634 }
1635 else {
1636 com_node(c, CHILD(n,i));
1637 i++;
1638 REQ(CHILD(n,i),COLON);
1639 i++;
1640 }
1641 /* second argument */
1642 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1643 com_node(c, CHILD(n,i));
1644 i++;
1645 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001646 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001647 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001648 com_push(c, 1);
1649 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001650 /* remaining arguments */
1651 for (; i < NCH(n); i++) {
1652 ns++;
1653 ch=CHILD(n,i);
1654 REQ(ch, sliceop);
1655 if (NCH(ch) == 1) {
1656 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001657 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001658 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001659 }
1660 else
1661 com_node(c, CHILD(ch,1));
1662 }
1663 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001664 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001665}
1666
1667static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001668com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001669{
1670 node *ch;
1671 REQ(n, subscript);
1672 ch = CHILD(n,0);
1673 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001674 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001675 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001676 com_push(c, 1);
1677 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001678 else {
1679 /* check for slice */
1680 if ((TYPE(ch) == COLON || NCH(n) > 1))
1681 com_sliceobj(c, n);
1682 else {
1683 REQ(ch, test);
1684 com_node(c, ch);
1685 }
1686 }
1687}
1688
1689static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001690com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001691{
1692 int i, op;
1693 REQ(n, subscriptlist);
1694 /* Check to make backward compatible slice behavior for '[i:j]' */
1695 if (NCH(n) == 1) {
1696 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001697 /* 'Basic' slice, should have exactly one colon. */
1698 if ((TYPE(CHILD(sub, 0)) == COLON
1699 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1700 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1701 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001702 switch (assigning) {
1703 case OP_DELETE:
1704 op = DELETE_SLICE;
1705 break;
1706 case OP_ASSIGN:
1707 op = STORE_SLICE;
1708 break;
1709 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001710 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001711 break;
1712 default:
1713 com_augassign_slice(c, sub, assigning, augn);
1714 return;
1715 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001716 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001717 if (op == STORE_SLICE)
1718 com_pop(c, 2);
1719 else if (op == DELETE_SLICE)
1720 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001721 return;
1722 }
1723 }
1724 /* Else normal subscriptlist. Compile each subscript. */
1725 for (i = 0; i < NCH(n); i += 2)
1726 com_subscript(c, CHILD(n, i));
1727 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001728 if (NCH(n) > 1) {
1729 i = (NCH(n)+1) / 2;
1730 com_addoparg(c, BUILD_TUPLE, i);
1731 com_pop(c, i-1);
1732 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001733 switch (assigning) {
1734 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001735 op = DELETE_SUBSCR;
1736 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00001737 break;
1738 default:
1739 case OP_ASSIGN:
1740 op = STORE_SUBSCR;
1741 i = 3;
1742 break;
1743 case OP_APPLY:
1744 op = BINARY_SUBSCR;
1745 i = 1;
1746 break;
1747 }
1748 if (assigning > OP_APPLY) {
1749 com_addoparg(c, DUP_TOPX, 2);
1750 com_push(c, 2);
1751 com_addbyte(c, BINARY_SUBSCR);
1752 com_pop(c, 1);
1753 com_node(c, augn);
1754 com_addbyte(c, assigning);
1755 com_pop(c, 1);
1756 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001757 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001758 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001759 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001760}
1761
1762static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001763com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001764{
1765 REQ(n, trailer);
1766 switch (TYPE(CHILD(n, 0))) {
1767 case LPAR:
1768 com_call_function(c, CHILD(n, 1));
1769 break;
1770 case DOT:
1771 com_select_member(c, CHILD(n, 1));
1772 break;
1773 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00001774 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001775 break;
1776 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001777 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001778 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001779 }
1780}
1781
1782static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001783com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001784{
1785 int i;
1786 REQ(n, power);
1787 com_atom(c, CHILD(n, 0));
1788 for (i = 1; i < NCH(n); i++) {
1789 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1790 com_factor(c, CHILD(n, i+1));
1791 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001792 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001793 break;
1794 }
1795 else
1796 com_apply_trailer(c, CHILD(n, i));
1797 }
1798}
1799
1800static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001801com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001802{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001803 REQ(n, factor);
1804 if (TYPE(CHILD(n, 0)) == PLUS) {
1805 com_factor(c, CHILD(n, 1));
1806 com_addbyte(c, UNARY_POSITIVE);
1807 }
1808 else if (TYPE(CHILD(n, 0)) == MINUS) {
1809 com_factor(c, CHILD(n, 1));
1810 com_addbyte(c, UNARY_NEGATIVE);
1811 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001812 else if (TYPE(CHILD(n, 0)) == TILDE) {
1813 com_factor(c, CHILD(n, 1));
1814 com_addbyte(c, UNARY_INVERT);
1815 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001816 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001817 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001818 }
1819}
1820
1821static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001822com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001823{
1824 int i;
1825 int op;
1826 REQ(n, term);
1827 com_factor(c, CHILD(n, 0));
1828 for (i = 2; i < NCH(n); i += 2) {
1829 com_factor(c, CHILD(n, i));
1830 switch (TYPE(CHILD(n, i-1))) {
1831 case STAR:
1832 op = BINARY_MULTIPLY;
1833 break;
1834 case SLASH:
1835 op = BINARY_DIVIDE;
1836 break;
1837 case PERCENT:
1838 op = BINARY_MODULO;
1839 break;
1840 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001841 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001842 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001843 op = 255;
1844 }
1845 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001846 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001847 }
1848}
1849
1850static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001851com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001852{
1853 int i;
1854 int op;
1855 REQ(n, arith_expr);
1856 com_term(c, CHILD(n, 0));
1857 for (i = 2; i < NCH(n); i += 2) {
1858 com_term(c, CHILD(n, i));
1859 switch (TYPE(CHILD(n, i-1))) {
1860 case PLUS:
1861 op = BINARY_ADD;
1862 break;
1863 case MINUS:
1864 op = BINARY_SUBTRACT;
1865 break;
1866 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001867 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001868 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001869 op = 255;
1870 }
1871 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001872 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001873 }
1874}
1875
1876static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001877com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001878{
1879 int i;
1880 int op;
1881 REQ(n, shift_expr);
1882 com_arith_expr(c, CHILD(n, 0));
1883 for (i = 2; i < NCH(n); i += 2) {
1884 com_arith_expr(c, CHILD(n, i));
1885 switch (TYPE(CHILD(n, i-1))) {
1886 case LEFTSHIFT:
1887 op = BINARY_LSHIFT;
1888 break;
1889 case RIGHTSHIFT:
1890 op = BINARY_RSHIFT;
1891 break;
1892 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001893 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001894 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001895 op = 255;
1896 }
1897 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001898 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001899 }
1900}
1901
1902static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001903com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001904{
1905 int i;
1906 int op;
1907 REQ(n, and_expr);
1908 com_shift_expr(c, CHILD(n, 0));
1909 for (i = 2; i < NCH(n); i += 2) {
1910 com_shift_expr(c, CHILD(n, i));
1911 if (TYPE(CHILD(n, i-1)) == AMPER) {
1912 op = BINARY_AND;
1913 }
1914 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001915 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001916 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001917 op = 255;
1918 }
1919 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001920 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001921 }
1922}
1923
1924static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001925com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001926{
1927 int i;
1928 int op;
1929 REQ(n, xor_expr);
1930 com_and_expr(c, CHILD(n, 0));
1931 for (i = 2; i < NCH(n); i += 2) {
1932 com_and_expr(c, CHILD(n, i));
1933 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1934 op = BINARY_XOR;
1935 }
1936 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001937 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001938 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001939 op = 255;
1940 }
1941 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001942 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001943 }
1944}
1945
1946static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001947com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001948{
1949 int i;
1950 int op;
1951 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001952 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001953 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001954 com_xor_expr(c, CHILD(n, i));
1955 if (TYPE(CHILD(n, i-1)) == VBAR) {
1956 op = BINARY_OR;
1957 }
1958 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001959 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001960 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001961 op = 255;
1962 }
1963 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001964 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001965 }
1966}
1967
1968static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001969cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001970{
1971 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001972 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001973 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1974 if (NCH(n) == 1) {
1975 n = CHILD(n, 0);
1976 switch (TYPE(n)) {
1977 case LESS: return LT;
1978 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001979 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001980 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001981 case LESSEQUAL: return LE;
1982 case GREATEREQUAL: return GE;
1983 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001984 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1985 if (strcmp(STR(n), "is") == 0) return IS;
1986 }
1987 }
1988 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001989 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001990 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1991 return NOT_IN;
1992 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1993 return IS_NOT;
1994 }
1995 }
1996 return BAD;
1997}
1998
1999static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002000com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002001{
2002 int i;
2003 enum cmp_op op;
2004 int anchor;
2005 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2006 com_expr(c, CHILD(n, 0));
2007 if (NCH(n) == 1)
2008 return;
2009
2010 /****************************************************************
2011 The following code is generated for all but the last
2012 comparison in a chain:
2013
2014 label: on stack: opcode: jump to:
2015
2016 a <code to load b>
2017 a, b DUP_TOP
2018 a, b, b ROT_THREE
2019 b, a, b COMPARE_OP
2020 b, 0-or-1 JUMP_IF_FALSE L1
2021 b, 1 POP_TOP
2022 b
2023
2024 We are now ready to repeat this sequence for the next
2025 comparison in the chain.
2026
2027 For the last we generate:
2028
2029 b <code to load c>
2030 b, c COMPARE_OP
2031 0-or-1
2032
2033 If there were any jumps to L1 (i.e., there was more than one
2034 comparison), we generate:
2035
2036 0-or-1 JUMP_FORWARD L2
2037 L1: b, 0 ROT_TWO
2038 0, b POP_TOP
2039 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002040 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002041 ****************************************************************/
2042
2043 anchor = 0;
2044
2045 for (i = 2; i < NCH(n); i += 2) {
2046 com_expr(c, CHILD(n, i));
2047 if (i+2 < NCH(n)) {
2048 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002049 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002050 com_addbyte(c, ROT_THREE);
2051 }
2052 op = cmp_type(CHILD(n, i-1));
2053 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002054 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002055 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002056 }
2057 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002058 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002059 if (i+2 < NCH(n)) {
2060 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2061 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002062 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002063 }
2064 }
2065
2066 if (anchor) {
2067 int anchor2 = 0;
2068 com_addfwref(c, JUMP_FORWARD, &anchor2);
2069 com_backpatch(c, anchor);
2070 com_addbyte(c, ROT_TWO);
2071 com_addbyte(c, POP_TOP);
2072 com_backpatch(c, anchor2);
2073 }
2074}
2075
2076static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002077com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002078{
2079 REQ(n, not_test); /* 'not' not_test | comparison */
2080 if (NCH(n) == 1) {
2081 com_comparison(c, CHILD(n, 0));
2082 }
2083 else {
2084 com_not_test(c, CHILD(n, 1));
2085 com_addbyte(c, UNARY_NOT);
2086 }
2087}
2088
2089static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002090com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002091{
2092 int i;
2093 int anchor;
2094 REQ(n, and_test); /* not_test ('and' not_test)* */
2095 anchor = 0;
2096 i = 0;
2097 for (;;) {
2098 com_not_test(c, CHILD(n, i));
2099 if ((i += 2) >= NCH(n))
2100 break;
2101 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2102 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002103 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002104 }
2105 if (anchor)
2106 com_backpatch(c, anchor);
2107}
2108
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002109static int
2110com_make_closure(struct compiling *c, PyCodeObject *co)
2111{
2112 int i, free = PyTuple_GET_SIZE(co->co_freevars);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002113 /* If the code is compiled with st->st_nested_scopes == 0,
2114 then no variable will ever be added to co_freevars.
2115 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002116 if (free == 0)
2117 return 0;
2118 for (i = 0; i < free; ++i) {
2119 /* Bypass com_addop_varname because it will generate
2120 LOAD_DEREF but LOAD_CLOSURE is needed.
2121 */
2122 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2123 int arg, reftype;
2124
2125 /* Special case: If a class contains a method with a
2126 free variable that has the same name as a method,
2127 the name will be considered free *and* local in the
2128 class. It should be handled by the closure, as
2129 well as by the normal name loookup logic.
2130 */
2131 reftype = get_ref_type(c, PyString_AS_STRING(name));
2132 if (reftype == CELL)
2133 arg = com_lookup_arg(c->c_cellvars, name);
2134 else /* (reftype == FREE) */
2135 arg = com_lookup_arg(c->c_freevars, name);
2136 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002137 fprintf(stderr, "lookup %s in %s %d %d\n"
2138 "freevars of %s: %s\n",
2139 PyObject_REPR(name),
2140 c->c_name,
2141 reftype, arg,
2142 PyString_AS_STRING(co->co_name),
2143 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002144 Py_FatalError("com_make_closure()");
2145 }
2146 com_addoparg(c, LOAD_CLOSURE, arg);
2147
2148 }
2149 com_push(c, free);
2150 return 1;
2151}
2152
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002153static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002154com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002155{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002156 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002157 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002158 PyObject *co;
2159 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002160 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002161 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2162 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002163 co = (PyObject *) icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002164 if (co == NULL) {
2165 c->c_errors++;
2166 return;
2167 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002168 symtable_exit_scope(c->c_symtable);
Tim Peters1e542112001-02-23 22:23:53 +00002169 i = com_addconst(c, co);
2170 closure = com_make_closure(c, (PyCodeObject *)co);
2171 Py_DECREF(co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002172 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002173 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002174 if (closure)
2175 com_addoparg(c, MAKE_CLOSURE, ndefs);
2176 else
2177 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002178 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002179 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002180 else {
2181 int anchor = 0;
2182 int i = 0;
2183 for (;;) {
2184 com_and_test(c, CHILD(n, i));
2185 if ((i += 2) >= NCH(n))
2186 break;
2187 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2188 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002189 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002190 }
2191 if (anchor)
2192 com_backpatch(c, anchor);
2193 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002194}
2195
2196static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002197com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002198{
2199 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002200 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002201 com_node(c, CHILD(n, 0));
2202 }
2203 else {
2204 int i;
2205 int len;
2206 len = (NCH(n) + 1) / 2;
2207 for (i = 0; i < NCH(n); i += 2)
2208 com_node(c, CHILD(n, i));
2209 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002210 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002211 }
2212}
2213
2214
2215/* Begin of assignment compilation */
2216
Thomas Wouters434d0822000-08-24 20:11:32 +00002217
2218static void
2219com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2220{
2221 com_addbyte(c, DUP_TOP);
2222 com_push(c, 1);
2223 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002224 com_node(c, augn);
2225 com_addbyte(c, opcode);
2226 com_pop(c, 1);
2227 com_addbyte(c, ROT_TWO);
2228 com_addopname(c, STORE_ATTR, n);
2229 com_pop(c, 2);
2230}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002231
2232static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002233com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002234{
2235 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002236 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002237}
2238
2239static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002240com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002241{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002242 REQ(n, trailer);
2243 switch (TYPE(CHILD(n, 0))) {
2244 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002245 com_error(c, PyExc_SyntaxError,
2246 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002247 break;
2248 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002249 if (assigning > OP_APPLY)
2250 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2251 else
2252 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002253 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002254 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002255 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002256 break;
2257 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002258 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002259 }
2260}
2261
2262static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002263com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002264{
2265 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002266 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002267 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002268 if (assigning) {
2269 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002270 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002271 com_push(c, i-1);
2272 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002273 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002274 com_assign(c, CHILD(n, i), assigning, NULL);
2275}
2276
2277static void
2278com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2279{
2280 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002281 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002282 com_push(c, 1);
2283 com_node(c, augn);
2284 com_addbyte(c, opcode);
2285 com_pop(c, 1);
2286 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002287}
2288
2289static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002290com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002291{
2292 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002293 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002294 if (assigning)
2295 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002296}
2297
2298static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002299com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002300{
2301 /* Loop to avoid trivial recursion */
2302 for (;;) {
2303 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002304
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002305 case exprlist:
2306 case testlist:
2307 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002308 if (assigning > OP_APPLY) {
2309 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002310 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002311 return;
2312 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002313 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002314 return;
2315 }
2316 n = CHILD(n, 0);
2317 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002318
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002319 case test:
2320 case and_test:
2321 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002322 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002323 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002324 case xor_expr:
2325 case and_expr:
2326 case shift_expr:
2327 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002328 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002329 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002330 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002331 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002332 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002333 return;
2334 }
2335 n = CHILD(n, 0);
2336 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002337
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002338 case power: /* atom trailer* ('**' power)*
2339 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002340 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002341 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002342 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002343 return;
2344 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002345 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002346 int i;
2347 com_node(c, CHILD(n, 0));
2348 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002349 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002350 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002351 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002352 return;
2353 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002354 com_apply_trailer(c, CHILD(n, i));
2355 } /* NB i is still alive */
2356 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002357 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002358 return;
2359 }
2360 n = CHILD(n, 0);
2361 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002362
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002363 case atom:
2364 switch (TYPE(CHILD(n, 0))) {
2365 case LPAR:
2366 n = CHILD(n, 1);
2367 if (TYPE(n) == RPAR) {
2368 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002369 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002370 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002371 return;
2372 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002373 if (assigning > OP_APPLY) {
2374 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002375 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002376 return;
2377 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002378 break;
2379 case LSQB:
2380 n = CHILD(n, 1);
2381 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002382 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002383 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002384 return;
2385 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002386 if (assigning > OP_APPLY) {
2387 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002388 "augmented assign to list not possible");
2389 return;
2390 }
2391 if (NCH(n) > 1
2392 && TYPE(CHILD(n, 1)) == list_for) {
2393 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002394 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002395 return;
2396 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002397 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002398 return;
2399 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002400 if (assigning > OP_APPLY)
2401 com_augassign_name(c, CHILD(n, 0),
2402 assigning, augn);
2403 else
2404 com_assign_name(c, CHILD(n, 0),
2405 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002406 return;
2407 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002408 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002409 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002410 return;
2411 }
2412 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002413
2414 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002415 com_error(c, PyExc_SyntaxError,
2416 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002417 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002418
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002419 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002420 com_error(c, PyExc_SystemError,
2421 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002422 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002423
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002424 }
2425 }
2426}
Guido van Rossum7c531111997-03-11 18:42:21 +00002427
Thomas Wouters434d0822000-08-24 20:11:32 +00002428static void
2429com_augassign(struct compiling *c, node *n)
2430{
2431 int opcode;
2432
2433 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2434 case '+': opcode = INPLACE_ADD; break;
2435 case '-': opcode = INPLACE_SUBTRACT; break;
2436 case '/': opcode = INPLACE_DIVIDE; break;
2437 case '%': opcode = INPLACE_MODULO; break;
2438 case '<': opcode = INPLACE_LSHIFT; break;
2439 case '>': opcode = INPLACE_RSHIFT; break;
2440 case '&': opcode = INPLACE_AND; break;
2441 case '^': opcode = INPLACE_XOR; break;
2442 case '|': opcode = INPLACE_OR; break;
2443 case '*':
2444 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2445 opcode = INPLACE_POWER;
2446 else
2447 opcode = INPLACE_MULTIPLY;
2448 break;
2449 default:
2450 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2451 return;
2452 }
2453 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2454}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002455
2456static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002457com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002458{
Thomas Wouters434d0822000-08-24 20:11:32 +00002459 REQ(n, expr_stmt);
2460 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002461 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002462 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002463 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002464 if (NCH(n) == 1) {
2465 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002466 if (c->c_interactive)
2467 com_addbyte(c, PRINT_EXPR);
2468 else
2469 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002470 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002471 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002472 else if (TYPE(CHILD(n,1)) == augassign)
2473 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002474 else {
2475 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002476 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002477 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002478 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002479 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002480 com_push(c, 1);
2481 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002482 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002483 }
2484 }
2485}
2486
2487static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002488com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002489{
2490 int a = 0, b = 0;
2491 int i;
2492 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2493 /* Generate code like for
2494
2495 if __debug__:
2496 if not <test>:
2497 raise AssertionError [, <message>]
2498
2499 where <message> is the second test, if present.
2500 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002501
Guido van Rossum228d7f31997-04-02 05:24:36 +00002502 if (Py_OptimizeFlag)
2503 return;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002504 com_addop_name(c, LOAD_GLOBAL, "__debug__");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002505 com_push(c, 1);
2506 com_addfwref(c, JUMP_IF_FALSE, &a);
2507 com_addbyte(c, POP_TOP);
2508 com_pop(c, 1);
2509 com_node(c, CHILD(n, 1));
2510 com_addfwref(c, JUMP_IF_TRUE, &b);
2511 com_addbyte(c, POP_TOP);
2512 com_pop(c, 1);
2513 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002514 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002515 com_push(c, 1);
2516 i = NCH(n)/2; /* Either 2 or 4 */
2517 if (i > 1)
2518 com_node(c, CHILD(n, 3));
2519 com_addoparg(c, RAISE_VARARGS, i);
2520 com_pop(c, i);
2521 /* The interpreter does not fall through */
2522 /* All jumps converge here */
2523 com_backpatch(c, a);
2524 com_backpatch(c, b);
2525 com_addbyte(c, POP_TOP);
2526}
2527
2528static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002529com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002530{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002531 int i = 1;
2532 node* stream = NULL;
2533
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002534 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002535
2536 /* are we using the extended print form? */
2537 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2538 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002539 com_node(c, stream);
2540 /* stack: [...] => [... stream] */
2541 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002542 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2543 i = 4;
2544 else
2545 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002546 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002547 for (; i < NCH(n); i += 2) {
2548 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002549 com_addbyte(c, DUP_TOP);
2550 /* stack: [stream] => [stream stream] */
2551 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002552 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002553 /* stack: [stream stream] => [stream stream obj] */
2554 com_addbyte(c, ROT_TWO);
2555 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002556 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002557 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002558 com_pop(c, 2);
2559 }
2560 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002561 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002562 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002563 com_addbyte(c, PRINT_ITEM);
2564 com_pop(c, 1);
2565 }
2566 }
2567 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002568 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002569 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002570 /* must pop the extra stream object off the stack */
2571 com_addbyte(c, POP_TOP);
2572 /* stack: [... stream] => [...] */
2573 com_pop(c, 1);
2574 }
2575 }
2576 else {
2577 if (stream != NULL) {
2578 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002579 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002580 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002581 com_pop(c, 1);
2582 }
2583 else
2584 com_addbyte(c, PRINT_NEWLINE);
2585 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002586}
2587
2588static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002589com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002590{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002591 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002592 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002593 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002594 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002595 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002596 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002597 com_push(c, 1);
2598 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002599 else
2600 com_node(c, CHILD(n, 1));
2601 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002602 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002603}
2604
2605static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002606com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002607{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002608 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002609 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2610 if (NCH(n) > 1) {
2611 com_node(c, CHILD(n, 1));
2612 if (NCH(n) > 3) {
2613 com_node(c, CHILD(n, 3));
2614 if (NCH(n) > 5)
2615 com_node(c, CHILD(n, 5));
2616 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002617 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002618 i = NCH(n)/2;
2619 com_addoparg(c, RAISE_VARARGS, i);
2620 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002621}
2622
2623static void
Thomas Wouters52152252000-08-17 22:55:00 +00002624com_from_import(struct compiling *c, node *n)
2625{
2626 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2627 com_push(c, 1);
2628 if (NCH(n) > 1) {
2629 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2630 com_error(c, PyExc_SyntaxError, "invalid syntax");
2631 return;
2632 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002633 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002634 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002635 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00002636 com_pop(c, 1);
2637}
2638
2639static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002640com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002641{
2642 int i;
2643 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002644 /* 'import' dotted_name (',' dotted_name)* |
2645 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002646 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00002647 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002648 /* 'from' dotted_name 'import' ... */
2649 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002650
2651 if (TYPE(CHILD(n, 3)) == STAR) {
2652 tup = Py_BuildValue("(s)", "*");
2653 } else {
2654 tup = PyTuple_New((NCH(n) - 2)/2);
2655 for (i = 3; i < NCH(n); i += 2) {
2656 PyTuple_SET_ITEM(tup, (i-3)/2,
2657 PyString_FromString(STR(
Jeremy Hylton4419ac12001-02-28 22:54:51 +00002658 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002659 }
2660 }
2661 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00002662 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002663 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002664 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00002665 if (TYPE(CHILD(n, 3)) == STAR)
2666 com_addbyte(c, IMPORT_STAR);
2667 else {
2668 for (i = 3; i < NCH(n); i += 2)
2669 com_from_import(c, CHILD(n, i));
2670 com_addbyte(c, POP_TOP);
2671 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002672 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002673 }
2674 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002675 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002676 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00002677 node *subn = CHILD(n, i);
2678 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002679 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002680 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002681 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00002682 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00002683 int j;
2684 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00002685 com_error(c, PyExc_SyntaxError,
2686 "invalid syntax");
2687 return;
2688 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00002689 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
2690 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002691 CHILD(CHILD(subn, 0),
2692 j));
2693 com_addop_varname(c, VAR_STORE,
2694 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002695 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002696 com_addop_varname(c, VAR_STORE,
2697 STR(CHILD(CHILD(subn, 0),
2698 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002699 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002700 }
2701 }
2702}
2703
2704static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002705com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002706{
2707 REQ(n, exec_stmt);
2708 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2709 com_node(c, CHILD(n, 1));
2710 if (NCH(n) >= 4)
2711 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002712 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002713 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002714 com_push(c, 1);
2715 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002716 if (NCH(n) >= 6)
2717 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002718 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002719 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002720 com_push(c, 1);
2721 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002722 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002723 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002724}
2725
Guido van Rossum7c531111997-03-11 18:42:21 +00002726static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002727is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002728{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002729 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002730 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002731 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00002732
2733 /* Label to avoid tail recursion */
2734 next:
2735 switch (TYPE(n)) {
2736
2737 case suite:
2738 if (NCH(n) == 1) {
2739 n = CHILD(n, 0);
2740 goto next;
2741 }
2742 /* Fall through */
2743 case file_input:
2744 for (i = 0; i < NCH(n); i++) {
2745 node *ch = CHILD(n, i);
2746 if (TYPE(ch) == stmt) {
2747 n = ch;
2748 goto next;
2749 }
2750 }
2751 break;
2752
2753 case stmt:
2754 case simple_stmt:
2755 case small_stmt:
2756 n = CHILD(n, 0);
2757 goto next;
2758
2759 case expr_stmt:
2760 case testlist:
2761 case test:
2762 case and_test:
2763 case not_test:
2764 case comparison:
2765 case expr:
2766 case xor_expr:
2767 case and_expr:
2768 case shift_expr:
2769 case arith_expr:
2770 case term:
2771 case factor:
2772 case power:
2773 case atom:
2774 if (NCH(n) == 1) {
2775 n = CHILD(n, 0);
2776 goto next;
2777 }
2778 break;
2779
2780 case NAME:
2781 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2782 return 1;
2783 break;
2784
2785 case NUMBER:
2786 v = parsenumber(c, STR(n));
2787 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002788 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002789 break;
2790 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002791 i = PyObject_IsTrue(v);
2792 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002793 return i == 0;
2794
2795 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002796 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002797 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002798 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002799 break;
2800 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002801 i = PyObject_IsTrue(v);
2802 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002803 return i == 0;
2804
2805 }
2806 return 0;
2807}
2808
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002809static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002810com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002811{
2812 int i;
2813 int anchor = 0;
2814 REQ(n, if_stmt);
2815 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2816 for (i = 0; i+3 < NCH(n); i+=4) {
2817 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002818 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002819 if (is_constant_false(c, ch))
2820 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002821 if (i > 0)
2822 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002823 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002824 com_addfwref(c, JUMP_IF_FALSE, &a);
2825 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002826 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002827 com_node(c, CHILD(n, i+3));
2828 com_addfwref(c, JUMP_FORWARD, &anchor);
2829 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002830 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002831 com_addbyte(c, POP_TOP);
2832 }
2833 if (i+2 < NCH(n))
2834 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002835 if (anchor)
2836 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002837}
2838
2839static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002840com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002841{
2842 int break_anchor = 0;
2843 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002844 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002845 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2846 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002847 block_push(c, SETUP_LOOP);
2848 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002849 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002850 com_node(c, CHILD(n, 1));
2851 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2852 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002853 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002854 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002855 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002856 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002857 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2858 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002859 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002860 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002861 com_addbyte(c, POP_TOP);
2862 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002863 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002864 if (NCH(n) > 4)
2865 com_node(c, CHILD(n, 6));
2866 com_backpatch(c, break_anchor);
2867}
2868
2869static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002870com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002871{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002872 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002873 int break_anchor = 0;
2874 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002875 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002876 REQ(n, for_stmt);
2877 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2878 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002879 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002880 com_node(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002881 v = PyInt_FromLong(0L);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002882 if (v == NULL)
2883 c->c_errors++;
2884 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002885 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002886 Py_XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002887 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002888 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002889 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002890 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00002891 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002892 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002893 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002894 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002895 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2896 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002897 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002898 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002899 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002900 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002901 if (NCH(n) > 8)
2902 com_node(c, CHILD(n, 8));
2903 com_backpatch(c, break_anchor);
2904}
2905
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002906/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002907
2908 SETUP_FINALLY L
2909 <code for S>
2910 POP_BLOCK
2911 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002912 L: <code for Sf>
2913 END_FINALLY
2914
2915 The special instructions use the block stack. Each block
2916 stack entry contains the instruction that created it (here
2917 SETUP_FINALLY), the level of the value stack at the time the
2918 block stack entry was created, and a label (here L).
2919
2920 SETUP_FINALLY:
2921 Pushes the current value stack level and the label
2922 onto the block stack.
2923 POP_BLOCK:
2924 Pops en entry from the block stack, and pops the value
2925 stack until its level is the same as indicated on the
2926 block stack. (The label is ignored.)
2927 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002928 Pops a variable number of entries from the *value* stack
2929 and re-raises the exception they specify. The number of
2930 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002931
2932 The block stack is unwound when an exception is raised:
2933 when a SETUP_FINALLY entry is found, the exception is pushed
2934 onto the value stack (and the exception condition is cleared),
2935 and the interpreter jumps to the label gotten from the block
2936 stack.
2937
2938 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002939 (The contents of the value stack is shown in [], with the top
2940 at the right; 'tb' is trace-back info, 'val' the exception's
2941 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002942
2943 Value stack Label Instruction Argument
2944 [] SETUP_EXCEPT L1
2945 [] <code for S>
2946 [] POP_BLOCK
2947 [] JUMP_FORWARD L0
2948
Guido van Rossum3f5da241990-12-20 15:06:42 +00002949 [tb, val, exc] L1: DUP )
2950 [tb, val, exc, exc] <evaluate E1> )
2951 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2952 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2953 [tb, val, exc, 1] POP )
2954 [tb, val, exc] POP
2955 [tb, val] <assign to V1> (or POP if no V1)
2956 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002957 [] <code for S1>
2958 JUMP_FORWARD L0
2959
Guido van Rossum3f5da241990-12-20 15:06:42 +00002960 [tb, val, exc, 0] L2: POP
2961 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002962 .............................etc.......................
2963
Guido van Rossum3f5da241990-12-20 15:06:42 +00002964 [tb, val, exc, 0] Ln+1: POP
2965 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002966
2967 [] L0: <next statement>
2968
2969 Of course, parts are not generated if Vi or Ei is not present.
2970*/
2971
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002972static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002973com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002974{
2975 int except_anchor = 0;
2976 int end_anchor = 0;
2977 int else_anchor = 0;
2978 int i;
2979 node *ch;
2980
2981 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2982 block_push(c, SETUP_EXCEPT);
2983 com_node(c, CHILD(n, 2));
2984 com_addbyte(c, POP_BLOCK);
2985 block_pop(c, SETUP_EXCEPT);
2986 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2987 com_backpatch(c, except_anchor);
2988 for (i = 3;
2989 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2990 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002991 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002992 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002993 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002994 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002995 break;
2996 }
2997 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002998 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002999 com_addoparg(c, SET_LINENO, ch->n_lineno);
3000 if (NCH(ch) > 1) {
3001 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003002 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003003 com_node(c, CHILD(ch, 1));
3004 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003005 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003006 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3007 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003008 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003009 }
3010 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 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003013 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003014 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003015 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003016 com_pop(c, 1);
3017 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003018 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003019 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003020 com_node(c, CHILD(n, i+2));
3021 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3022 if (except_anchor) {
3023 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003024 /* We come in with [tb, val, exc, 0] on the
3025 stack; one pop and it's the same as
3026 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003027 com_addbyte(c, POP_TOP);
3028 }
3029 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003030 /* We actually come in here with [tb, val, exc] but the
3031 END_FINALLY will zap those and jump around.
3032 The c_stacklevel does not reflect them so we need not pop
3033 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003034 com_addbyte(c, END_FINALLY);
3035 com_backpatch(c, else_anchor);
3036 if (i < NCH(n))
3037 com_node(c, CHILD(n, i+2));
3038 com_backpatch(c, end_anchor);
3039}
3040
3041static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003042com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003043{
3044 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003045 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003046
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003047 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3048 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003049 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003050 com_addbyte(c, POP_BLOCK);
3051 block_pop(c, SETUP_FINALLY);
3052 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003053 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003054 /* While the generated code pushes only one item,
3055 the try-finally handling can enter here with
3056 up to three items. OK, here are the details:
3057 3 for an exception, 2 for RETURN, 1 for BREAK. */
3058 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003059 com_backpatch(c, finally_anchor);
3060 ch = CHILD(n, NCH(n)-1);
3061 com_addoparg(c, SET_LINENO, ch->n_lineno);
3062 com_node(c, ch);
3063 com_addbyte(c, END_FINALLY);
3064 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003065 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003066}
3067
3068static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003069com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003070{
3071 REQ(n, try_stmt);
3072 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3073 | 'try' ':' suite 'finally' ':' suite */
3074 if (TYPE(CHILD(n, 3)) != except_clause)
3075 com_try_finally(c, n);
3076 else
3077 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003078}
3079
Guido van Rossum8b993a91997-01-17 21:04:03 +00003080static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003081get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003082{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003083 int i;
3084
Guido van Rossum8b993a91997-01-17 21:04:03 +00003085 /* Label to avoid tail recursion */
3086 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003087 switch (TYPE(n)) {
3088
3089 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003090 if (NCH(n) == 1) {
3091 n = CHILD(n, 0);
3092 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003093 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003094 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003095 case file_input:
3096 for (i = 0; i < NCH(n); i++) {
3097 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003098 if (TYPE(ch) == stmt) {
3099 n = ch;
3100 goto next;
3101 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003102 }
3103 break;
3104
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003105 case stmt:
3106 case simple_stmt:
3107 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003108 n = CHILD(n, 0);
3109 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003110
3111 case expr_stmt:
3112 case testlist:
3113 case test:
3114 case and_test:
3115 case not_test:
3116 case comparison:
3117 case expr:
3118 case xor_expr:
3119 case and_expr:
3120 case shift_expr:
3121 case arith_expr:
3122 case term:
3123 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003124 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003125 if (NCH(n) == 1) {
3126 n = CHILD(n, 0);
3127 goto next;
3128 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003129 break;
3130
3131 case atom:
3132 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003133 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003134 break;
3135
3136 }
3137 return NULL;
3138}
3139
Guido van Rossum79f25d91997-04-29 20:08:16 +00003140static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003141get_docstring(node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003142{
Guido van Rossum541563e1999-01-28 15:08:09 +00003143 /* Don't generate doc-strings if run with -OO */
3144 if (Py_OptimizeFlag > 1)
3145 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003146 n = get_rawdocstring(n);
3147 if (n == NULL)
3148 return NULL;
3149 return parsestrplus(n);
3150}
3151
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003152static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003153com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003154{
3155 REQ(n, suite);
3156 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3157 if (NCH(n) == 1) {
3158 com_node(c, CHILD(n, 0));
3159 }
3160 else {
3161 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003162 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003163 node *ch = CHILD(n, i);
3164 if (TYPE(ch) == stmt)
3165 com_node(c, ch);
3166 }
3167 }
3168}
3169
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003170/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003171static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003172com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003173{
3174 int i = c->c_nblocks;
3175 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3176 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3177 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003178 else if (i <= 0) {
3179 /* at the outer level */
3180 com_error(c, PyExc_SyntaxError,
3181 "'continue' not properly in loop");
3182 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003183 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003184 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003185 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003186 if (c->c_block[j] == SETUP_LOOP)
3187 break;
3188 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003189 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003190 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003191 for (; i > j; --i) {
3192 if (c->c_block[i] == SETUP_EXCEPT ||
3193 c->c_block[i] == SETUP_FINALLY) {
3194 com_addoparg(c, CONTINUE_LOOP,
3195 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003196 return;
3197 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003198 if (c->c_block[i] == END_FINALLY) {
3199 com_error(c, PyExc_SyntaxError,
3200 "'continue' not supported inside 'finally' clause");
3201 return;
3202 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003203 }
3204 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003205 com_error(c, PyExc_SyntaxError,
3206 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003207 }
3208 /* XXX Could allow it inside a 'finally' clause
3209 XXX if we could pop the exception still on the stack */
3210}
3211
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003212static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003213com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003214{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003215 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003216 if (TYPE(n) == lambdef) {
3217 /* lambdef: 'lambda' [varargslist] ':' test */
3218 n = CHILD(n, 1);
3219 }
3220 else {
3221 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3222 n = CHILD(n, 2);
3223 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3224 n = CHILD(n, 1);
3225 }
3226 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003227 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003228 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003229 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003230 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3231 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003232 nargs = 0;
3233 ndefs = 0;
3234 for (i = 0; i < nch; i++) {
3235 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003236 if (TYPE(CHILD(n, i)) == STAR ||
3237 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003238 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003239 nargs++;
3240 i++;
3241 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003242 t = RPAR; /* Anything except EQUAL or COMMA */
3243 else
3244 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003245 if (t == EQUAL) {
3246 i++;
3247 ndefs++;
3248 com_node(c, CHILD(n, i));
3249 i++;
3250 if (i >= nch)
3251 break;
3252 t = TYPE(CHILD(n, i));
3253 }
3254 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003255 /* Treat "(a=1, b)" as an error */
3256 if (ndefs)
3257 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003258 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003259 }
3260 if (t != COMMA)
3261 break;
3262 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003263 return ndefs;
3264}
3265
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003266static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003267com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003268{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003269 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003270 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003271 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003272 ndefs = com_argdefs(c, n);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003273 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3274 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003275 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003276 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003277 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003278 c->c_errors++;
3279 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003280 int closure = com_make_closure(c, (PyCodeObject *)co);
3281 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003282 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003283 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003284 if (closure)
3285 com_addoparg(c, MAKE_CLOSURE, ndefs);
3286 else
3287 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003288 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003289 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003290 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003291 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003292 }
3293}
3294
3295static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003296com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003297{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003298 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003299 REQ(n, testlist);
3300 /* testlist: test (',' test)* [','] */
3301 for (i = 0; i < NCH(n); i += 2)
3302 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003303 i = (NCH(n)+1) / 2;
3304 com_addoparg(c, BUILD_TUPLE, i);
3305 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003306}
3307
3308static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003309com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003310{
Guido van Rossum25831651993-05-19 14:50:45 +00003311 int i;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003312 PyObject *co, *v;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003313 char *name;
3314
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003315 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003316 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003317 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003318 c->c_errors++;
3319 return;
3320 }
3321 /* Push the class name on the stack */
3322 i = com_addconst(c, v);
3323 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003324 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003325 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003326 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003327 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003328 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003329 com_push(c, 1);
3330 }
Guido van Rossum25831651993-05-19 14:50:45 +00003331 else
3332 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003333 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003334 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003335 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003336 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003337 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003338 c->c_errors++;
3339 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003340 int closure = com_make_closure(c, (PyCodeObject *)co);
3341 i = com_addconst(c, co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003342 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003343 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003344 if (closure)
3345 com_addoparg(c, MAKE_CLOSURE, 0);
3346 else
3347 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003348 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003349 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003350 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003351 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003352 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003353 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003354}
3355
3356static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003357com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003358{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003359 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003360 if (c->c_errors)
3361 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003362 switch (TYPE(n)) {
3363
3364 /* Definition nodes */
3365
3366 case funcdef:
3367 com_funcdef(c, n);
3368 break;
3369 case classdef:
3370 com_classdef(c, n);
3371 break;
3372
3373 /* Trivial parse tree nodes */
3374
3375 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003376 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003377 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003378 n = CHILD(n, 0);
3379 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003380
3381 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003382 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
3383 com_addoparg(c, SET_LINENO, n->n_lineno);
3384 {
3385 int i;
3386 for (i = 0; i < NCH(n)-1; i += 2)
3387 com_node(c, CHILD(n, i));
3388 }
3389 break;
3390
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003391 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003392 com_addoparg(c, SET_LINENO, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003393 n = CHILD(n, 0);
3394 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003395
3396 /* Statement nodes */
3397
3398 case expr_stmt:
3399 com_expr_stmt(c, n);
3400 break;
3401 case print_stmt:
3402 com_print_stmt(c, n);
3403 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003404 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003405 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003406 break;
3407 case pass_stmt:
3408 break;
3409 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003410 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003411 com_error(c, PyExc_SyntaxError,
3412 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003413 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003414 com_addbyte(c, BREAK_LOOP);
3415 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003416 case continue_stmt:
3417 com_continue_stmt(c, n);
3418 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003419 case return_stmt:
3420 com_return_stmt(c, n);
3421 break;
3422 case raise_stmt:
3423 com_raise_stmt(c, n);
3424 break;
3425 case import_stmt:
3426 com_import_stmt(c, n);
3427 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003428 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003429 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003430 case exec_stmt:
3431 com_exec_stmt(c, n);
3432 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003433 case assert_stmt:
3434 com_assert_stmt(c, n);
3435 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003436 case if_stmt:
3437 com_if_stmt(c, n);
3438 break;
3439 case while_stmt:
3440 com_while_stmt(c, n);
3441 break;
3442 case for_stmt:
3443 com_for_stmt(c, n);
3444 break;
3445 case try_stmt:
3446 com_try_stmt(c, n);
3447 break;
3448 case suite:
3449 com_suite(c, n);
3450 break;
3451
3452 /* Expression nodes */
3453
3454 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003455 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003456 break;
3457 case test:
3458 com_test(c, n);
3459 break;
3460 case and_test:
3461 com_and_test(c, n);
3462 break;
3463 case not_test:
3464 com_not_test(c, n);
3465 break;
3466 case comparison:
3467 com_comparison(c, n);
3468 break;
3469 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003470 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003471 break;
3472 case expr:
3473 com_expr(c, n);
3474 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003475 case xor_expr:
3476 com_xor_expr(c, n);
3477 break;
3478 case and_expr:
3479 com_and_expr(c, n);
3480 break;
3481 case shift_expr:
3482 com_shift_expr(c, n);
3483 break;
3484 case arith_expr:
3485 com_arith_expr(c, n);
3486 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003487 case term:
3488 com_term(c, n);
3489 break;
3490 case factor:
3491 com_factor(c, n);
3492 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003493 case power:
3494 com_power(c, n);
3495 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003496 case atom:
3497 com_atom(c, n);
3498 break;
3499
3500 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003501 com_error(c, PyExc_SystemError,
3502 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003503 }
3504}
3505
Tim Petersdbd9ba62000-07-09 03:09:57 +00003506static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003507
3508static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003509com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003510{
3511 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3512 if (TYPE(CHILD(n, 0)) == LPAR)
3513 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003514 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003515 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003516 com_pop(c, 1);
3517 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003518}
3519
3520static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003521com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003522{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003523 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003524 if (NCH(n) == 1) {
3525 com_fpdef(c, CHILD(n, 0));
3526 }
3527 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003528 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003529 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003530 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003531 for (i = 0; i < NCH(n); i += 2)
3532 com_fpdef(c, CHILD(n, i));
3533 }
3534}
3535
3536static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003537com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003538{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003539 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003540 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003541 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003542 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003543 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003544 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003545 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003546 /* Enter all arguments in table of locals */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003547 for (i = 0, narg = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003548 node *ch = CHILD(n, i);
3549 node *fp;
3550 char *name;
Guido van Rossum50564e81996-01-12 01:13:16 +00003551 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003552 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003553 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3554 fp = CHILD(ch, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003555 if (TYPE(fp) == NAME) {
3556 PyObject *v;
3557 name = STR(fp);
3558 v = PyDict_GetItemString(c->c_cellvars, name);
3559 if (v) {
3560 com_addoparg(c, LOAD_FAST, narg);
3561 com_addoparg(c, STORE_DEREF,
3562 PyInt_AS_LONG(v));
3563 }
3564 } else {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003565 name = nbuf;
3566 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003567 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003568 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003569 narg++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003570 /* all name updates handled by symtable */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003571 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003572 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003573 ch = CHILD(n, i);
3574 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003575 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003576 else
3577 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003578 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003579 /* Handle *arguments */
3580 if (i < nch) {
3581 node *ch;
3582 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003583 if (TYPE(ch) != DOUBLESTAR) {
3584 REQ(ch, STAR);
3585 ch = CHILD(n, i+1);
3586 if (TYPE(ch) == NAME) {
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003587 PyObject *v;
Guido van Rossum50564e81996-01-12 01:13:16 +00003588 i += 3;
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003589 v = PyDict_GetItemString(c->c_cellvars,
3590 STR(ch));
3591 if (v) {
3592 com_addoparg(c, LOAD_FAST, narg);
3593 com_addoparg(c, STORE_DEREF,
3594 PyInt_AS_LONG(v));
Guido van Rossum50564e81996-01-12 01:13:16 +00003595 }
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003596 narg++;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003597 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003598 }
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003599 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003600 /* Handle **keywords */
3601 if (i < nch) {
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003602 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003603 node *ch;
3604 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003605 if (TYPE(ch) != DOUBLESTAR) {
3606 REQ(ch, STAR);
3607 ch = CHILD(n, i+1);
3608 REQ(ch, STAR);
3609 ch = CHILD(n, i+2);
3610 }
3611 else
3612 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003613 REQ(ch, NAME);
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003614 v = PyDict_GetItemString(c->c_cellvars, STR(ch));
3615 if (v) {
3616 com_addoparg(c, LOAD_FAST, narg);
3617 com_addoparg(c, STORE_DEREF, PyInt_AS_LONG(v));
3618 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003619 }
3620 if (complex) {
3621 /* Generate code for complex arguments only after
3622 having counted the simple arguments */
3623 int ilocal = 0;
3624 for (i = 0; i < nch; i++) {
3625 node *ch = CHILD(n, i);
3626 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003627 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003628 break;
3629 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3630 fp = CHILD(ch, 0);
3631 if (TYPE(fp) != NAME) {
3632 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003633 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003634 com_fpdef(c, ch);
3635 }
3636 ilocal++;
3637 if (++i >= nch)
3638 break;
3639 ch = CHILD(n, i);
3640 if (TYPE(ch) == EQUAL)
3641 i += 2;
3642 else
3643 REQ(ch, COMMA);
3644 }
3645 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003646}
3647
3648static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003649com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003650{
3651 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003652 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003653 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003654 doc = get_docstring(n);
3655 if (doc != NULL) {
3656 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003657 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003658 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003659 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003660 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003661 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003662 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003663 for (i = 0; i < NCH(n); i++) {
3664 node *ch = CHILD(n, i);
3665 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3666 com_node(c, ch);
3667 }
3668}
3669
3670/* Top-level compile-node interface */
3671
3672static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003673compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003674{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003675 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003676 node *ch;
3677 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003678 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003679 doc = get_docstring(CHILD(n, 4));
3680 if (doc != NULL) {
3681 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003682 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003683 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003684 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003685 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003686 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3687 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003688 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003689 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003690 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003691 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003692 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003693 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003694 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003695 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003696 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003697}
3698
3699static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003700compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003701{
Guido van Rossum590baa41993-11-30 13:40:46 +00003702 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003703 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003704 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003705
3706 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003707 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003708 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003709 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003710 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003711 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003712 else
3713 ch = CHILD(n, 2);
3714 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003715 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003716 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003717}
3718
3719static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003720compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003721{
3722 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003723 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003724 REQ(n, classdef);
3725 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3726 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003727 c->c_private = c->c_name;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003728 ch = CHILD(n, NCH(n)-1); /* The suite */
3729 doc = get_docstring(ch);
3730 if (doc != NULL) {
3731 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003732 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003733 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003734 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003735 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003736 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003737 }
3738 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003739 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003740 com_node(c, ch);
3741 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003742 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003743 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003744 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003745}
3746
3747static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003748compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003749{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003750 com_addoparg(c, SET_LINENO, n->n_lineno);
3751
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003752 switch (TYPE(n)) {
3753
Guido van Rossum4c417781991-01-21 16:09:22 +00003754 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003755 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003756 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003757 n = CHILD(n, 0);
3758 if (TYPE(n) != NEWLINE)
3759 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003760 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003761 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003762 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003763 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003764 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003765 break;
3766
Guido van Rossum4c417781991-01-21 16:09:22 +00003767 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003768 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003769 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003770 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003771 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003772 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003773 break;
3774
Guido van Rossum590baa41993-11-30 13:40:46 +00003775 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003776 com_node(c, CHILD(n, 0));
3777 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003778 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003779 break;
3780
Guido van Rossum590baa41993-11-30 13:40:46 +00003781 case lambdef: /* anonymous function definition */
3782 compile_lambdef(c, n);
3783 break;
3784
Guido van Rossum4c417781991-01-21 16:09:22 +00003785 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003786 compile_funcdef(c, n);
3787 break;
3788
Guido van Rossum4c417781991-01-21 16:09:22 +00003789 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003790 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003791 break;
3792
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003793 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003794 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003795 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003796 }
3797}
3798
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003799static PyObject *
3800dict_keys_inorder(PyObject *dict, int offset)
3801{
3802 PyObject *tuple, *k, *v;
3803 int i, pos = 0, size = PyDict_Size(dict);
3804
3805 tuple = PyTuple_New(size);
3806 if (tuple == NULL)
3807 return NULL;
3808 while (PyDict_Next(dict, &pos, &k, &v)) {
3809 i = PyInt_AS_LONG(v);
3810 Py_INCREF(k);
3811 PyTuple_SET_ITEM(tuple, i - offset, k);
3812 }
3813 return tuple;
3814}
3815
Guido van Rossum79f25d91997-04-29 20:08:16 +00003816PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003817PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003818{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003819 return jcompile(n, filename, NULL);
3820}
3821
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003822struct symtable *
3823PyNode_CompileSymtable(node *n, char *filename)
3824{
3825 struct symtable *st;
3826
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003827 st = symtable_init();
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003828 if (st == NULL)
3829 return NULL;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00003830 assert(st->st_symbols != NULL);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003831 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
3832 if (st->st_errors > 0) {
3833 PySymtable_Free(st);
3834 return NULL;
3835 }
3836 symtable_node(st, n);
3837 if (st->st_errors > 0) {
3838 PySymtable_Free(st);
3839 return NULL;
3840 }
3841 return st;
3842}
3843
Guido van Rossum79f25d91997-04-29 20:08:16 +00003844static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003845icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003846{
3847 return jcompile(n, base->c_filename, base);
3848}
3849
Guido van Rossum79f25d91997-04-29 20:08:16 +00003850static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003851jcompile(node *n, char *filename, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003852{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003853 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003854 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003855 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003856 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003857 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003858 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003859 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003860 /* c_symtable still points to parent's symbols */
3861 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003862 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003863 sc.c_nested = 1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003864 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003865 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00003866 sc.c_future = PyNode_Future(n, filename);
3867 if (sc.c_future == NULL || symtable_build(&sc, n) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003868 com_free(&sc);
3869 return NULL;
3870 }
3871 }
3872 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003873 if (symtable_load_symbols(&sc) < 0) {
3874 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003875 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003876 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003877 compile_node(&sc, n);
3878 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00003879 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003880 PyObject *consts, *names, *varnames, *filename, *name,
3881 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003882 consts = PyList_AsTuple(sc.c_consts);
3883 names = PyList_AsTuple(sc.c_names);
3884 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003885 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
3886 freevars = dict_keys_inorder(sc.c_freevars,
3887 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003888 filename = PyString_InternFromString(sc.c_filename);
3889 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003890 if (!PyErr_Occurred())
3891 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003892 sc.c_nlocals,
3893 sc.c_maxstacklevel,
3894 sc.c_flags,
3895 sc.c_code,
3896 consts,
3897 names,
3898 varnames,
3899 freevars,
3900 cellvars,
3901 filename,
3902 name,
3903 sc.c_firstlineno,
3904 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003905 Py_XDECREF(consts);
3906 Py_XDECREF(names);
3907 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003908 Py_XDECREF(freevars);
3909 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003910 Py_XDECREF(filename);
3911 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003912 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00003913 else if (!PyErr_Occurred()) {
3914 /* This could happen if someone called PyErr_Clear() after an
3915 error was reported above. That's not supposed to happen,
3916 but I just plugged one case and I'm not sure there can't be
3917 others. In that case, raise SystemError so that at least
3918 it gets reported instead dumping core. */
3919 PyErr_SetString(PyExc_SystemError, "lost syntax error");
3920 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003921 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00003922 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003923 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00003924 sc.c_symtable = NULL;
3925 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003926 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003927 return co;
3928}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003929
3930int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003931PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003932{
3933 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003934 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003935 int line = co->co_firstlineno;
3936 int addr = 0;
3937 while (--size >= 0) {
3938 addr += *p++;
3939 if (addr > addrq)
3940 break;
3941 line += *p++;
3942 }
3943 return line;
3944}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003945
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003946/* The test for LOCAL must come before the test for FREE in order to
3947 handle classes where name is both local and free. The local var is
3948 a method and the free var is a free var referenced within a method.
3949*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003950
3951static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003952get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003953{
3954 PyObject *v;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00003955 if (c->c_symtable->st_nested_scopes) {
3956 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
3957 return CELL;
3958 if (PyDict_GetItemString(c->c_locals, name) != NULL)
3959 return LOCAL;
3960 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
3961 return FREE;
3962 v = PyDict_GetItemString(c->c_globals, name);
3963 if (v) {
3964 if (v == Py_None)
3965 return GLOBAL_EXPLICIT;
3966 else {
3967 return GLOBAL_IMPLICIT;
3968 }
3969 }
3970 } else {
3971 if (PyDict_GetItemString(c->c_locals, name) != NULL)
3972 return LOCAL;
3973 v = PyDict_GetItemString(c->c_globals, name);
3974 if (v) {
3975 if (v == Py_None)
3976 return GLOBAL_EXPLICIT;
3977 else {
3978 return GLOBAL_IMPLICIT;
3979 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003980 }
3981 }
3982 {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003983 char buf[350];
3984 sprintf(buf,
Jeremy Hylton51257732001-03-01 00:42:55 +00003985 "unknown scope for %.100s in %.100s(%s) "
3986 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
Jeremy Hylton483638c2001-02-01 20:20:45 +00003987 name, c->c_name,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003988 PyObject_REPR(c->c_symtable->st_cur->ste_id),
Jeremy Hylton51257732001-03-01 00:42:55 +00003989 c->c_filename,
3990 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
3991 PyObject_REPR(c->c_locals),
3992 PyObject_REPR(c->c_globals)
3993 );
3994
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003995 Py_FatalError(buf);
3996 }
3997 return -1; /* can't get here */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003998}
3999
Guido van Rossumee34ac12001-02-28 22:08:12 +00004000/* Helper function to issue symbol table warnings */
4001
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004002static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004003symtable_warn(struct symtable *st, char *msg)
4004{
4005 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, st->st_filename,
4006 st->st_cur->ste_lineno, NULL, NULL) < 0) {
4007 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4008 PyErr_SetString(PyExc_SyntaxError, msg);
4009 PyErr_SyntaxLocation(st->st_filename,
4010 st->st_cur->ste_lineno);
4011 }
4012 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004013 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004014 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004015 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004016}
4017
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004018/* Helper function for setting lineno and filename */
4019
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004020static int
4021symtable_build(struct compiling *c, node *n)
4022{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004023 if ((c->c_symtable = symtable_init()) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004024 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004025 c->c_symtable->st_future = c->c_future;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004026 if (c->c_future->ff_nested_scopes)
4027 c->c_symtable->st_nested_scopes = 1;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004028 c->c_symtable->st_filename = c->c_filename;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004029 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
4030 if (c->c_symtable->st_errors > 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004031 return -1;
4032 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004033 if (c->c_symtable->st_errors > 0)
4034 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004035 /* reset for second pass */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004036 c->c_symtable->st_nscopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004037 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004038 return 0;
4039}
4040
4041static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004042symtable_init_compiling_symbols(struct compiling *c)
4043{
4044 PyObject *varnames;
4045
4046 varnames = c->c_symtable->st_cur->ste_varnames;
4047 if (varnames == NULL) {
4048 varnames = PyList_New(0);
4049 if (varnames == NULL)
4050 return -1;
4051 c->c_symtable->st_cur->ste_varnames = varnames;
4052 Py_INCREF(varnames);
4053 } else
4054 Py_INCREF(varnames);
4055 c->c_varnames = varnames;
4056
4057 c->c_globals = PyDict_New();
4058 if (c->c_globals == NULL)
4059 return -1;
4060 c->c_freevars = PyDict_New();
4061 if (c->c_freevars == NULL)
4062 return -1;
4063 c->c_cellvars = PyDict_New();
4064 if (c->c_cellvars == NULL)
4065 return -1;
4066 return 0;
4067}
4068
4069struct symbol_info {
4070 int si_nlocals;
4071 int si_ncells;
4072 int si_nfrees;
4073 int si_nimplicit;
4074};
4075
4076static void
4077symtable_init_info(struct symbol_info *si)
4078{
4079 si->si_nlocals = 0;
4080 si->si_ncells = 0;
4081 si->si_nfrees = 0;
4082 si->si_nimplicit = 0;
4083}
4084
4085static int
4086symtable_resolve_free(struct compiling *c, PyObject *name,
4087 struct symbol_info *si)
4088{
4089 PyObject *dict, *v;
4090
4091 /* Seperate logic for DEF_FREE. If it occurs in a function,
4092 it indicates a local that we must allocate storage for (a
4093 cell var). If it occurs in a class, then the class has a
4094 method and a free variable with the same name.
4095 */
4096
4097 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
4098 v = PyInt_FromLong(si->si_ncells++);
4099 dict = c->c_cellvars;
4100 } else {
4101 v = PyInt_FromLong(si->si_nfrees++);
4102 dict = c->c_freevars;
4103 }
4104 if (v == NULL)
4105 return -1;
4106 if (PyDict_SetItem(dict, name, v) < 0) {
4107 Py_DECREF(v);
4108 return -1;
4109 }
4110 Py_DECREF(v);
4111 return 0;
4112}
4113
4114static int
4115symtable_freevar_offsets(PyObject *freevars, int offset)
4116{
4117 PyObject *name, *v;
4118 int pos;
4119
4120 /* The cell vars are the first elements of the closure,
4121 followed by the free vars. Update the offsets in
4122 c_freevars to account for number of cellvars. */
4123 pos = 0;
4124 while (PyDict_Next(freevars, &pos, &name, &v)) {
4125 int i = PyInt_AS_LONG(v) + offset;
4126 PyObject *o = PyInt_FromLong(i);
4127 if (o == NULL)
4128 return -1;
4129 if (PyDict_SetItem(freevars, name, o) < 0) {
4130 Py_DECREF(o);
4131 return -1;
4132 }
4133 Py_DECREF(o);
4134 }
4135 return 0;
4136}
4137
4138static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004139symtable_check_unoptimized(struct compiling *c,
4140 PySymtableEntryObject *ste,
4141 struct symbol_info *si)
4142{
4143 char buf[300];
4144
4145 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4146 || (ste->ste_nested && si->si_nimplicit)))
4147 return 0;
4148
4149#define ILLEGAL_IMPORT_STAR \
4150"import * is not allowed in function '%.100s' " \
4151"because it contains a nested function with free variables"
4152
4153#define ILLEGAL_BARE_EXEC \
4154"unqualified exec is not allowed in function '%.100s' " \
4155"because it contains a nested function with free variables"
4156
4157#define ILLEGAL_EXEC_AND_IMPORT_STAR \
4158"function '%.100s' uses import * and bare exec, which are illegal" \
4159"because it contains a nested function with free variables"
4160
4161 /* XXX perhaps the linenos for these opt-breaking statements
4162 should be stored so the exception can point to them. */
4163
4164 if (ste->ste_optimized == OPT_IMPORT_STAR)
4165 sprintf(buf, ILLEGAL_IMPORT_STAR,
4166 PyString_AS_STRING(ste->ste_name));
4167 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
4168 sprintf(buf, ILLEGAL_BARE_EXEC,
4169 PyString_AS_STRING(ste->ste_name));
4170 else {
4171 sprintf(buf, ILLEGAL_EXEC_AND_IMPORT_STAR,
4172 PyString_AS_STRING(ste->ste_name));
4173 }
4174
4175 if (c->c_symtable->st_nested_scopes) {
4176 PyErr_SetString(PyExc_SyntaxError, buf);
4177 PyErr_SyntaxLocation(c->c_symtable->st_filename,
4178 ste->ste_lineno);
4179 return -1;
4180 } else {
4181 /* XXX if the warning becomes an exception, we should
4182 attached more info to it. */
4183 if (PyErr_Warn(PyExc_SyntaxWarning, buf) < 0)
4184 return -1;
4185 }
4186 return 0;
4187}
4188
4189static int
4190symtable_check_shadow(struct symtable *st, PyObject *name, int flags)
4191{
4192 char buf[500];
4193 PyObject *children, *v;
Jeremy Hyltonc1761322001-02-28 23:44:45 +00004194 PySymtableEntryObject *child = NULL;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004195 int i;
4196
4197 if (!(flags & DEF_BOUND))
4198 return 0;
4199 /* The semantics of this code will change with nested scopes.
4200 It is defined in the current scope and referenced in a
4201 child scope. Under the old rules, the child will see a
4202 global. Under the new rules, the child will see the
4203 binding in the current scope.
4204 */
4205
4206 /* Find name of child function that has free variable */
4207 children = st->st_cur->ste_children;
4208 for (i = 0; i < PyList_GET_SIZE(children); i++) {
4209 int cflags;
4210 child = (PySymtableEntryObject *)PyList_GET_ITEM(children, i);
4211 v = PyDict_GetItem(child->ste_symbols, name);
4212 if (v == NULL)
4213 continue;
4214 cflags = PyInt_AS_LONG(v);
4215 if (!(cflags & DEF_BOUND))
4216 break;
4217 }
Jeremy Hyltonc1761322001-02-28 23:44:45 +00004218
4219 assert(child != NULL);
4220
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004221 sprintf(buf, "local name '%.100s' in '%.100s' shadows "
4222 "use of '%.100s' as global in nested scope '%.100s'",
4223 PyString_AS_STRING(name),
4224 PyString_AS_STRING(st->st_cur->ste_name),
4225 PyString_AS_STRING(name),
4226 PyString_AS_STRING(child->ste_name)
4227 );
4228
4229 return symtable_warn(st, buf);
4230}
4231
4232static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004233symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4234 struct symbol_info *si)
4235{
4236 if (ste->ste_type != TYPE_MODULE)
4237 c->c_flags |= CO_NEWLOCALS;
4238 if (ste->ste_type == TYPE_FUNCTION) {
4239 c->c_nlocals = si->si_nlocals;
4240 if (ste->ste_optimized == 0)
4241 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004242 else if (ste->ste_optimized != OPT_EXEC)
4243 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004244 }
4245 return 0;
4246}
4247
4248static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004249symtable_load_symbols(struct compiling *c)
4250{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004251 static PyObject *implicit = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004252 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004253 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004254 PyObject *name, *varnames, *v;
4255 int i, flags, pos;
4256 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004257
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004258 if (implicit == NULL) {
4259 implicit = PyInt_FromLong(1);
4260 if (implicit == NULL)
4261 return -1;
4262 }
4263 v = NULL;
4264
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004265 if (symtable_init_compiling_symbols(c) < 0)
4266 goto fail;
4267 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004268 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004269 si.si_nlocals = PyList_GET_SIZE(varnames);
4270 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004271
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004272 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004273 v = PyInt_FromLong(i);
4274 if (PyDict_SetItem(c->c_locals,
4275 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004276 goto fail;
4277 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004278 }
4279
4280 /* XXX The cases below define the rules for whether a name is
4281 local or global. The logic could probably be clearer. */
4282 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004283 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4284 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004285
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004286 if (st->st_nested_scopes == 0
4287 && (flags & (DEF_FREE | DEF_FREE_CLASS))) {
4288 if (symtable_check_shadow(st, name, flags) < 0)
4289 goto fail;
4290 }
4291
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004292 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004293 /* undo the original DEF_FREE */
4294 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004295
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004296 if ((flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004297 && (flags & (DEF_LOCAL | DEF_PARAM)))
4298 symtable_resolve_free(c, name, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004299
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004300 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004301 c->c_argcount--;
4302 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004303 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004304 c->c_argcount--;
4305 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004306 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004307 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004308 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004309 if (flags & DEF_PARAM) {
4310 PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004311 PyString_AS_STRING(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004312 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004313 ste->ste_lineno);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004314 st->st_errors++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004315 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004316 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004317 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4318 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004319 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004320 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004321 if (PyDict_SetItem(c->c_globals, name, implicit) < 0)
4322 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004323 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004324 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004325 if (v == NULL)
4326 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004327 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004328 goto fail;
4329 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004330 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004331 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004332 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004333 } else if (is_free(flags)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004334 if (ste->ste_nested && st->st_nested_scopes) {
4335 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004336 if (v == NULL)
4337 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004338 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004339 goto fail;
4340 Py_DECREF(v);
4341 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004342 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004343 if (PyDict_SetItem(c->c_globals, name,
4344 implicit) < 0)
4345 goto fail;
Jeremy Hylton51257732001-03-01 00:42:55 +00004346 if (st->st_nscopes != 1) {
4347 v = PyInt_FromLong(flags);
4348 if (PyDict_SetItem(st->st_global,
4349 name, v))
4350 goto fail;
4351 Py_DECREF(v);
4352 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004353 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004354 }
4355 }
4356
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004357 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4358 return -1;
4359 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004360 fail:
4361 /* is this always the right thing to do? */
4362 Py_XDECREF(v);
4363 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004364}
4365
4366static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004367symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004368{
4369 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004370
4371 st = (struct symtable *)PyMem_Malloc(sizeof(struct symtable));
4372 if (st == NULL)
4373 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004374 st->st_pass = 1;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004375 st->st_nested_scopes = NESTED_SCOPES_DEFAULT;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004376 st->st_filename = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004377 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004378 goto fail;
4379 if ((st->st_symbols = PyDict_New()) == NULL)
4380 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004381 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004382 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004383 st->st_errors = 0;
4384 st->st_tmpname = 0;
4385 st->st_private = NULL;
4386 return st;
4387 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004388 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004389 return NULL;
4390}
4391
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004392void
4393PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004394{
4395 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004396 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004397 Py_XDECREF(st->st_cur);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004398 PyMem_Free((void *)st);
4399}
4400
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004401/* When the compiler exits a scope, it must should update the scope's
4402 free variable information with the list of free variables in its
4403 children.
4404
4405 Variables that are free in children and defined in the current
4406 scope are cellvars.
4407
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004408 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004409 false), free variables in children that are not defined here are
4410 implicit globals.
4411
4412*/
4413
4414static int
4415symtable_update_free_vars(struct symtable *st)
4416{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004417 int i, j, def;
4418 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004419 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004420
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004421 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004422 def = DEF_FREE_CLASS;
4423 else
4424 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004425 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004426 int pos = 0;
4427
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004428 if (list)
4429 PyList_SetSlice(list, 0,
4430 ((PyVarObject*)list)->ob_size, 0);
Barry Warsaw0372af72001-02-23 18:22:59 +00004431 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004432 PyList_GET_ITEM(ste->ste_children, i);
4433 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004434 int flags = PyInt_AS_LONG(o);
4435 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004436 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004437 if (list == NULL) {
4438 list = PyList_New(0);
4439 if (list == NULL)
4440 return -1;
4441 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004442 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004443 if (PyList_Append(list, name) < 0) {
4444 Py_DECREF(list);
4445 return -1;
4446 }
4447 }
4448 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004449 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004450 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00004451 v = PyDict_GetItem(ste->ste_symbols, name);
4452 /* If a name N is declared global in scope A and
4453 referenced in scope B contained (perhaps
4454 indirectly) in A and there are no scopes
4455 with bindings for N between B and A, then N
4456 is global in B.
4457 */
4458 if (v) {
4459 int flags = PyInt_AS_LONG(v);
4460 if (flags & DEF_GLOBAL) {
4461 symtable_undo_free(st, child->ste_id,
4462 name);
4463 continue;
4464 }
4465 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004466 if (ste->ste_nested) {
4467 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004468 name, def) < 0) {
4469 Py_DECREF(list);
4470 return -1;
4471 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004472 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004473 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004474 name) < 0) {
4475 Py_DECREF(list);
4476 return -1;
4477 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004478 }
4479 }
4480 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004481
4482 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004483 return 0;
4484}
4485
4486/* If the current scope is a non-nested class or if name is not
4487 defined in the current, non-nested scope, then it is an implicit
4488 global in all nested scopes.
4489*/
4490
4491static int
4492symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
4493{
4494 PyObject *o;
4495 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004496 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00004497
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004498 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004499 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004500 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004501 if (o == NULL)
4502 return symtable_undo_free(st, child, name);
4503 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00004504
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004505 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004506 return symtable_undo_free(st, child, name);
4507 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004508 return symtable_add_def_o(st, ste->ste_symbols,
4509 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004510}
4511
4512static int
4513symtable_undo_free(struct symtable *st, PyObject *id,
4514 PyObject *name)
4515{
4516 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004517 PyObject *info;
4518 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004519
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004520 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
4521 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004522 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00004523
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004524 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004525 if (info == NULL)
4526 return 0;
4527 v = PyInt_AS_LONG(info);
4528 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004529 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004530 DEF_FREE_GLOBAL) < 0)
4531 return -1;
4532 } else
4533 /* If the name is defined here or declared global,
4534 then the recursion stops. */
4535 return 0;
4536
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004537 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
4538 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00004539 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004540 PyList_GET_ITEM(ste->ste_children, i);
4541 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004542 if (x < 0)
4543 return x;
4544 }
4545 return 0;
4546}
4547
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004548/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
4549 This reference is released when the scope is exited, via the DECREF
4550 in symtable_exit_scope().
4551*/
4552
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004553static int
4554symtable_exit_scope(struct symtable *st)
4555{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004556 int end;
4557
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004558 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004559 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004560 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004561 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004562 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
4563 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004564 if (PySequence_DelItem(st->st_stack, end) < 0)
4565 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004566 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004567}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004568
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004569static void
4570symtable_enter_scope(struct symtable *st, char *name, int type,
4571 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004572{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004573 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004574
4575 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004576 prev = st->st_cur;
4577 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
4578 Py_DECREF(st->st_cur);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004579 st->st_errors++;
4580 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004581 }
4582 }
Barry Warsaw0372af72001-02-23 18:22:59 +00004583 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004584 PySymtableEntry_New(st, name, type, lineno);
4585 if (strcmp(name, TOP) == 0)
4586 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004587 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004588 if (PyList_Append(prev->ste_children,
4589 (PyObject *)st->st_cur) < 0)
4590 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004591 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004592}
4593
4594static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004595symtable_lookup(struct symtable *st, char *name)
4596{
4597 char buffer[MANGLE_LEN];
4598 PyObject *v;
4599 int flags;
4600
4601 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
4602 name = buffer;
4603 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
4604 if (v == NULL) {
4605 if (PyErr_Occurred())
4606 return -1;
4607 else
4608 return 0;
4609 }
4610
4611 flags = PyInt_AS_LONG(v);
4612 return flags;
4613}
4614
4615static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004616symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004617{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004618 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004619 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004620 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004621
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004622 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004623 name = buffer;
4624 if ((s = PyString_InternFromString(name)) == NULL)
4625 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004626 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
4627 Py_DECREF(s);
4628 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004629}
4630
4631/* Must only be called with mangled names */
4632
4633static int
4634symtable_add_def_o(struct symtable *st, PyObject *dict,
4635 PyObject *name, int flag)
4636{
4637 PyObject *o;
4638 int val;
4639
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004640 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004641 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004642 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004643 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00004644 PyString_AsString(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004645 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004646 st->st_cur->ste_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004647 return -1;
4648 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004649 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004650 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004651 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004652 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004653 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004654 Py_DECREF(o);
4655 return -1;
4656 }
4657 Py_DECREF(o);
4658
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004659 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004660 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004661 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004662 } else if (flag & DEF_GLOBAL) {
4663 /* XXX need to update DEF_GLOBAL for other flags too;
4664 perhaps only DEF_FREE_GLOBAL */
4665 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004666 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004667 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004668 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004669 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004670 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004671 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004672 Py_DECREF(o);
4673 return -1;
4674 }
4675 Py_DECREF(o);
4676 }
4677 return 0;
4678}
4679
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004680#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004681
4682static void
4683symtable_node(struct symtable *st, node *n)
4684{
4685 int i, start = 0;
4686
4687 loop:
4688 switch (TYPE(n)) {
4689 case funcdef: {
4690 char *func_name = STR(CHILD(n, 1));
4691 symtable_add_def(st, func_name, DEF_LOCAL);
4692 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004693 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004694 symtable_funcdef(st, n);
4695 symtable_exit_scope(st);
4696 break;
4697 }
4698 case lambdef:
4699 if (NCH(n) == 4)
4700 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004701 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004702 symtable_funcdef(st, n);
4703 symtable_exit_scope(st);
4704 break;
4705 case classdef: {
4706 char *tmp, *class_name = STR(CHILD(n, 1));
4707 symtable_add_def(st, class_name, DEF_LOCAL);
4708 if (TYPE(CHILD(n, 2)) == LPAR) {
4709 node *bases = CHILD(n, 3);
4710 int i;
4711 for (i = 0; i < NCH(bases); i += 2) {
4712 symtable_node(st, CHILD(bases, i));
4713 }
4714 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004715 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004716 tmp = st->st_private;
4717 st->st_private = class_name;
4718 symtable_node(st, CHILD(n, NCH(n) - 1));
4719 st->st_private = tmp;
4720 symtable_exit_scope(st);
4721 break;
4722 }
4723 case if_stmt:
4724 for (i = 0; i + 3 < NCH(n); i += 4) {
4725 if (is_constant_false(NULL, (CHILD(n, i + 1))))
4726 continue;
4727 symtable_node(st, CHILD(n, i + 1));
4728 symtable_node(st, CHILD(n, i + 3));
4729 }
4730 if (i + 2 < NCH(n))
4731 symtable_node(st, CHILD(n, i + 2));
4732 break;
4733 case global_stmt:
4734 symtable_global(st, n);
4735 break;
4736 case import_stmt:
4737 symtable_import(st, n);
4738 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004739 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004740 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004741 symtable_node(st, CHILD(n, 1));
4742 if (NCH(n) > 2)
4743 symtable_node(st, CHILD(n, 3));
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004744 else
4745 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004746 if (NCH(n) > 4)
4747 symtable_node(st, CHILD(n, 5));
4748 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004749
4750 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00004751 case assert_stmt:
4752 if (Py_OptimizeFlag)
4753 return;
4754 if (NCH(n) == 2) {
4755 n = CHILD(n, 1);
4756 goto loop;
4757 } else {
4758 symtable_node(st, CHILD(n, 1));
4759 n = CHILD(n, 3);
4760 goto loop;
4761 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004762 case except_clause:
4763 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004764 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004765 if (NCH(n) > 1) {
4766 n = CHILD(n, 1);
4767 goto loop;
4768 }
4769 break;
4770 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004771 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004772 break;
4773 case expr_stmt:
4774 if (NCH(n) == 1)
4775 n = CHILD(n, 0);
4776 else {
4777 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004778 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004779 symtable_node(st, CHILD(n, 2));
4780 break;
4781 } else {
4782 int i;
4783 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004784 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004785 n = CHILD(n, NCH(n) - 1);
4786 }
4787 }
4788 goto loop;
4789 /* watchout for fall-through logic below */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004790 case argument:
4791 if (NCH(n) == 3) {
4792 n = CHILD(n, 2);
4793 goto loop;
4794 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004795 case listmaker:
4796 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
4797 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton5f827f42001-01-23 01:26:20 +00004798 n = CHILD(n, 0);
4799 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004800 }
4801 case atom:
4802 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
4803 symtable_add_use(st, STR(CHILD(n, 0)));
4804 break;
4805 }
4806 case for_stmt:
4807 if (TYPE(n) == for_stmt) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004808 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004809 start = 3;
4810 }
4811 default:
4812 if (NCH(n) == 1) {
4813 n = CHILD(n, 0);
4814 goto loop;
4815 }
4816 for (i = start; i < NCH(n); ++i)
4817 if (TYPE(CHILD(n, i)) >= single_input)
4818 symtable_node(st, CHILD(n, i));
4819 }
4820}
4821
4822static void
4823symtable_funcdef(struct symtable *st, node *n)
4824{
4825 node *body;
4826
4827 if (TYPE(n) == lambdef) {
4828 if (NCH(n) == 4)
4829 symtable_params(st, CHILD(n, 1));
4830 } else
4831 symtable_params(st, CHILD(n, 2));
4832 body = CHILD(n, NCH(n) - 1);
4833 symtable_node(st, body);
4834}
4835
4836/* The next two functions parse the argument tuple.
4837 symtable_default_arg() checks for names in the default arguments,
4838 which are references in the defining scope. symtable_params()
4839 parses the parameter names, which are defined in the function's
4840 body.
4841
4842 varargslist:
4843 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
4844 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
4845*/
4846
4847static void
4848symtable_default_args(struct symtable *st, node *n)
4849{
4850 node *c;
4851 int i;
4852
4853 if (TYPE(n) == parameters) {
4854 n = CHILD(n, 1);
4855 if (TYPE(n) == RPAR)
4856 return;
4857 }
4858 REQ(n, varargslist);
4859 for (i = 0; i < NCH(n); i += 2) {
4860 c = CHILD(n, i);
4861 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
4862 break;
4863 }
4864 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
4865 symtable_node(st, CHILD(n, i));
4866 }
4867}
4868
4869static void
4870symtable_params(struct symtable *st, node *n)
4871{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004872 int i, complex = -1, ext = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004873 node *c = NULL;
4874
4875 if (TYPE(n) == parameters) {
4876 n = CHILD(n, 1);
4877 if (TYPE(n) == RPAR)
4878 return;
4879 }
4880 REQ(n, varargslist);
4881 for (i = 0; i < NCH(n); i += 2) {
4882 c = CHILD(n, i);
4883 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
4884 ext = 1;
4885 break;
4886 }
4887 if (TYPE(c) == test) {
4888 continue;
4889 }
4890 if (TYPE(CHILD(c, 0)) == NAME)
4891 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
4892 else {
4893 char nbuf[10];
4894 sprintf(nbuf, ".%d", i);
4895 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004896 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004897 }
4898 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004899 if (ext) {
4900 c = CHILD(n, i);
4901 if (TYPE(c) == STAR) {
4902 i++;
4903 symtable_add_def(st, STR(CHILD(n, i)),
4904 DEF_PARAM | DEF_STAR);
4905 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00004906 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004907 c = NULL;
4908 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004909 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004910 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004911 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004912 i++;
4913 symtable_add_def(st, STR(CHILD(n, i)),
4914 DEF_PARAM | DEF_DOUBLESTAR);
4915 }
4916 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004917 if (complex >= 0) {
4918 int j;
4919 for (j = 0; j <= complex; j++) {
4920 c = CHILD(n, j);
4921 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00004922 c = CHILD(n, ++j);
4923 else if (TYPE(c) == EQUAL)
4924 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004925 if (TYPE(CHILD(c, 0)) == LPAR)
4926 symtable_params_fplist(st, CHILD(c, 1));
4927 }
4928 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004929}
4930
4931static void
4932symtable_params_fplist(struct symtable *st, node *n)
4933{
4934 int i;
4935 node *c;
4936
4937 REQ(n, fplist);
4938 for (i = 0; i < NCH(n); i += 2) {
4939 c = CHILD(n, i);
4940 REQ(c, fpdef);
4941 if (NCH(c) == 1)
4942 symtable_add_def(st, STR(CHILD(c, 0)),
4943 DEF_PARAM | DEF_INTUPLE);
4944 else
4945 symtable_params_fplist(st, CHILD(c, 1));
4946 }
4947
4948}
4949
4950static void
4951symtable_global(struct symtable *st, node *n)
4952{
4953 int i;
4954
Jeremy Hyltonc1761322001-02-28 23:44:45 +00004955 if (st->st_nscopes == 1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004956 /* XXX must check that we are compiling file_input */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00004957 if (symtable_warn(st,
4958 "global statement has no meaning at module level") < 0)
4959 return;
4960 }
4961
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004962 for (i = 1; i < NCH(n); i += 2) {
4963 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00004964 int flags;
4965
4966 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004967 if (flags < 0)
4968 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00004969 if (flags && flags != DEF_GLOBAL) {
4970 char buf[500];
4971 if (flags & DEF_PARAM) {
4972 PyErr_Format(PyExc_SyntaxError,
4973 "name '%.400s' is local and global",
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004974 name);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004975 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00004976 st->st_cur->ste_lineno);
4977 st->st_errors++;
4978 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00004979 }
4980 else {
4981 if (flags & DEF_LOCAL)
4982 sprintf(buf, GLOBAL_AFTER_ASSIGN,
4983 name);
4984 else
4985 sprintf(buf, GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00004986 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00004987 }
4988 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004989 symtable_add_def(st, name, DEF_GLOBAL);
4990 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004991}
4992
4993static void
4994symtable_list_comprehension(struct symtable *st, node *n)
4995{
4996 char tmpname[12];
4997
Tim Peters30814212001-02-17 05:30:26 +00004998 sprintf(tmpname, "_[%d]", ++st->st_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004999 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005000 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005001 symtable_node(st, CHILD(n, 3));
5002 if (NCH(n) == 5)
5003 symtable_node(st, CHILD(n, 4));
5004 --st->st_tmpname;
5005}
5006
5007static void
5008symtable_import(struct symtable *st, node *n)
5009{
5010 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005011 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005012 | 'from' dotted_name 'import'
5013 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00005014 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005015 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005016 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005017 node *dotname = CHILD(n, 1);
5018 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
5019 /* check for bogus imports */
5020 if (n->n_lineno >= st->st_future->ff_last_lineno) {
5021 PyErr_SetString(PyExc_SyntaxError,
5022 LATE_FUTURE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005023 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005024 n->n_lineno);
5025 st->st_errors++;
5026 return;
5027 }
5028 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005029 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005030 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005031 } else {
5032 for (i = 3; i < NCH(n); i += 2) {
5033 node *c = CHILD(n, i);
5034 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005035 symtable_assign(st, CHILD(c, 2),
5036 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005037 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005038 symtable_assign(st, CHILD(c, 0),
5039 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005040 }
5041 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005042 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005043 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005044 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005045 }
5046 }
5047}
5048
5049static void
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005050symtable_assign(struct symtable *st, node *n, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005051{
5052 node *tmp;
5053 int i;
5054
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005055 loop:
5056 switch (TYPE(n)) {
5057 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005058 /* invalid assignment, e.g. lambda x:x=2. The next
5059 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005060 return;
5061 case power:
5062 if (NCH(n) > 2) {
5063 for (i = 2; i < NCH(n); ++i)
5064 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
5065 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005066 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005067 if (NCH(n) > 1) {
5068 symtable_node(st, CHILD(n, 0));
5069 symtable_node(st, CHILD(n, 1));
5070 } else {
5071 n = CHILD(n, 0);
5072 goto loop;
5073 }
5074 return;
5075 case listmaker:
5076 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
5077 symtable_list_comprehension(st, CHILD(n, 1));
5078 else {
5079 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005080 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005081 }
5082 return;
5083 case exprlist:
5084 case testlist:
5085 if (NCH(n) == 1) {
5086 n = CHILD(n, 0);
5087 goto loop;
5088 }
5089 else {
5090 int i;
5091 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005092 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005093 return;
5094 }
5095 goto loop;
5096 case atom:
5097 tmp = CHILD(n, 0);
5098 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
5099 n = CHILD(n, 1);
5100 goto loop;
5101 } else if (TYPE(tmp) == NAME)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005102 symtable_add_def(st, STR(tmp), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005103 return;
5104 case dotted_as_name:
5105 if (NCH(n) == 3)
5106 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005107 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005108 else
5109 symtable_add_def(st,
5110 STR(CHILD(CHILD(n,
5111 0), 0)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005112 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005113 return;
5114 case dotted_name:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005115 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005116 return;
5117 case NAME:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005118 symtable_add_def(st, STR(n), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005119 return;
5120 default:
5121 if (NCH(n) == 0)
5122 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00005123 if (NCH(n) == 1) {
5124 n = CHILD(n, 0);
5125 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005126 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00005127 /* Should only occur for errors like x + 1 = 1,
5128 which will be caught in the next pass. */
5129 for (i = 0; i < NCH(n); ++i)
5130 if (TYPE(CHILD(n, i)) >= single_input)
5131 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005132 }
5133}