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