blob: 0be168c2c639b39722bba9481f70dd5485ebb6c0 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002/* Compile an expression node to intermediate code */
3
Guido van Rossum3f5da241990-12-20 15:06:42 +00004/* XXX TO DO:
Guido van Rossum8b993a91997-01-17 21:04:03 +00005 XXX add __doc__ attribute == co_doc to code object attributes?
6 XXX (it's currently the first item of the co_const tuple)
Guido van Rossum3f5da241990-12-20 15:06:42 +00007 XXX Generate simple jump for break/return outside 'try...finally'
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00008 XXX Allow 'continue' inside finally clause of try-finally
Guido van Rossum8b993a91997-01-17 21:04:03 +00009 XXX New opcode for loading the initial index for a for loop
Guido van Rossum681d79a1995-07-18 14:51:37 +000010 XXX other JAR tricks?
Guido van Rossum3f5da241990-12-20 15:06:42 +000011*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +000012
Guido van Rossum79f25d91997-04-29 20:08:16 +000013#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000014
Guido van Rossum10dc2e81990-11-18 17:27:39 +000015#include "node.h"
16#include "token.h"
17#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000018#include "compile.h"
Jeremy Hylton4b38da62001-02-02 18:19:15 +000019#include "symtable.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000020#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000021#include "structmember.h"
22
23#include <ctype.h>
Guido van Rossum282914b1991-04-04 10:42:56 +000024
Guido van Rossumb05a5c71997-05-07 17:46:13 +000025/* Three symbols from graminit.h are also defined in Python.h, with
26 Py_ prefixes to their names. Python.h can't include graminit.h
27 (which defines too many confusing symbols), but we can check here
28 that they haven't changed (which is very unlikely, but possible). */
29#if Py_single_input != single_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000030 #error "single_input has changed -- update Py_single_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000031#endif
32#if Py_file_input != file_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000033 #error "file_input has changed -- update Py_file_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000034#endif
35#if Py_eval_input != eval_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000036 #error "eval_input has changed -- update Py_eval_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000037#endif
38
Guido van Rossum8e793d91997-03-03 19:13:14 +000039int Py_OptimizeFlag = 0;
40
Guido van Rossum8861b741996-07-30 16:49:37 +000041#define OP_DELETE 0
42#define OP_ASSIGN 1
43#define OP_APPLY 2
44
Jeremy Hyltone36f7782001-01-19 03:21:30 +000045#define VAR_LOAD 0
46#define VAR_STORE 1
47#define VAR_DELETE 2
48
Jeremy Hylton64949cb2001-01-25 20:06:59 +000049#define DEL_CLOSURE_ERROR \
Jeremy Hyltoneab156f2001-01-30 01:24:43 +000050"can not delete variable '%.400s' referenced in nested scope"
51
52#define DUPLICATE_ARGUMENT \
53"duplicate argument '%s' in function definition"
54
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000055#define ILLEGAL_DYNAMIC_SCOPE \
56"%.100s: exec or 'import *' makes names ambiguous in nested scope"
Jeremy Hyltoneab156f2001-01-30 01:24:43 +000057
Jeremy Hylton29906ee2001-02-27 04:23:34 +000058#define GLOBAL_AFTER_ASSIGN \
59"name '%.400s' is assigned to before global declaration"
60
61#define GLOBAL_AFTER_USE \
62"name '%.400s' is used prior to global declaration"
63
64#define LOCAL_GLOBAL \
65"name '%.400s' is a function paramter and declared global"
66
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +000067#define LATE_FUTURE \
68"from __future__ imports must occur at the beginning of the file"
69
Jeremy Hyltone36f7782001-01-19 03:21:30 +000070#define MANGLE_LEN 256
71
Guido van Rossum79f25d91997-04-29 20:08:16 +000072#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000073
74static struct memberlist code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000075 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
76 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000077 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000078 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000079 {"co_code", T_OBJECT, OFF(co_code), READONLY},
80 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
81 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000082 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Jeremy Hylton64949cb2001-01-25 20:06:59 +000083 {"co_freevars", T_OBJECT, OFF(co_freevars), READONLY},
84 {"co_cellvars", T_OBJECT, OFF(co_cellvars), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000085 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000086 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000087 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
88 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000089 {NULL} /* Sentinel */
90};
91
Guido van Rossum79f25d91997-04-29 20:08:16 +000092static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000093code_getattr(PyCodeObject *co, char *name)
Guido van Rossum3f5da241990-12-20 15:06:42 +000094{
Guido van Rossum79f25d91997-04-29 20:08:16 +000095 return PyMember_Get((char *)co, code_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +000096}
Guido van Rossum10dc2e81990-11-18 17:27:39 +000097
98static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000099code_dealloc(PyCodeObject *co)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000100{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000101 Py_XDECREF(co->co_code);
102 Py_XDECREF(co->co_consts);
103 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +0000104 Py_XDECREF(co->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000105 Py_XDECREF(co->co_freevars);
106 Py_XDECREF(co->co_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000107 Py_XDECREF(co->co_filename);
108 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +0000109 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000110 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000111}
112
Guido van Rossum79f25d91997-04-29 20:08:16 +0000113static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000114code_repr(PyCodeObject *co)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000115{
116 char buf[500];
117 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000118 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000119 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000120
Guido van Rossuma396a882000-04-07 01:21:36 +0000121 if (co->co_firstlineno != 0)
122 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000123 if (co->co_filename && PyString_Check(co->co_filename))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000124 filename = PyString_AS_STRING(co->co_filename);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000125 if (co->co_name && PyString_Check(co->co_name))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000126 name = PyString_AS_STRING(co->co_name);
Fred Drake615ae552000-06-30 16:20:13 +0000127 sprintf(buf, "<code object %.100s at %p, file \"%.300s\", line %d>",
128 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000129 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000130}
131
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000132static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000133code_compare(PyCodeObject *co, PyCodeObject *cp)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000134{
135 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000136 cmp = PyObject_Compare(co->co_name, cp->co_name);
137 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000138 cmp = co->co_argcount - cp->co_argcount;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000139 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000140 cmp = co->co_nlocals - cp->co_nlocals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000141 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000142 cmp = co->co_flags - cp->co_flags;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000143 if (cmp) return cmp;
Guido van Rossumd076c731998-10-07 19:42:25 +0000144 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000145 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000146 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000147 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000148 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000149 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000150 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000151 if (cmp) return cmp;
152 cmp = PyObject_Compare(co->co_freevars, cp->co_freevars);
153 if (cmp) return cmp;
154 cmp = PyObject_Compare(co->co_cellvars, cp->co_cellvars);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000155 return cmp;
156}
157
158static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000159code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000160{
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000161 long h, h0, h1, h2, h3, h4, h5, h6;
Guido van Rossum44679592000-04-10 16:20:31 +0000162 h0 = PyObject_Hash(co->co_name);
163 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000164 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000165 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000166 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000167 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000168 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000169 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000170 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000171 if (h4 == -1) return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000172 h5 = PyObject_Hash(co->co_freevars);
173 if (h5 == -1) return -1;
174 h6 = PyObject_Hash(co->co_cellvars);
175 if (h6 == -1) return -1;
176 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^ h5 ^ h6 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000177 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000178 if (h == -1) h = -2;
179 return h;
180}
181
Guido van Rossum79f25d91997-04-29 20:08:16 +0000182PyTypeObject PyCode_Type = {
183 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000184 0,
185 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000186 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000187 0,
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000188 (destructor)code_dealloc, /*tp_dealloc*/
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000189 0, /*tp_print*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000190 (getattrfunc)code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000191 0, /*tp_setattr*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000192 (cmpfunc)code_compare, /*tp_compare*/
193 (reprfunc)code_repr, /*tp_repr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000194 0, /*tp_as_number*/
195 0, /*tp_as_sequence*/
196 0, /*tp_as_mapping*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000197 (hashfunc)code_hash, /*tp_hash*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000198};
199
Guido van Rossum644a12b1997-04-09 19:24:53 +0000200#define NAME_CHARS \
201 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
202
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000203/* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
204
205static int
206all_name_chars(unsigned char *s)
207{
Guido van Rossumcd90c202001-02-09 15:06:42 +0000208 static char ok_name_char[256];
209 static unsigned char *name_chars = (unsigned char *)NAME_CHARS;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000210
Guido van Rossumcd90c202001-02-09 15:06:42 +0000211 if (ok_name_char[*name_chars] == 0) {
212 unsigned char *p;
213 for (p = name_chars; *p; p++)
214 ok_name_char[*p] = 1;
215 }
216 while (*s) {
217 if (ok_name_char[*s++] == 0)
218 return 0;
219 }
220 return 1;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000221}
222
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000223static int
224intern_strings(PyObject *tuple)
225{
226 int i;
227
228 for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) {
229 PyObject *v = PyTuple_GET_ITEM(tuple, i);
230 if (v == NULL || !PyString_Check(v)) {
231 Py_FatalError("non-string found in code slot");
232 PyErr_BadInternalCall();
233 return -1;
234 }
235 PyString_InternInPlace(&PyTuple_GET_ITEM(tuple, i));
236 }
237 return 0;
238}
239
Guido van Rossum79f25d91997-04-29 20:08:16 +0000240PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000241PyCode_New(int argcount, int nlocals, int stacksize, int flags,
242 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000243 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
244 PyObject *filename, PyObject *name, int firstlineno,
245 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000246{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000247 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000248 int i;
Guido van Rossumd076c731998-10-07 19:42:25 +0000249 PyBufferProcs *pb;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000250 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000251 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000252 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000253 consts == NULL || !PyTuple_Check(consts) ||
254 names == NULL || !PyTuple_Check(names) ||
255 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000256 freevars == NULL || !PyTuple_Check(freevars) ||
257 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000258 name == NULL || !PyString_Check(name) ||
259 filename == NULL || !PyString_Check(filename) ||
260 lnotab == NULL || !PyString_Check(lnotab)) {
261 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000262 return NULL;
263 }
Guido van Rossumd076c731998-10-07 19:42:25 +0000264 pb = code->ob_type->tp_as_buffer;
265 if (pb == NULL ||
266 pb->bf_getreadbuffer == NULL ||
267 pb->bf_getsegcount == NULL ||
268 (*pb->bf_getsegcount)(code, NULL) != 1)
269 {
270 PyErr_BadInternalCall();
271 return NULL;
272 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000273 intern_strings(names);
274 intern_strings(varnames);
275 if (freevars == NULL)
276 freevars = PyTuple_New(0);
277 intern_strings(freevars);
278 if (cellvars == NULL)
279 cellvars = PyTuple_New(0);
280 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000281 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000282 for (i = PyTuple_Size(consts); --i >= 0; ) {
283 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000284 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000285 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000286 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000287 continue;
288 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000289 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000290 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000291 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000292 co->co_argcount = argcount;
293 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000294 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000295 co->co_flags = flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000296 Py_INCREF(code);
Guido van Rossumd076c731998-10-07 19:42:25 +0000297 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000298 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000299 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000300 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000301 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000302 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000303 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000304 Py_INCREF(freevars);
305 co->co_freevars = freevars;
306 Py_INCREF(cellvars);
307 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000308 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000309 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000310 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000311 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000312 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000313 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000314 co->co_lnotab = lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000315 }
316 return co;
317}
318
319
320/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000321
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000322/* The compiler uses two passes to generate bytecodes. The first pass
323 builds the symbol table. The second pass generates the bytecode.
324
325 The first pass uses a single symtable struct. The second pass uses
326 a compiling struct for each code block. The compiling structs
327 share a reference to the symtable.
328
329 The two passes communicate via symtable_load_symbols() and via
330 is_local() and is_global(). The former initializes several slots
331 in the compiling struct: c_varnames, c_locals, c_nlocals,
332 c_argcount, c_globals, and c_flags.
333*/
334
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000335struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000336 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000337 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000338 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000339 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000340 PyObject *c_name_dict; /* inverse of c_names */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000341 PyObject *c_globals; /* dictionary (value=None) */
342 PyObject *c_locals; /* dictionary (value=localID) */
343 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000344 PyObject *c_freevars; /* dictionary (value=None) */
345 PyObject *c_cellvars; /* list */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000346 int c_nlocals; /* index of next local */
347 int c_argcount; /* number of top-level arguments */
348 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000349 int c_nexti; /* index into c_code */
350 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000351 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000352 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000353 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000354 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000355 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000356 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000357 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000358 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000359 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000360 int c_stacklevel; /* Current stack level */
361 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000362 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000363 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000364 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000365 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000366 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000367 int c_nested; /* Is block nested funcdef or lamdef? */
368 int c_closure; /* Is nested w/freevars? */
369 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000370 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000371};
372
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000373int is_free(int v)
374{
375 if ((v & (USE | DEF_FREE))
376 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
377 return 1;
378 if (v & DEF_FREE_CLASS)
379 return 1;
380 return 0;
381}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000382
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000383static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000384com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000385{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000386 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
387
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000388 if (c == NULL) {
389 /* Error occurred via symtable call to
390 is_constant_false */
391 PyErr_SetString(exc, msg);
392 return;
393 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000394 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000395 if (c->c_lineno < 1 || c->c_interactive) {
396 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000397 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000398 return;
399 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000400 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000401 if (v == NULL)
402 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000403
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000404 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000405 if (line == NULL) {
406 Py_INCREF(Py_None);
407 line = Py_None;
408 }
409 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
410 Py_None, line);
411 if (t == NULL)
412 goto exit;
413 w = Py_BuildValue("(OO)", v, t);
414 if (w == NULL)
415 goto exit;
416 PyErr_SetObject(exc, w);
417 exit:
418 Py_XDECREF(t);
419 Py_XDECREF(v);
420 Py_XDECREF(w);
421 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000422}
423
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000424/* Interface to the block stack */
425
426static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000427block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000428{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000429 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000430 com_error(c, PyExc_SystemError,
431 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000432 }
433 else {
434 c->c_block[c->c_nblocks++] = type;
435 }
436}
437
438static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000439block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000440{
441 if (c->c_nblocks > 0)
442 c->c_nblocks--;
443 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000444 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000445 }
446}
447
Guido van Rossum681d79a1995-07-18 14:51:37 +0000448/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000449
Tim Petersdbd9ba62000-07-09 03:09:57 +0000450static int com_init(struct compiling *, char *);
451static void com_free(struct compiling *);
452static void com_push(struct compiling *, int);
453static void com_pop(struct compiling *, int);
454static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000455static void com_node(struct compiling *, node *);
456static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000457static void com_addbyte(struct compiling *, int);
458static void com_addint(struct compiling *, int);
459static void com_addoparg(struct compiling *, int, int);
460static void com_addfwref(struct compiling *, int, int *);
461static void com_backpatch(struct compiling *, int);
462static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
463static int com_addconst(struct compiling *, PyObject *);
464static int com_addname(struct compiling *, PyObject *);
465static void com_addopname(struct compiling *, int, node *);
466static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000467static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000468static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000469static void com_assign(struct compiling *, node *, int, node *);
470static void com_assign_name(struct compiling *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000471static PyCodeObject *icompile(node *, struct compiling *);
472static PyCodeObject *jcompile(node *, char *, struct compiling *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000473static PyObject *parsestrplus(node *);
474static PyObject *parsestr(char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000475static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000476
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000477static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000478
479/* symtable operations */
480static int symtable_build(struct compiling *, node *);
481static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000482static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000483static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000484static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000485static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000486static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000487
488static void symtable_node(struct symtable *, node *);
489static void symtable_funcdef(struct symtable *, node *);
490static void symtable_default_args(struct symtable *, node *);
491static void symtable_params(struct symtable *, node *);
492static void symtable_params_fplist(struct symtable *, node *n);
493static void symtable_global(struct symtable *, node *);
494static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000495static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000496static void symtable_list_comprehension(struct symtable *, node *);
497
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000498static int symtable_update_free_vars(struct symtable *);
499static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
500static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
501
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000502/* helper */
503static void
504do_pad(int pad)
505{
506 int i;
507 for (i = 0; i < pad; ++i)
508 fprintf(stderr, " ");
509}
510
511static void
512dump(node *n, int pad, int depth)
513{
514 int i;
515 if (depth == 0)
516 return;
517 do_pad(pad);
518 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
519 if (depth > 0)
520 depth--;
521 for (i = 0; i < NCH(n); ++i)
522 dump(CHILD(n, i), pad + 1, depth);
523}
524
525#define DUMP(N) dump(N, 0, -1)
526
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000527static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000528com_init(struct compiling *c, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000529{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000530 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000531 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
532 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000533 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000534 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000535 goto fail;
536 if ((c->c_const_dict = PyDict_New()) == NULL)
537 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000538 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000539 goto fail;
540 if ((c->c_name_dict = PyDict_New()) == NULL)
541 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000542 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000543 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000544 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
545 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000546 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000547 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000548 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000549 c->c_freevars = NULL;
550 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000551 c->c_nlocals = 0;
552 c->c_argcount = 0;
553 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000554 c->c_nexti = 0;
555 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000556 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000557 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000558 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000559 c->c_begin = 0;
560 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000561 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000562 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000563 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000564 c->c_stacklevel = 0;
565 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000566 c->c_firstlineno = 0;
567 c->c_last_addr = 0;
568 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000569 c->c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000570 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000571 c->c_nested = 0;
572 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000573 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000574 return 1;
575
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000576 fail:
577 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000578 return 0;
579}
580
581static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000582com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000583{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000584 Py_XDECREF(c->c_code);
585 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000586 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000587 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000588 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000589 Py_XDECREF(c->c_globals);
590 Py_XDECREF(c->c_locals);
591 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000592 Py_XDECREF(c->c_freevars);
593 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000594 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +0000595 if (c->c_future)
596 PyMem_Free((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000597}
598
599static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000600com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000601{
602 c->c_stacklevel += n;
603 if (c->c_stacklevel > c->c_maxstacklevel)
604 c->c_maxstacklevel = c->c_stacklevel;
605}
606
607static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000608com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000609{
610 if (c->c_stacklevel < n) {
Guido van Rossum90f827c1998-08-25 18:22:17 +0000611 /* fprintf(stderr,
Guido van Rossum8b993a91997-01-17 21:04:03 +0000612 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
613 c->c_filename, c->c_lineno,
Guido van Rossum90f827c1998-08-25 18:22:17 +0000614 c->c_nexti, c->c_stacklevel, n); */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000615 c->c_stacklevel = 0;
616 }
617 else
618 c->c_stacklevel -= n;
619}
620
621static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000622com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000623{
624 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000625 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000626 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000627 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000628}
629
630static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000631com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000632{
633 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000634 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000635 assert(byte >= 0 && byte <= 255);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000636 if (byte < 0 || byte > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000637 com_error(c, PyExc_SystemError,
638 "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000639 }
640 if (c->c_code == NULL)
641 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000642 len = PyString_Size(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000643 if (c->c_nexti >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000644 if (_PyString_Resize(&c->c_code, len+1000) != 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000645 c->c_errors++;
646 return;
647 }
648 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000649 PyString_AsString(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000650}
651
652static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000653com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000654{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000655 com_addbyte(c, x & 0xff);
656 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000657}
658
659static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000660com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000661{
662 int size;
663 char *p;
664 if (c->c_lnotab == NULL)
665 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000666 size = PyString_Size(c->c_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000667 if (c->c_lnotab_next+2 > size) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000668 if (_PyString_Resize(&c->c_lnotab, size + 1000) < 0) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000669 c->c_errors++;
670 return;
671 }
672 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000673 p = PyString_AsString(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000674 *p++ = addr;
675 *p++ = line;
676 c->c_lnotab_next += 2;
677}
678
679static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000680com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000681{
682 c->c_lineno = lineno;
683 if (c->c_firstlineno == 0) {
684 c->c_firstlineno = c->c_last_line = lineno;
685 }
686 else {
687 int incr_addr = c->c_nexti - c->c_last_addr;
688 int incr_line = lineno - c->c_last_line;
689 while (incr_addr > 0 || incr_line > 0) {
690 int trunc_addr = incr_addr;
691 int trunc_line = incr_line;
692 if (trunc_addr > 255)
693 trunc_addr = 255;
694 if (trunc_line > 255)
695 trunc_line = 255;
696 com_add_lnotab(c, trunc_addr, trunc_line);
697 incr_addr -= trunc_addr;
698 incr_line -= trunc_line;
699 }
700 c->c_last_addr = c->c_nexti;
701 c->c_last_line = lineno;
702 }
703}
704
705static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000706com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000707{
Fred Drakeef8ace32000-08-24 00:32:09 +0000708 int extended_arg = arg >> 16;
Guido van Rossum8e793d91997-03-03 19:13:14 +0000709 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000710 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000711 if (Py_OptimizeFlag)
712 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000713 }
Fred Drakeef8ace32000-08-24 00:32:09 +0000714 if (extended_arg){
715 com_addbyte(c, EXTENDED_ARG);
716 com_addint(c, extended_arg);
717 arg &= 0xffff;
718 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000719 com_addbyte(c, op);
720 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000721}
722
723static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000724com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000725{
726 /* Compile a forward reference for backpatching */
727 int here;
728 int anchor;
729 com_addbyte(c, op);
730 here = c->c_nexti;
731 anchor = *p_anchor;
732 *p_anchor = here;
733 com_addint(c, anchor == 0 ? 0 : here - anchor);
734}
735
736static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000737com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000738{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000739 unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000740 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000741 int dist;
742 int prev;
743 for (;;) {
744 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000745 prev = code[anchor] + (code[anchor+1] << 8);
746 dist = target - (anchor+2);
747 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +0000748 dist >>= 8;
749 code[anchor+1] = dist;
750 dist >>= 8;
751 if (dist) {
752 com_error(c, PyExc_SystemError,
753 "com_backpatch: offset too large");
754 break;
755 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000756 if (!prev)
757 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000758 anchor -= prev;
759 }
760}
761
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000762/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000763
764static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000765com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000766{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000767 PyObject *w, *t, *np=NULL;
768 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000769
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000770 t = Py_BuildValue("(OO)", v, v->ob_type);
771 if (t == NULL)
772 goto fail;
773 w = PyDict_GetItem(dict, t);
774 if (w != NULL) {
775 n = PyInt_AsLong(w);
776 } else {
777 n = PyList_Size(list);
778 np = PyInt_FromLong(n);
779 if (np == NULL)
780 goto fail;
781 if (PyList_Append(list, v) != 0)
782 goto fail;
783 if (PyDict_SetItem(dict, t, np) != 0)
784 goto fail;
785 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000786 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000787 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000788 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000789 fail:
790 Py_XDECREF(np);
791 Py_XDECREF(t);
792 c->c_errors++;
793 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000794}
795
796static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000797com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000798{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000799 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000800}
801
802static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000803com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000804{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000805 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000806}
807
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000808static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000809mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000810{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000811 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000812 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +0000813 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000814 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
815 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000816 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000817 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000818 return 0; /* Don't mangle __extremely_long_names */
819 if (name[nlen-1] == '_' && name[nlen-2] == '_')
820 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000821 /* Strip leading underscores from class name */
822 while (*p == '_')
823 p++;
824 if (*p == '\0')
825 return 0; /* Don't mangle if class is just underscores */
826 plen = strlen(p);
827 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000828 plen = maxlen-nlen-2; /* Truncate class name if too long */
829 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000830 buffer[0] = '_';
831 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000832 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000833 return 1;
834}
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000835
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000836static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000837com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000838{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000839 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000840 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000841 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000842
843 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000844 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000845 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000846 c->c_errors++;
847 i = 255;
848 }
849 else {
850 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000851 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000852 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000853 com_addoparg(c, op, i);
854}
855
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000856#define NAME_LOCAL 0
857#define NAME_GLOBAL 1
858#define NAME_DEFAULT 2
859#define NAME_CLOSURE 3
860
861static int
862com_lookup_arg(PyObject *dict, PyObject *name)
863{
864 PyObject *v = PyDict_GetItem(dict, name);
865 if (v == NULL)
866 return -1;
867 else
868 return PyInt_AS_LONG(v);
869}
870
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000871static void
872com_addop_varname(struct compiling *c, int kind, char *name)
873{
874 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000875 int i, reftype;
876 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000877 int op = STOP_CODE;
878 char buffer[MANGLE_LEN];
879
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000880 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000881 name = buffer;
882 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
883 c->c_errors++;
884 i = 255;
885 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000886 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000887
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000888 reftype = get_ref_type(c, name);
889 switch (reftype) {
890 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000891 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000892 scope = NAME_LOCAL;
893 break;
894 case GLOBAL_EXPLICIT:
895 scope = NAME_GLOBAL;
896 break;
897 case GLOBAL_IMPLICIT:
898 if (c->c_flags & CO_OPTIMIZED)
899 scope = NAME_GLOBAL;
900 break;
901 case FREE:
902 case CELL:
903 scope = NAME_CLOSURE;
904 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000905 }
906
907 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000908 if (scope == NAME_LOCAL)
909 i = com_lookup_arg(c->c_locals, v);
910 else if (reftype == FREE)
911 i = com_lookup_arg(c->c_freevars, v);
912 else if (reftype == CELL)
913 i = com_lookup_arg(c->c_cellvars, v);
914 if (i == -1) {
915 c->c_errors++; /* XXX no exception set */
916 i = 255;
917 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000918 }
919 Py_DECREF(v);
920
921 switch (kind) {
922 case VAR_LOAD:
923 switch (scope) {
924 case NAME_LOCAL:
925 op = LOAD_FAST;
926 break;
927 case NAME_GLOBAL:
928 op = LOAD_GLOBAL;
929 break;
930 case NAME_DEFAULT:
931 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000932 break;
933 case NAME_CLOSURE:
934 op = LOAD_DEREF;
935 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000936 }
937 break;
938 case VAR_STORE:
939 switch (scope) {
940 case NAME_LOCAL:
941 op = STORE_FAST;
942 break;
943 case NAME_GLOBAL:
944 op = STORE_GLOBAL;
945 break;
946 case NAME_DEFAULT:
947 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000948 break;
949 case NAME_CLOSURE:
950 op = STORE_DEREF;
951 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000952 }
953 break;
954 case VAR_DELETE:
955 switch (scope) {
956 case NAME_LOCAL:
957 op = DELETE_FAST;
958 break;
959 case NAME_GLOBAL:
960 op = DELETE_GLOBAL;
961 break;
962 case NAME_DEFAULT:
963 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000964 break;
965 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000966 char buf[500];
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000967 sprintf(buf, DEL_CLOSURE_ERROR, name);
968 com_error(c, PyExc_SyntaxError, buf);
969 i = 255;
970 break;
971 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000972 }
973 break;
974 }
975done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000976 com_addoparg(c, op, i);
977}
978
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000979static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000980com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000981{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000982 char *name;
983 char buffer[1000];
984 /* XXX it is possible to write this code without the 1000
985 chars on the total length of dotted names, I just can't be
986 bothered right now */
987 if (TYPE(n) == STAR)
988 name = "*";
989 else if (TYPE(n) == dotted_name) {
990 char *p = buffer;
991 int i;
992 name = buffer;
993 for (i = 0; i < NCH(n); i += 2) {
994 char *s = STR(CHILD(n, i));
995 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000996 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000997 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +0000998 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000999 break;
1000 }
1001 if (p != buffer)
1002 *p++ = '.';
1003 strcpy(p, s);
1004 p = strchr(p, '\0');
1005 }
1006 }
1007 else {
1008 REQ(n, NAME);
1009 name = STR(n);
1010 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001011 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001012}
1013
Guido van Rossum79f25d91997-04-29 20:08:16 +00001014static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001015parsenumber(struct compiling *co, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001016{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001017 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001018 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001019 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001020#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +00001021 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +00001022 int imflag;
1023#endif
1024
Guido van Rossum282914b1991-04-04 10:42:56 +00001025 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001026 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001027#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001028 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001029#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001030 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001031 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001032 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001033 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001034 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001035 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001036 if (*end == '\0') {
1037 if (errno != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001038 com_error(co, PyExc_OverflowError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001039 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +00001040 return NULL;
1041 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001042 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001043 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001044 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001045#ifndef WITHOUT_COMPLEX
1046 if (imflag) {
1047 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001048 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +00001049 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001050 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001051 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +00001052 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001053 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001054#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001055 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001056 PyFPE_START_PROTECT("atof", return 0)
1057 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001058 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001059 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001060 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001061}
1062
Guido van Rossum79f25d91997-04-29 20:08:16 +00001063static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001064parsestr(char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001065{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001066 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001067 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001068 char *buf;
1069 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001070 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001071 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001072 int first = *s;
1073 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001074 int rawmode = 0;
1075 int unicode = 0;
1076 if (isalpha(quote) || quote == '_') {
1077 if (quote == 'u' || quote == 'U') {
1078 quote = *++s;
1079 unicode = 1;
1080 }
1081 if (quote == 'r' || quote == 'R') {
1082 quote = *++s;
1083 rawmode = 1;
1084 }
1085 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001086 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001087 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001088 return NULL;
1089 }
1090 s++;
1091 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001092 if (len > INT_MAX) {
1093 PyErr_SetString(PyExc_OverflowError, "string to parse is too long");
1094 return NULL;
1095 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001096 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001097 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001098 return NULL;
1099 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001100 if (len >= 4 && s[0] == quote && s[1] == quote) {
1101 s += 2;
1102 len -= 2;
1103 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001104 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001105 return NULL;
1106 }
1107 }
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001108 if (unicode || Py_UnicodeFlag) {
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001109 if (rawmode)
1110 return PyUnicode_DecodeRawUnicodeEscape(
1111 s, len, NULL);
1112 else
1113 return PyUnicode_DecodeUnicodeEscape(
1114 s, len, NULL);
1115 }
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001116 if (rawmode || strchr(s, '\\') == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001117 return PyString_FromStringAndSize(s, len);
1118 v = PyString_FromStringAndSize((char *)NULL, len);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001119 if (v == NULL)
1120 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001121 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001122 end = s + len;
1123 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001124 if (*s != '\\') {
1125 *p++ = *s++;
1126 continue;
1127 }
1128 s++;
1129 switch (*s++) {
1130 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001131 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001132 case '\\': *p++ = '\\'; break;
1133 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +00001134 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001135 case 'b': *p++ = '\b'; break;
1136 case 'f': *p++ = '\014'; break; /* FF */
1137 case 't': *p++ = '\t'; break;
1138 case 'n': *p++ = '\n'; break;
1139 case 'r': *p++ = '\r'; break;
1140 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001141 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
1142 case '0': case '1': case '2': case '3':
1143 case '4': case '5': case '6': case '7':
1144 c = s[-1] - '0';
1145 if ('0' <= *s && *s <= '7') {
1146 c = (c<<3) + *s++ - '0';
1147 if ('0' <= *s && *s <= '7')
1148 c = (c<<3) + *s++ - '0';
1149 }
1150 *p++ = c;
1151 break;
1152 case 'x':
Jeremy Hylton4419ac12001-02-28 22:54:51 +00001153 if (isxdigit(Py_CHARMASK(s[0]))
1154 && isxdigit(Py_CHARMASK(s[1]))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +00001155 unsigned int x = 0;
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001156 c = Py_CHARMASK(*s);
1157 s++;
1158 if (isdigit(c))
1159 x = c - '0';
1160 else if (islower(c))
1161 x = 10 + c - 'a';
1162 else
1163 x = 10 + c - 'A';
1164 x = x << 4;
1165 c = Py_CHARMASK(*s);
1166 s++;
1167 if (isdigit(c))
1168 x += c - '0';
1169 else if (islower(c))
1170 x += 10 + c - 'a';
1171 else
1172 x += 10 + c - 'A';
Guido van Rossumed1100f1997-10-20 23:24:07 +00001173 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001174 break;
1175 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00001176 PyErr_SetString(PyExc_ValueError,
1177 "invalid \\x escape");
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001178 Py_DECREF(v);
1179 return NULL;
1180 default:
1181 *p++ = '\\';
1182 *p++ = s[-1];
1183 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001184 }
1185 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001186 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001187 return v;
1188}
1189
Guido van Rossum79f25d91997-04-29 20:08:16 +00001190static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001191parsestrplus(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001192{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001193 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001194 int i;
1195 REQ(CHILD(n, 0), STRING);
1196 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
1197 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001198 for (i = 1; i < NCH(n); i++) {
1199 PyObject *s;
1200 s = parsestr(STR(CHILD(n, i)));
1201 if (s == NULL)
1202 goto onError;
1203 if (PyString_Check(v) && PyString_Check(s)) {
1204 PyString_ConcatAndDel(&v, s);
1205 if (v == NULL)
1206 goto onError;
1207 }
1208 else {
1209 PyObject *temp;
1210 temp = PyUnicode_Concat(v, s);
1211 Py_DECREF(s);
1212 if (temp == NULL)
1213 goto onError;
1214 Py_DECREF(v);
1215 v = temp;
1216 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001217 }
1218 }
1219 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001220
1221 onError:
1222 Py_XDECREF(v);
1223 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001224}
1225
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001226static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001227com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001228{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001229 PyObject *v;
1230 int anchor = 0;
1231 int save_begin = c->c_begin;
1232
1233 /* list_iter: for v in expr [list_iter] */
1234 com_node(c, CHILD(n, 3)); /* expr */
1235 v = PyInt_FromLong(0L);
1236 if (v == NULL)
1237 c->c_errors++;
1238 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
1239 com_push(c, 1);
1240 Py_XDECREF(v);
1241 c->c_begin = c->c_nexti;
1242 com_addoparg(c, SET_LINENO, n->n_lineno);
1243 com_addfwref(c, FOR_LOOP, &anchor);
1244 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001245 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001246 c->c_loops++;
1247 com_list_iter(c, n, e, t);
1248 c->c_loops--;
1249 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1250 c->c_begin = save_begin;
1251 com_backpatch(c, anchor);
1252 com_pop(c, 2); /* FOR_LOOP has popped these */
1253}
1254
1255static void
1256com_list_if(struct compiling *c, node *n, node *e, char *t)
1257{
1258 int anchor = 0;
1259 int a = 0;
1260 /* list_iter: 'if' test [list_iter] */
1261 com_addoparg(c, SET_LINENO, n->n_lineno);
1262 com_node(c, CHILD(n, 1));
1263 com_addfwref(c, JUMP_IF_FALSE, &a);
1264 com_addbyte(c, POP_TOP);
1265 com_pop(c, 1);
1266 com_list_iter(c, n, e, t);
1267 com_addfwref(c, JUMP_FORWARD, &anchor);
1268 com_backpatch(c, a);
1269 /* We jump here with an extra entry which we now pop */
1270 com_addbyte(c, POP_TOP);
1271 com_backpatch(c, anchor);
1272}
1273
1274static void
1275com_list_iter(struct compiling *c,
1276 node *p, /* parent of list_iter node */
1277 node *e, /* element expression node */
1278 char *t /* name of result list temp local */)
1279{
1280 /* list_iter is the last child in a listmaker, list_for, or list_if */
1281 node *n = CHILD(p, NCH(p)-1);
1282 if (TYPE(n) == list_iter) {
1283 n = CHILD(n, 0);
1284 switch (TYPE(n)) {
1285 case list_for:
1286 com_list_for(c, n, e, t);
1287 break;
1288 case list_if:
1289 com_list_if(c, n, e, t);
1290 break;
1291 default:
1292 com_error(c, PyExc_SystemError,
1293 "invalid list_iter node type");
1294 }
1295 }
1296 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001297 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001298 com_push(c, 1);
1299 com_node(c, e);
1300 com_addoparg(c, CALL_FUNCTION, 1);
1301 com_addbyte(c, POP_TOP);
1302 com_pop(c, 2);
1303 }
1304}
1305
1306static void
1307com_list_comprehension(struct compiling *c, node *n)
1308{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001309 /* listmaker: test list_for */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001310 char tmpname[12];
Tim Peters30814212001-02-17 05:30:26 +00001311 sprintf(tmpname, "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001312 com_addoparg(c, BUILD_LIST, 0);
1313 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1314 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001315 com_addop_name(c, LOAD_ATTR, "append");
1316 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001317 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001318 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001319 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001320 --c->c_tmpname;
1321}
1322
1323static void
1324com_listmaker(struct compiling *c, node *n)
1325{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001326 /* listmaker: test ( list_for | (',' test)* [','] ) */
1327 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001328 com_list_comprehension(c, n);
1329 else {
1330 int len = 0;
1331 int i;
1332 for (i = 0; i < NCH(n); i += 2, len++)
1333 com_node(c, CHILD(n, i));
1334 com_addoparg(c, BUILD_LIST, len);
1335 com_pop(c, len-1);
1336 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001337}
1338
1339static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001340com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001341{
1342 int i;
1343 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1344 for (i = 0; i+2 < NCH(n); i += 4) {
1345 /* We must arrange things just right for STORE_SUBSCR.
1346 It wants the stack to look like (value) (dict) (key) */
1347 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001348 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001349 com_node(c, CHILD(n, i+2)); /* value */
1350 com_addbyte(c, ROT_TWO);
1351 com_node(c, CHILD(n, i)); /* key */
1352 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001353 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001354 }
1355}
1356
1357static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001358com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001359{
1360 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001361 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001362 int i;
1363 REQ(n, atom);
1364 ch = CHILD(n, 0);
1365 switch (TYPE(ch)) {
1366 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001367 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001368 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001369 com_push(c, 1);
1370 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001371 else
1372 com_node(c, CHILD(n, 1));
1373 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001374 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001375 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001376 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001377 com_push(c, 1);
1378 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001379 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001380 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001381 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001382 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001383 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001384 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001385 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001386 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001387 break;
1388 case BACKQUOTE:
1389 com_node(c, CHILD(n, 1));
1390 com_addbyte(c, UNARY_CONVERT);
1391 break;
1392 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001393 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001394 i = 255;
1395 }
1396 else {
1397 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001398 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001399 }
1400 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001401 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001402 break;
1403 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001404 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001405 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001406 c->c_errors++;
1407 i = 255;
1408 }
1409 else {
1410 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001411 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001412 }
1413 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001414 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001415 break;
1416 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001417 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001418 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001419 break;
1420 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001421 com_error(c, PyExc_SystemError,
1422 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001423 }
1424}
1425
1426static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001427com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001428{
1429 if (NCH(n) == 1) {
1430 com_addbyte(c, op);
1431 }
1432 else if (NCH(n) == 2) {
1433 if (TYPE(CHILD(n, 0)) != COLON) {
1434 com_node(c, CHILD(n, 0));
1435 com_addbyte(c, op+1);
1436 }
1437 else {
1438 com_node(c, CHILD(n, 1));
1439 com_addbyte(c, op+2);
1440 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001441 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001442 }
1443 else {
1444 com_node(c, CHILD(n, 0));
1445 com_node(c, CHILD(n, 2));
1446 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001447 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001448 }
1449}
1450
Guido van Rossum635abd21997-01-06 22:56:52 +00001451static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001452com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1453{
1454 if (NCH(n) == 1) {
1455 com_addbyte(c, DUP_TOP);
1456 com_push(c, 1);
1457 com_addbyte(c, SLICE);
1458 com_node(c, augn);
1459 com_addbyte(c, opcode);
1460 com_pop(c, 1);
1461 com_addbyte(c, ROT_TWO);
1462 com_addbyte(c, STORE_SLICE);
1463 com_pop(c, 2);
1464 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1465 com_node(c, CHILD(n, 0));
1466 com_addoparg(c, DUP_TOPX, 2);
1467 com_push(c, 2);
1468 com_addbyte(c, SLICE+1);
1469 com_pop(c, 1);
1470 com_node(c, augn);
1471 com_addbyte(c, opcode);
1472 com_pop(c, 1);
1473 com_addbyte(c, ROT_THREE);
1474 com_addbyte(c, STORE_SLICE+1);
1475 com_pop(c, 3);
1476 } else if (NCH(n) == 2) {
1477 com_node(c, CHILD(n, 1));
1478 com_addoparg(c, DUP_TOPX, 2);
1479 com_push(c, 2);
1480 com_addbyte(c, SLICE+2);
1481 com_pop(c, 1);
1482 com_node(c, augn);
1483 com_addbyte(c, opcode);
1484 com_pop(c, 1);
1485 com_addbyte(c, ROT_THREE);
1486 com_addbyte(c, STORE_SLICE+2);
1487 com_pop(c, 3);
1488 } else {
1489 com_node(c, CHILD(n, 0));
1490 com_node(c, CHILD(n, 2));
1491 com_addoparg(c, DUP_TOPX, 3);
1492 com_push(c, 3);
1493 com_addbyte(c, SLICE+3);
1494 com_pop(c, 2);
1495 com_node(c, augn);
1496 com_addbyte(c, opcode);
1497 com_pop(c, 1);
1498 com_addbyte(c, ROT_FOUR);
1499 com_addbyte(c, STORE_SLICE+3);
1500 com_pop(c, 4);
1501 }
1502}
1503
1504static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001505com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001506{
1507 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001508 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001509 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001510 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001511 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001512 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001513 }
1514 else {
1515 com_node(c, CHILD(n, 0));
1516 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001517 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001518 }
1519 m = n;
1520 do {
1521 m = CHILD(m, 0);
1522 } while (NCH(m) == 1);
1523 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00001524 /* f(lambda x: x[0] = 3) ends up getting parsed with
1525 * LHS test = lambda x: x[0], and RHS test = 3.
1526 * SF bug 132313 points out that complaining about a keyword
1527 * then is very confusing.
1528 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001529 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00001530 TYPE(m) == lambdef ?
1531 "lambda cannot contain assignment" :
1532 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001533 }
1534 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001535 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001536 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001537 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001538 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001539 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001540 else if (*pkeywords == NULL) {
1541 c->c_errors++;
1542 Py_DECREF(v);
1543 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001544 if (PyDict_GetItem(*pkeywords, v) != NULL)
1545 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001546 "duplicate keyword argument");
1547 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001548 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001549 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001550 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001551 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001552 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001553 }
1554 }
1555 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001556}
1557
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001558static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001559com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001560{
1561 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001562 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001563 }
1564 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001565 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001566 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001567 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001568 int star_flag = 0;
1569 int starstar_flag = 0;
1570 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001571 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001572 na = 0;
1573 nk = 0;
1574 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001575 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001576 if (TYPE(ch) == STAR ||
1577 TYPE(ch) == DOUBLESTAR)
1578 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001579 if (ch->n_lineno != lineno) {
1580 lineno = ch->n_lineno;
1581 com_addoparg(c, SET_LINENO, lineno);
1582 }
1583 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001584 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001585 na++;
1586 else
1587 nk++;
1588 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001589 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001590 while (i < NCH(n)) {
1591 node *tok = CHILD(n, i);
1592 node *ch = CHILD(n, i+1);
1593 i += 3;
1594 switch (TYPE(tok)) {
1595 case STAR: star_flag = 1; break;
1596 case DOUBLESTAR: starstar_flag = 1; break;
1597 }
1598 com_node(c, ch);
1599 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001600 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001601 com_error(c, PyExc_SyntaxError,
1602 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001603 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001604 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001605 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001606 star_flag + (starstar_flag << 1);
1607 else
1608 opcode = CALL_FUNCTION;
1609 com_addoparg(c, opcode, na | (nk << 8));
1610 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001611 }
1612}
1613
1614static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001615com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001616{
1617 com_addopname(c, LOAD_ATTR, n);
1618}
1619
1620static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001621com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001622{
1623 int i=0;
1624 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001625 node *ch;
1626
1627 /* first argument */
1628 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001629 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001630 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001631 i++;
1632 }
1633 else {
1634 com_node(c, CHILD(n,i));
1635 i++;
1636 REQ(CHILD(n,i),COLON);
1637 i++;
1638 }
1639 /* second argument */
1640 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1641 com_node(c, CHILD(n,i));
1642 i++;
1643 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001644 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001645 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001646 com_push(c, 1);
1647 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001648 /* remaining arguments */
1649 for (; i < NCH(n); i++) {
1650 ns++;
1651 ch=CHILD(n,i);
1652 REQ(ch, sliceop);
1653 if (NCH(ch) == 1) {
1654 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001655 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001656 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001657 }
1658 else
1659 com_node(c, CHILD(ch,1));
1660 }
1661 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001662 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001663}
1664
1665static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001666com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001667{
1668 node *ch;
1669 REQ(n, subscript);
1670 ch = CHILD(n,0);
1671 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001672 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001673 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001674 com_push(c, 1);
1675 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001676 else {
1677 /* check for slice */
1678 if ((TYPE(ch) == COLON || NCH(n) > 1))
1679 com_sliceobj(c, n);
1680 else {
1681 REQ(ch, test);
1682 com_node(c, ch);
1683 }
1684 }
1685}
1686
1687static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001688com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001689{
1690 int i, op;
1691 REQ(n, subscriptlist);
1692 /* Check to make backward compatible slice behavior for '[i:j]' */
1693 if (NCH(n) == 1) {
1694 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001695 /* 'Basic' slice, should have exactly one colon. */
1696 if ((TYPE(CHILD(sub, 0)) == COLON
1697 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1698 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1699 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001700 switch (assigning) {
1701 case OP_DELETE:
1702 op = DELETE_SLICE;
1703 break;
1704 case OP_ASSIGN:
1705 op = STORE_SLICE;
1706 break;
1707 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001708 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001709 break;
1710 default:
1711 com_augassign_slice(c, sub, assigning, augn);
1712 return;
1713 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001714 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001715 if (op == STORE_SLICE)
1716 com_pop(c, 2);
1717 else if (op == DELETE_SLICE)
1718 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001719 return;
1720 }
1721 }
1722 /* Else normal subscriptlist. Compile each subscript. */
1723 for (i = 0; i < NCH(n); i += 2)
1724 com_subscript(c, CHILD(n, i));
1725 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001726 if (NCH(n) > 1) {
1727 i = (NCH(n)+1) / 2;
1728 com_addoparg(c, BUILD_TUPLE, i);
1729 com_pop(c, i-1);
1730 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001731 switch (assigning) {
1732 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001733 op = DELETE_SUBSCR;
1734 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00001735 break;
1736 default:
1737 case OP_ASSIGN:
1738 op = STORE_SUBSCR;
1739 i = 3;
1740 break;
1741 case OP_APPLY:
1742 op = BINARY_SUBSCR;
1743 i = 1;
1744 break;
1745 }
1746 if (assigning > OP_APPLY) {
1747 com_addoparg(c, DUP_TOPX, 2);
1748 com_push(c, 2);
1749 com_addbyte(c, BINARY_SUBSCR);
1750 com_pop(c, 1);
1751 com_node(c, augn);
1752 com_addbyte(c, assigning);
1753 com_pop(c, 1);
1754 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001755 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001756 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001757 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001758}
1759
1760static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001761com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001762{
1763 REQ(n, trailer);
1764 switch (TYPE(CHILD(n, 0))) {
1765 case LPAR:
1766 com_call_function(c, CHILD(n, 1));
1767 break;
1768 case DOT:
1769 com_select_member(c, CHILD(n, 1));
1770 break;
1771 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00001772 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001773 break;
1774 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001775 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001776 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001777 }
1778}
1779
1780static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001781com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001782{
1783 int i;
1784 REQ(n, power);
1785 com_atom(c, CHILD(n, 0));
1786 for (i = 1; i < NCH(n); i++) {
1787 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1788 com_factor(c, CHILD(n, i+1));
1789 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001790 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001791 break;
1792 }
1793 else
1794 com_apply_trailer(c, CHILD(n, i));
1795 }
1796}
1797
1798static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001799com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001800{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001801 REQ(n, factor);
1802 if (TYPE(CHILD(n, 0)) == PLUS) {
1803 com_factor(c, CHILD(n, 1));
1804 com_addbyte(c, UNARY_POSITIVE);
1805 }
1806 else if (TYPE(CHILD(n, 0)) == MINUS) {
1807 com_factor(c, CHILD(n, 1));
1808 com_addbyte(c, UNARY_NEGATIVE);
1809 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001810 else if (TYPE(CHILD(n, 0)) == TILDE) {
1811 com_factor(c, CHILD(n, 1));
1812 com_addbyte(c, UNARY_INVERT);
1813 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001814 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001815 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001816 }
1817}
1818
1819static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001820com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001821{
1822 int i;
1823 int op;
1824 REQ(n, term);
1825 com_factor(c, CHILD(n, 0));
1826 for (i = 2; i < NCH(n); i += 2) {
1827 com_factor(c, CHILD(n, i));
1828 switch (TYPE(CHILD(n, i-1))) {
1829 case STAR:
1830 op = BINARY_MULTIPLY;
1831 break;
1832 case SLASH:
1833 op = BINARY_DIVIDE;
1834 break;
1835 case PERCENT:
1836 op = BINARY_MODULO;
1837 break;
1838 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001839 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001840 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001841 op = 255;
1842 }
1843 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001844 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001845 }
1846}
1847
1848static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001849com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001850{
1851 int i;
1852 int op;
1853 REQ(n, arith_expr);
1854 com_term(c, CHILD(n, 0));
1855 for (i = 2; i < NCH(n); i += 2) {
1856 com_term(c, CHILD(n, i));
1857 switch (TYPE(CHILD(n, i-1))) {
1858 case PLUS:
1859 op = BINARY_ADD;
1860 break;
1861 case MINUS:
1862 op = BINARY_SUBTRACT;
1863 break;
1864 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001865 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001866 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001867 op = 255;
1868 }
1869 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001870 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001871 }
1872}
1873
1874static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001875com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001876{
1877 int i;
1878 int op;
1879 REQ(n, shift_expr);
1880 com_arith_expr(c, CHILD(n, 0));
1881 for (i = 2; i < NCH(n); i += 2) {
1882 com_arith_expr(c, CHILD(n, i));
1883 switch (TYPE(CHILD(n, i-1))) {
1884 case LEFTSHIFT:
1885 op = BINARY_LSHIFT;
1886 break;
1887 case RIGHTSHIFT:
1888 op = BINARY_RSHIFT;
1889 break;
1890 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001891 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001892 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001893 op = 255;
1894 }
1895 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001896 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001897 }
1898}
1899
1900static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001901com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001902{
1903 int i;
1904 int op;
1905 REQ(n, and_expr);
1906 com_shift_expr(c, CHILD(n, 0));
1907 for (i = 2; i < NCH(n); i += 2) {
1908 com_shift_expr(c, CHILD(n, i));
1909 if (TYPE(CHILD(n, i-1)) == AMPER) {
1910 op = BINARY_AND;
1911 }
1912 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001913 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001914 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001915 op = 255;
1916 }
1917 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001918 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001919 }
1920}
1921
1922static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001923com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001924{
1925 int i;
1926 int op;
1927 REQ(n, xor_expr);
1928 com_and_expr(c, CHILD(n, 0));
1929 for (i = 2; i < NCH(n); i += 2) {
1930 com_and_expr(c, CHILD(n, i));
1931 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1932 op = BINARY_XOR;
1933 }
1934 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001935 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001936 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001937 op = 255;
1938 }
1939 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001940 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001941 }
1942}
1943
1944static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001945com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001946{
1947 int i;
1948 int op;
1949 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001950 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001951 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001952 com_xor_expr(c, CHILD(n, i));
1953 if (TYPE(CHILD(n, i-1)) == VBAR) {
1954 op = BINARY_OR;
1955 }
1956 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001957 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001958 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001959 op = 255;
1960 }
1961 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001962 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001963 }
1964}
1965
1966static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001967cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001968{
1969 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001970 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001971 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1972 if (NCH(n) == 1) {
1973 n = CHILD(n, 0);
1974 switch (TYPE(n)) {
1975 case LESS: return LT;
1976 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001977 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001978 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001979 case LESSEQUAL: return LE;
1980 case GREATEREQUAL: return GE;
1981 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001982 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1983 if (strcmp(STR(n), "is") == 0) return IS;
1984 }
1985 }
1986 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001987 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001988 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1989 return NOT_IN;
1990 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1991 return IS_NOT;
1992 }
1993 }
1994 return BAD;
1995}
1996
1997static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001998com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001999{
2000 int i;
2001 enum cmp_op op;
2002 int anchor;
2003 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2004 com_expr(c, CHILD(n, 0));
2005 if (NCH(n) == 1)
2006 return;
2007
2008 /****************************************************************
2009 The following code is generated for all but the last
2010 comparison in a chain:
2011
2012 label: on stack: opcode: jump to:
2013
2014 a <code to load b>
2015 a, b DUP_TOP
2016 a, b, b ROT_THREE
2017 b, a, b COMPARE_OP
2018 b, 0-or-1 JUMP_IF_FALSE L1
2019 b, 1 POP_TOP
2020 b
2021
2022 We are now ready to repeat this sequence for the next
2023 comparison in the chain.
2024
2025 For the last we generate:
2026
2027 b <code to load c>
2028 b, c COMPARE_OP
2029 0-or-1
2030
2031 If there were any jumps to L1 (i.e., there was more than one
2032 comparison), we generate:
2033
2034 0-or-1 JUMP_FORWARD L2
2035 L1: b, 0 ROT_TWO
2036 0, b POP_TOP
2037 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002038 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002039 ****************************************************************/
2040
2041 anchor = 0;
2042
2043 for (i = 2; i < NCH(n); i += 2) {
2044 com_expr(c, CHILD(n, i));
2045 if (i+2 < NCH(n)) {
2046 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002047 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002048 com_addbyte(c, ROT_THREE);
2049 }
2050 op = cmp_type(CHILD(n, i-1));
2051 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002052 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002053 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002054 }
2055 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002056 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002057 if (i+2 < NCH(n)) {
2058 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2059 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002060 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002061 }
2062 }
2063
2064 if (anchor) {
2065 int anchor2 = 0;
2066 com_addfwref(c, JUMP_FORWARD, &anchor2);
2067 com_backpatch(c, anchor);
2068 com_addbyte(c, ROT_TWO);
2069 com_addbyte(c, POP_TOP);
2070 com_backpatch(c, anchor2);
2071 }
2072}
2073
2074static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002075com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002076{
2077 REQ(n, not_test); /* 'not' not_test | comparison */
2078 if (NCH(n) == 1) {
2079 com_comparison(c, CHILD(n, 0));
2080 }
2081 else {
2082 com_not_test(c, CHILD(n, 1));
2083 com_addbyte(c, UNARY_NOT);
2084 }
2085}
2086
2087static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002088com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002089{
2090 int i;
2091 int anchor;
2092 REQ(n, and_test); /* not_test ('and' not_test)* */
2093 anchor = 0;
2094 i = 0;
2095 for (;;) {
2096 com_not_test(c, CHILD(n, i));
2097 if ((i += 2) >= NCH(n))
2098 break;
2099 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2100 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002101 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002102 }
2103 if (anchor)
2104 com_backpatch(c, anchor);
2105}
2106
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002107static int
2108com_make_closure(struct compiling *c, PyCodeObject *co)
2109{
2110 int i, free = PyTuple_GET_SIZE(co->co_freevars);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002111 /* If the code is compiled with st->st_nested_scopes == 0,
2112 then no variable will ever be added to co_freevars.
2113 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002114 if (free == 0)
2115 return 0;
2116 for (i = 0; i < free; ++i) {
2117 /* Bypass com_addop_varname because it will generate
2118 LOAD_DEREF but LOAD_CLOSURE is needed.
2119 */
2120 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2121 int arg, reftype;
2122
2123 /* Special case: If a class contains a method with a
2124 free variable that has the same name as a method,
2125 the name will be considered free *and* local in the
2126 class. It should be handled by the closure, as
2127 well as by the normal name loookup logic.
2128 */
2129 reftype = get_ref_type(c, PyString_AS_STRING(name));
2130 if (reftype == CELL)
2131 arg = com_lookup_arg(c->c_cellvars, name);
2132 else /* (reftype == FREE) */
2133 arg = com_lookup_arg(c->c_freevars, name);
2134 if (arg == -1) {
2135 fprintf(stderr, "lookup %s in %s %d %d\n",
Jeremy Hylton483638c2001-02-01 20:20:45 +00002136 PyObject_REPR(name), c->c_name, reftype, arg);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002137 Py_FatalError("com_make_closure()");
2138 }
2139 com_addoparg(c, LOAD_CLOSURE, arg);
2140
2141 }
2142 com_push(c, free);
2143 return 1;
2144}
2145
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002146static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002147com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002148{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002149 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002150 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002151 PyObject *co;
2152 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002153 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002154 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2155 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002156 co = (PyObject *) icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002157 if (co == NULL) {
2158 c->c_errors++;
2159 return;
2160 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002161 symtable_exit_scope(c->c_symtable);
Tim Peters1e542112001-02-23 22:23:53 +00002162 i = com_addconst(c, co);
2163 closure = com_make_closure(c, (PyCodeObject *)co);
2164 Py_DECREF(co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002165 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002166 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002167 if (closure)
2168 com_addoparg(c, MAKE_CLOSURE, ndefs);
2169 else
2170 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002171 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002172 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002173 else {
2174 int anchor = 0;
2175 int i = 0;
2176 for (;;) {
2177 com_and_test(c, CHILD(n, i));
2178 if ((i += 2) >= NCH(n))
2179 break;
2180 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2181 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002182 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002183 }
2184 if (anchor)
2185 com_backpatch(c, anchor);
2186 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002187}
2188
2189static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002190com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002191{
2192 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002193 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002194 com_node(c, CHILD(n, 0));
2195 }
2196 else {
2197 int i;
2198 int len;
2199 len = (NCH(n) + 1) / 2;
2200 for (i = 0; i < NCH(n); i += 2)
2201 com_node(c, CHILD(n, i));
2202 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002203 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002204 }
2205}
2206
2207
2208/* Begin of assignment compilation */
2209
Thomas Wouters434d0822000-08-24 20:11:32 +00002210
2211static void
2212com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2213{
2214 com_addbyte(c, DUP_TOP);
2215 com_push(c, 1);
2216 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002217 com_node(c, augn);
2218 com_addbyte(c, opcode);
2219 com_pop(c, 1);
2220 com_addbyte(c, ROT_TWO);
2221 com_addopname(c, STORE_ATTR, n);
2222 com_pop(c, 2);
2223}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002224
2225static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002226com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002227{
2228 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002229 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002230}
2231
2232static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002233com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002234{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002235 REQ(n, trailer);
2236 switch (TYPE(CHILD(n, 0))) {
2237 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002238 com_error(c, PyExc_SyntaxError,
2239 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002240 break;
2241 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002242 if (assigning > OP_APPLY)
2243 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2244 else
2245 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002246 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002247 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002248 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002249 break;
2250 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002251 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002252 }
2253}
2254
2255static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002256com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002257{
2258 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002259 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002260 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002261 if (assigning) {
2262 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002263 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002264 com_push(c, i-1);
2265 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002266 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002267 com_assign(c, CHILD(n, i), assigning, NULL);
2268}
2269
2270static void
2271com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2272{
2273 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002274 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002275 com_push(c, 1);
2276 com_node(c, augn);
2277 com_addbyte(c, opcode);
2278 com_pop(c, 1);
2279 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002280}
2281
2282static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002283com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002284{
2285 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002286 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002287 if (assigning)
2288 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002289}
2290
2291static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002292com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002293{
2294 /* Loop to avoid trivial recursion */
2295 for (;;) {
2296 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002297
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002298 case exprlist:
2299 case testlist:
2300 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002301 if (assigning > OP_APPLY) {
2302 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002303 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002304 return;
2305 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002306 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002307 return;
2308 }
2309 n = CHILD(n, 0);
2310 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002311
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002312 case test:
2313 case and_test:
2314 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002315 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002316 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002317 case xor_expr:
2318 case and_expr:
2319 case shift_expr:
2320 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002321 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002322 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002323 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002324 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002325 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002326 return;
2327 }
2328 n = CHILD(n, 0);
2329 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002330
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002331 case power: /* atom trailer* ('**' power)*
2332 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002333 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002334 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002335 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002336 return;
2337 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002338 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002339 int i;
2340 com_node(c, CHILD(n, 0));
2341 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002342 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002343 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002344 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002345 return;
2346 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002347 com_apply_trailer(c, CHILD(n, i));
2348 } /* NB i is still alive */
2349 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002350 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002351 return;
2352 }
2353 n = CHILD(n, 0);
2354 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002355
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002356 case atom:
2357 switch (TYPE(CHILD(n, 0))) {
2358 case LPAR:
2359 n = CHILD(n, 1);
2360 if (TYPE(n) == RPAR) {
2361 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002362 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002363 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002364 return;
2365 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002366 if (assigning > OP_APPLY) {
2367 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002368 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002369 return;
2370 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002371 break;
2372 case LSQB:
2373 n = CHILD(n, 1);
2374 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002375 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002376 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002377 return;
2378 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002379 if (assigning > OP_APPLY) {
2380 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002381 "augmented assign to list not possible");
2382 return;
2383 }
2384 if (NCH(n) > 1
2385 && TYPE(CHILD(n, 1)) == list_for) {
2386 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002387 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002388 return;
2389 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002390 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002391 return;
2392 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002393 if (assigning > OP_APPLY)
2394 com_augassign_name(c, CHILD(n, 0),
2395 assigning, augn);
2396 else
2397 com_assign_name(c, CHILD(n, 0),
2398 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002399 return;
2400 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002401 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002402 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002403 return;
2404 }
2405 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002406
2407 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002408 com_error(c, PyExc_SyntaxError,
2409 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002410 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002411
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002412 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002413 com_error(c, PyExc_SystemError,
2414 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002415 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002416
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002417 }
2418 }
2419}
Guido van Rossum7c531111997-03-11 18:42:21 +00002420
Thomas Wouters434d0822000-08-24 20:11:32 +00002421static void
2422com_augassign(struct compiling *c, node *n)
2423{
2424 int opcode;
2425
2426 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2427 case '+': opcode = INPLACE_ADD; break;
2428 case '-': opcode = INPLACE_SUBTRACT; break;
2429 case '/': opcode = INPLACE_DIVIDE; break;
2430 case '%': opcode = INPLACE_MODULO; break;
2431 case '<': opcode = INPLACE_LSHIFT; break;
2432 case '>': opcode = INPLACE_RSHIFT; break;
2433 case '&': opcode = INPLACE_AND; break;
2434 case '^': opcode = INPLACE_XOR; break;
2435 case '|': opcode = INPLACE_OR; break;
2436 case '*':
2437 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2438 opcode = INPLACE_POWER;
2439 else
2440 opcode = INPLACE_MULTIPLY;
2441 break;
2442 default:
2443 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2444 return;
2445 }
2446 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2447}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002448
2449static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002450com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002451{
Thomas Wouters434d0822000-08-24 20:11:32 +00002452 REQ(n, expr_stmt);
2453 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002454 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002455 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002456 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002457 if (NCH(n) == 1) {
2458 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002459 if (c->c_interactive)
2460 com_addbyte(c, PRINT_EXPR);
2461 else
2462 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002463 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002464 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002465 else if (TYPE(CHILD(n,1)) == augassign)
2466 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002467 else {
2468 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002469 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002470 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002471 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002472 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002473 com_push(c, 1);
2474 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002475 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002476 }
2477 }
2478}
2479
2480static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002481com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002482{
2483 int a = 0, b = 0;
2484 int i;
2485 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2486 /* Generate code like for
2487
2488 if __debug__:
2489 if not <test>:
2490 raise AssertionError [, <message>]
2491
2492 where <message> is the second test, if present.
2493 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002494
Guido van Rossum228d7f31997-04-02 05:24:36 +00002495 if (Py_OptimizeFlag)
2496 return;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002497 com_addop_name(c, LOAD_GLOBAL, "__debug__");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002498 com_push(c, 1);
2499 com_addfwref(c, JUMP_IF_FALSE, &a);
2500 com_addbyte(c, POP_TOP);
2501 com_pop(c, 1);
2502 com_node(c, CHILD(n, 1));
2503 com_addfwref(c, JUMP_IF_TRUE, &b);
2504 com_addbyte(c, POP_TOP);
2505 com_pop(c, 1);
2506 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002507 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002508 com_push(c, 1);
2509 i = NCH(n)/2; /* Either 2 or 4 */
2510 if (i > 1)
2511 com_node(c, CHILD(n, 3));
2512 com_addoparg(c, RAISE_VARARGS, i);
2513 com_pop(c, i);
2514 /* The interpreter does not fall through */
2515 /* All jumps converge here */
2516 com_backpatch(c, a);
2517 com_backpatch(c, b);
2518 com_addbyte(c, POP_TOP);
2519}
2520
2521static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002522com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002523{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002524 int i = 1;
2525 node* stream = NULL;
2526
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002527 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002528
2529 /* are we using the extended print form? */
2530 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2531 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002532 com_node(c, stream);
2533 /* stack: [...] => [... stream] */
2534 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002535 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2536 i = 4;
2537 else
2538 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002539 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002540 for (; i < NCH(n); i += 2) {
2541 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002542 com_addbyte(c, DUP_TOP);
2543 /* stack: [stream] => [stream stream] */
2544 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002545 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002546 /* stack: [stream stream] => [stream stream obj] */
2547 com_addbyte(c, ROT_TWO);
2548 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002549 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002550 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002551 com_pop(c, 2);
2552 }
2553 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002554 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002555 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002556 com_addbyte(c, PRINT_ITEM);
2557 com_pop(c, 1);
2558 }
2559 }
2560 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002561 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002562 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002563 /* must pop the extra stream object off the stack */
2564 com_addbyte(c, POP_TOP);
2565 /* stack: [... stream] => [...] */
2566 com_pop(c, 1);
2567 }
2568 }
2569 else {
2570 if (stream != NULL) {
2571 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002572 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002573 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002574 com_pop(c, 1);
2575 }
2576 else
2577 com_addbyte(c, PRINT_NEWLINE);
2578 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002579}
2580
2581static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002582com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002583{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002584 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002585 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002586 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002587 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002588 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002589 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002590 com_push(c, 1);
2591 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002592 else
2593 com_node(c, CHILD(n, 1));
2594 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002595 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002596}
2597
2598static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002599com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002600{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002601 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002602 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2603 if (NCH(n) > 1) {
2604 com_node(c, CHILD(n, 1));
2605 if (NCH(n) > 3) {
2606 com_node(c, CHILD(n, 3));
2607 if (NCH(n) > 5)
2608 com_node(c, CHILD(n, 5));
2609 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002610 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002611 i = NCH(n)/2;
2612 com_addoparg(c, RAISE_VARARGS, i);
2613 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002614}
2615
2616static void
Thomas Wouters52152252000-08-17 22:55:00 +00002617com_from_import(struct compiling *c, node *n)
2618{
2619 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2620 com_push(c, 1);
2621 if (NCH(n) > 1) {
2622 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2623 com_error(c, PyExc_SyntaxError, "invalid syntax");
2624 return;
2625 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002626 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002627 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002628 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00002629 com_pop(c, 1);
2630}
2631
2632static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002633com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002634{
2635 int i;
2636 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002637 /* 'import' dotted_name (',' dotted_name)* |
2638 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002639 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00002640 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002641 /* 'from' dotted_name 'import' ... */
2642 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002643
2644 if (TYPE(CHILD(n, 3)) == STAR) {
2645 tup = Py_BuildValue("(s)", "*");
2646 } else {
2647 tup = PyTuple_New((NCH(n) - 2)/2);
2648 for (i = 3; i < NCH(n); i += 2) {
2649 PyTuple_SET_ITEM(tup, (i-3)/2,
2650 PyString_FromString(STR(
Jeremy Hylton4419ac12001-02-28 22:54:51 +00002651 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002652 }
2653 }
2654 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00002655 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002656 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002657 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00002658 if (TYPE(CHILD(n, 3)) == STAR)
2659 com_addbyte(c, IMPORT_STAR);
2660 else {
2661 for (i = 3; i < NCH(n); i += 2)
2662 com_from_import(c, CHILD(n, i));
2663 com_addbyte(c, POP_TOP);
2664 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002665 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002666 }
2667 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002668 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002669 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00002670 node *subn = CHILD(n, i);
2671 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002672 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002673 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002674 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00002675 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00002676 int j;
2677 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00002678 com_error(c, PyExc_SyntaxError,
2679 "invalid syntax");
2680 return;
2681 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00002682 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
2683 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002684 CHILD(CHILD(subn, 0),
2685 j));
2686 com_addop_varname(c, VAR_STORE,
2687 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002688 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002689 com_addop_varname(c, VAR_STORE,
2690 STR(CHILD(CHILD(subn, 0),
2691 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002692 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002693 }
2694 }
2695}
2696
2697static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002698com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002699{
2700 REQ(n, exec_stmt);
2701 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2702 com_node(c, CHILD(n, 1));
2703 if (NCH(n) >= 4)
2704 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002705 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002706 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002707 com_push(c, 1);
2708 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002709 if (NCH(n) >= 6)
2710 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002711 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002712 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002713 com_push(c, 1);
2714 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002715 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002716 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002717}
2718
Guido van Rossum7c531111997-03-11 18:42:21 +00002719static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002720is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002721{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002722 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002723 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002724 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00002725
2726 /* Label to avoid tail recursion */
2727 next:
2728 switch (TYPE(n)) {
2729
2730 case suite:
2731 if (NCH(n) == 1) {
2732 n = CHILD(n, 0);
2733 goto next;
2734 }
2735 /* Fall through */
2736 case file_input:
2737 for (i = 0; i < NCH(n); i++) {
2738 node *ch = CHILD(n, i);
2739 if (TYPE(ch) == stmt) {
2740 n = ch;
2741 goto next;
2742 }
2743 }
2744 break;
2745
2746 case stmt:
2747 case simple_stmt:
2748 case small_stmt:
2749 n = CHILD(n, 0);
2750 goto next;
2751
2752 case expr_stmt:
2753 case testlist:
2754 case test:
2755 case and_test:
2756 case not_test:
2757 case comparison:
2758 case expr:
2759 case xor_expr:
2760 case and_expr:
2761 case shift_expr:
2762 case arith_expr:
2763 case term:
2764 case factor:
2765 case power:
2766 case atom:
2767 if (NCH(n) == 1) {
2768 n = CHILD(n, 0);
2769 goto next;
2770 }
2771 break;
2772
2773 case NAME:
2774 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2775 return 1;
2776 break;
2777
2778 case NUMBER:
2779 v = parsenumber(c, STR(n));
2780 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002781 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002782 break;
2783 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002784 i = PyObject_IsTrue(v);
2785 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002786 return i == 0;
2787
2788 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002789 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002790 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002791 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002792 break;
2793 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002794 i = PyObject_IsTrue(v);
2795 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002796 return i == 0;
2797
2798 }
2799 return 0;
2800}
2801
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002802static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002803com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002804{
2805 int i;
2806 int anchor = 0;
2807 REQ(n, if_stmt);
2808 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2809 for (i = 0; i+3 < NCH(n); i+=4) {
2810 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002811 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002812 if (is_constant_false(c, ch))
2813 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002814 if (i > 0)
2815 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002816 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002817 com_addfwref(c, JUMP_IF_FALSE, &a);
2818 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002819 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002820 com_node(c, CHILD(n, i+3));
2821 com_addfwref(c, JUMP_FORWARD, &anchor);
2822 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002823 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002824 com_addbyte(c, POP_TOP);
2825 }
2826 if (i+2 < NCH(n))
2827 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002828 if (anchor)
2829 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002830}
2831
2832static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002833com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002834{
2835 int break_anchor = 0;
2836 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002837 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002838 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2839 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002840 block_push(c, SETUP_LOOP);
2841 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002842 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002843 com_node(c, CHILD(n, 1));
2844 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2845 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002846 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002847 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002848 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002849 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002850 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2851 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002852 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002853 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002854 com_addbyte(c, POP_TOP);
2855 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002856 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002857 if (NCH(n) > 4)
2858 com_node(c, CHILD(n, 6));
2859 com_backpatch(c, break_anchor);
2860}
2861
2862static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002863com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002864{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002865 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002866 int break_anchor = 0;
2867 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002868 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002869 REQ(n, for_stmt);
2870 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2871 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002872 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002873 com_node(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002874 v = PyInt_FromLong(0L);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002875 if (v == NULL)
2876 c->c_errors++;
2877 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002878 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002879 Py_XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002880 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002881 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002882 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002883 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00002884 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002885 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002886 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002887 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002888 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2889 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002890 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002891 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002892 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002893 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002894 if (NCH(n) > 8)
2895 com_node(c, CHILD(n, 8));
2896 com_backpatch(c, break_anchor);
2897}
2898
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002899/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002900
2901 SETUP_FINALLY L
2902 <code for S>
2903 POP_BLOCK
2904 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002905 L: <code for Sf>
2906 END_FINALLY
2907
2908 The special instructions use the block stack. Each block
2909 stack entry contains the instruction that created it (here
2910 SETUP_FINALLY), the level of the value stack at the time the
2911 block stack entry was created, and a label (here L).
2912
2913 SETUP_FINALLY:
2914 Pushes the current value stack level and the label
2915 onto the block stack.
2916 POP_BLOCK:
2917 Pops en entry from the block stack, and pops the value
2918 stack until its level is the same as indicated on the
2919 block stack. (The label is ignored.)
2920 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002921 Pops a variable number of entries from the *value* stack
2922 and re-raises the exception they specify. The number of
2923 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002924
2925 The block stack is unwound when an exception is raised:
2926 when a SETUP_FINALLY entry is found, the exception is pushed
2927 onto the value stack (and the exception condition is cleared),
2928 and the interpreter jumps to the label gotten from the block
2929 stack.
2930
2931 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002932 (The contents of the value stack is shown in [], with the top
2933 at the right; 'tb' is trace-back info, 'val' the exception's
2934 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002935
2936 Value stack Label Instruction Argument
2937 [] SETUP_EXCEPT L1
2938 [] <code for S>
2939 [] POP_BLOCK
2940 [] JUMP_FORWARD L0
2941
Guido van Rossum3f5da241990-12-20 15:06:42 +00002942 [tb, val, exc] L1: DUP )
2943 [tb, val, exc, exc] <evaluate E1> )
2944 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2945 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2946 [tb, val, exc, 1] POP )
2947 [tb, val, exc] POP
2948 [tb, val] <assign to V1> (or POP if no V1)
2949 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002950 [] <code for S1>
2951 JUMP_FORWARD L0
2952
Guido van Rossum3f5da241990-12-20 15:06:42 +00002953 [tb, val, exc, 0] L2: POP
2954 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002955 .............................etc.......................
2956
Guido van Rossum3f5da241990-12-20 15:06:42 +00002957 [tb, val, exc, 0] Ln+1: POP
2958 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002959
2960 [] L0: <next statement>
2961
2962 Of course, parts are not generated if Vi or Ei is not present.
2963*/
2964
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002965static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002966com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002967{
2968 int except_anchor = 0;
2969 int end_anchor = 0;
2970 int else_anchor = 0;
2971 int i;
2972 node *ch;
2973
2974 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2975 block_push(c, SETUP_EXCEPT);
2976 com_node(c, CHILD(n, 2));
2977 com_addbyte(c, POP_BLOCK);
2978 block_pop(c, SETUP_EXCEPT);
2979 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2980 com_backpatch(c, except_anchor);
2981 for (i = 3;
2982 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2983 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002984 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002985 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002986 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002987 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002988 break;
2989 }
2990 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002991 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002992 com_addoparg(c, SET_LINENO, ch->n_lineno);
2993 if (NCH(ch) > 1) {
2994 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002995 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002996 com_node(c, CHILD(ch, 1));
2997 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002998 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002999 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3000 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003001 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003002 }
3003 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003004 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003005 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003006 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003007 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003008 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003009 com_pop(c, 1);
3010 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003011 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 com_node(c, CHILD(n, i+2));
3014 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3015 if (except_anchor) {
3016 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003017 /* We come in with [tb, val, exc, 0] on the
3018 stack; one pop and it's the same as
3019 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003020 com_addbyte(c, POP_TOP);
3021 }
3022 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003023 /* We actually come in here with [tb, val, exc] but the
3024 END_FINALLY will zap those and jump around.
3025 The c_stacklevel does not reflect them so we need not pop
3026 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003027 com_addbyte(c, END_FINALLY);
3028 com_backpatch(c, else_anchor);
3029 if (i < NCH(n))
3030 com_node(c, CHILD(n, i+2));
3031 com_backpatch(c, end_anchor);
3032}
3033
3034static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003035com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003036{
3037 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003038 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003039
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003040 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3041 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003042 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003043 com_addbyte(c, POP_BLOCK);
3044 block_pop(c, SETUP_FINALLY);
3045 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003046 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003047 /* While the generated code pushes only one item,
3048 the try-finally handling can enter here with
3049 up to three items. OK, here are the details:
3050 3 for an exception, 2 for RETURN, 1 for BREAK. */
3051 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003052 com_backpatch(c, finally_anchor);
3053 ch = CHILD(n, NCH(n)-1);
3054 com_addoparg(c, SET_LINENO, ch->n_lineno);
3055 com_node(c, ch);
3056 com_addbyte(c, END_FINALLY);
3057 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003058 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003059}
3060
3061static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003062com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003063{
3064 REQ(n, try_stmt);
3065 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3066 | 'try' ':' suite 'finally' ':' suite */
3067 if (TYPE(CHILD(n, 3)) != except_clause)
3068 com_try_finally(c, n);
3069 else
3070 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003071}
3072
Guido van Rossum8b993a91997-01-17 21:04:03 +00003073static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003074get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003075{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003076 int i;
3077
Guido van Rossum8b993a91997-01-17 21:04:03 +00003078 /* Label to avoid tail recursion */
3079 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003080 switch (TYPE(n)) {
3081
3082 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003083 if (NCH(n) == 1) {
3084 n = CHILD(n, 0);
3085 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003086 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003087 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003088 case file_input:
3089 for (i = 0; i < NCH(n); i++) {
3090 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003091 if (TYPE(ch) == stmt) {
3092 n = ch;
3093 goto next;
3094 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003095 }
3096 break;
3097
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003098 case stmt:
3099 case simple_stmt:
3100 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003101 n = CHILD(n, 0);
3102 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003103
3104 case expr_stmt:
3105 case testlist:
3106 case test:
3107 case and_test:
3108 case not_test:
3109 case comparison:
3110 case expr:
3111 case xor_expr:
3112 case and_expr:
3113 case shift_expr:
3114 case arith_expr:
3115 case term:
3116 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003117 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003118 if (NCH(n) == 1) {
3119 n = CHILD(n, 0);
3120 goto next;
3121 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003122 break;
3123
3124 case atom:
3125 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003126 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003127 break;
3128
3129 }
3130 return NULL;
3131}
3132
Guido van Rossum79f25d91997-04-29 20:08:16 +00003133static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003134get_docstring(node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003135{
Guido van Rossum541563e1999-01-28 15:08:09 +00003136 /* Don't generate doc-strings if run with -OO */
3137 if (Py_OptimizeFlag > 1)
3138 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003139 n = get_rawdocstring(n);
3140 if (n == NULL)
3141 return NULL;
3142 return parsestrplus(n);
3143}
3144
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003145static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003146com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003147{
3148 REQ(n, suite);
3149 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3150 if (NCH(n) == 1) {
3151 com_node(c, CHILD(n, 0));
3152 }
3153 else {
3154 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003155 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003156 node *ch = CHILD(n, i);
3157 if (TYPE(ch) == stmt)
3158 com_node(c, ch);
3159 }
3160 }
3161}
3162
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003163/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003164static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003165com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003166{
3167 int i = c->c_nblocks;
3168 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3169 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3170 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003171 else if (i <= 0) {
3172 /* at the outer level */
3173 com_error(c, PyExc_SyntaxError,
3174 "'continue' not properly in loop");
3175 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003176 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003177 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003178 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003179 if (c->c_block[j] == SETUP_LOOP)
3180 break;
3181 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003182 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003183 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003184 for (; i > j; --i) {
3185 if (c->c_block[i] == SETUP_EXCEPT ||
3186 c->c_block[i] == SETUP_FINALLY) {
3187 com_addoparg(c, CONTINUE_LOOP,
3188 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003189 return;
3190 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003191 if (c->c_block[i] == END_FINALLY) {
3192 com_error(c, PyExc_SyntaxError,
3193 "'continue' not supported inside 'finally' clause");
3194 return;
3195 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003196 }
3197 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003198 com_error(c, PyExc_SyntaxError,
3199 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003200 }
3201 /* XXX Could allow it inside a 'finally' clause
3202 XXX if we could pop the exception still on the stack */
3203}
3204
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003205static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003206com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003207{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003208 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003209 if (TYPE(n) == lambdef) {
3210 /* lambdef: 'lambda' [varargslist] ':' test */
3211 n = CHILD(n, 1);
3212 }
3213 else {
3214 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3215 n = CHILD(n, 2);
3216 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3217 n = CHILD(n, 1);
3218 }
3219 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003220 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003221 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003222 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003223 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3224 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003225 nargs = 0;
3226 ndefs = 0;
3227 for (i = 0; i < nch; i++) {
3228 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003229 if (TYPE(CHILD(n, i)) == STAR ||
3230 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003231 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003232 nargs++;
3233 i++;
3234 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003235 t = RPAR; /* Anything except EQUAL or COMMA */
3236 else
3237 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003238 if (t == EQUAL) {
3239 i++;
3240 ndefs++;
3241 com_node(c, CHILD(n, i));
3242 i++;
3243 if (i >= nch)
3244 break;
3245 t = TYPE(CHILD(n, i));
3246 }
3247 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003248 /* Treat "(a=1, b)" as an error */
3249 if (ndefs)
3250 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003251 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003252 }
3253 if (t != COMMA)
3254 break;
3255 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003256 return ndefs;
3257}
3258
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003259static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003260com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003261{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003262 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003263 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003264 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003265 ndefs = com_argdefs(c, n);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003266 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3267 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003268 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003269 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003270 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003271 c->c_errors++;
3272 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003273 int closure = com_make_closure(c, (PyCodeObject *)co);
3274 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003275 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003276 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003277 if (closure)
3278 com_addoparg(c, MAKE_CLOSURE, ndefs);
3279 else
3280 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003281 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003282 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003283 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003284 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003285 }
3286}
3287
3288static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003289com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003290{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003291 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003292 REQ(n, testlist);
3293 /* testlist: test (',' test)* [','] */
3294 for (i = 0; i < NCH(n); i += 2)
3295 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003296 i = (NCH(n)+1) / 2;
3297 com_addoparg(c, BUILD_TUPLE, i);
3298 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003299}
3300
3301static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003302com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003303{
Guido van Rossum25831651993-05-19 14:50:45 +00003304 int i;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003305 PyObject *co, *v;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003306 char *name;
3307
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003308 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003309 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003310 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003311 c->c_errors++;
3312 return;
3313 }
3314 /* Push the class name on the stack */
3315 i = com_addconst(c, v);
3316 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003317 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003318 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003319 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003320 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003321 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003322 com_push(c, 1);
3323 }
Guido van Rossum25831651993-05-19 14:50:45 +00003324 else
3325 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003326 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003327 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003328 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003329 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003330 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003331 c->c_errors++;
3332 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003333 int closure = com_make_closure(c, (PyCodeObject *)co);
3334 i = com_addconst(c, co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003335 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003336 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003337 if (closure)
3338 com_addoparg(c, MAKE_CLOSURE, 0);
3339 else
3340 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003341 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003342 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003343 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003344 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003345 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003346 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003347}
3348
3349static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003350com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003351{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003352 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003353 if (c->c_errors)
3354 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003355 switch (TYPE(n)) {
3356
3357 /* Definition nodes */
3358
3359 case funcdef:
3360 com_funcdef(c, n);
3361 break;
3362 case classdef:
3363 com_classdef(c, n);
3364 break;
3365
3366 /* Trivial parse tree nodes */
3367
3368 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003369 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003370 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003371 n = CHILD(n, 0);
3372 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003373
3374 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003375 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
3376 com_addoparg(c, SET_LINENO, n->n_lineno);
3377 {
3378 int i;
3379 for (i = 0; i < NCH(n)-1; i += 2)
3380 com_node(c, CHILD(n, i));
3381 }
3382 break;
3383
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003384 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003385 com_addoparg(c, SET_LINENO, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003386 n = CHILD(n, 0);
3387 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003388
3389 /* Statement nodes */
3390
3391 case expr_stmt:
3392 com_expr_stmt(c, n);
3393 break;
3394 case print_stmt:
3395 com_print_stmt(c, n);
3396 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003397 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003398 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003399 break;
3400 case pass_stmt:
3401 break;
3402 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003403 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003404 com_error(c, PyExc_SyntaxError,
3405 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003406 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003407 com_addbyte(c, BREAK_LOOP);
3408 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003409 case continue_stmt:
3410 com_continue_stmt(c, n);
3411 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003412 case return_stmt:
3413 com_return_stmt(c, n);
3414 break;
3415 case raise_stmt:
3416 com_raise_stmt(c, n);
3417 break;
3418 case import_stmt:
3419 com_import_stmt(c, n);
3420 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003421 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003422 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003423 case exec_stmt:
3424 com_exec_stmt(c, n);
3425 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003426 case assert_stmt:
3427 com_assert_stmt(c, n);
3428 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003429 case if_stmt:
3430 com_if_stmt(c, n);
3431 break;
3432 case while_stmt:
3433 com_while_stmt(c, n);
3434 break;
3435 case for_stmt:
3436 com_for_stmt(c, n);
3437 break;
3438 case try_stmt:
3439 com_try_stmt(c, n);
3440 break;
3441 case suite:
3442 com_suite(c, n);
3443 break;
3444
3445 /* Expression nodes */
3446
3447 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003448 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003449 break;
3450 case test:
3451 com_test(c, n);
3452 break;
3453 case and_test:
3454 com_and_test(c, n);
3455 break;
3456 case not_test:
3457 com_not_test(c, n);
3458 break;
3459 case comparison:
3460 com_comparison(c, n);
3461 break;
3462 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003463 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003464 break;
3465 case expr:
3466 com_expr(c, n);
3467 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003468 case xor_expr:
3469 com_xor_expr(c, n);
3470 break;
3471 case and_expr:
3472 com_and_expr(c, n);
3473 break;
3474 case shift_expr:
3475 com_shift_expr(c, n);
3476 break;
3477 case arith_expr:
3478 com_arith_expr(c, n);
3479 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003480 case term:
3481 com_term(c, n);
3482 break;
3483 case factor:
3484 com_factor(c, n);
3485 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003486 case power:
3487 com_power(c, n);
3488 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003489 case atom:
3490 com_atom(c, n);
3491 break;
3492
3493 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003494 com_error(c, PyExc_SystemError,
3495 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003496 }
3497}
3498
Tim Petersdbd9ba62000-07-09 03:09:57 +00003499static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003500
3501static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003502com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003503{
3504 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3505 if (TYPE(CHILD(n, 0)) == LPAR)
3506 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003507 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003508 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003509 com_pop(c, 1);
3510 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003511}
3512
3513static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003514com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003515{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003516 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003517 if (NCH(n) == 1) {
3518 com_fpdef(c, CHILD(n, 0));
3519 }
3520 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003521 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003522 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003523 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003524 for (i = 0; i < NCH(n); i += 2)
3525 com_fpdef(c, CHILD(n, i));
3526 }
3527}
3528
3529static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003530com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003531{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003532 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003533 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003534 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003535 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003536 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003537 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003538 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003539 /* Enter all arguments in table of locals */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003540 for (i = 0, narg = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003541 node *ch = CHILD(n, i);
3542 node *fp;
3543 char *name;
Guido van Rossum50564e81996-01-12 01:13:16 +00003544 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003545 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003546 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3547 fp = CHILD(ch, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003548 if (TYPE(fp) == NAME) {
3549 PyObject *v;
3550 name = STR(fp);
3551 v = PyDict_GetItemString(c->c_cellvars, name);
3552 if (v) {
3553 com_addoparg(c, LOAD_FAST, narg);
3554 com_addoparg(c, STORE_DEREF,
3555 PyInt_AS_LONG(v));
3556 }
3557 } else {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003558 name = nbuf;
3559 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003560 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003561 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003562 narg++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003563 /* all name updates handled by symtable */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003564 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003565 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003566 ch = CHILD(n, i);
3567 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003568 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003569 else
3570 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003571 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003572 /* Handle *arguments */
3573 if (i < nch) {
3574 node *ch;
3575 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003576 if (TYPE(ch) != DOUBLESTAR) {
3577 REQ(ch, STAR);
3578 ch = CHILD(n, i+1);
3579 if (TYPE(ch) == NAME) {
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003580 PyObject *v;
Guido van Rossum50564e81996-01-12 01:13:16 +00003581 i += 3;
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003582 v = PyDict_GetItemString(c->c_cellvars,
3583 STR(ch));
3584 if (v) {
3585 com_addoparg(c, LOAD_FAST, narg);
3586 com_addoparg(c, STORE_DEREF,
3587 PyInt_AS_LONG(v));
Guido van Rossum50564e81996-01-12 01:13:16 +00003588 }
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003589 narg++;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003590 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003591 }
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003592 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003593 /* Handle **keywords */
3594 if (i < nch) {
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003595 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003596 node *ch;
3597 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003598 if (TYPE(ch) != DOUBLESTAR) {
3599 REQ(ch, STAR);
3600 ch = CHILD(n, i+1);
3601 REQ(ch, STAR);
3602 ch = CHILD(n, i+2);
3603 }
3604 else
3605 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003606 REQ(ch, NAME);
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003607 v = PyDict_GetItemString(c->c_cellvars, STR(ch));
3608 if (v) {
3609 com_addoparg(c, LOAD_FAST, narg);
3610 com_addoparg(c, STORE_DEREF, PyInt_AS_LONG(v));
3611 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003612 }
3613 if (complex) {
3614 /* Generate code for complex arguments only after
3615 having counted the simple arguments */
3616 int ilocal = 0;
3617 for (i = 0; i < nch; i++) {
3618 node *ch = CHILD(n, i);
3619 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003620 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003621 break;
3622 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3623 fp = CHILD(ch, 0);
3624 if (TYPE(fp) != NAME) {
3625 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003626 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003627 com_fpdef(c, ch);
3628 }
3629 ilocal++;
3630 if (++i >= nch)
3631 break;
3632 ch = CHILD(n, i);
3633 if (TYPE(ch) == EQUAL)
3634 i += 2;
3635 else
3636 REQ(ch, COMMA);
3637 }
3638 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003639}
3640
3641static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003642com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003643{
3644 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003645 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003646 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003647 doc = get_docstring(n);
3648 if (doc != NULL) {
3649 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003650 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003651 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003652 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003653 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003654 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003655 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003656 for (i = 0; i < NCH(n); i++) {
3657 node *ch = CHILD(n, i);
3658 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3659 com_node(c, ch);
3660 }
3661}
3662
3663/* Top-level compile-node interface */
3664
3665static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003666compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003667{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003668 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003669 node *ch;
3670 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003671 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003672 doc = get_docstring(CHILD(n, 4));
3673 if (doc != NULL) {
3674 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003675 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003676 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003677 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003678 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003679 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3680 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003681 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003682 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003683 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003684 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003685 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003686 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003687 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003688 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003689 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003690}
3691
3692static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003693compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003694{
Guido van Rossum590baa41993-11-30 13:40:46 +00003695 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003696 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003697 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003698
3699 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003700 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003701 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003702 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003703 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003704 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003705 else
3706 ch = CHILD(n, 2);
3707 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003708 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003709 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003710}
3711
3712static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003713compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003714{
3715 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003716 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003717 REQ(n, classdef);
3718 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3719 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003720 c->c_private = c->c_name;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003721 ch = CHILD(n, NCH(n)-1); /* The suite */
3722 doc = get_docstring(ch);
3723 if (doc != NULL) {
3724 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003725 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003726 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003727 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003728 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003729 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003730 }
3731 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003732 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003733 com_node(c, ch);
3734 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003735 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003736 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003737 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003738}
3739
3740static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003741compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003742{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003743 com_addoparg(c, SET_LINENO, n->n_lineno);
3744
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003745 switch (TYPE(n)) {
3746
Guido van Rossum4c417781991-01-21 16:09:22 +00003747 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003748 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003749 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003750 n = CHILD(n, 0);
3751 if (TYPE(n) != NEWLINE)
3752 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003753 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003754 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003755 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003756 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003757 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003758 break;
3759
Guido van Rossum4c417781991-01-21 16:09:22 +00003760 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003761 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003762 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003763 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003764 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003765 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003766 break;
3767
Guido van Rossum590baa41993-11-30 13:40:46 +00003768 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003769 com_node(c, CHILD(n, 0));
3770 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003771 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003772 break;
3773
Guido van Rossum590baa41993-11-30 13:40:46 +00003774 case lambdef: /* anonymous function definition */
3775 compile_lambdef(c, n);
3776 break;
3777
Guido van Rossum4c417781991-01-21 16:09:22 +00003778 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003779 compile_funcdef(c, n);
3780 break;
3781
Guido van Rossum4c417781991-01-21 16:09:22 +00003782 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003783 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003784 break;
3785
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003786 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003787 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003788 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003789 }
3790}
3791
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003792static PyObject *
3793dict_keys_inorder(PyObject *dict, int offset)
3794{
3795 PyObject *tuple, *k, *v;
3796 int i, pos = 0, size = PyDict_Size(dict);
3797
3798 tuple = PyTuple_New(size);
3799 if (tuple == NULL)
3800 return NULL;
3801 while (PyDict_Next(dict, &pos, &k, &v)) {
3802 i = PyInt_AS_LONG(v);
3803 Py_INCREF(k);
3804 PyTuple_SET_ITEM(tuple, i - offset, k);
3805 }
3806 return tuple;
3807}
3808
Guido van Rossum79f25d91997-04-29 20:08:16 +00003809PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003810PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003811{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003812 return jcompile(n, filename, NULL);
3813}
3814
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003815struct symtable *
3816PyNode_CompileSymtable(node *n, char *filename)
3817{
3818 struct symtable *st;
3819
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003820 st = symtable_init();
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003821 if (st == NULL)
3822 return NULL;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00003823 assert(st->st_symbols != NULL);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003824 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
3825 if (st->st_errors > 0) {
3826 PySymtable_Free(st);
3827 return NULL;
3828 }
3829 symtable_node(st, n);
3830 if (st->st_errors > 0) {
3831 PySymtable_Free(st);
3832 return NULL;
3833 }
3834 return st;
3835}
3836
Guido van Rossum79f25d91997-04-29 20:08:16 +00003837static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003838icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003839{
3840 return jcompile(n, base->c_filename, base);
3841}
3842
Guido van Rossum79f25d91997-04-29 20:08:16 +00003843static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003844jcompile(node *n, char *filename, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003845{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003846 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003847 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003848 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003849 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003850 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003851 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003852 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003853 /* c_symtable still points to parent's symbols */
3854 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003855 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003856 sc.c_nested = 1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003857 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003858 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00003859 sc.c_future = PyNode_Future(n, filename);
3860 if (sc.c_future == NULL || symtable_build(&sc, n) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003861 com_free(&sc);
3862 return NULL;
3863 }
3864 }
3865 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003866 if (symtable_load_symbols(&sc) < 0) {
3867 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003868 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003869 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003870 compile_node(&sc, n);
3871 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00003872 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003873 PyObject *consts, *names, *varnames, *filename, *name,
3874 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003875 consts = PyList_AsTuple(sc.c_consts);
3876 names = PyList_AsTuple(sc.c_names);
3877 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003878 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
3879 freevars = dict_keys_inorder(sc.c_freevars,
3880 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003881 filename = PyString_InternFromString(sc.c_filename);
3882 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003883 if (!PyErr_Occurred())
3884 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003885 sc.c_nlocals,
3886 sc.c_maxstacklevel,
3887 sc.c_flags,
3888 sc.c_code,
3889 consts,
3890 names,
3891 varnames,
3892 freevars,
3893 cellvars,
3894 filename,
3895 name,
3896 sc.c_firstlineno,
3897 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003898 Py_XDECREF(consts);
3899 Py_XDECREF(names);
3900 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003901 Py_XDECREF(freevars);
3902 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003903 Py_XDECREF(filename);
3904 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003905 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00003906 else if (!PyErr_Occurred()) {
3907 /* This could happen if someone called PyErr_Clear() after an
3908 error was reported above. That's not supposed to happen,
3909 but I just plugged one case and I'm not sure there can't be
3910 others. In that case, raise SystemError so that at least
3911 it gets reported instead dumping core. */
3912 PyErr_SetString(PyExc_SystemError, "lost syntax error");
3913 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003914 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00003915 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003916 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00003917 sc.c_symtable = NULL;
3918 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003919 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003920 return co;
3921}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003922
3923int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003924PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003925{
3926 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003927 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003928 int line = co->co_firstlineno;
3929 int addr = 0;
3930 while (--size >= 0) {
3931 addr += *p++;
3932 if (addr > addrq)
3933 break;
3934 line += *p++;
3935 }
3936 return line;
3937}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003938
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003939/* The test for LOCAL must come before the test for FREE in order to
3940 handle classes where name is both local and free. The local var is
3941 a method and the free var is a free var referenced within a method.
3942*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003943
3944static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003945get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003946{
3947 PyObject *v;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00003948 if (c->c_symtable->st_nested_scopes) {
3949 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
3950 return CELL;
3951 if (PyDict_GetItemString(c->c_locals, name) != NULL)
3952 return LOCAL;
3953 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
3954 return FREE;
3955 v = PyDict_GetItemString(c->c_globals, name);
3956 if (v) {
3957 if (v == Py_None)
3958 return GLOBAL_EXPLICIT;
3959 else {
3960 return GLOBAL_IMPLICIT;
3961 }
3962 }
3963 } else {
3964 if (PyDict_GetItemString(c->c_locals, name) != NULL)
3965 return LOCAL;
3966 v = PyDict_GetItemString(c->c_globals, name);
3967 if (v) {
3968 if (v == Py_None)
3969 return GLOBAL_EXPLICIT;
3970 else {
3971 return GLOBAL_IMPLICIT;
3972 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003973 }
3974 }
3975 {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003976 char buf[350];
3977 sprintf(buf,
3978 "unknown scope for %.100s in %.100s(%s) in %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00003979 name, c->c_name,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003980 PyObject_REPR(c->c_symtable->st_cur->ste_id),
3981 c->c_filename);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003982 Py_FatalError(buf);
3983 }
3984 return -1; /* can't get here */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003985}
3986
Guido van Rossumee34ac12001-02-28 22:08:12 +00003987/* Helper function to issue symbol table warnings */
3988
Jeremy Hylton4419ac12001-02-28 22:54:51 +00003989static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00003990symtable_warn(struct symtable *st, char *msg)
3991{
3992 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, st->st_filename,
3993 st->st_cur->ste_lineno, NULL, NULL) < 0) {
3994 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
3995 PyErr_SetString(PyExc_SyntaxError, msg);
3996 PyErr_SyntaxLocation(st->st_filename,
3997 st->st_cur->ste_lineno);
3998 }
3999 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004000 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004001 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004002 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004003}
4004
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004005/* Helper function for setting lineno and filename */
4006
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004007static int
4008symtable_build(struct compiling *c, node *n)
4009{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004010 if ((c->c_symtable = symtable_init()) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004011 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004012 c->c_symtable->st_future = c->c_future;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004013 if (c->c_future->ff_nested_scopes)
4014 c->c_symtable->st_nested_scopes = 1;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004015 c->c_symtable->st_filename = c->c_filename;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004016 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
4017 if (c->c_symtable->st_errors > 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004018 return -1;
4019 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004020 if (c->c_symtable->st_errors > 0)
4021 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004022 /* reset for second pass */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004023 c->c_symtable->st_nscopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004024 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004025 return 0;
4026}
4027
4028static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004029symtable_init_compiling_symbols(struct compiling *c)
4030{
4031 PyObject *varnames;
4032
4033 varnames = c->c_symtable->st_cur->ste_varnames;
4034 if (varnames == NULL) {
4035 varnames = PyList_New(0);
4036 if (varnames == NULL)
4037 return -1;
4038 c->c_symtable->st_cur->ste_varnames = varnames;
4039 Py_INCREF(varnames);
4040 } else
4041 Py_INCREF(varnames);
4042 c->c_varnames = varnames;
4043
4044 c->c_globals = PyDict_New();
4045 if (c->c_globals == NULL)
4046 return -1;
4047 c->c_freevars = PyDict_New();
4048 if (c->c_freevars == NULL)
4049 return -1;
4050 c->c_cellvars = PyDict_New();
4051 if (c->c_cellvars == NULL)
4052 return -1;
4053 return 0;
4054}
4055
4056struct symbol_info {
4057 int si_nlocals;
4058 int si_ncells;
4059 int si_nfrees;
4060 int si_nimplicit;
4061};
4062
4063static void
4064symtable_init_info(struct symbol_info *si)
4065{
4066 si->si_nlocals = 0;
4067 si->si_ncells = 0;
4068 si->si_nfrees = 0;
4069 si->si_nimplicit = 0;
4070}
4071
4072static int
4073symtable_resolve_free(struct compiling *c, PyObject *name,
4074 struct symbol_info *si)
4075{
4076 PyObject *dict, *v;
4077
4078 /* Seperate logic for DEF_FREE. If it occurs in a function,
4079 it indicates a local that we must allocate storage for (a
4080 cell var). If it occurs in a class, then the class has a
4081 method and a free variable with the same name.
4082 */
4083
4084 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
4085 v = PyInt_FromLong(si->si_ncells++);
4086 dict = c->c_cellvars;
4087 } else {
4088 v = PyInt_FromLong(si->si_nfrees++);
4089 dict = c->c_freevars;
4090 }
4091 if (v == NULL)
4092 return -1;
4093 if (PyDict_SetItem(dict, name, v) < 0) {
4094 Py_DECREF(v);
4095 return -1;
4096 }
4097 Py_DECREF(v);
4098 return 0;
4099}
4100
4101static int
4102symtable_freevar_offsets(PyObject *freevars, int offset)
4103{
4104 PyObject *name, *v;
4105 int pos;
4106
4107 /* The cell vars are the first elements of the closure,
4108 followed by the free vars. Update the offsets in
4109 c_freevars to account for number of cellvars. */
4110 pos = 0;
4111 while (PyDict_Next(freevars, &pos, &name, &v)) {
4112 int i = PyInt_AS_LONG(v) + offset;
4113 PyObject *o = PyInt_FromLong(i);
4114 if (o == NULL)
4115 return -1;
4116 if (PyDict_SetItem(freevars, name, o) < 0) {
4117 Py_DECREF(o);
4118 return -1;
4119 }
4120 Py_DECREF(o);
4121 }
4122 return 0;
4123}
4124
4125static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004126symtable_check_unoptimized(struct compiling *c,
4127 PySymtableEntryObject *ste,
4128 struct symbol_info *si)
4129{
4130 char buf[300];
4131
4132 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4133 || (ste->ste_nested && si->si_nimplicit)))
4134 return 0;
4135
4136#define ILLEGAL_IMPORT_STAR \
4137"import * is not allowed in function '%.100s' " \
4138"because it contains a nested function with free variables"
4139
4140#define ILLEGAL_BARE_EXEC \
4141"unqualified exec is not allowed in function '%.100s' " \
4142"because it contains a nested function with free variables"
4143
4144#define ILLEGAL_EXEC_AND_IMPORT_STAR \
4145"function '%.100s' uses import * and bare exec, which are illegal" \
4146"because it contains a nested function with free variables"
4147
4148 /* XXX perhaps the linenos for these opt-breaking statements
4149 should be stored so the exception can point to them. */
4150
4151 if (ste->ste_optimized == OPT_IMPORT_STAR)
4152 sprintf(buf, ILLEGAL_IMPORT_STAR,
4153 PyString_AS_STRING(ste->ste_name));
4154 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
4155 sprintf(buf, ILLEGAL_BARE_EXEC,
4156 PyString_AS_STRING(ste->ste_name));
4157 else {
4158 sprintf(buf, ILLEGAL_EXEC_AND_IMPORT_STAR,
4159 PyString_AS_STRING(ste->ste_name));
4160 }
4161
4162 if (c->c_symtable->st_nested_scopes) {
4163 PyErr_SetString(PyExc_SyntaxError, buf);
4164 PyErr_SyntaxLocation(c->c_symtable->st_filename,
4165 ste->ste_lineno);
4166 return -1;
4167 } else {
4168 /* XXX if the warning becomes an exception, we should
4169 attached more info to it. */
4170 if (PyErr_Warn(PyExc_SyntaxWarning, buf) < 0)
4171 return -1;
4172 }
4173 return 0;
4174}
4175
4176static int
4177symtable_check_shadow(struct symtable *st, PyObject *name, int flags)
4178{
4179 char buf[500];
4180 PyObject *children, *v;
Jeremy Hyltonc1761322001-02-28 23:44:45 +00004181 PySymtableEntryObject *child = NULL;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004182 int i;
4183
4184 if (!(flags & DEF_BOUND))
4185 return 0;
4186 /* The semantics of this code will change with nested scopes.
4187 It is defined in the current scope and referenced in a
4188 child scope. Under the old rules, the child will see a
4189 global. Under the new rules, the child will see the
4190 binding in the current scope.
4191 */
4192
4193 /* Find name of child function that has free variable */
4194 children = st->st_cur->ste_children;
4195 for (i = 0; i < PyList_GET_SIZE(children); i++) {
4196 int cflags;
4197 child = (PySymtableEntryObject *)PyList_GET_ITEM(children, i);
4198 v = PyDict_GetItem(child->ste_symbols, name);
4199 if (v == NULL)
4200 continue;
4201 cflags = PyInt_AS_LONG(v);
4202 if (!(cflags & DEF_BOUND))
4203 break;
4204 }
Jeremy Hyltonc1761322001-02-28 23:44:45 +00004205
4206 assert(child != NULL);
4207
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004208 sprintf(buf, "local name '%.100s' in '%.100s' shadows "
4209 "use of '%.100s' as global in nested scope '%.100s'",
4210 PyString_AS_STRING(name),
4211 PyString_AS_STRING(st->st_cur->ste_name),
4212 PyString_AS_STRING(name),
4213 PyString_AS_STRING(child->ste_name)
4214 );
4215
4216 return symtable_warn(st, buf);
4217}
4218
4219static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004220symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4221 struct symbol_info *si)
4222{
4223 if (ste->ste_type != TYPE_MODULE)
4224 c->c_flags |= CO_NEWLOCALS;
4225 if (ste->ste_type == TYPE_FUNCTION) {
4226 c->c_nlocals = si->si_nlocals;
4227 if (ste->ste_optimized == 0)
4228 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004229 else if (ste->ste_optimized != OPT_EXEC)
4230 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004231 }
4232 return 0;
4233}
4234
4235static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004236symtable_load_symbols(struct compiling *c)
4237{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004238 static PyObject *implicit = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004239 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004240 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004241 PyObject *name, *varnames, *v;
4242 int i, flags, pos;
4243 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004244
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004245 if (implicit == NULL) {
4246 implicit = PyInt_FromLong(1);
4247 if (implicit == NULL)
4248 return -1;
4249 }
4250 v = NULL;
4251
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004252 if (symtable_init_compiling_symbols(c) < 0)
4253 goto fail;
4254 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004255 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004256 si.si_nlocals = PyList_GET_SIZE(varnames);
4257 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004258
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004259 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004260 v = PyInt_FromLong(i);
4261 if (PyDict_SetItem(c->c_locals,
4262 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004263 goto fail;
4264 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004265 }
4266
4267 /* XXX The cases below define the rules for whether a name is
4268 local or global. The logic could probably be clearer. */
4269 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004270 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4271 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004272
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004273 if (st->st_nested_scopes == 0
4274 && (flags & (DEF_FREE | DEF_FREE_CLASS))) {
4275 if (symtable_check_shadow(st, name, flags) < 0)
4276 goto fail;
4277 }
4278
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004279 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004280 /* undo the original DEF_FREE */
4281 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004282
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004283 if ((flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004284 && (flags & (DEF_LOCAL | DEF_PARAM)))
4285 symtable_resolve_free(c, name, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004286
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004287 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004288 c->c_argcount--;
4289 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004290 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004291 c->c_argcount--;
4292 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004293 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004294 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004295 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004296 if (flags & DEF_PARAM) {
4297 PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004298 PyString_AS_STRING(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004299 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004300 ste->ste_lineno);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004301 st->st_errors++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004302 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004303 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004304 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4305 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004306 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004307 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004308 if (PyDict_SetItem(c->c_globals, name, implicit) < 0)
4309 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004310 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004311 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004312 if (v == NULL)
4313 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004314 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004315 goto fail;
4316 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004317 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004318 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004319 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004320 } else if (is_free(flags)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004321 if (ste->ste_nested && st->st_nested_scopes) {
4322 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004323 if (v == NULL)
4324 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004325 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004326 goto fail;
4327 Py_DECREF(v);
4328 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004329 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004330 if (PyDict_SetItem(c->c_globals, name,
4331 implicit) < 0)
4332 goto fail;
Jeremy Hyltonc1761322001-02-28 23:44:45 +00004333 v = PyInt_FromLong(flags);
4334 if (PyDict_SetItem(st->st_global, name, v))
4335 goto fail;
4336 Py_DECREF(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004337 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004338 }
4339 }
4340
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004341 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4342 return -1;
4343 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004344 fail:
4345 /* is this always the right thing to do? */
4346 Py_XDECREF(v);
4347 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004348}
4349
4350static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004351symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004352{
4353 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004354
4355 st = (struct symtable *)PyMem_Malloc(sizeof(struct symtable));
4356 if (st == NULL)
4357 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004358 st->st_pass = 1;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004359 st->st_nested_scopes = NESTED_SCOPES_DEFAULT;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004360 st->st_filename = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004361 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004362 goto fail;
4363 if ((st->st_symbols = PyDict_New()) == NULL)
4364 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004365 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004366 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004367 st->st_errors = 0;
4368 st->st_tmpname = 0;
4369 st->st_private = NULL;
4370 return st;
4371 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004372 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004373 return NULL;
4374}
4375
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004376void
4377PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004378{
4379 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004380 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004381 Py_XDECREF(st->st_cur);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004382 PyMem_Free((void *)st);
4383}
4384
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004385/* When the compiler exits a scope, it must should update the scope's
4386 free variable information with the list of free variables in its
4387 children.
4388
4389 Variables that are free in children and defined in the current
4390 scope are cellvars.
4391
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004392 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004393 false), free variables in children that are not defined here are
4394 implicit globals.
4395
4396*/
4397
4398static int
4399symtable_update_free_vars(struct symtable *st)
4400{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004401 int i, j, def;
4402 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004403 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004404
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004405 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004406 def = DEF_FREE_CLASS;
4407 else
4408 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004409 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004410 int pos = 0;
4411
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004412 if (list)
4413 PyList_SetSlice(list, 0,
4414 ((PyVarObject*)list)->ob_size, 0);
Barry Warsaw0372af72001-02-23 18:22:59 +00004415 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004416 PyList_GET_ITEM(ste->ste_children, i);
4417 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004418 int v = PyInt_AS_LONG(o);
4419 if (!(is_free(v)))
4420 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004421 if (list == NULL) {
4422 list = PyList_New(0);
4423 if (list == NULL)
4424 return -1;
4425 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004426 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004427 if (PyList_Append(list, name) < 0) {
4428 Py_DECREF(list);
4429 return -1;
4430 }
4431 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004432/*
4433 if (st->st_nested_scopes == 0
4434 && list && PyList_GET_SIZE(list) > 0) {
4435 fprintf(stderr, "function %s has children with "
4436 "the following free vars:\n%s\n",
4437 PyString_AS_STRING(ste->ste_name),
4438 PyObject_REPR(list));
4439 continue;
4440 }
4441*/
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004442 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
4443 name = PyList_GET_ITEM(list, j);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004444 if (ste->ste_nested) {
4445 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004446 name, def) < 0) {
4447 Py_DECREF(list);
4448 return -1;
4449 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004450 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004451 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004452 name) < 0) {
4453 Py_DECREF(list);
4454 return -1;
4455 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004456 }
4457 }
4458 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004459
4460 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004461 return 0;
4462}
4463
4464/* If the current scope is a non-nested class or if name is not
4465 defined in the current, non-nested scope, then it is an implicit
4466 global in all nested scopes.
4467*/
4468
4469static int
4470symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
4471{
4472 PyObject *o;
4473 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004474 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004475
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004476 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004477 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004478 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004479 if (o == NULL)
4480 return symtable_undo_free(st, child, name);
4481 v = PyInt_AS_LONG(o);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004482 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004483 return symtable_undo_free(st, child, name);
4484 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004485 return symtable_add_def_o(st, ste->ste_symbols,
4486 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004487}
4488
4489static int
4490symtable_undo_free(struct symtable *st, PyObject *id,
4491 PyObject *name)
4492{
4493 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004494 PyObject *info;
4495 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004496
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004497 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
4498 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004499 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004500 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004501 if (info == NULL)
4502 return 0;
4503 v = PyInt_AS_LONG(info);
4504 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004505 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004506 DEF_FREE_GLOBAL) < 0)
4507 return -1;
4508 } else
4509 /* If the name is defined here or declared global,
4510 then the recursion stops. */
4511 return 0;
4512
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004513 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
4514 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00004515 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004516 PyList_GET_ITEM(ste->ste_children, i);
4517 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004518 if (x < 0)
4519 return x;
4520 }
4521 return 0;
4522}
4523
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004524/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
4525 This reference is released when the scope is exited, via the DECREF
4526 in symtable_exit_scope().
4527*/
4528
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004529static int
4530symtable_exit_scope(struct symtable *st)
4531{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004532 int end;
4533
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004534 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004535 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004536 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004537 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004538 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
4539 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004540 if (PySequence_DelItem(st->st_stack, end) < 0)
4541 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004542 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004543}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004544
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004545static void
4546symtable_enter_scope(struct symtable *st, char *name, int type,
4547 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004548{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004549 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004550
4551 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004552 prev = st->st_cur;
4553 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
4554 Py_DECREF(st->st_cur);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004555 st->st_errors++;
4556 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004557 }
4558 }
Barry Warsaw0372af72001-02-23 18:22:59 +00004559 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004560 PySymtableEntry_New(st, name, type, lineno);
4561 if (strcmp(name, TOP) == 0)
4562 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004563 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004564 if (PyList_Append(prev->ste_children,
4565 (PyObject *)st->st_cur) < 0)
4566 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004567 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004568}
4569
4570static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004571symtable_lookup(struct symtable *st, char *name)
4572{
4573 char buffer[MANGLE_LEN];
4574 PyObject *v;
4575 int flags;
4576
4577 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
4578 name = buffer;
4579 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
4580 if (v == NULL) {
4581 if (PyErr_Occurred())
4582 return -1;
4583 else
4584 return 0;
4585 }
4586
4587 flags = PyInt_AS_LONG(v);
4588 return flags;
4589}
4590
4591static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004592symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004593{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004594 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004595 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004596 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004597
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004598 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004599 name = buffer;
4600 if ((s = PyString_InternFromString(name)) == NULL)
4601 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004602 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
4603 Py_DECREF(s);
4604 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004605}
4606
4607/* Must only be called with mangled names */
4608
4609static int
4610symtable_add_def_o(struct symtable *st, PyObject *dict,
4611 PyObject *name, int flag)
4612{
4613 PyObject *o;
4614 int val;
4615
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004616 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004617 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004618 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004619 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00004620 PyString_AsString(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004621 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004622 st->st_cur->ste_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004623 return -1;
4624 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004625 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004626 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004627 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004628 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004629 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004630 Py_DECREF(o);
4631 return -1;
4632 }
4633 Py_DECREF(o);
4634
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004635 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004636 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004637 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004638 } else if (flag & DEF_GLOBAL) {
4639 /* XXX need to update DEF_GLOBAL for other flags too;
4640 perhaps only DEF_FREE_GLOBAL */
4641 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004642 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004643 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004644 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004645 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004646 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004647 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004648 Py_DECREF(o);
4649 return -1;
4650 }
4651 Py_DECREF(o);
4652 }
4653 return 0;
4654}
4655
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004656#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004657
4658static void
4659symtable_node(struct symtable *st, node *n)
4660{
4661 int i, start = 0;
4662
4663 loop:
4664 switch (TYPE(n)) {
4665 case funcdef: {
4666 char *func_name = STR(CHILD(n, 1));
4667 symtable_add_def(st, func_name, DEF_LOCAL);
4668 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004669 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004670 symtable_funcdef(st, n);
4671 symtable_exit_scope(st);
4672 break;
4673 }
4674 case lambdef:
4675 if (NCH(n) == 4)
4676 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004677 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004678 symtable_funcdef(st, n);
4679 symtable_exit_scope(st);
4680 break;
4681 case classdef: {
4682 char *tmp, *class_name = STR(CHILD(n, 1));
4683 symtable_add_def(st, class_name, DEF_LOCAL);
4684 if (TYPE(CHILD(n, 2)) == LPAR) {
4685 node *bases = CHILD(n, 3);
4686 int i;
4687 for (i = 0; i < NCH(bases); i += 2) {
4688 symtable_node(st, CHILD(bases, i));
4689 }
4690 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004691 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004692 tmp = st->st_private;
4693 st->st_private = class_name;
4694 symtable_node(st, CHILD(n, NCH(n) - 1));
4695 st->st_private = tmp;
4696 symtable_exit_scope(st);
4697 break;
4698 }
4699 case if_stmt:
4700 for (i = 0; i + 3 < NCH(n); i += 4) {
4701 if (is_constant_false(NULL, (CHILD(n, i + 1))))
4702 continue;
4703 symtable_node(st, CHILD(n, i + 1));
4704 symtable_node(st, CHILD(n, i + 3));
4705 }
4706 if (i + 2 < NCH(n))
4707 symtable_node(st, CHILD(n, i + 2));
4708 break;
4709 case global_stmt:
4710 symtable_global(st, n);
4711 break;
4712 case import_stmt:
4713 symtable_import(st, n);
4714 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004715 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004716 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004717 symtable_node(st, CHILD(n, 1));
4718 if (NCH(n) > 2)
4719 symtable_node(st, CHILD(n, 3));
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004720 else
4721 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004722 if (NCH(n) > 4)
4723 symtable_node(st, CHILD(n, 5));
4724 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004725
4726 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00004727 case assert_stmt:
4728 if (Py_OptimizeFlag)
4729 return;
4730 if (NCH(n) == 2) {
4731 n = CHILD(n, 1);
4732 goto loop;
4733 } else {
4734 symtable_node(st, CHILD(n, 1));
4735 n = CHILD(n, 3);
4736 goto loop;
4737 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004738 case except_clause:
4739 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004740 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004741 if (NCH(n) > 1) {
4742 n = CHILD(n, 1);
4743 goto loop;
4744 }
4745 break;
4746 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004747 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004748 break;
4749 case expr_stmt:
4750 if (NCH(n) == 1)
4751 n = CHILD(n, 0);
4752 else {
4753 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004754 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004755 symtable_node(st, CHILD(n, 2));
4756 break;
4757 } else {
4758 int i;
4759 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004760 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004761 n = CHILD(n, NCH(n) - 1);
4762 }
4763 }
4764 goto loop;
4765 /* watchout for fall-through logic below */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004766 case argument:
4767 if (NCH(n) == 3) {
4768 n = CHILD(n, 2);
4769 goto loop;
4770 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004771 case listmaker:
4772 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
4773 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton5f827f42001-01-23 01:26:20 +00004774 n = CHILD(n, 0);
4775 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004776 }
4777 case atom:
4778 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
4779 symtable_add_use(st, STR(CHILD(n, 0)));
4780 break;
4781 }
4782 case for_stmt:
4783 if (TYPE(n) == for_stmt) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004784 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004785 start = 3;
4786 }
4787 default:
4788 if (NCH(n) == 1) {
4789 n = CHILD(n, 0);
4790 goto loop;
4791 }
4792 for (i = start; i < NCH(n); ++i)
4793 if (TYPE(CHILD(n, i)) >= single_input)
4794 symtable_node(st, CHILD(n, i));
4795 }
4796}
4797
4798static void
4799symtable_funcdef(struct symtable *st, node *n)
4800{
4801 node *body;
4802
4803 if (TYPE(n) == lambdef) {
4804 if (NCH(n) == 4)
4805 symtable_params(st, CHILD(n, 1));
4806 } else
4807 symtable_params(st, CHILD(n, 2));
4808 body = CHILD(n, NCH(n) - 1);
4809 symtable_node(st, body);
4810}
4811
4812/* The next two functions parse the argument tuple.
4813 symtable_default_arg() checks for names in the default arguments,
4814 which are references in the defining scope. symtable_params()
4815 parses the parameter names, which are defined in the function's
4816 body.
4817
4818 varargslist:
4819 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
4820 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
4821*/
4822
4823static void
4824symtable_default_args(struct symtable *st, node *n)
4825{
4826 node *c;
4827 int i;
4828
4829 if (TYPE(n) == parameters) {
4830 n = CHILD(n, 1);
4831 if (TYPE(n) == RPAR)
4832 return;
4833 }
4834 REQ(n, varargslist);
4835 for (i = 0; i < NCH(n); i += 2) {
4836 c = CHILD(n, i);
4837 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
4838 break;
4839 }
4840 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
4841 symtable_node(st, CHILD(n, i));
4842 }
4843}
4844
4845static void
4846symtable_params(struct symtable *st, node *n)
4847{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004848 int i, complex = -1, ext = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004849 node *c = NULL;
4850
4851 if (TYPE(n) == parameters) {
4852 n = CHILD(n, 1);
4853 if (TYPE(n) == RPAR)
4854 return;
4855 }
4856 REQ(n, varargslist);
4857 for (i = 0; i < NCH(n); i += 2) {
4858 c = CHILD(n, i);
4859 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
4860 ext = 1;
4861 break;
4862 }
4863 if (TYPE(c) == test) {
4864 continue;
4865 }
4866 if (TYPE(CHILD(c, 0)) == NAME)
4867 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
4868 else {
4869 char nbuf[10];
4870 sprintf(nbuf, ".%d", i);
4871 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004872 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004873 }
4874 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004875 if (ext) {
4876 c = CHILD(n, i);
4877 if (TYPE(c) == STAR) {
4878 i++;
4879 symtable_add_def(st, STR(CHILD(n, i)),
4880 DEF_PARAM | DEF_STAR);
4881 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00004882 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004883 c = NULL;
4884 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004885 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004886 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004887 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004888 i++;
4889 symtable_add_def(st, STR(CHILD(n, i)),
4890 DEF_PARAM | DEF_DOUBLESTAR);
4891 }
4892 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004893 if (complex >= 0) {
4894 int j;
4895 for (j = 0; j <= complex; j++) {
4896 c = CHILD(n, j);
4897 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00004898 c = CHILD(n, ++j);
4899 else if (TYPE(c) == EQUAL)
4900 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004901 if (TYPE(CHILD(c, 0)) == LPAR)
4902 symtable_params_fplist(st, CHILD(c, 1));
4903 }
4904 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004905}
4906
4907static void
4908symtable_params_fplist(struct symtable *st, node *n)
4909{
4910 int i;
4911 node *c;
4912
4913 REQ(n, fplist);
4914 for (i = 0; i < NCH(n); i += 2) {
4915 c = CHILD(n, i);
4916 REQ(c, fpdef);
4917 if (NCH(c) == 1)
4918 symtable_add_def(st, STR(CHILD(c, 0)),
4919 DEF_PARAM | DEF_INTUPLE);
4920 else
4921 symtable_params_fplist(st, CHILD(c, 1));
4922 }
4923
4924}
4925
4926static void
4927symtable_global(struct symtable *st, node *n)
4928{
4929 int i;
4930
Jeremy Hyltonc1761322001-02-28 23:44:45 +00004931 if (st->st_nscopes == 1) {
4932 if (symtable_warn(st,
4933 "global statement has no meaning at module level") < 0)
4934 return;
4935 }
4936
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004937 for (i = 1; i < NCH(n); i += 2) {
4938 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00004939 int flags;
4940
4941 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004942 if (flags < 0)
4943 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00004944 if (flags && flags != DEF_GLOBAL) {
4945 char buf[500];
4946 if (flags & DEF_PARAM) {
4947 PyErr_Format(PyExc_SyntaxError,
4948 "name '%.400s' is local and global",
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004949 name);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004950 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00004951 st->st_cur->ste_lineno);
4952 st->st_errors++;
4953 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00004954 }
4955 else {
4956 if (flags & DEF_LOCAL)
4957 sprintf(buf, GLOBAL_AFTER_ASSIGN,
4958 name);
4959 else
4960 sprintf(buf, GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00004961 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00004962 }
4963 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004964 symtable_add_def(st, name, DEF_GLOBAL);
4965 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004966}
4967
4968static void
4969symtable_list_comprehension(struct symtable *st, node *n)
4970{
4971 char tmpname[12];
4972
Tim Peters30814212001-02-17 05:30:26 +00004973 sprintf(tmpname, "_[%d]", ++st->st_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004974 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004975 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004976 symtable_node(st, CHILD(n, 3));
4977 if (NCH(n) == 5)
4978 symtable_node(st, CHILD(n, 4));
4979 --st->st_tmpname;
4980}
4981
4982static void
4983symtable_import(struct symtable *st, node *n)
4984{
4985 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004986 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004987 | 'from' dotted_name 'import'
4988 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00004989 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004990 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004991 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004992 node *dotname = CHILD(n, 1);
4993 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
4994 /* check for bogus imports */
4995 if (n->n_lineno >= st->st_future->ff_last_lineno) {
4996 PyErr_SetString(PyExc_SyntaxError,
4997 LATE_FUTURE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004998 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004999 n->n_lineno);
5000 st->st_errors++;
5001 return;
5002 }
5003 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005004 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005005 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005006 } else {
5007 for (i = 3; i < NCH(n); i += 2) {
5008 node *c = CHILD(n, i);
5009 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005010 symtable_assign(st, CHILD(c, 2),
5011 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005012 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005013 symtable_assign(st, CHILD(c, 0),
5014 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005015 }
5016 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005017 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005018 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005019 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005020 }
5021 }
5022}
5023
5024static void
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005025symtable_assign(struct symtable *st, node *n, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005026{
5027 node *tmp;
5028 int i;
5029
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005030 loop:
5031 switch (TYPE(n)) {
5032 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005033 /* invalid assignment, e.g. lambda x:x=2. The next
5034 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005035 return;
5036 case power:
5037 if (NCH(n) > 2) {
5038 for (i = 2; i < NCH(n); ++i)
5039 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
5040 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005041 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005042 if (NCH(n) > 1) {
5043 symtable_node(st, CHILD(n, 0));
5044 symtable_node(st, CHILD(n, 1));
5045 } else {
5046 n = CHILD(n, 0);
5047 goto loop;
5048 }
5049 return;
5050 case listmaker:
5051 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
5052 symtable_list_comprehension(st, CHILD(n, 1));
5053 else {
5054 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005055 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005056 }
5057 return;
5058 case exprlist:
5059 case testlist:
5060 if (NCH(n) == 1) {
5061 n = CHILD(n, 0);
5062 goto loop;
5063 }
5064 else {
5065 int i;
5066 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005067 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005068 return;
5069 }
5070 goto loop;
5071 case atom:
5072 tmp = CHILD(n, 0);
5073 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
5074 n = CHILD(n, 1);
5075 goto loop;
5076 } else if (TYPE(tmp) == NAME)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005077 symtable_add_def(st, STR(tmp), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005078 return;
5079 case dotted_as_name:
5080 if (NCH(n) == 3)
5081 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005082 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005083 else
5084 symtable_add_def(st,
5085 STR(CHILD(CHILD(n,
5086 0), 0)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005087 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005088 return;
5089 case dotted_name:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005090 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005091 return;
5092 case NAME:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005093 symtable_add_def(st, STR(n), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005094 return;
5095 default:
5096 if (NCH(n) == 0)
5097 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00005098 if (NCH(n) == 1) {
5099 n = CHILD(n, 0);
5100 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005101 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00005102 /* Should only occur for errors like x + 1 = 1,
5103 which will be caught in the next pass. */
5104 for (i = 0; i < NCH(n); ++i)
5105 if (TYPE(CHILD(n, i)) >= single_input)
5106 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005107 }
5108}