blob: ed50f7ef41b5a0804a4dfb27a0b0c14c9ce9d8cb [file] [log] [blame]
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001/* Compile an expression node to intermediate code */
2
Guido van Rossum3f5da241990-12-20 15:06:42 +00003/* XXX TO DO:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004 XXX add __doc__ attribute == co_doc to code object attributes?
5 XXX (it's currently the first item of the co_const tuple)
Guido van Rossum3f5da241990-12-20 15:06:42 +00006 XXX Generate simple jump for break/return outside 'try...finally'
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00007 XXX Allow 'continue' inside finally clause of try-finally
Guido van Rossum8b993a91997-01-17 21:04:03 +00008 XXX New opcode for loading the initial index for a for loop
Guido van Rossum681d79a1995-07-18 14:51:37 +00009 XXX other JAR tricks?
Guido van Rossum3f5da241990-12-20 15:06:42 +000010*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +000011
Guido van Rossum79f25d91997-04-29 20:08:16 +000012#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000013
Guido van Rossum10dc2e81990-11-18 17:27:39 +000014#include "node.h"
15#include "token.h"
16#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000017#include "compile.h"
Jeremy Hylton4b38da62001-02-02 18:19:15 +000018#include "symtable.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000019#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000020#include "structmember.h"
21
22#include <ctype.h>
Guido van Rossum282914b1991-04-04 10:42:56 +000023
Guido van Rossumb05a5c71997-05-07 17:46:13 +000024/* Three symbols from graminit.h are also defined in Python.h, with
25 Py_ prefixes to their names. Python.h can't include graminit.h
26 (which defines too many confusing symbols), but we can check here
27 that they haven't changed (which is very unlikely, but possible). */
28#if Py_single_input != single_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000029 #error "single_input has changed -- update Py_single_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000030#endif
31#if Py_file_input != file_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000032 #error "file_input has changed -- update Py_file_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000033#endif
34#if Py_eval_input != eval_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000035 #error "eval_input has changed -- update Py_eval_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000036#endif
37
Guido van Rossum8e793d91997-03-03 19:13:14 +000038int Py_OptimizeFlag = 0;
39
Guido van Rossum8861b741996-07-30 16:49:37 +000040#define OP_DELETE 0
41#define OP_ASSIGN 1
42#define OP_APPLY 2
43
Jeremy Hyltone36f7782001-01-19 03:21:30 +000044#define VAR_LOAD 0
45#define VAR_STORE 1
46#define VAR_DELETE 2
47
Jeremy Hylton64949cb2001-01-25 20:06:59 +000048#define DEL_CLOSURE_ERROR \
Jeremy Hyltoneab156f2001-01-30 01:24:43 +000049"can not delete variable '%.400s' referenced in nested scope"
50
51#define DUPLICATE_ARGUMENT \
52"duplicate argument '%s' in function definition"
53
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000054#define ILLEGAL_DYNAMIC_SCOPE \
55"%.100s: exec or 'import *' makes names ambiguous in nested scope"
Jeremy Hyltoneab156f2001-01-30 01:24:43 +000056
Jeremy Hylton29906ee2001-02-27 04:23:34 +000057#define GLOBAL_AFTER_ASSIGN \
58"name '%.400s' is assigned to before global declaration"
59
60#define GLOBAL_AFTER_USE \
61"name '%.400s' is used prior to global declaration"
62
63#define LOCAL_GLOBAL \
64"name '%.400s' is a function paramter and declared global"
65
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +000066#define LATE_FUTURE \
67"from __future__ imports must occur at the beginning of the file"
68
Jeremy Hyltone36f7782001-01-19 03:21:30 +000069#define MANGLE_LEN 256
70
Guido van Rossum79f25d91997-04-29 20:08:16 +000071#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000072
73static struct memberlist code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000074 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
75 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000076 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000077 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000078 {"co_code", T_OBJECT, OFF(co_code), READONLY},
79 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
80 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000081 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Jeremy Hylton64949cb2001-01-25 20:06:59 +000082 {"co_freevars", T_OBJECT, OFF(co_freevars), READONLY},
83 {"co_cellvars", T_OBJECT, OFF(co_cellvars), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000084 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000085 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000086 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
87 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000088 {NULL} /* Sentinel */
89};
90
Guido van Rossum79f25d91997-04-29 20:08:16 +000091static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000092code_getattr(PyCodeObject *co, char *name)
Guido van Rossum3f5da241990-12-20 15:06:42 +000093{
Guido van Rossum79f25d91997-04-29 20:08:16 +000094 return PyMember_Get((char *)co, code_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +000095}
Guido van Rossum10dc2e81990-11-18 17:27:39 +000096
97static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000098code_dealloc(PyCodeObject *co)
Guido van Rossum10dc2e81990-11-18 17:27:39 +000099{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000100 Py_XDECREF(co->co_code);
101 Py_XDECREF(co->co_consts);
102 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +0000103 Py_XDECREF(co->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000104 Py_XDECREF(co->co_freevars);
105 Py_XDECREF(co->co_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000106 Py_XDECREF(co->co_filename);
107 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +0000108 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000109 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000110}
111
Guido van Rossum79f25d91997-04-29 20:08:16 +0000112static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000113code_repr(PyCodeObject *co)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000114{
115 char buf[500];
116 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000117 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000118 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000119
Guido van Rossuma396a882000-04-07 01:21:36 +0000120 if (co->co_firstlineno != 0)
121 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000122 if (co->co_filename && PyString_Check(co->co_filename))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000123 filename = PyString_AS_STRING(co->co_filename);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000124 if (co->co_name && PyString_Check(co->co_name))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000125 name = PyString_AS_STRING(co->co_name);
Fred Drake615ae552000-06-30 16:20:13 +0000126 sprintf(buf, "<code object %.100s at %p, file \"%.300s\", line %d>",
127 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000128 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000129}
130
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000131static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000132code_compare(PyCodeObject *co, PyCodeObject *cp)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000133{
134 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000135 cmp = PyObject_Compare(co->co_name, cp->co_name);
136 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000137 cmp = co->co_argcount - cp->co_argcount;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000138 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000139 cmp = co->co_nlocals - cp->co_nlocals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000140 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000141 cmp = co->co_flags - cp->co_flags;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000142 if (cmp) return cmp;
Guido van Rossumd076c731998-10-07 19:42:25 +0000143 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000144 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000145 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000146 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000147 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000148 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000149 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000150 if (cmp) return cmp;
151 cmp = PyObject_Compare(co->co_freevars, cp->co_freevars);
152 if (cmp) return cmp;
153 cmp = PyObject_Compare(co->co_cellvars, cp->co_cellvars);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000154 return cmp;
155}
156
157static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000158code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000159{
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000160 long h, h0, h1, h2, h3, h4, h5, h6;
Guido van Rossum44679592000-04-10 16:20:31 +0000161 h0 = PyObject_Hash(co->co_name);
162 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000163 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000164 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000165 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000166 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000167 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000168 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000169 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000170 if (h4 == -1) return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000171 h5 = PyObject_Hash(co->co_freevars);
172 if (h5 == -1) return -1;
173 h6 = PyObject_Hash(co->co_cellvars);
174 if (h6 == -1) return -1;
175 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^ h5 ^ h6 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000176 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000177 if (h == -1) h = -2;
178 return h;
179}
180
Jeremy Hylton78891072001-03-01 06:09:34 +0000181/* XXX code objects need to participate in GC? */
182
Guido van Rossum79f25d91997-04-29 20:08:16 +0000183PyTypeObject PyCode_Type = {
184 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000185 0,
186 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000187 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000188 0,
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000189 (destructor)code_dealloc, /*tp_dealloc*/
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000190 0, /*tp_print*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000191 (getattrfunc)code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000192 0, /*tp_setattr*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000193 (cmpfunc)code_compare, /*tp_compare*/
194 (reprfunc)code_repr, /*tp_repr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000195 0, /*tp_as_number*/
196 0, /*tp_as_sequence*/
197 0, /*tp_as_mapping*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000198 (hashfunc)code_hash, /*tp_hash*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000199};
200
Guido van Rossum644a12b1997-04-09 19:24:53 +0000201#define NAME_CHARS \
202 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
203
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000204/* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
205
206static int
207all_name_chars(unsigned char *s)
208{
Guido van Rossumcd90c202001-02-09 15:06:42 +0000209 static char ok_name_char[256];
210 static unsigned char *name_chars = (unsigned char *)NAME_CHARS;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000211
Guido van Rossumcd90c202001-02-09 15:06:42 +0000212 if (ok_name_char[*name_chars] == 0) {
213 unsigned char *p;
214 for (p = name_chars; *p; p++)
215 ok_name_char[*p] = 1;
216 }
217 while (*s) {
218 if (ok_name_char[*s++] == 0)
219 return 0;
220 }
221 return 1;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000222}
223
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000224static int
225intern_strings(PyObject *tuple)
226{
227 int i;
228
229 for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) {
230 PyObject *v = PyTuple_GET_ITEM(tuple, i);
231 if (v == NULL || !PyString_Check(v)) {
232 Py_FatalError("non-string found in code slot");
233 PyErr_BadInternalCall();
234 return -1;
235 }
236 PyString_InternInPlace(&PyTuple_GET_ITEM(tuple, i));
237 }
238 return 0;
239}
240
Guido van Rossum79f25d91997-04-29 20:08:16 +0000241PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000242PyCode_New(int argcount, int nlocals, int stacksize, int flags,
243 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000244 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
245 PyObject *filename, PyObject *name, int firstlineno,
246 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000247{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000248 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000249 int i;
Guido van Rossumd076c731998-10-07 19:42:25 +0000250 PyBufferProcs *pb;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000251 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000252 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000253 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000254 consts == NULL || !PyTuple_Check(consts) ||
255 names == NULL || !PyTuple_Check(names) ||
256 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000257 freevars == NULL || !PyTuple_Check(freevars) ||
258 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000259 name == NULL || !PyString_Check(name) ||
260 filename == NULL || !PyString_Check(filename) ||
261 lnotab == NULL || !PyString_Check(lnotab)) {
262 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000263 return NULL;
264 }
Guido van Rossumd076c731998-10-07 19:42:25 +0000265 pb = code->ob_type->tp_as_buffer;
266 if (pb == NULL ||
267 pb->bf_getreadbuffer == NULL ||
268 pb->bf_getsegcount == NULL ||
269 (*pb->bf_getsegcount)(code, NULL) != 1)
270 {
271 PyErr_BadInternalCall();
272 return NULL;
273 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000274 intern_strings(names);
275 intern_strings(varnames);
276 if (freevars == NULL)
277 freevars = PyTuple_New(0);
278 intern_strings(freevars);
279 if (cellvars == NULL)
280 cellvars = PyTuple_New(0);
281 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000282 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000283 for (i = PyTuple_Size(consts); --i >= 0; ) {
284 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000285 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000286 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000287 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000288 continue;
289 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000290 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000291 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000292 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000293 co->co_argcount = argcount;
294 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000295 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000296 co->co_flags = flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000297 Py_INCREF(code);
Guido van Rossumd076c731998-10-07 19:42:25 +0000298 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000299 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000300 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000301 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000302 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000303 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000304 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000305 Py_INCREF(freevars);
306 co->co_freevars = freevars;
307 Py_INCREF(cellvars);
308 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000309 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000310 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000311 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000312 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000313 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000314 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000315 co->co_lnotab = lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000316 }
317 return co;
318}
319
320
321/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000322
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000323/* The compiler uses two passes to generate bytecodes. The first pass
324 builds the symbol table. The second pass generates the bytecode.
325
326 The first pass uses a single symtable struct. The second pass uses
327 a compiling struct for each code block. The compiling structs
328 share a reference to the symtable.
329
330 The two passes communicate via symtable_load_symbols() and via
331 is_local() and is_global(). The former initializes several slots
332 in the compiling struct: c_varnames, c_locals, c_nlocals,
333 c_argcount, c_globals, and c_flags.
334*/
335
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000336struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000337 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000338 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000339 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000340 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000341 PyObject *c_name_dict; /* inverse of c_names */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000342 PyObject *c_globals; /* dictionary (value=None) */
343 PyObject *c_locals; /* dictionary (value=localID) */
344 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000345 PyObject *c_freevars; /* dictionary (value=None) */
346 PyObject *c_cellvars; /* list */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000347 int c_nlocals; /* index of next local */
348 int c_argcount; /* number of top-level arguments */
349 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000350 int c_nexti; /* index into c_code */
351 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000352 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000353 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000354 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000355 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000356 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000357 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000358 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000359 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000360 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000361 int c_stacklevel; /* Current stack level */
362 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000363 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000364 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000365 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000366 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000367 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000368 int c_nested; /* Is block nested funcdef or lamdef? */
369 int c_closure; /* Is nested w/freevars? */
370 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000371 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000372};
373
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000374int is_free(int v)
375{
376 if ((v & (USE | DEF_FREE))
377 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
378 return 1;
379 if (v & DEF_FREE_CLASS)
380 return 1;
381 return 0;
382}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000383
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000384static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000385com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000386{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000387 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
388
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000389 if (c == NULL) {
390 /* Error occurred via symtable call to
391 is_constant_false */
392 PyErr_SetString(exc, msg);
393 return;
394 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000395 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000396 if (c->c_lineno < 1 || c->c_interactive) {
397 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000398 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000399 return;
400 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000401 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000402 if (v == NULL)
403 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000404
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000405 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000406 if (line == NULL) {
407 Py_INCREF(Py_None);
408 line = Py_None;
409 }
410 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
411 Py_None, line);
412 if (t == NULL)
413 goto exit;
414 w = Py_BuildValue("(OO)", v, t);
415 if (w == NULL)
416 goto exit;
417 PyErr_SetObject(exc, w);
418 exit:
419 Py_XDECREF(t);
420 Py_XDECREF(v);
421 Py_XDECREF(w);
422 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000423}
424
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000425/* Interface to the block stack */
426
427static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000428block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000429{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000430 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000431 com_error(c, PyExc_SystemError,
432 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000433 }
434 else {
435 c->c_block[c->c_nblocks++] = type;
436 }
437}
438
439static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000440block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000441{
442 if (c->c_nblocks > 0)
443 c->c_nblocks--;
444 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000445 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000446 }
447}
448
Guido van Rossum681d79a1995-07-18 14:51:37 +0000449/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000450
Tim Petersdbd9ba62000-07-09 03:09:57 +0000451static int com_init(struct compiling *, char *);
452static void com_free(struct compiling *);
453static void com_push(struct compiling *, int);
454static void com_pop(struct compiling *, int);
455static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000456static void com_node(struct compiling *, node *);
457static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000458static void com_addbyte(struct compiling *, int);
459static void com_addint(struct compiling *, int);
460static void com_addoparg(struct compiling *, int, int);
461static void com_addfwref(struct compiling *, int, int *);
462static void com_backpatch(struct compiling *, int);
463static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
464static int com_addconst(struct compiling *, PyObject *);
465static int com_addname(struct compiling *, PyObject *);
466static void com_addopname(struct compiling *, int, node *);
467static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000468static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000469static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000470static void com_assign(struct compiling *, node *, int, node *);
471static void com_assign_name(struct compiling *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000472static PyCodeObject *icompile(node *, struct compiling *);
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000473static PyCodeObject *jcompile(node *, char *, struct compiling *,
474 PyCompilerFlags *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000475static PyObject *parsestrplus(node *);
476static PyObject *parsestr(char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000477static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000478
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000479static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000480
481/* symtable operations */
482static int symtable_build(struct compiling *, node *);
483static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000484static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000485static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000486static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000487static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000488static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000489
490static void symtable_node(struct symtable *, node *);
491static void symtable_funcdef(struct symtable *, node *);
492static void symtable_default_args(struct symtable *, node *);
493static void symtable_params(struct symtable *, node *);
494static void symtable_params_fplist(struct symtable *, node *n);
495static void symtable_global(struct symtable *, node *);
496static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000497static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000498static void symtable_list_comprehension(struct symtable *, node *);
499
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000500static int symtable_update_free_vars(struct symtable *);
501static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
502static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
503
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000504/* helper */
505static void
506do_pad(int pad)
507{
508 int i;
509 for (i = 0; i < pad; ++i)
510 fprintf(stderr, " ");
511}
512
513static void
514dump(node *n, int pad, int depth)
515{
516 int i;
517 if (depth == 0)
518 return;
519 do_pad(pad);
520 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
521 if (depth > 0)
522 depth--;
523 for (i = 0; i < NCH(n); ++i)
524 dump(CHILD(n, i), pad + 1, depth);
525}
526
527#define DUMP(N) dump(N, 0, -1)
528
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000529static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000530com_init(struct compiling *c, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000531{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000532 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000533 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
534 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000535 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000536 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000537 goto fail;
538 if ((c->c_const_dict = PyDict_New()) == NULL)
539 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000540 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000541 goto fail;
542 if ((c->c_name_dict = PyDict_New()) == NULL)
543 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000544 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000545 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000546 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
547 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000548 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000549 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000550 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000551 c->c_freevars = NULL;
552 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000553 c->c_nlocals = 0;
554 c->c_argcount = 0;
555 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000556 c->c_nexti = 0;
557 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000558 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000559 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000560 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000561 c->c_begin = 0;
562 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000563 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000564 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000565 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000566 c->c_stacklevel = 0;
567 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000568 c->c_firstlineno = 0;
569 c->c_last_addr = 0;
570 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000571 c->c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000572 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000573 c->c_nested = 0;
574 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000575 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000576 return 1;
577
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000578 fail:
579 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000580 return 0;
581}
582
583static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000584com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000585{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000586 Py_XDECREF(c->c_code);
587 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000588 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000589 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000590 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000591 Py_XDECREF(c->c_globals);
592 Py_XDECREF(c->c_locals);
593 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000594 Py_XDECREF(c->c_freevars);
595 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000596 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +0000597 if (c->c_future)
598 PyMem_Free((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000599}
600
601static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000602com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000603{
604 c->c_stacklevel += n;
605 if (c->c_stacklevel > c->c_maxstacklevel)
606 c->c_maxstacklevel = c->c_stacklevel;
607}
608
609static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000610com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000611{
612 if (c->c_stacklevel < n) {
Guido van Rossum90f827c1998-08-25 18:22:17 +0000613 /* fprintf(stderr,
Guido van Rossum8b993a91997-01-17 21:04:03 +0000614 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
615 c->c_filename, c->c_lineno,
Guido van Rossum90f827c1998-08-25 18:22:17 +0000616 c->c_nexti, c->c_stacklevel, n); */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000617 c->c_stacklevel = 0;
618 }
619 else
620 c->c_stacklevel -= n;
621}
622
623static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000624com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000625{
626 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000627 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000628 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000629 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000630}
631
632static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000633com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000634{
635 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000636 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000637 assert(byte >= 0 && byte <= 255);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000638 if (byte < 0 || byte > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000639 com_error(c, PyExc_SystemError,
640 "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000641 }
642 if (c->c_code == NULL)
643 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000644 len = PyString_Size(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000645 if (c->c_nexti >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000646 if (_PyString_Resize(&c->c_code, len+1000) != 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000647 c->c_errors++;
648 return;
649 }
650 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000651 PyString_AsString(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000652}
653
654static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000655com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000656{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000657 com_addbyte(c, x & 0xff);
658 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000659}
660
661static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000662com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000663{
664 int size;
665 char *p;
666 if (c->c_lnotab == NULL)
667 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000668 size = PyString_Size(c->c_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000669 if (c->c_lnotab_next+2 > size) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000670 if (_PyString_Resize(&c->c_lnotab, size + 1000) < 0) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000671 c->c_errors++;
672 return;
673 }
674 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000675 p = PyString_AsString(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000676 *p++ = addr;
677 *p++ = line;
678 c->c_lnotab_next += 2;
679}
680
681static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000682com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000683{
684 c->c_lineno = lineno;
685 if (c->c_firstlineno == 0) {
686 c->c_firstlineno = c->c_last_line = lineno;
687 }
688 else {
689 int incr_addr = c->c_nexti - c->c_last_addr;
690 int incr_line = lineno - c->c_last_line;
691 while (incr_addr > 0 || incr_line > 0) {
692 int trunc_addr = incr_addr;
693 int trunc_line = incr_line;
694 if (trunc_addr > 255)
695 trunc_addr = 255;
696 if (trunc_line > 255)
697 trunc_line = 255;
698 com_add_lnotab(c, trunc_addr, trunc_line);
699 incr_addr -= trunc_addr;
700 incr_line -= trunc_line;
701 }
702 c->c_last_addr = c->c_nexti;
703 c->c_last_line = lineno;
704 }
705}
706
707static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000708com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000709{
Fred Drakeef8ace32000-08-24 00:32:09 +0000710 int extended_arg = arg >> 16;
Guido van Rossum8e793d91997-03-03 19:13:14 +0000711 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000712 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000713 if (Py_OptimizeFlag)
714 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000715 }
Fred Drakeef8ace32000-08-24 00:32:09 +0000716 if (extended_arg){
717 com_addbyte(c, EXTENDED_ARG);
718 com_addint(c, extended_arg);
719 arg &= 0xffff;
720 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000721 com_addbyte(c, op);
722 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000723}
724
725static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000726com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000727{
728 /* Compile a forward reference for backpatching */
729 int here;
730 int anchor;
731 com_addbyte(c, op);
732 here = c->c_nexti;
733 anchor = *p_anchor;
734 *p_anchor = here;
735 com_addint(c, anchor == 0 ? 0 : here - anchor);
736}
737
738static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000739com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000740{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000741 unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000742 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000743 int dist;
744 int prev;
745 for (;;) {
746 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000747 prev = code[anchor] + (code[anchor+1] << 8);
748 dist = target - (anchor+2);
749 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +0000750 dist >>= 8;
751 code[anchor+1] = dist;
752 dist >>= 8;
753 if (dist) {
754 com_error(c, PyExc_SystemError,
755 "com_backpatch: offset too large");
756 break;
757 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000758 if (!prev)
759 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000760 anchor -= prev;
761 }
762}
763
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000764/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000765
766static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000767com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000768{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000769 PyObject *w, *t, *np=NULL;
770 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000771
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000772 t = Py_BuildValue("(OO)", v, v->ob_type);
773 if (t == NULL)
774 goto fail;
775 w = PyDict_GetItem(dict, t);
776 if (w != NULL) {
777 n = PyInt_AsLong(w);
778 } else {
779 n = PyList_Size(list);
780 np = PyInt_FromLong(n);
781 if (np == NULL)
782 goto fail;
783 if (PyList_Append(list, v) != 0)
784 goto fail;
785 if (PyDict_SetItem(dict, t, np) != 0)
786 goto fail;
787 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000788 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000789 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000790 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000791 fail:
792 Py_XDECREF(np);
793 Py_XDECREF(t);
794 c->c_errors++;
795 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000796}
797
798static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000799com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000800{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000801 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000802}
803
804static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000805com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000806{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000807 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000808}
809
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000810static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000811mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000812{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000813 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000814 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +0000815 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000816 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
817 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000818 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000819 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000820 return 0; /* Don't mangle __extremely_long_names */
821 if (name[nlen-1] == '_' && name[nlen-2] == '_')
822 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000823 /* Strip leading underscores from class name */
824 while (*p == '_')
825 p++;
826 if (*p == '\0')
827 return 0; /* Don't mangle if class is just underscores */
828 plen = strlen(p);
829 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000830 plen = maxlen-nlen-2; /* Truncate class name if too long */
831 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000832 buffer[0] = '_';
833 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000834 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000835 return 1;
836}
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000837
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000838static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000839com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000840{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000841 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000842 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000843 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000844
845 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000846 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000847 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000848 c->c_errors++;
849 i = 255;
850 }
851 else {
852 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000853 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000854 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000855 com_addoparg(c, op, i);
856}
857
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000858#define NAME_LOCAL 0
859#define NAME_GLOBAL 1
860#define NAME_DEFAULT 2
861#define NAME_CLOSURE 3
862
863static int
864com_lookup_arg(PyObject *dict, PyObject *name)
865{
866 PyObject *v = PyDict_GetItem(dict, name);
867 if (v == NULL)
868 return -1;
869 else
870 return PyInt_AS_LONG(v);
871}
872
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000873static void
874com_addop_varname(struct compiling *c, int kind, char *name)
875{
876 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000877 int i, reftype;
878 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000879 int op = STOP_CODE;
880 char buffer[MANGLE_LEN];
881
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000882 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000883 name = buffer;
884 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
885 c->c_errors++;
886 i = 255;
887 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000888 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000889
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000890 reftype = get_ref_type(c, name);
891 switch (reftype) {
892 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000893 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000894 scope = NAME_LOCAL;
895 break;
896 case GLOBAL_EXPLICIT:
897 scope = NAME_GLOBAL;
898 break;
899 case GLOBAL_IMPLICIT:
900 if (c->c_flags & CO_OPTIMIZED)
901 scope = NAME_GLOBAL;
902 break;
903 case FREE:
904 case CELL:
905 scope = NAME_CLOSURE;
906 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000907 }
908
909 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000910 if (scope == NAME_LOCAL)
911 i = com_lookup_arg(c->c_locals, v);
912 else if (reftype == FREE)
913 i = com_lookup_arg(c->c_freevars, v);
914 else if (reftype == CELL)
915 i = com_lookup_arg(c->c_cellvars, v);
916 if (i == -1) {
917 c->c_errors++; /* XXX no exception set */
918 i = 255;
919 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000920 }
921 Py_DECREF(v);
922
923 switch (kind) {
924 case VAR_LOAD:
925 switch (scope) {
926 case NAME_LOCAL:
927 op = LOAD_FAST;
928 break;
929 case NAME_GLOBAL:
930 op = LOAD_GLOBAL;
931 break;
932 case NAME_DEFAULT:
933 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000934 break;
935 case NAME_CLOSURE:
936 op = LOAD_DEREF;
937 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000938 }
939 break;
940 case VAR_STORE:
941 switch (scope) {
942 case NAME_LOCAL:
943 op = STORE_FAST;
944 break;
945 case NAME_GLOBAL:
946 op = STORE_GLOBAL;
947 break;
948 case NAME_DEFAULT:
949 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000950 break;
951 case NAME_CLOSURE:
952 op = STORE_DEREF;
953 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000954 }
955 break;
956 case VAR_DELETE:
957 switch (scope) {
958 case NAME_LOCAL:
959 op = DELETE_FAST;
960 break;
961 case NAME_GLOBAL:
962 op = DELETE_GLOBAL;
963 break;
964 case NAME_DEFAULT:
965 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000966 break;
967 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000968 char buf[500];
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000969 sprintf(buf, DEL_CLOSURE_ERROR, name);
970 com_error(c, PyExc_SyntaxError, buf);
971 i = 255;
972 break;
973 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000974 }
975 break;
976 }
977done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000978 com_addoparg(c, op, i);
979}
980
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000981static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000982com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000983{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000984 char *name;
985 char buffer[1000];
986 /* XXX it is possible to write this code without the 1000
987 chars on the total length of dotted names, I just can't be
988 bothered right now */
989 if (TYPE(n) == STAR)
990 name = "*";
991 else if (TYPE(n) == dotted_name) {
992 char *p = buffer;
993 int i;
994 name = buffer;
995 for (i = 0; i < NCH(n); i += 2) {
996 char *s = STR(CHILD(n, i));
997 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000998 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000999 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001000 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001001 break;
1002 }
1003 if (p != buffer)
1004 *p++ = '.';
1005 strcpy(p, s);
1006 p = strchr(p, '\0');
1007 }
1008 }
1009 else {
1010 REQ(n, NAME);
1011 name = STR(n);
1012 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001013 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001014}
1015
Guido van Rossum79f25d91997-04-29 20:08:16 +00001016static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001017parsenumber(struct compiling *co, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001018{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001019 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001020 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001021 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001022#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +00001023 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +00001024 int imflag;
1025#endif
1026
Guido van Rossum282914b1991-04-04 10:42:56 +00001027 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001028 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001029#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001030 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001031#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001032 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001033 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001034 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001035 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001036 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001037 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001038 if (*end == '\0') {
1039 if (errno != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001040 com_error(co, PyExc_OverflowError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001041 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +00001042 return NULL;
1043 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001044 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001045 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001046 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001047#ifndef WITHOUT_COMPLEX
1048 if (imflag) {
1049 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001050 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +00001051 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001052 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001053 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +00001054 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001055 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001056#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001057 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001058 PyFPE_START_PROTECT("atof", return 0)
1059 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001060 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001061 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001062 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001063}
1064
Guido van Rossum79f25d91997-04-29 20:08:16 +00001065static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001066parsestr(char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001067{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001068 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001069 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001070 char *buf;
1071 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001072 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001073 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001074 int first = *s;
1075 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001076 int rawmode = 0;
1077 int unicode = 0;
1078 if (isalpha(quote) || quote == '_') {
1079 if (quote == 'u' || quote == 'U') {
1080 quote = *++s;
1081 unicode = 1;
1082 }
1083 if (quote == 'r' || quote == 'R') {
1084 quote = *++s;
1085 rawmode = 1;
1086 }
1087 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001088 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001089 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001090 return NULL;
1091 }
1092 s++;
1093 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001094 if (len > INT_MAX) {
1095 PyErr_SetString(PyExc_OverflowError, "string to parse is too long");
1096 return NULL;
1097 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001098 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001099 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001100 return NULL;
1101 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001102 if (len >= 4 && s[0] == quote && s[1] == quote) {
1103 s += 2;
1104 len -= 2;
1105 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001106 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001107 return NULL;
1108 }
1109 }
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001110 if (unicode || Py_UnicodeFlag) {
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001111 if (rawmode)
1112 return PyUnicode_DecodeRawUnicodeEscape(
1113 s, len, NULL);
1114 else
1115 return PyUnicode_DecodeUnicodeEscape(
1116 s, len, NULL);
1117 }
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001118 if (rawmode || strchr(s, '\\') == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001119 return PyString_FromStringAndSize(s, len);
1120 v = PyString_FromStringAndSize((char *)NULL, len);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001121 if (v == NULL)
1122 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001123 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001124 end = s + len;
1125 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001126 if (*s != '\\') {
1127 *p++ = *s++;
1128 continue;
1129 }
1130 s++;
1131 switch (*s++) {
1132 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001133 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001134 case '\\': *p++ = '\\'; break;
1135 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +00001136 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001137 case 'b': *p++ = '\b'; break;
1138 case 'f': *p++ = '\014'; break; /* FF */
1139 case 't': *p++ = '\t'; break;
1140 case 'n': *p++ = '\n'; break;
1141 case 'r': *p++ = '\r'; break;
1142 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001143 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
1144 case '0': case '1': case '2': case '3':
1145 case '4': case '5': case '6': case '7':
1146 c = s[-1] - '0';
1147 if ('0' <= *s && *s <= '7') {
1148 c = (c<<3) + *s++ - '0';
1149 if ('0' <= *s && *s <= '7')
1150 c = (c<<3) + *s++ - '0';
1151 }
1152 *p++ = c;
1153 break;
1154 case 'x':
Jeremy Hylton4419ac12001-02-28 22:54:51 +00001155 if (isxdigit(Py_CHARMASK(s[0]))
1156 && isxdigit(Py_CHARMASK(s[1]))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +00001157 unsigned int x = 0;
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001158 c = Py_CHARMASK(*s);
1159 s++;
1160 if (isdigit(c))
1161 x = c - '0';
1162 else if (islower(c))
1163 x = 10 + c - 'a';
1164 else
1165 x = 10 + c - 'A';
1166 x = x << 4;
1167 c = Py_CHARMASK(*s);
1168 s++;
1169 if (isdigit(c))
1170 x += c - '0';
1171 else if (islower(c))
1172 x += 10 + c - 'a';
1173 else
1174 x += 10 + c - 'A';
Guido van Rossumed1100f1997-10-20 23:24:07 +00001175 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001176 break;
1177 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00001178 PyErr_SetString(PyExc_ValueError,
1179 "invalid \\x escape");
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001180 Py_DECREF(v);
1181 return NULL;
1182 default:
1183 *p++ = '\\';
1184 *p++ = s[-1];
1185 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001186 }
1187 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001188 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001189 return v;
1190}
1191
Guido van Rossum79f25d91997-04-29 20:08:16 +00001192static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001193parsestrplus(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001194{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001195 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001196 int i;
1197 REQ(CHILD(n, 0), STRING);
1198 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
1199 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001200 for (i = 1; i < NCH(n); i++) {
1201 PyObject *s;
1202 s = parsestr(STR(CHILD(n, i)));
1203 if (s == NULL)
1204 goto onError;
1205 if (PyString_Check(v) && PyString_Check(s)) {
1206 PyString_ConcatAndDel(&v, s);
1207 if (v == NULL)
1208 goto onError;
1209 }
1210 else {
1211 PyObject *temp;
1212 temp = PyUnicode_Concat(v, s);
1213 Py_DECREF(s);
1214 if (temp == NULL)
1215 goto onError;
1216 Py_DECREF(v);
1217 v = temp;
1218 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001219 }
1220 }
1221 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001222
1223 onError:
1224 Py_XDECREF(v);
1225 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001226}
1227
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001228static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001229com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001230{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001231 PyObject *v;
1232 int anchor = 0;
1233 int save_begin = c->c_begin;
1234
1235 /* list_iter: for v in expr [list_iter] */
1236 com_node(c, CHILD(n, 3)); /* expr */
1237 v = PyInt_FromLong(0L);
1238 if (v == NULL)
1239 c->c_errors++;
1240 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
1241 com_push(c, 1);
1242 Py_XDECREF(v);
1243 c->c_begin = c->c_nexti;
1244 com_addoparg(c, SET_LINENO, n->n_lineno);
1245 com_addfwref(c, FOR_LOOP, &anchor);
1246 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001247 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001248 c->c_loops++;
1249 com_list_iter(c, n, e, t);
1250 c->c_loops--;
1251 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1252 c->c_begin = save_begin;
1253 com_backpatch(c, anchor);
1254 com_pop(c, 2); /* FOR_LOOP has popped these */
1255}
1256
1257static void
1258com_list_if(struct compiling *c, node *n, node *e, char *t)
1259{
1260 int anchor = 0;
1261 int a = 0;
1262 /* list_iter: 'if' test [list_iter] */
1263 com_addoparg(c, SET_LINENO, n->n_lineno);
1264 com_node(c, CHILD(n, 1));
1265 com_addfwref(c, JUMP_IF_FALSE, &a);
1266 com_addbyte(c, POP_TOP);
1267 com_pop(c, 1);
1268 com_list_iter(c, n, e, t);
1269 com_addfwref(c, JUMP_FORWARD, &anchor);
1270 com_backpatch(c, a);
1271 /* We jump here with an extra entry which we now pop */
1272 com_addbyte(c, POP_TOP);
1273 com_backpatch(c, anchor);
1274}
1275
1276static void
1277com_list_iter(struct compiling *c,
1278 node *p, /* parent of list_iter node */
1279 node *e, /* element expression node */
1280 char *t /* name of result list temp local */)
1281{
1282 /* list_iter is the last child in a listmaker, list_for, or list_if */
1283 node *n = CHILD(p, NCH(p)-1);
1284 if (TYPE(n) == list_iter) {
1285 n = CHILD(n, 0);
1286 switch (TYPE(n)) {
1287 case list_for:
1288 com_list_for(c, n, e, t);
1289 break;
1290 case list_if:
1291 com_list_if(c, n, e, t);
1292 break;
1293 default:
1294 com_error(c, PyExc_SystemError,
1295 "invalid list_iter node type");
1296 }
1297 }
1298 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001299 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001300 com_push(c, 1);
1301 com_node(c, e);
1302 com_addoparg(c, CALL_FUNCTION, 1);
1303 com_addbyte(c, POP_TOP);
1304 com_pop(c, 2);
1305 }
1306}
1307
1308static void
1309com_list_comprehension(struct compiling *c, node *n)
1310{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001311 /* listmaker: test list_for */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001312 char tmpname[12];
Tim Peters30814212001-02-17 05:30:26 +00001313 sprintf(tmpname, "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001314 com_addoparg(c, BUILD_LIST, 0);
1315 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1316 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001317 com_addop_name(c, LOAD_ATTR, "append");
1318 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001319 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001320 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001321 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001322 --c->c_tmpname;
1323}
1324
1325static void
1326com_listmaker(struct compiling *c, node *n)
1327{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001328 /* listmaker: test ( list_for | (',' test)* [','] ) */
1329 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001330 com_list_comprehension(c, n);
1331 else {
1332 int len = 0;
1333 int i;
1334 for (i = 0; i < NCH(n); i += 2, len++)
1335 com_node(c, CHILD(n, i));
1336 com_addoparg(c, BUILD_LIST, len);
1337 com_pop(c, len-1);
1338 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001339}
1340
1341static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001342com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001343{
1344 int i;
1345 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1346 for (i = 0; i+2 < NCH(n); i += 4) {
1347 /* We must arrange things just right for STORE_SUBSCR.
1348 It wants the stack to look like (value) (dict) (key) */
1349 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001350 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001351 com_node(c, CHILD(n, i+2)); /* value */
1352 com_addbyte(c, ROT_TWO);
1353 com_node(c, CHILD(n, i)); /* key */
1354 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001355 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001356 }
1357}
1358
1359static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001360com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001361{
1362 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001363 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001364 int i;
1365 REQ(n, atom);
1366 ch = CHILD(n, 0);
1367 switch (TYPE(ch)) {
1368 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001369 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001370 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001371 com_push(c, 1);
1372 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001373 else
1374 com_node(c, CHILD(n, 1));
1375 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001376 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001377 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001378 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001379 com_push(c, 1);
1380 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001381 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001382 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001383 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001384 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001385 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001386 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001387 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001388 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001389 break;
1390 case BACKQUOTE:
1391 com_node(c, CHILD(n, 1));
1392 com_addbyte(c, UNARY_CONVERT);
1393 break;
1394 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001395 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001396 i = 255;
1397 }
1398 else {
1399 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001400 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001401 }
1402 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001403 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001404 break;
1405 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001406 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001407 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001408 c->c_errors++;
1409 i = 255;
1410 }
1411 else {
1412 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001413 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001414 }
1415 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001416 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001417 break;
1418 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001419 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001420 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001421 break;
1422 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001423 com_error(c, PyExc_SystemError,
1424 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001425 }
1426}
1427
1428static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001429com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001430{
1431 if (NCH(n) == 1) {
1432 com_addbyte(c, op);
1433 }
1434 else if (NCH(n) == 2) {
1435 if (TYPE(CHILD(n, 0)) != COLON) {
1436 com_node(c, CHILD(n, 0));
1437 com_addbyte(c, op+1);
1438 }
1439 else {
1440 com_node(c, CHILD(n, 1));
1441 com_addbyte(c, op+2);
1442 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001443 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001444 }
1445 else {
1446 com_node(c, CHILD(n, 0));
1447 com_node(c, CHILD(n, 2));
1448 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001449 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001450 }
1451}
1452
Guido van Rossum635abd21997-01-06 22:56:52 +00001453static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001454com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1455{
1456 if (NCH(n) == 1) {
1457 com_addbyte(c, DUP_TOP);
1458 com_push(c, 1);
1459 com_addbyte(c, SLICE);
1460 com_node(c, augn);
1461 com_addbyte(c, opcode);
1462 com_pop(c, 1);
1463 com_addbyte(c, ROT_TWO);
1464 com_addbyte(c, STORE_SLICE);
1465 com_pop(c, 2);
1466 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1467 com_node(c, CHILD(n, 0));
1468 com_addoparg(c, DUP_TOPX, 2);
1469 com_push(c, 2);
1470 com_addbyte(c, SLICE+1);
1471 com_pop(c, 1);
1472 com_node(c, augn);
1473 com_addbyte(c, opcode);
1474 com_pop(c, 1);
1475 com_addbyte(c, ROT_THREE);
1476 com_addbyte(c, STORE_SLICE+1);
1477 com_pop(c, 3);
1478 } else if (NCH(n) == 2) {
1479 com_node(c, CHILD(n, 1));
1480 com_addoparg(c, DUP_TOPX, 2);
1481 com_push(c, 2);
1482 com_addbyte(c, SLICE+2);
1483 com_pop(c, 1);
1484 com_node(c, augn);
1485 com_addbyte(c, opcode);
1486 com_pop(c, 1);
1487 com_addbyte(c, ROT_THREE);
1488 com_addbyte(c, STORE_SLICE+2);
1489 com_pop(c, 3);
1490 } else {
1491 com_node(c, CHILD(n, 0));
1492 com_node(c, CHILD(n, 2));
1493 com_addoparg(c, DUP_TOPX, 3);
1494 com_push(c, 3);
1495 com_addbyte(c, SLICE+3);
1496 com_pop(c, 2);
1497 com_node(c, augn);
1498 com_addbyte(c, opcode);
1499 com_pop(c, 1);
1500 com_addbyte(c, ROT_FOUR);
1501 com_addbyte(c, STORE_SLICE+3);
1502 com_pop(c, 4);
1503 }
1504}
1505
1506static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001507com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001508{
1509 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001510 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001511 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001512 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001513 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001514 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001515 }
1516 else {
1517 com_node(c, CHILD(n, 0));
1518 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001519 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001520 }
1521 m = n;
1522 do {
1523 m = CHILD(m, 0);
1524 } while (NCH(m) == 1);
1525 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00001526 /* f(lambda x: x[0] = 3) ends up getting parsed with
1527 * LHS test = lambda x: x[0], and RHS test = 3.
1528 * SF bug 132313 points out that complaining about a keyword
1529 * then is very confusing.
1530 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001531 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00001532 TYPE(m) == lambdef ?
1533 "lambda cannot contain assignment" :
1534 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001535 }
1536 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001537 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001538 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001539 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001540 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001541 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001542 else if (*pkeywords == NULL) {
1543 c->c_errors++;
1544 Py_DECREF(v);
1545 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001546 if (PyDict_GetItem(*pkeywords, v) != NULL)
1547 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001548 "duplicate keyword argument");
1549 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001550 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001551 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001552 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001553 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001554 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001555 }
1556 }
1557 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001558}
1559
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001560static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001561com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001562{
1563 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001564 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001565 }
1566 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001567 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001568 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001569 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001570 int star_flag = 0;
1571 int starstar_flag = 0;
1572 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001573 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001574 na = 0;
1575 nk = 0;
1576 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001577 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001578 if (TYPE(ch) == STAR ||
1579 TYPE(ch) == DOUBLESTAR)
1580 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001581 if (ch->n_lineno != lineno) {
1582 lineno = ch->n_lineno;
1583 com_addoparg(c, SET_LINENO, lineno);
1584 }
1585 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001586 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001587 na++;
1588 else
1589 nk++;
1590 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001591 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001592 while (i < NCH(n)) {
1593 node *tok = CHILD(n, i);
1594 node *ch = CHILD(n, i+1);
1595 i += 3;
1596 switch (TYPE(tok)) {
1597 case STAR: star_flag = 1; break;
1598 case DOUBLESTAR: starstar_flag = 1; break;
1599 }
1600 com_node(c, ch);
1601 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001602 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001603 com_error(c, PyExc_SyntaxError,
1604 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001605 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001606 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001607 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001608 star_flag + (starstar_flag << 1);
1609 else
1610 opcode = CALL_FUNCTION;
1611 com_addoparg(c, opcode, na | (nk << 8));
1612 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001613 }
1614}
1615
1616static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001617com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001618{
1619 com_addopname(c, LOAD_ATTR, n);
1620}
1621
1622static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001623com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001624{
1625 int i=0;
1626 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001627 node *ch;
1628
1629 /* first argument */
1630 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001631 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001632 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001633 i++;
1634 }
1635 else {
1636 com_node(c, CHILD(n,i));
1637 i++;
1638 REQ(CHILD(n,i),COLON);
1639 i++;
1640 }
1641 /* second argument */
1642 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1643 com_node(c, CHILD(n,i));
1644 i++;
1645 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001646 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001647 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001648 com_push(c, 1);
1649 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001650 /* remaining arguments */
1651 for (; i < NCH(n); i++) {
1652 ns++;
1653 ch=CHILD(n,i);
1654 REQ(ch, sliceop);
1655 if (NCH(ch) == 1) {
1656 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001657 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001658 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001659 }
1660 else
1661 com_node(c, CHILD(ch,1));
1662 }
1663 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001664 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001665}
1666
1667static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001668com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001669{
1670 node *ch;
1671 REQ(n, subscript);
1672 ch = CHILD(n,0);
1673 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001674 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001675 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001676 com_push(c, 1);
1677 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001678 else {
1679 /* check for slice */
1680 if ((TYPE(ch) == COLON || NCH(n) > 1))
1681 com_sliceobj(c, n);
1682 else {
1683 REQ(ch, test);
1684 com_node(c, ch);
1685 }
1686 }
1687}
1688
1689static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001690com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001691{
1692 int i, op;
1693 REQ(n, subscriptlist);
1694 /* Check to make backward compatible slice behavior for '[i:j]' */
1695 if (NCH(n) == 1) {
1696 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001697 /* 'Basic' slice, should have exactly one colon. */
1698 if ((TYPE(CHILD(sub, 0)) == COLON
1699 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1700 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1701 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001702 switch (assigning) {
1703 case OP_DELETE:
1704 op = DELETE_SLICE;
1705 break;
1706 case OP_ASSIGN:
1707 op = STORE_SLICE;
1708 break;
1709 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001710 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001711 break;
1712 default:
1713 com_augassign_slice(c, sub, assigning, augn);
1714 return;
1715 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001716 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001717 if (op == STORE_SLICE)
1718 com_pop(c, 2);
1719 else if (op == DELETE_SLICE)
1720 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001721 return;
1722 }
1723 }
1724 /* Else normal subscriptlist. Compile each subscript. */
1725 for (i = 0; i < NCH(n); i += 2)
1726 com_subscript(c, CHILD(n, i));
1727 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001728 if (NCH(n) > 1) {
1729 i = (NCH(n)+1) / 2;
1730 com_addoparg(c, BUILD_TUPLE, i);
1731 com_pop(c, i-1);
1732 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001733 switch (assigning) {
1734 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001735 op = DELETE_SUBSCR;
1736 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00001737 break;
1738 default:
1739 case OP_ASSIGN:
1740 op = STORE_SUBSCR;
1741 i = 3;
1742 break;
1743 case OP_APPLY:
1744 op = BINARY_SUBSCR;
1745 i = 1;
1746 break;
1747 }
1748 if (assigning > OP_APPLY) {
1749 com_addoparg(c, DUP_TOPX, 2);
1750 com_push(c, 2);
1751 com_addbyte(c, BINARY_SUBSCR);
1752 com_pop(c, 1);
1753 com_node(c, augn);
1754 com_addbyte(c, assigning);
1755 com_pop(c, 1);
1756 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001757 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001758 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001759 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001760}
1761
1762static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001763com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001764{
1765 REQ(n, trailer);
1766 switch (TYPE(CHILD(n, 0))) {
1767 case LPAR:
1768 com_call_function(c, CHILD(n, 1));
1769 break;
1770 case DOT:
1771 com_select_member(c, CHILD(n, 1));
1772 break;
1773 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00001774 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001775 break;
1776 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001777 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001778 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001779 }
1780}
1781
1782static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001783com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001784{
1785 int i;
1786 REQ(n, power);
1787 com_atom(c, CHILD(n, 0));
1788 for (i = 1; i < NCH(n); i++) {
1789 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1790 com_factor(c, CHILD(n, i+1));
1791 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001792 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001793 break;
1794 }
1795 else
1796 com_apply_trailer(c, CHILD(n, i));
1797 }
1798}
1799
1800static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001801com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001802{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001803 REQ(n, factor);
1804 if (TYPE(CHILD(n, 0)) == PLUS) {
1805 com_factor(c, CHILD(n, 1));
1806 com_addbyte(c, UNARY_POSITIVE);
1807 }
1808 else if (TYPE(CHILD(n, 0)) == MINUS) {
1809 com_factor(c, CHILD(n, 1));
1810 com_addbyte(c, UNARY_NEGATIVE);
1811 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001812 else if (TYPE(CHILD(n, 0)) == TILDE) {
1813 com_factor(c, CHILD(n, 1));
1814 com_addbyte(c, UNARY_INVERT);
1815 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001816 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001817 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001818 }
1819}
1820
1821static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001822com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001823{
1824 int i;
1825 int op;
1826 REQ(n, term);
1827 com_factor(c, CHILD(n, 0));
1828 for (i = 2; i < NCH(n); i += 2) {
1829 com_factor(c, CHILD(n, i));
1830 switch (TYPE(CHILD(n, i-1))) {
1831 case STAR:
1832 op = BINARY_MULTIPLY;
1833 break;
1834 case SLASH:
1835 op = BINARY_DIVIDE;
1836 break;
1837 case PERCENT:
1838 op = BINARY_MODULO;
1839 break;
1840 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001841 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001842 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001843 op = 255;
1844 }
1845 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001846 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001847 }
1848}
1849
1850static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001851com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001852{
1853 int i;
1854 int op;
1855 REQ(n, arith_expr);
1856 com_term(c, CHILD(n, 0));
1857 for (i = 2; i < NCH(n); i += 2) {
1858 com_term(c, CHILD(n, i));
1859 switch (TYPE(CHILD(n, i-1))) {
1860 case PLUS:
1861 op = BINARY_ADD;
1862 break;
1863 case MINUS:
1864 op = BINARY_SUBTRACT;
1865 break;
1866 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001867 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001868 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001869 op = 255;
1870 }
1871 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001872 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001873 }
1874}
1875
1876static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001877com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001878{
1879 int i;
1880 int op;
1881 REQ(n, shift_expr);
1882 com_arith_expr(c, CHILD(n, 0));
1883 for (i = 2; i < NCH(n); i += 2) {
1884 com_arith_expr(c, CHILD(n, i));
1885 switch (TYPE(CHILD(n, i-1))) {
1886 case LEFTSHIFT:
1887 op = BINARY_LSHIFT;
1888 break;
1889 case RIGHTSHIFT:
1890 op = BINARY_RSHIFT;
1891 break;
1892 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001893 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001894 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001895 op = 255;
1896 }
1897 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001898 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001899 }
1900}
1901
1902static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001903com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001904{
1905 int i;
1906 int op;
1907 REQ(n, and_expr);
1908 com_shift_expr(c, CHILD(n, 0));
1909 for (i = 2; i < NCH(n); i += 2) {
1910 com_shift_expr(c, CHILD(n, i));
1911 if (TYPE(CHILD(n, i-1)) == AMPER) {
1912 op = BINARY_AND;
1913 }
1914 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001915 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001916 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001917 op = 255;
1918 }
1919 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001920 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001921 }
1922}
1923
1924static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001925com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001926{
1927 int i;
1928 int op;
1929 REQ(n, xor_expr);
1930 com_and_expr(c, CHILD(n, 0));
1931 for (i = 2; i < NCH(n); i += 2) {
1932 com_and_expr(c, CHILD(n, i));
1933 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1934 op = BINARY_XOR;
1935 }
1936 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001937 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001938 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001939 op = 255;
1940 }
1941 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001942 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001943 }
1944}
1945
1946static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001947com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001948{
1949 int i;
1950 int op;
1951 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001952 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001953 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001954 com_xor_expr(c, CHILD(n, i));
1955 if (TYPE(CHILD(n, i-1)) == VBAR) {
1956 op = BINARY_OR;
1957 }
1958 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001959 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001960 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001961 op = 255;
1962 }
1963 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001964 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001965 }
1966}
1967
1968static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001969cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001970{
1971 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001972 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001973 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1974 if (NCH(n) == 1) {
1975 n = CHILD(n, 0);
1976 switch (TYPE(n)) {
1977 case LESS: return LT;
1978 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001979 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001980 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001981 case LESSEQUAL: return LE;
1982 case GREATEREQUAL: return GE;
1983 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001984 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1985 if (strcmp(STR(n), "is") == 0) return IS;
1986 }
1987 }
1988 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001989 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001990 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1991 return NOT_IN;
1992 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1993 return IS_NOT;
1994 }
1995 }
1996 return BAD;
1997}
1998
1999static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002000com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002001{
2002 int i;
2003 enum cmp_op op;
2004 int anchor;
2005 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2006 com_expr(c, CHILD(n, 0));
2007 if (NCH(n) == 1)
2008 return;
2009
2010 /****************************************************************
2011 The following code is generated for all but the last
2012 comparison in a chain:
2013
2014 label: on stack: opcode: jump to:
2015
2016 a <code to load b>
2017 a, b DUP_TOP
2018 a, b, b ROT_THREE
2019 b, a, b COMPARE_OP
2020 b, 0-or-1 JUMP_IF_FALSE L1
2021 b, 1 POP_TOP
2022 b
2023
2024 We are now ready to repeat this sequence for the next
2025 comparison in the chain.
2026
2027 For the last we generate:
2028
2029 b <code to load c>
2030 b, c COMPARE_OP
2031 0-or-1
2032
2033 If there were any jumps to L1 (i.e., there was more than one
2034 comparison), we generate:
2035
2036 0-or-1 JUMP_FORWARD L2
2037 L1: b, 0 ROT_TWO
2038 0, b POP_TOP
2039 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002040 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002041 ****************************************************************/
2042
2043 anchor = 0;
2044
2045 for (i = 2; i < NCH(n); i += 2) {
2046 com_expr(c, CHILD(n, i));
2047 if (i+2 < NCH(n)) {
2048 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002049 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002050 com_addbyte(c, ROT_THREE);
2051 }
2052 op = cmp_type(CHILD(n, i-1));
2053 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002054 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002055 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002056 }
2057 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002058 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002059 if (i+2 < NCH(n)) {
2060 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2061 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002062 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002063 }
2064 }
2065
2066 if (anchor) {
2067 int anchor2 = 0;
2068 com_addfwref(c, JUMP_FORWARD, &anchor2);
2069 com_backpatch(c, anchor);
2070 com_addbyte(c, ROT_TWO);
2071 com_addbyte(c, POP_TOP);
2072 com_backpatch(c, anchor2);
2073 }
2074}
2075
2076static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002077com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002078{
2079 REQ(n, not_test); /* 'not' not_test | comparison */
2080 if (NCH(n) == 1) {
2081 com_comparison(c, CHILD(n, 0));
2082 }
2083 else {
2084 com_not_test(c, CHILD(n, 1));
2085 com_addbyte(c, UNARY_NOT);
2086 }
2087}
2088
2089static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002090com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002091{
2092 int i;
2093 int anchor;
2094 REQ(n, and_test); /* not_test ('and' not_test)* */
2095 anchor = 0;
2096 i = 0;
2097 for (;;) {
2098 com_not_test(c, CHILD(n, i));
2099 if ((i += 2) >= NCH(n))
2100 break;
2101 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2102 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002103 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002104 }
2105 if (anchor)
2106 com_backpatch(c, anchor);
2107}
2108
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002109static int
2110com_make_closure(struct compiling *c, PyCodeObject *co)
2111{
2112 int i, free = PyTuple_GET_SIZE(co->co_freevars);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002113 /* If the code is compiled with st->st_nested_scopes == 0,
2114 then no variable will ever be added to co_freevars.
2115 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002116 if (free == 0)
2117 return 0;
2118 for (i = 0; i < free; ++i) {
2119 /* Bypass com_addop_varname because it will generate
2120 LOAD_DEREF but LOAD_CLOSURE is needed.
2121 */
2122 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2123 int arg, reftype;
2124
2125 /* Special case: If a class contains a method with a
2126 free variable that has the same name as a method,
2127 the name will be considered free *and* local in the
2128 class. It should be handled by the closure, as
2129 well as by the normal name loookup logic.
2130 */
2131 reftype = get_ref_type(c, PyString_AS_STRING(name));
2132 if (reftype == CELL)
2133 arg = com_lookup_arg(c->c_cellvars, name);
2134 else /* (reftype == FREE) */
2135 arg = com_lookup_arg(c->c_freevars, name);
2136 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002137 fprintf(stderr, "lookup %s in %s %d %d\n"
2138 "freevars of %s: %s\n",
2139 PyObject_REPR(name),
2140 c->c_name,
2141 reftype, arg,
2142 PyString_AS_STRING(co->co_name),
2143 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002144 Py_FatalError("com_make_closure()");
2145 }
2146 com_addoparg(c, LOAD_CLOSURE, arg);
2147
2148 }
2149 com_push(c, free);
2150 return 1;
2151}
2152
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002153static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002154com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002155{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002156 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002157 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002158 PyObject *co;
2159 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002160 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002161 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2162 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002163 co = (PyObject *) icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002164 if (co == NULL) {
2165 c->c_errors++;
2166 return;
2167 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002168 symtable_exit_scope(c->c_symtable);
Tim Peters1e542112001-02-23 22:23:53 +00002169 i = com_addconst(c, co);
2170 closure = com_make_closure(c, (PyCodeObject *)co);
2171 Py_DECREF(co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002172 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002173 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002174 if (closure)
2175 com_addoparg(c, MAKE_CLOSURE, ndefs);
2176 else
2177 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002178 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002179 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002180 else {
2181 int anchor = 0;
2182 int i = 0;
2183 for (;;) {
2184 com_and_test(c, CHILD(n, i));
2185 if ((i += 2) >= NCH(n))
2186 break;
2187 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2188 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002189 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002190 }
2191 if (anchor)
2192 com_backpatch(c, anchor);
2193 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002194}
2195
2196static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002197com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002198{
2199 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002200 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002201 com_node(c, CHILD(n, 0));
2202 }
2203 else {
2204 int i;
2205 int len;
2206 len = (NCH(n) + 1) / 2;
2207 for (i = 0; i < NCH(n); i += 2)
2208 com_node(c, CHILD(n, i));
2209 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002210 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002211 }
2212}
2213
2214
2215/* Begin of assignment compilation */
2216
Thomas Wouters434d0822000-08-24 20:11:32 +00002217
2218static void
2219com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2220{
2221 com_addbyte(c, DUP_TOP);
2222 com_push(c, 1);
2223 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002224 com_node(c, augn);
2225 com_addbyte(c, opcode);
2226 com_pop(c, 1);
2227 com_addbyte(c, ROT_TWO);
2228 com_addopname(c, STORE_ATTR, n);
2229 com_pop(c, 2);
2230}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002231
2232static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002233com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002234{
2235 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002236 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002237}
2238
2239static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002240com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002241{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002242 REQ(n, trailer);
2243 switch (TYPE(CHILD(n, 0))) {
2244 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002245 com_error(c, PyExc_SyntaxError,
2246 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002247 break;
2248 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002249 if (assigning > OP_APPLY)
2250 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2251 else
2252 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002253 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002254 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002255 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002256 break;
2257 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002258 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002259 }
2260}
2261
2262static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002263com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002264{
2265 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002266 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002267 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002268 if (assigning) {
2269 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002270 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002271 com_push(c, i-1);
2272 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002273 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002274 com_assign(c, CHILD(n, i), assigning, NULL);
2275}
2276
2277static void
2278com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2279{
2280 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002281 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002282 com_push(c, 1);
2283 com_node(c, augn);
2284 com_addbyte(c, opcode);
2285 com_pop(c, 1);
2286 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002287}
2288
2289static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002290com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002291{
2292 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002293 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002294 if (assigning)
2295 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002296}
2297
2298static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002299com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002300{
2301 /* Loop to avoid trivial recursion */
2302 for (;;) {
2303 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002304
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002305 case exprlist:
2306 case testlist:
2307 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002308 if (assigning > OP_APPLY) {
2309 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002310 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002311 return;
2312 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002313 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002314 return;
2315 }
2316 n = CHILD(n, 0);
2317 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002318
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002319 case test:
2320 case and_test:
2321 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002322 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002323 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002324 case xor_expr:
2325 case and_expr:
2326 case shift_expr:
2327 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002328 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002329 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002330 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002331 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002332 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002333 return;
2334 }
2335 n = CHILD(n, 0);
2336 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002337
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002338 case power: /* atom trailer* ('**' power)*
2339 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002340 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002341 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002342 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002343 return;
2344 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002345 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002346 int i;
2347 com_node(c, CHILD(n, 0));
2348 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002349 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002350 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002351 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002352 return;
2353 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002354 com_apply_trailer(c, CHILD(n, i));
2355 } /* NB i is still alive */
2356 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002357 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002358 return;
2359 }
2360 n = CHILD(n, 0);
2361 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002362
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002363 case atom:
2364 switch (TYPE(CHILD(n, 0))) {
2365 case LPAR:
2366 n = CHILD(n, 1);
2367 if (TYPE(n) == RPAR) {
2368 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002369 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002370 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002371 return;
2372 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002373 if (assigning > OP_APPLY) {
2374 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002375 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002376 return;
2377 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002378 break;
2379 case LSQB:
2380 n = CHILD(n, 1);
2381 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002382 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002383 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002384 return;
2385 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002386 if (assigning > OP_APPLY) {
2387 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002388 "augmented assign to list not possible");
2389 return;
2390 }
2391 if (NCH(n) > 1
2392 && TYPE(CHILD(n, 1)) == list_for) {
2393 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002394 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002395 return;
2396 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002397 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002398 return;
2399 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002400 if (assigning > OP_APPLY)
2401 com_augassign_name(c, CHILD(n, 0),
2402 assigning, augn);
2403 else
2404 com_assign_name(c, CHILD(n, 0),
2405 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002406 return;
2407 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002408 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002409 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002410 return;
2411 }
2412 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002413
2414 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002415 com_error(c, PyExc_SyntaxError,
2416 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002417 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002418
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002419 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002420 com_error(c, PyExc_SystemError,
2421 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002422 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002423
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002424 }
2425 }
2426}
Guido van Rossum7c531111997-03-11 18:42:21 +00002427
Thomas Wouters434d0822000-08-24 20:11:32 +00002428static void
2429com_augassign(struct compiling *c, node *n)
2430{
2431 int opcode;
2432
2433 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2434 case '+': opcode = INPLACE_ADD; break;
2435 case '-': opcode = INPLACE_SUBTRACT; break;
2436 case '/': opcode = INPLACE_DIVIDE; break;
2437 case '%': opcode = INPLACE_MODULO; break;
2438 case '<': opcode = INPLACE_LSHIFT; break;
2439 case '>': opcode = INPLACE_RSHIFT; break;
2440 case '&': opcode = INPLACE_AND; break;
2441 case '^': opcode = INPLACE_XOR; break;
2442 case '|': opcode = INPLACE_OR; break;
2443 case '*':
2444 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2445 opcode = INPLACE_POWER;
2446 else
2447 opcode = INPLACE_MULTIPLY;
2448 break;
2449 default:
2450 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2451 return;
2452 }
2453 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2454}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002455
2456static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002457com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002458{
Thomas Wouters434d0822000-08-24 20:11:32 +00002459 REQ(n, expr_stmt);
2460 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002461 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002462 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002463 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002464 if (NCH(n) == 1) {
2465 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002466 if (c->c_interactive)
2467 com_addbyte(c, PRINT_EXPR);
2468 else
2469 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002470 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002471 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002472 else if (TYPE(CHILD(n,1)) == augassign)
2473 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002474 else {
2475 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002476 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002477 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002478 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002479 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002480 com_push(c, 1);
2481 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002482 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002483 }
2484 }
2485}
2486
2487static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002488com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002489{
2490 int a = 0, b = 0;
2491 int i;
2492 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2493 /* Generate code like for
2494
2495 if __debug__:
2496 if not <test>:
2497 raise AssertionError [, <message>]
2498
2499 where <message> is the second test, if present.
2500 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002501
Guido van Rossum228d7f31997-04-02 05:24:36 +00002502 if (Py_OptimizeFlag)
2503 return;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002504 com_addop_name(c, LOAD_GLOBAL, "__debug__");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002505 com_push(c, 1);
2506 com_addfwref(c, JUMP_IF_FALSE, &a);
2507 com_addbyte(c, POP_TOP);
2508 com_pop(c, 1);
2509 com_node(c, CHILD(n, 1));
2510 com_addfwref(c, JUMP_IF_TRUE, &b);
2511 com_addbyte(c, POP_TOP);
2512 com_pop(c, 1);
2513 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002514 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002515 com_push(c, 1);
2516 i = NCH(n)/2; /* Either 2 or 4 */
2517 if (i > 1)
2518 com_node(c, CHILD(n, 3));
2519 com_addoparg(c, RAISE_VARARGS, i);
2520 com_pop(c, i);
2521 /* The interpreter does not fall through */
2522 /* All jumps converge here */
2523 com_backpatch(c, a);
2524 com_backpatch(c, b);
2525 com_addbyte(c, POP_TOP);
2526}
2527
2528static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002529com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002530{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002531 int i = 1;
2532 node* stream = NULL;
2533
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002534 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002535
2536 /* are we using the extended print form? */
2537 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2538 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002539 com_node(c, stream);
2540 /* stack: [...] => [... stream] */
2541 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002542 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2543 i = 4;
2544 else
2545 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002546 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002547 for (; i < NCH(n); i += 2) {
2548 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002549 com_addbyte(c, DUP_TOP);
2550 /* stack: [stream] => [stream stream] */
2551 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002552 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002553 /* stack: [stream stream] => [stream stream obj] */
2554 com_addbyte(c, ROT_TWO);
2555 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002556 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002557 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002558 com_pop(c, 2);
2559 }
2560 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002561 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002562 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002563 com_addbyte(c, PRINT_ITEM);
2564 com_pop(c, 1);
2565 }
2566 }
2567 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002568 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002569 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002570 /* must pop the extra stream object off the stack */
2571 com_addbyte(c, POP_TOP);
2572 /* stack: [... stream] => [...] */
2573 com_pop(c, 1);
2574 }
2575 }
2576 else {
2577 if (stream != NULL) {
2578 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002579 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002580 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002581 com_pop(c, 1);
2582 }
2583 else
2584 com_addbyte(c, PRINT_NEWLINE);
2585 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002586}
2587
2588static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002589com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002590{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002591 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002592 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002593 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002594 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002595 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002596 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002597 com_push(c, 1);
2598 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002599 else
2600 com_node(c, CHILD(n, 1));
2601 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002602 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002603}
2604
2605static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002606com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002607{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002608 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002609 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2610 if (NCH(n) > 1) {
2611 com_node(c, CHILD(n, 1));
2612 if (NCH(n) > 3) {
2613 com_node(c, CHILD(n, 3));
2614 if (NCH(n) > 5)
2615 com_node(c, CHILD(n, 5));
2616 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002617 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002618 i = NCH(n)/2;
2619 com_addoparg(c, RAISE_VARARGS, i);
2620 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002621}
2622
2623static void
Thomas Wouters52152252000-08-17 22:55:00 +00002624com_from_import(struct compiling *c, node *n)
2625{
2626 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2627 com_push(c, 1);
2628 if (NCH(n) > 1) {
2629 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2630 com_error(c, PyExc_SyntaxError, "invalid syntax");
2631 return;
2632 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002633 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002634 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002635 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00002636 com_pop(c, 1);
2637}
2638
2639static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002640com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002641{
2642 int i;
2643 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002644 /* 'import' dotted_name (',' dotted_name)* |
2645 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002646 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00002647 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002648 /* 'from' dotted_name 'import' ... */
2649 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002650
2651 if (TYPE(CHILD(n, 3)) == STAR) {
2652 tup = Py_BuildValue("(s)", "*");
2653 } else {
2654 tup = PyTuple_New((NCH(n) - 2)/2);
2655 for (i = 3; i < NCH(n); i += 2) {
2656 PyTuple_SET_ITEM(tup, (i-3)/2,
2657 PyString_FromString(STR(
Jeremy Hylton4419ac12001-02-28 22:54:51 +00002658 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002659 }
2660 }
2661 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00002662 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002663 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002664 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00002665 if (TYPE(CHILD(n, 3)) == STAR)
2666 com_addbyte(c, IMPORT_STAR);
2667 else {
2668 for (i = 3; i < NCH(n); i += 2)
2669 com_from_import(c, CHILD(n, i));
2670 com_addbyte(c, POP_TOP);
2671 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002672 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002673 }
2674 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002675 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002676 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00002677 node *subn = CHILD(n, i);
2678 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002679 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002680 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002681 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00002682 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00002683 int j;
2684 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00002685 com_error(c, PyExc_SyntaxError,
2686 "invalid syntax");
2687 return;
2688 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00002689 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
2690 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002691 CHILD(CHILD(subn, 0),
2692 j));
2693 com_addop_varname(c, VAR_STORE,
2694 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002695 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002696 com_addop_varname(c, VAR_STORE,
2697 STR(CHILD(CHILD(subn, 0),
2698 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002699 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002700 }
2701 }
2702}
2703
2704static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002705com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002706{
2707 REQ(n, exec_stmt);
2708 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2709 com_node(c, CHILD(n, 1));
2710 if (NCH(n) >= 4)
2711 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002712 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002713 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002714 com_push(c, 1);
2715 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002716 if (NCH(n) >= 6)
2717 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002718 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002719 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002720 com_push(c, 1);
2721 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002722 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002723 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002724}
2725
Guido van Rossum7c531111997-03-11 18:42:21 +00002726static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002727is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002728{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002729 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002730 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002731 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00002732
2733 /* Label to avoid tail recursion */
2734 next:
2735 switch (TYPE(n)) {
2736
2737 case suite:
2738 if (NCH(n) == 1) {
2739 n = CHILD(n, 0);
2740 goto next;
2741 }
2742 /* Fall through */
2743 case file_input:
2744 for (i = 0; i < NCH(n); i++) {
2745 node *ch = CHILD(n, i);
2746 if (TYPE(ch) == stmt) {
2747 n = ch;
2748 goto next;
2749 }
2750 }
2751 break;
2752
2753 case stmt:
2754 case simple_stmt:
2755 case small_stmt:
2756 n = CHILD(n, 0);
2757 goto next;
2758
2759 case expr_stmt:
2760 case testlist:
2761 case test:
2762 case and_test:
2763 case not_test:
2764 case comparison:
2765 case expr:
2766 case xor_expr:
2767 case and_expr:
2768 case shift_expr:
2769 case arith_expr:
2770 case term:
2771 case factor:
2772 case power:
2773 case atom:
2774 if (NCH(n) == 1) {
2775 n = CHILD(n, 0);
2776 goto next;
2777 }
2778 break;
2779
2780 case NAME:
2781 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2782 return 1;
2783 break;
2784
2785 case NUMBER:
2786 v = parsenumber(c, STR(n));
2787 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002788 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002789 break;
2790 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002791 i = PyObject_IsTrue(v);
2792 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002793 return i == 0;
2794
2795 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002796 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002797 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002798 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002799 break;
2800 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002801 i = PyObject_IsTrue(v);
2802 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002803 return i == 0;
2804
2805 }
2806 return 0;
2807}
2808
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002809static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002810com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002811{
2812 int i;
2813 int anchor = 0;
2814 REQ(n, if_stmt);
2815 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2816 for (i = 0; i+3 < NCH(n); i+=4) {
2817 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002818 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002819 if (is_constant_false(c, ch))
2820 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002821 if (i > 0)
2822 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002823 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002824 com_addfwref(c, JUMP_IF_FALSE, &a);
2825 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002826 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002827 com_node(c, CHILD(n, i+3));
2828 com_addfwref(c, JUMP_FORWARD, &anchor);
2829 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002830 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002831 com_addbyte(c, POP_TOP);
2832 }
2833 if (i+2 < NCH(n))
2834 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002835 if (anchor)
2836 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002837}
2838
2839static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002840com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002841{
2842 int break_anchor = 0;
2843 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002844 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002845 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2846 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002847 block_push(c, SETUP_LOOP);
2848 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002849 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002850 com_node(c, CHILD(n, 1));
2851 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2852 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002853 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002854 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002855 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002856 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002857 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2858 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002859 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002860 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002861 com_addbyte(c, POP_TOP);
2862 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002863 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002864 if (NCH(n) > 4)
2865 com_node(c, CHILD(n, 6));
2866 com_backpatch(c, break_anchor);
2867}
2868
2869static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002870com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002871{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002872 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002873 int break_anchor = 0;
2874 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002875 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002876 REQ(n, for_stmt);
2877 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2878 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002879 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002880 com_node(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002881 v = PyInt_FromLong(0L);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002882 if (v == NULL)
2883 c->c_errors++;
2884 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002885 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002886 Py_XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002887 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002888 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002889 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002890 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00002891 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002892 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002893 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002894 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002895 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2896 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002897 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002898 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002899 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002900 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002901 if (NCH(n) > 8)
2902 com_node(c, CHILD(n, 8));
2903 com_backpatch(c, break_anchor);
2904}
2905
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002906/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002907
2908 SETUP_FINALLY L
2909 <code for S>
2910 POP_BLOCK
2911 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002912 L: <code for Sf>
2913 END_FINALLY
2914
2915 The special instructions use the block stack. Each block
2916 stack entry contains the instruction that created it (here
2917 SETUP_FINALLY), the level of the value stack at the time the
2918 block stack entry was created, and a label (here L).
2919
2920 SETUP_FINALLY:
2921 Pushes the current value stack level and the label
2922 onto the block stack.
2923 POP_BLOCK:
2924 Pops en entry from the block stack, and pops the value
2925 stack until its level is the same as indicated on the
2926 block stack. (The label is ignored.)
2927 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002928 Pops a variable number of entries from the *value* stack
2929 and re-raises the exception they specify. The number of
2930 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002931
2932 The block stack is unwound when an exception is raised:
2933 when a SETUP_FINALLY entry is found, the exception is pushed
2934 onto the value stack (and the exception condition is cleared),
2935 and the interpreter jumps to the label gotten from the block
2936 stack.
2937
2938 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002939 (The contents of the value stack is shown in [], with the top
2940 at the right; 'tb' is trace-back info, 'val' the exception's
2941 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002942
2943 Value stack Label Instruction Argument
2944 [] SETUP_EXCEPT L1
2945 [] <code for S>
2946 [] POP_BLOCK
2947 [] JUMP_FORWARD L0
2948
Guido van Rossum3f5da241990-12-20 15:06:42 +00002949 [tb, val, exc] L1: DUP )
2950 [tb, val, exc, exc] <evaluate E1> )
2951 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2952 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2953 [tb, val, exc, 1] POP )
2954 [tb, val, exc] POP
2955 [tb, val] <assign to V1> (or POP if no V1)
2956 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002957 [] <code for S1>
2958 JUMP_FORWARD L0
2959
Guido van Rossum3f5da241990-12-20 15:06:42 +00002960 [tb, val, exc, 0] L2: POP
2961 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002962 .............................etc.......................
2963
Guido van Rossum3f5da241990-12-20 15:06:42 +00002964 [tb, val, exc, 0] Ln+1: POP
2965 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002966
2967 [] L0: <next statement>
2968
2969 Of course, parts are not generated if Vi or Ei is not present.
2970*/
2971
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002972static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002973com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002974{
2975 int except_anchor = 0;
2976 int end_anchor = 0;
2977 int else_anchor = 0;
2978 int i;
2979 node *ch;
2980
2981 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2982 block_push(c, SETUP_EXCEPT);
2983 com_node(c, CHILD(n, 2));
2984 com_addbyte(c, POP_BLOCK);
2985 block_pop(c, SETUP_EXCEPT);
2986 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2987 com_backpatch(c, except_anchor);
2988 for (i = 3;
2989 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2990 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002991 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002992 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002993 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002994 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002995 break;
2996 }
2997 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002998 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002999 com_addoparg(c, SET_LINENO, ch->n_lineno);
3000 if (NCH(ch) > 1) {
3001 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003002 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003003 com_node(c, CHILD(ch, 1));
3004 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003005 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003006 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3007 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003008 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003009 }
3010 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003011 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003012 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003013 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003014 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003015 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003016 com_pop(c, 1);
3017 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003018 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003019 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003020 com_node(c, CHILD(n, i+2));
3021 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3022 if (except_anchor) {
3023 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003024 /* We come in with [tb, val, exc, 0] on the
3025 stack; one pop and it's the same as
3026 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003027 com_addbyte(c, POP_TOP);
3028 }
3029 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003030 /* We actually come in here with [tb, val, exc] but the
3031 END_FINALLY will zap those and jump around.
3032 The c_stacklevel does not reflect them so we need not pop
3033 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003034 com_addbyte(c, END_FINALLY);
3035 com_backpatch(c, else_anchor);
3036 if (i < NCH(n))
3037 com_node(c, CHILD(n, i+2));
3038 com_backpatch(c, end_anchor);
3039}
3040
3041static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003042com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003043{
3044 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003045 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003046
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003047 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3048 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003049 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003050 com_addbyte(c, POP_BLOCK);
3051 block_pop(c, SETUP_FINALLY);
3052 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003053 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003054 /* While the generated code pushes only one item,
3055 the try-finally handling can enter here with
3056 up to three items. OK, here are the details:
3057 3 for an exception, 2 for RETURN, 1 for BREAK. */
3058 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003059 com_backpatch(c, finally_anchor);
3060 ch = CHILD(n, NCH(n)-1);
3061 com_addoparg(c, SET_LINENO, ch->n_lineno);
3062 com_node(c, ch);
3063 com_addbyte(c, END_FINALLY);
3064 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003065 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003066}
3067
3068static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003069com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003070{
3071 REQ(n, try_stmt);
3072 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3073 | 'try' ':' suite 'finally' ':' suite */
3074 if (TYPE(CHILD(n, 3)) != except_clause)
3075 com_try_finally(c, n);
3076 else
3077 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003078}
3079
Guido van Rossum8b993a91997-01-17 21:04:03 +00003080static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003081get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003082{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003083 int i;
3084
Guido van Rossum8b993a91997-01-17 21:04:03 +00003085 /* Label to avoid tail recursion */
3086 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003087 switch (TYPE(n)) {
3088
3089 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003090 if (NCH(n) == 1) {
3091 n = CHILD(n, 0);
3092 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003093 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003094 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003095 case file_input:
3096 for (i = 0; i < NCH(n); i++) {
3097 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003098 if (TYPE(ch) == stmt) {
3099 n = ch;
3100 goto next;
3101 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003102 }
3103 break;
3104
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003105 case stmt:
3106 case simple_stmt:
3107 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003108 n = CHILD(n, 0);
3109 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003110
3111 case expr_stmt:
3112 case testlist:
3113 case test:
3114 case and_test:
3115 case not_test:
3116 case comparison:
3117 case expr:
3118 case xor_expr:
3119 case and_expr:
3120 case shift_expr:
3121 case arith_expr:
3122 case term:
3123 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003124 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003125 if (NCH(n) == 1) {
3126 n = CHILD(n, 0);
3127 goto next;
3128 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003129 break;
3130
3131 case atom:
3132 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003133 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003134 break;
3135
3136 }
3137 return NULL;
3138}
3139
Guido van Rossum79f25d91997-04-29 20:08:16 +00003140static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003141get_docstring(node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003142{
Guido van Rossum541563e1999-01-28 15:08:09 +00003143 /* Don't generate doc-strings if run with -OO */
3144 if (Py_OptimizeFlag > 1)
3145 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003146 n = get_rawdocstring(n);
3147 if (n == NULL)
3148 return NULL;
3149 return parsestrplus(n);
3150}
3151
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003152static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003153com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003154{
3155 REQ(n, suite);
3156 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3157 if (NCH(n) == 1) {
3158 com_node(c, CHILD(n, 0));
3159 }
3160 else {
3161 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003162 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003163 node *ch = CHILD(n, i);
3164 if (TYPE(ch) == stmt)
3165 com_node(c, ch);
3166 }
3167 }
3168}
3169
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003170/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003171static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003172com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003173{
3174 int i = c->c_nblocks;
3175 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3176 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3177 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003178 else if (i <= 0) {
3179 /* at the outer level */
3180 com_error(c, PyExc_SyntaxError,
3181 "'continue' not properly in loop");
3182 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003183 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003184 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003185 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003186 if (c->c_block[j] == SETUP_LOOP)
3187 break;
3188 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003189 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003190 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003191 for (; i > j; --i) {
3192 if (c->c_block[i] == SETUP_EXCEPT ||
3193 c->c_block[i] == SETUP_FINALLY) {
3194 com_addoparg(c, CONTINUE_LOOP,
3195 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003196 return;
3197 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003198 if (c->c_block[i] == END_FINALLY) {
3199 com_error(c, PyExc_SyntaxError,
3200 "'continue' not supported inside 'finally' clause");
3201 return;
3202 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003203 }
3204 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003205 com_error(c, PyExc_SyntaxError,
3206 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003207 }
3208 /* XXX Could allow it inside a 'finally' clause
3209 XXX if we could pop the exception still on the stack */
3210}
3211
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003212static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003213com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003214{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003215 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003216 if (TYPE(n) == lambdef) {
3217 /* lambdef: 'lambda' [varargslist] ':' test */
3218 n = CHILD(n, 1);
3219 }
3220 else {
3221 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3222 n = CHILD(n, 2);
3223 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3224 n = CHILD(n, 1);
3225 }
3226 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003227 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003228 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003229 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003230 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3231 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003232 nargs = 0;
3233 ndefs = 0;
3234 for (i = 0; i < nch; i++) {
3235 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003236 if (TYPE(CHILD(n, i)) == STAR ||
3237 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003238 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003239 nargs++;
3240 i++;
3241 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003242 t = RPAR; /* Anything except EQUAL or COMMA */
3243 else
3244 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003245 if (t == EQUAL) {
3246 i++;
3247 ndefs++;
3248 com_node(c, CHILD(n, i));
3249 i++;
3250 if (i >= nch)
3251 break;
3252 t = TYPE(CHILD(n, i));
3253 }
3254 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003255 /* Treat "(a=1, b)" as an error */
3256 if (ndefs)
3257 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003258 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003259 }
3260 if (t != COMMA)
3261 break;
3262 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003263 return ndefs;
3264}
3265
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003266static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003267com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003268{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003269 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003270 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003271 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003272 ndefs = com_argdefs(c, n);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003273 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3274 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003275 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003276 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003277 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003278 c->c_errors++;
3279 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003280 int closure = com_make_closure(c, (PyCodeObject *)co);
3281 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003282 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003283 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003284 if (closure)
3285 com_addoparg(c, MAKE_CLOSURE, ndefs);
3286 else
3287 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003288 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003289 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003290 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003291 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003292 }
3293}
3294
3295static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003296com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003297{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003298 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003299 REQ(n, testlist);
3300 /* testlist: test (',' test)* [','] */
3301 for (i = 0; i < NCH(n); i += 2)
3302 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003303 i = (NCH(n)+1) / 2;
3304 com_addoparg(c, BUILD_TUPLE, i);
3305 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003306}
3307
3308static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003309com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003310{
Guido van Rossum25831651993-05-19 14:50:45 +00003311 int i;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003312 PyObject *co, *v;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003313 char *name;
3314
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003315 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003316 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003317 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003318 c->c_errors++;
3319 return;
3320 }
3321 /* Push the class name on the stack */
3322 i = com_addconst(c, v);
3323 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003324 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003325 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003326 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003327 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003328 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003329 com_push(c, 1);
3330 }
Guido van Rossum25831651993-05-19 14:50:45 +00003331 else
3332 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003333 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003334 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003335 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003336 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003337 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003338 c->c_errors++;
3339 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003340 int closure = com_make_closure(c, (PyCodeObject *)co);
3341 i = com_addconst(c, co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003342 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003343 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003344 if (closure)
3345 com_addoparg(c, MAKE_CLOSURE, 0);
3346 else
3347 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003348 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003349 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003350 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003351 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003352 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003353 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003354}
3355
3356static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003357com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003358{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003359 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003360 if (c->c_errors)
3361 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003362 switch (TYPE(n)) {
3363
3364 /* Definition nodes */
3365
3366 case funcdef:
3367 com_funcdef(c, n);
3368 break;
3369 case classdef:
3370 com_classdef(c, n);
3371 break;
3372
3373 /* Trivial parse tree nodes */
3374
3375 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003376 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003377 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003378 n = CHILD(n, 0);
3379 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003380
3381 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003382 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
3383 com_addoparg(c, SET_LINENO, n->n_lineno);
3384 {
3385 int i;
3386 for (i = 0; i < NCH(n)-1; i += 2)
3387 com_node(c, CHILD(n, i));
3388 }
3389 break;
3390
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003391 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003392 com_addoparg(c, SET_LINENO, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003393 n = CHILD(n, 0);
3394 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003395
3396 /* Statement nodes */
3397
3398 case expr_stmt:
3399 com_expr_stmt(c, n);
3400 break;
3401 case print_stmt:
3402 com_print_stmt(c, n);
3403 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003404 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003405 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003406 break;
3407 case pass_stmt:
3408 break;
3409 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003410 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003411 com_error(c, PyExc_SyntaxError,
3412 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003413 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003414 com_addbyte(c, BREAK_LOOP);
3415 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003416 case continue_stmt:
3417 com_continue_stmt(c, n);
3418 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003419 case return_stmt:
3420 com_return_stmt(c, n);
3421 break;
3422 case raise_stmt:
3423 com_raise_stmt(c, n);
3424 break;
3425 case import_stmt:
3426 com_import_stmt(c, n);
3427 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003428 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003429 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003430 case exec_stmt:
3431 com_exec_stmt(c, n);
3432 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003433 case assert_stmt:
3434 com_assert_stmt(c, n);
3435 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003436 case if_stmt:
3437 com_if_stmt(c, n);
3438 break;
3439 case while_stmt:
3440 com_while_stmt(c, n);
3441 break;
3442 case for_stmt:
3443 com_for_stmt(c, n);
3444 break;
3445 case try_stmt:
3446 com_try_stmt(c, n);
3447 break;
3448 case suite:
3449 com_suite(c, n);
3450 break;
3451
3452 /* Expression nodes */
3453
3454 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003455 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003456 break;
3457 case test:
3458 com_test(c, n);
3459 break;
3460 case and_test:
3461 com_and_test(c, n);
3462 break;
3463 case not_test:
3464 com_not_test(c, n);
3465 break;
3466 case comparison:
3467 com_comparison(c, n);
3468 break;
3469 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003470 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003471 break;
3472 case expr:
3473 com_expr(c, n);
3474 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003475 case xor_expr:
3476 com_xor_expr(c, n);
3477 break;
3478 case and_expr:
3479 com_and_expr(c, n);
3480 break;
3481 case shift_expr:
3482 com_shift_expr(c, n);
3483 break;
3484 case arith_expr:
3485 com_arith_expr(c, n);
3486 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003487 case term:
3488 com_term(c, n);
3489 break;
3490 case factor:
3491 com_factor(c, n);
3492 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003493 case power:
3494 com_power(c, n);
3495 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003496 case atom:
3497 com_atom(c, n);
3498 break;
3499
3500 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003501 com_error(c, PyExc_SystemError,
3502 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003503 }
3504}
3505
Tim Petersdbd9ba62000-07-09 03:09:57 +00003506static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003507
3508static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003509com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003510{
3511 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3512 if (TYPE(CHILD(n, 0)) == LPAR)
3513 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003514 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003515 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003516 com_pop(c, 1);
3517 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003518}
3519
3520static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003521com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003522{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003523 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003524 if (NCH(n) == 1) {
3525 com_fpdef(c, CHILD(n, 0));
3526 }
3527 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003528 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003529 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003530 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003531 for (i = 0; i < NCH(n); i += 2)
3532 com_fpdef(c, CHILD(n, i));
3533 }
3534}
3535
3536static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003537com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003538{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003539 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003540 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003541 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003542 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003543 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003544 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003545 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003546 /* Enter all arguments in table of locals */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003547 for (i = 0, narg = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003548 node *ch = CHILD(n, i);
3549 node *fp;
3550 char *name;
Guido van Rossum50564e81996-01-12 01:13:16 +00003551 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003552 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003553 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3554 fp = CHILD(ch, 0);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00003555 if (TYPE(fp) != NAME) {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003556 name = nbuf;
3557 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003558 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003559 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003560 narg++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003561 /* all name updates handled by symtable */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003562 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003563 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003564 ch = CHILD(n, i);
3565 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003566 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003567 else
3568 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003569 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003570 if (complex) {
3571 /* Generate code for complex arguments only after
3572 having counted the simple arguments */
3573 int ilocal = 0;
3574 for (i = 0; i < nch; i++) {
3575 node *ch = CHILD(n, i);
3576 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003577 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003578 break;
3579 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3580 fp = CHILD(ch, 0);
3581 if (TYPE(fp) != NAME) {
3582 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003583 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003584 com_fpdef(c, ch);
3585 }
3586 ilocal++;
3587 if (++i >= nch)
3588 break;
3589 ch = CHILD(n, i);
3590 if (TYPE(ch) == EQUAL)
3591 i += 2;
3592 else
3593 REQ(ch, COMMA);
3594 }
3595 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003596}
3597
3598static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003599com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003600{
3601 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003602 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003603 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003604 doc = get_docstring(n);
3605 if (doc != NULL) {
3606 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003607 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003608 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003609 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003610 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003611 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003612 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003613 for (i = 0; i < NCH(n); i++) {
3614 node *ch = CHILD(n, i);
3615 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3616 com_node(c, ch);
3617 }
3618}
3619
3620/* Top-level compile-node interface */
3621
3622static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003623compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003624{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003625 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003626 node *ch;
3627 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003628 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003629 doc = get_docstring(CHILD(n, 4));
3630 if (doc != NULL) {
3631 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003632 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003633 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003634 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003635 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003636 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3637 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003638 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003639 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003640 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003641 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003642 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003643 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003644 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003645 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003646 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003647}
3648
3649static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003650compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003651{
Guido van Rossum590baa41993-11-30 13:40:46 +00003652 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003653 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003654 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003655
3656 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003657 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003658 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003659 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003660 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003661 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003662 else
3663 ch = CHILD(n, 2);
3664 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003665 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003666 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003667}
3668
3669static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003670compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003671{
3672 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003673 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003674 REQ(n, classdef);
3675 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3676 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003677 c->c_private = c->c_name;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003678 ch = CHILD(n, NCH(n)-1); /* The suite */
3679 doc = get_docstring(ch);
3680 if (doc != NULL) {
3681 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003682 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003683 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003684 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003685 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003686 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003687 }
3688 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003689 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003690 com_node(c, ch);
3691 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003692 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003693 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003694 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003695}
3696
3697static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003698compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003699{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003700 com_addoparg(c, SET_LINENO, n->n_lineno);
3701
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003702 switch (TYPE(n)) {
3703
Guido van Rossum4c417781991-01-21 16:09:22 +00003704 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003705 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003706 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003707 n = CHILD(n, 0);
3708 if (TYPE(n) != NEWLINE)
3709 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003710 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003711 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003712 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003713 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003714 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003715 break;
3716
Guido van Rossum4c417781991-01-21 16:09:22 +00003717 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003718 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003719 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003720 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003721 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003722 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003723 break;
3724
Guido van Rossum590baa41993-11-30 13:40:46 +00003725 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003726 com_node(c, CHILD(n, 0));
3727 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003728 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003729 break;
3730
Guido van Rossum590baa41993-11-30 13:40:46 +00003731 case lambdef: /* anonymous function definition */
3732 compile_lambdef(c, n);
3733 break;
3734
Guido van Rossum4c417781991-01-21 16:09:22 +00003735 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003736 compile_funcdef(c, n);
3737 break;
3738
Guido van Rossum4c417781991-01-21 16:09:22 +00003739 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003740 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003741 break;
3742
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003743 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003744 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003745 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003746 }
3747}
3748
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003749static PyObject *
3750dict_keys_inorder(PyObject *dict, int offset)
3751{
3752 PyObject *tuple, *k, *v;
3753 int i, pos = 0, size = PyDict_Size(dict);
3754
3755 tuple = PyTuple_New(size);
3756 if (tuple == NULL)
3757 return NULL;
3758 while (PyDict_Next(dict, &pos, &k, &v)) {
3759 i = PyInt_AS_LONG(v);
3760 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00003761 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003762 PyTuple_SET_ITEM(tuple, i - offset, k);
3763 }
3764 return tuple;
3765}
3766
Guido van Rossum79f25d91997-04-29 20:08:16 +00003767PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003768PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003769{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003770 return PyNode_CompileFlags(n, filename, NULL);
3771}
3772
3773PyCodeObject *
3774PyNode_CompileFlags(node *n, char *filename, PyCompilerFlags *flags)
3775{
3776 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003777}
3778
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003779struct symtable *
3780PyNode_CompileSymtable(node *n, char *filename)
3781{
3782 struct symtable *st;
3783
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003784 st = symtable_init();
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003785 if (st == NULL)
3786 return NULL;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00003787 assert(st->st_symbols != NULL);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003788 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
3789 if (st->st_errors > 0) {
3790 PySymtable_Free(st);
3791 return NULL;
3792 }
3793 symtable_node(st, n);
3794 if (st->st_errors > 0) {
3795 PySymtable_Free(st);
3796 return NULL;
3797 }
3798 return st;
3799}
3800
Guido van Rossum79f25d91997-04-29 20:08:16 +00003801static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003802icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003803{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003804 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003805}
3806
Guido van Rossum79f25d91997-04-29 20:08:16 +00003807static PyCodeObject *
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003808jcompile(node *n, char *filename, struct compiling *base,
3809 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003810{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003811 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003812 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003813 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003814 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003815 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003816 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003817 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003818 /* c_symtable still points to parent's symbols */
3819 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003820 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003821 sc.c_nested = 1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003822 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003823 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00003824 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003825 if (sc.c_future == NULL) {
3826 com_free(&sc);
3827 return NULL;
3828 }
3829 if (flags) {
3830 if (flags->cf_nested_scopes)
3831 sc.c_future->ff_nested_scopes = 1;
3832 else if (sc.c_future->ff_nested_scopes)
3833 flags->cf_nested_scopes = 1;
3834 }
3835 if (symtable_build(&sc, n) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003836 com_free(&sc);
3837 return NULL;
3838 }
3839 }
3840 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003841 if (symtable_load_symbols(&sc) < 0) {
3842 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003843 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003844 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003845 compile_node(&sc, n);
3846 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00003847 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003848 PyObject *consts, *names, *varnames, *filename, *name,
3849 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003850 consts = PyList_AsTuple(sc.c_consts);
3851 names = PyList_AsTuple(sc.c_names);
3852 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003853 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
3854 freevars = dict_keys_inorder(sc.c_freevars,
3855 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003856 filename = PyString_InternFromString(sc.c_filename);
3857 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003858 if (!PyErr_Occurred())
3859 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003860 sc.c_nlocals,
3861 sc.c_maxstacklevel,
3862 sc.c_flags,
3863 sc.c_code,
3864 consts,
3865 names,
3866 varnames,
3867 freevars,
3868 cellvars,
3869 filename,
3870 name,
3871 sc.c_firstlineno,
3872 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003873 Py_XDECREF(consts);
3874 Py_XDECREF(names);
3875 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003876 Py_XDECREF(freevars);
3877 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003878 Py_XDECREF(filename);
3879 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003880 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00003881 else if (!PyErr_Occurred()) {
3882 /* This could happen if someone called PyErr_Clear() after an
3883 error was reported above. That's not supposed to happen,
3884 but I just plugged one case and I'm not sure there can't be
3885 others. In that case, raise SystemError so that at least
3886 it gets reported instead dumping core. */
3887 PyErr_SetString(PyExc_SystemError, "lost syntax error");
3888 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003889 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00003890 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003891 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00003892 sc.c_symtable = NULL;
3893 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003894 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003895 return co;
3896}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003897
3898int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003899PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003900{
3901 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003902 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003903 int line = co->co_firstlineno;
3904 int addr = 0;
3905 while (--size >= 0) {
3906 addr += *p++;
3907 if (addr > addrq)
3908 break;
3909 line += *p++;
3910 }
3911 return line;
3912}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003913
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003914/* The test for LOCAL must come before the test for FREE in order to
3915 handle classes where name is both local and free. The local var is
3916 a method and the free var is a free var referenced within a method.
3917*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003918
3919static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003920get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003921{
3922 PyObject *v;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00003923 if (c->c_symtable->st_nested_scopes) {
3924 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
3925 return CELL;
3926 if (PyDict_GetItemString(c->c_locals, name) != NULL)
3927 return LOCAL;
3928 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
3929 return FREE;
3930 v = PyDict_GetItemString(c->c_globals, name);
3931 if (v) {
3932 if (v == Py_None)
3933 return GLOBAL_EXPLICIT;
3934 else {
3935 return GLOBAL_IMPLICIT;
3936 }
3937 }
3938 } else {
3939 if (PyDict_GetItemString(c->c_locals, name) != NULL)
3940 return LOCAL;
3941 v = PyDict_GetItemString(c->c_globals, name);
3942 if (v) {
3943 if (v == Py_None)
3944 return GLOBAL_EXPLICIT;
3945 else {
3946 return GLOBAL_IMPLICIT;
3947 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003948 }
3949 }
3950 {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003951 char buf[350];
3952 sprintf(buf,
Jeremy Hylton51257732001-03-01 00:42:55 +00003953 "unknown scope for %.100s in %.100s(%s) "
3954 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
Jeremy Hylton483638c2001-02-01 20:20:45 +00003955 name, c->c_name,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003956 PyObject_REPR(c->c_symtable->st_cur->ste_id),
Jeremy Hylton51257732001-03-01 00:42:55 +00003957 c->c_filename,
3958 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
3959 PyObject_REPR(c->c_locals),
3960 PyObject_REPR(c->c_globals)
3961 );
3962
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003963 Py_FatalError(buf);
3964 }
3965 return -1; /* can't get here */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003966}
3967
Guido van Rossum207fda62001-03-02 03:30:41 +00003968/* Helper functions to issue warnings */
3969
3970static int
3971issue_warning(char *msg, char *filename, int lineno)
3972{
3973 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
3974 lineno, NULL, NULL) < 0) {
3975 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
3976 PyErr_SetString(PyExc_SyntaxError, msg);
3977 PyErr_SyntaxLocation(filename, lineno);
3978 }
3979 return -1;
3980 }
3981 return 0;
3982}
Guido van Rossumee34ac12001-02-28 22:08:12 +00003983
Jeremy Hylton4419ac12001-02-28 22:54:51 +00003984static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00003985symtable_warn(struct symtable *st, char *msg)
3986{
Guido van Rossum207fda62001-03-02 03:30:41 +00003987 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00003988 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00003989 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00003990 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00003991 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00003992}
3993
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00003994/* Helper function for setting lineno and filename */
3995
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003996static int
3997symtable_build(struct compiling *c, node *n)
3998{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003999 if ((c->c_symtable = symtable_init()) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004000 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004001 c->c_symtable->st_future = c->c_future;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004002 if (c->c_future->ff_nested_scopes)
4003 c->c_symtable->st_nested_scopes = 1;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004004 c->c_symtable->st_filename = c->c_filename;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004005 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
4006 if (c->c_symtable->st_errors > 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004007 return -1;
4008 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004009 if (c->c_symtable->st_errors > 0)
4010 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004011 /* reset for second pass */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004012 c->c_symtable->st_nscopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004013 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004014 return 0;
4015}
4016
4017static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004018symtable_init_compiling_symbols(struct compiling *c)
4019{
4020 PyObject *varnames;
4021
4022 varnames = c->c_symtable->st_cur->ste_varnames;
4023 if (varnames == NULL) {
4024 varnames = PyList_New(0);
4025 if (varnames == NULL)
4026 return -1;
4027 c->c_symtable->st_cur->ste_varnames = varnames;
4028 Py_INCREF(varnames);
4029 } else
4030 Py_INCREF(varnames);
4031 c->c_varnames = varnames;
4032
4033 c->c_globals = PyDict_New();
4034 if (c->c_globals == NULL)
4035 return -1;
4036 c->c_freevars = PyDict_New();
4037 if (c->c_freevars == NULL)
4038 return -1;
4039 c->c_cellvars = PyDict_New();
4040 if (c->c_cellvars == NULL)
4041 return -1;
4042 return 0;
4043}
4044
4045struct symbol_info {
4046 int si_nlocals;
4047 int si_ncells;
4048 int si_nfrees;
4049 int si_nimplicit;
4050};
4051
4052static void
4053symtable_init_info(struct symbol_info *si)
4054{
4055 si->si_nlocals = 0;
4056 si->si_ncells = 0;
4057 si->si_nfrees = 0;
4058 si->si_nimplicit = 0;
4059}
4060
4061static int
4062symtable_resolve_free(struct compiling *c, PyObject *name,
4063 struct symbol_info *si)
4064{
4065 PyObject *dict, *v;
4066
4067 /* Seperate logic for DEF_FREE. If it occurs in a function,
4068 it indicates a local that we must allocate storage for (a
4069 cell var). If it occurs in a class, then the class has a
4070 method and a free variable with the same name.
4071 */
4072
4073 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
4074 v = PyInt_FromLong(si->si_ncells++);
4075 dict = c->c_cellvars;
4076 } else {
4077 v = PyInt_FromLong(si->si_nfrees++);
4078 dict = c->c_freevars;
4079 }
4080 if (v == NULL)
4081 return -1;
4082 if (PyDict_SetItem(dict, name, v) < 0) {
4083 Py_DECREF(v);
4084 return -1;
4085 }
4086 Py_DECREF(v);
4087 return 0;
4088}
4089
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004090/* If a variable is a cell and an argument, make sure that appears in
4091 co_cellvars before any variable to its right in varnames.
4092*/
4093
4094
4095static int
4096symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4097 PyObject *varnames, int flags)
4098{
4099 PyObject *v, *w, *d, *list = NULL;
4100 int i, pos;
4101
4102 if (flags & CO_VARARGS)
4103 argcount++;
4104 if (flags & CO_VARKEYWORDS)
4105 argcount++;
4106 for (i = argcount; --i >= 0; ) {
4107 v = PyList_GET_ITEM(varnames, i);
4108 if (PyDict_GetItem(*cellvars, v)) {
4109 if (list == NULL) {
4110 list = PyList_New(1);
4111 if (list == NULL)
4112 return -1;
4113 PyList_SET_ITEM(list, 0, v);
4114 Py_INCREF(v);
4115 } else
4116 PyList_Insert(list, 0, v);
4117 }
4118 }
4119 if (list == NULL || PyList_GET_SIZE(list) == 0)
4120 return 0;
4121 /* There are cellvars that are also arguments. Create a dict
4122 to replace cellvars and put the args at the front.
4123 */
4124 d = PyDict_New();
4125 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
4126 v = PyInt_FromLong(i);
4127 if (v == NULL)
4128 goto fail;
4129 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
4130 goto fail;
4131 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
4132 goto fail;
4133 }
4134 pos = 0;
4135 i = PyList_GET_SIZE(list);
4136 Py_DECREF(list);
4137 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
4138 w = PyInt_FromLong(i++); /* don't care about the old key */
4139 if (PyDict_SetItem(d, v, w) < 0) {
4140 Py_DECREF(w);
4141 goto fail;
4142 }
4143 Py_DECREF(w);
4144 }
4145 Py_DECREF(*cellvars);
4146 *cellvars = d;
4147 return 1;
4148 fail:
4149 Py_DECREF(d);
4150 return -1;
4151}
4152
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004153static int
4154symtable_freevar_offsets(PyObject *freevars, int offset)
4155{
4156 PyObject *name, *v;
4157 int pos;
4158
4159 /* The cell vars are the first elements of the closure,
4160 followed by the free vars. Update the offsets in
4161 c_freevars to account for number of cellvars. */
4162 pos = 0;
4163 while (PyDict_Next(freevars, &pos, &name, &v)) {
4164 int i = PyInt_AS_LONG(v) + offset;
4165 PyObject *o = PyInt_FromLong(i);
4166 if (o == NULL)
4167 return -1;
4168 if (PyDict_SetItem(freevars, name, o) < 0) {
4169 Py_DECREF(o);
4170 return -1;
4171 }
4172 Py_DECREF(o);
4173 }
4174 return 0;
4175}
4176
4177static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004178symtable_check_unoptimized(struct compiling *c,
4179 PySymtableEntryObject *ste,
4180 struct symbol_info *si)
4181{
4182 char buf[300];
4183
4184 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4185 || (ste->ste_nested && si->si_nimplicit)))
4186 return 0;
4187
4188#define ILLEGAL_IMPORT_STAR \
4189"import * is not allowed in function '%.100s' " \
4190"because it contains a nested function with free variables"
4191
4192#define ILLEGAL_BARE_EXEC \
4193"unqualified exec is not allowed in function '%.100s' " \
4194"because it contains a nested function with free variables"
4195
4196#define ILLEGAL_EXEC_AND_IMPORT_STAR \
4197"function '%.100s' uses import * and bare exec, which are illegal" \
4198"because it contains a nested function with free variables"
4199
4200 /* XXX perhaps the linenos for these opt-breaking statements
4201 should be stored so the exception can point to them. */
4202
4203 if (ste->ste_optimized == OPT_IMPORT_STAR)
4204 sprintf(buf, ILLEGAL_IMPORT_STAR,
4205 PyString_AS_STRING(ste->ste_name));
4206 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
4207 sprintf(buf, ILLEGAL_BARE_EXEC,
4208 PyString_AS_STRING(ste->ste_name));
4209 else {
4210 sprintf(buf, ILLEGAL_EXEC_AND_IMPORT_STAR,
4211 PyString_AS_STRING(ste->ste_name));
4212 }
4213
4214 if (c->c_symtable->st_nested_scopes) {
4215 PyErr_SetString(PyExc_SyntaxError, buf);
4216 PyErr_SyntaxLocation(c->c_symtable->st_filename,
4217 ste->ste_lineno);
4218 return -1;
Guido van Rossum207fda62001-03-02 03:30:41 +00004219 }
4220 else {
4221 return issue_warning(buf, c->c_filename, ste->ste_lineno);
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004222 }
4223 return 0;
4224}
4225
4226static int
4227symtable_check_shadow(struct symtable *st, PyObject *name, int flags)
4228{
4229 char buf[500];
4230 PyObject *children, *v;
Jeremy Hyltonc1761322001-02-28 23:44:45 +00004231 PySymtableEntryObject *child = NULL;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004232 int i;
4233
4234 if (!(flags & DEF_BOUND))
4235 return 0;
4236 /* The semantics of this code will change with nested scopes.
4237 It is defined in the current scope and referenced in a
4238 child scope. Under the old rules, the child will see a
4239 global. Under the new rules, the child will see the
4240 binding in the current scope.
4241 */
4242
4243 /* Find name of child function that has free variable */
4244 children = st->st_cur->ste_children;
4245 for (i = 0; i < PyList_GET_SIZE(children); i++) {
4246 int cflags;
4247 child = (PySymtableEntryObject *)PyList_GET_ITEM(children, i);
4248 v = PyDict_GetItem(child->ste_symbols, name);
4249 if (v == NULL)
4250 continue;
4251 cflags = PyInt_AS_LONG(v);
4252 if (!(cflags & DEF_BOUND))
4253 break;
4254 }
Jeremy Hyltonc1761322001-02-28 23:44:45 +00004255
4256 assert(child != NULL);
4257
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004258 sprintf(buf, "local name '%.100s' in '%.100s' shadows "
4259 "use of '%.100s' as global in nested scope '%.100s'",
4260 PyString_AS_STRING(name),
4261 PyString_AS_STRING(st->st_cur->ste_name),
4262 PyString_AS_STRING(name),
4263 PyString_AS_STRING(child->ste_name)
4264 );
4265
4266 return symtable_warn(st, buf);
4267}
4268
4269static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004270symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4271 struct symbol_info *si)
4272{
4273 if (ste->ste_type != TYPE_MODULE)
4274 c->c_flags |= CO_NEWLOCALS;
4275 if (ste->ste_type == TYPE_FUNCTION) {
4276 c->c_nlocals = si->si_nlocals;
4277 if (ste->ste_optimized == 0)
4278 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004279 else if (ste->ste_optimized != OPT_EXEC)
4280 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004281 }
4282 return 0;
4283}
4284
4285static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004286symtable_load_symbols(struct compiling *c)
4287{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004288 static PyObject *implicit = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004289 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004290 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004291 PyObject *name, *varnames, *v;
4292 int i, flags, pos;
4293 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004294
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004295 if (implicit == NULL) {
4296 implicit = PyInt_FromLong(1);
4297 if (implicit == NULL)
4298 return -1;
4299 }
4300 v = NULL;
4301
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004302 if (symtable_init_compiling_symbols(c) < 0)
4303 goto fail;
4304 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004305 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004306 si.si_nlocals = PyList_GET_SIZE(varnames);
4307 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004308
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004309 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004310 v = PyInt_FromLong(i);
4311 if (PyDict_SetItem(c->c_locals,
4312 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004313 goto fail;
4314 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004315 }
4316
4317 /* XXX The cases below define the rules for whether a name is
4318 local or global. The logic could probably be clearer. */
4319 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004320 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4321 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004322
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004323 if (st->st_nested_scopes == 0
4324 && (flags & (DEF_FREE | DEF_FREE_CLASS))) {
4325 if (symtable_check_shadow(st, name, flags) < 0)
4326 goto fail;
4327 }
4328
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004329 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004330 /* undo the original DEF_FREE */
4331 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004332
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004333 /* Deal with names that need two actions:
4334 1. Cell variables, which are also locals.
4335 2. Free variables in methods that are also class
4336 variables or declared global.
4337 */
4338 if (flags & (DEF_FREE | DEF_FREE_CLASS)) {
4339 if ((ste->ste_type == TYPE_CLASS
4340 && flags != DEF_FREE_CLASS)
4341 || (flags & (DEF_LOCAL | DEF_PARAM)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004342 symtable_resolve_free(c, name, &si);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004343 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004344
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004345 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004346 c->c_argcount--;
4347 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004348 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004349 c->c_argcount--;
4350 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004351 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004352 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004353 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004354 if (flags & DEF_PARAM) {
4355 PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004356 PyString_AS_STRING(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004357 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004358 ste->ste_lineno);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004359 st->st_errors++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004360 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004361 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004362 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4363 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004364 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004365 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004366 if (PyDict_SetItem(c->c_globals, name, implicit) < 0)
4367 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004368 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004369 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004370 if (v == NULL)
4371 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004372 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004373 goto fail;
4374 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004375 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004376 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004377 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004378 } else if (is_free(flags)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004379 if (ste->ste_nested && st->st_nested_scopes) {
4380 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004381 if (v == NULL)
4382 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004383 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004384 goto fail;
4385 Py_DECREF(v);
4386 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004387 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004388 if (PyDict_SetItem(c->c_globals, name,
4389 implicit) < 0)
4390 goto fail;
Jeremy Hylton51257732001-03-01 00:42:55 +00004391 if (st->st_nscopes != 1) {
4392 v = PyInt_FromLong(flags);
4393 if (PyDict_SetItem(st->st_global,
4394 name, v))
4395 goto fail;
4396 Py_DECREF(v);
4397 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004398 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004399 }
4400 }
4401
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004402 if (si.si_ncells > 1) { /* one cell is always in order */
4403 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
4404 c->c_varnames, c->c_flags) < 0)
4405 return -1;
4406 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004407 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4408 return -1;
4409 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004410 fail:
4411 /* is this always the right thing to do? */
4412 Py_XDECREF(v);
4413 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004414}
4415
4416static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004417symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004418{
4419 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004420
4421 st = (struct symtable *)PyMem_Malloc(sizeof(struct symtable));
4422 if (st == NULL)
4423 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004424 st->st_pass = 1;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004425 st->st_nested_scopes = NESTED_SCOPES_DEFAULT;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004426 st->st_filename = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004427 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004428 goto fail;
4429 if ((st->st_symbols = PyDict_New()) == NULL)
4430 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004431 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004432 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004433 st->st_errors = 0;
4434 st->st_tmpname = 0;
4435 st->st_private = NULL;
4436 return st;
4437 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004438 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004439 return NULL;
4440}
4441
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004442void
4443PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004444{
4445 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004446 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004447 Py_XDECREF(st->st_cur);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004448 PyMem_Free((void *)st);
4449}
4450
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004451/* When the compiler exits a scope, it must should update the scope's
4452 free variable information with the list of free variables in its
4453 children.
4454
4455 Variables that are free in children and defined in the current
4456 scope are cellvars.
4457
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004458 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004459 false), free variables in children that are not defined here are
4460 implicit globals.
4461
4462*/
4463
4464static int
4465symtable_update_free_vars(struct symtable *st)
4466{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004467 int i, j, def;
4468 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004469 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004470
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004471 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004472 def = DEF_FREE_CLASS;
4473 else
4474 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004475 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004476 int pos = 0;
4477
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004478 if (list)
4479 PyList_SetSlice(list, 0,
4480 ((PyVarObject*)list)->ob_size, 0);
Barry Warsaw0372af72001-02-23 18:22:59 +00004481 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004482 PyList_GET_ITEM(ste->ste_children, i);
4483 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004484 int flags = PyInt_AS_LONG(o);
4485 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004486 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004487 if (list == NULL) {
4488 list = PyList_New(0);
4489 if (list == NULL)
4490 return -1;
4491 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004492 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004493 if (PyList_Append(list, name) < 0) {
4494 Py_DECREF(list);
4495 return -1;
4496 }
4497 }
4498 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004499 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004500 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00004501 v = PyDict_GetItem(ste->ste_symbols, name);
4502 /* If a name N is declared global in scope A and
4503 referenced in scope B contained (perhaps
4504 indirectly) in A and there are no scopes
4505 with bindings for N between B and A, then N
4506 is global in B.
4507 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004508 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004509 int flags = PyInt_AS_LONG(v);
4510 if (flags & DEF_GLOBAL) {
4511 symtable_undo_free(st, child->ste_id,
4512 name);
4513 continue;
4514 }
4515 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004516 if (ste->ste_nested) {
4517 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004518 name, def) < 0) {
4519 Py_DECREF(list);
4520 return -1;
4521 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004522 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004523 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004524 name) < 0) {
4525 Py_DECREF(list);
4526 return -1;
4527 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004528 }
4529 }
4530 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004531
4532 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004533 return 0;
4534}
4535
4536/* If the current scope is a non-nested class or if name is not
4537 defined in the current, non-nested scope, then it is an implicit
4538 global in all nested scopes.
4539*/
4540
4541static int
4542symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
4543{
4544 PyObject *o;
4545 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004546 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00004547
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004548 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004549 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004550 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004551 if (o == NULL)
4552 return symtable_undo_free(st, child, name);
4553 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00004554
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004555 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004556 return symtable_undo_free(st, child, name);
4557 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004558 return symtable_add_def_o(st, ste->ste_symbols,
4559 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004560}
4561
4562static int
4563symtable_undo_free(struct symtable *st, PyObject *id,
4564 PyObject *name)
4565{
4566 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004567 PyObject *info;
4568 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004569
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004570 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
4571 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004572 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00004573
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004574 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004575 if (info == NULL)
4576 return 0;
4577 v = PyInt_AS_LONG(info);
4578 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004579 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004580 DEF_FREE_GLOBAL) < 0)
4581 return -1;
4582 } else
4583 /* If the name is defined here or declared global,
4584 then the recursion stops. */
4585 return 0;
4586
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004587 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
4588 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00004589 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004590 PyList_GET_ITEM(ste->ste_children, i);
4591 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004592 if (x < 0)
4593 return x;
4594 }
4595 return 0;
4596}
4597
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004598/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
4599 This reference is released when the scope is exited, via the DECREF
4600 in symtable_exit_scope().
4601*/
4602
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004603static int
4604symtable_exit_scope(struct symtable *st)
4605{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004606 int end;
4607
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004608 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004609 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004610 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004611 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004612 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
4613 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004614 if (PySequence_DelItem(st->st_stack, end) < 0)
4615 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004616 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004617}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004618
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004619static void
4620symtable_enter_scope(struct symtable *st, char *name, int type,
4621 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004622{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004623 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004624
4625 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004626 prev = st->st_cur;
4627 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
4628 Py_DECREF(st->st_cur);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004629 st->st_errors++;
4630 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004631 }
4632 }
Barry Warsaw0372af72001-02-23 18:22:59 +00004633 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004634 PySymtableEntry_New(st, name, type, lineno);
4635 if (strcmp(name, TOP) == 0)
4636 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004637 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004638 if (PyList_Append(prev->ste_children,
4639 (PyObject *)st->st_cur) < 0)
4640 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004641 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004642}
4643
4644static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004645symtable_lookup(struct symtable *st, char *name)
4646{
4647 char buffer[MANGLE_LEN];
4648 PyObject *v;
4649 int flags;
4650
4651 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
4652 name = buffer;
4653 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
4654 if (v == NULL) {
4655 if (PyErr_Occurred())
4656 return -1;
4657 else
4658 return 0;
4659 }
4660
4661 flags = PyInt_AS_LONG(v);
4662 return flags;
4663}
4664
4665static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004666symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004667{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004668 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004669 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004670 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004671
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004672 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004673 name = buffer;
4674 if ((s = PyString_InternFromString(name)) == NULL)
4675 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004676 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
4677 Py_DECREF(s);
4678 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004679}
4680
4681/* Must only be called with mangled names */
4682
4683static int
4684symtable_add_def_o(struct symtable *st, PyObject *dict,
4685 PyObject *name, int flag)
4686{
4687 PyObject *o;
4688 int val;
4689
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004690 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004691 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004692 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004693 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00004694 PyString_AsString(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004695 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004696 st->st_cur->ste_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004697 return -1;
4698 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004699 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004700 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004701 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004702 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004703 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004704 Py_DECREF(o);
4705 return -1;
4706 }
4707 Py_DECREF(o);
4708
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004709 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004710 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004711 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004712 } else if (flag & DEF_GLOBAL) {
4713 /* XXX need to update DEF_GLOBAL for other flags too;
4714 perhaps only DEF_FREE_GLOBAL */
4715 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004716 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004717 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004718 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004719 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004720 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004721 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004722 Py_DECREF(o);
4723 return -1;
4724 }
4725 Py_DECREF(o);
4726 }
4727 return 0;
4728}
4729
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004730#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004731
4732static void
4733symtable_node(struct symtable *st, node *n)
4734{
4735 int i, start = 0;
4736
4737 loop:
4738 switch (TYPE(n)) {
4739 case funcdef: {
4740 char *func_name = STR(CHILD(n, 1));
4741 symtable_add_def(st, func_name, DEF_LOCAL);
4742 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004743 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004744 symtable_funcdef(st, n);
4745 symtable_exit_scope(st);
4746 break;
4747 }
4748 case lambdef:
4749 if (NCH(n) == 4)
4750 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004751 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004752 symtable_funcdef(st, n);
4753 symtable_exit_scope(st);
4754 break;
4755 case classdef: {
4756 char *tmp, *class_name = STR(CHILD(n, 1));
4757 symtable_add_def(st, class_name, DEF_LOCAL);
4758 if (TYPE(CHILD(n, 2)) == LPAR) {
4759 node *bases = CHILD(n, 3);
4760 int i;
4761 for (i = 0; i < NCH(bases); i += 2) {
4762 symtable_node(st, CHILD(bases, i));
4763 }
4764 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004765 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004766 tmp = st->st_private;
4767 st->st_private = class_name;
4768 symtable_node(st, CHILD(n, NCH(n) - 1));
4769 st->st_private = tmp;
4770 symtable_exit_scope(st);
4771 break;
4772 }
4773 case if_stmt:
4774 for (i = 0; i + 3 < NCH(n); i += 4) {
4775 if (is_constant_false(NULL, (CHILD(n, i + 1))))
4776 continue;
4777 symtable_node(st, CHILD(n, i + 1));
4778 symtable_node(st, CHILD(n, i + 3));
4779 }
4780 if (i + 2 < NCH(n))
4781 symtable_node(st, CHILD(n, i + 2));
4782 break;
4783 case global_stmt:
4784 symtable_global(st, n);
4785 break;
4786 case import_stmt:
4787 symtable_import(st, n);
4788 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004789 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004790 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004791 symtable_node(st, CHILD(n, 1));
4792 if (NCH(n) > 2)
4793 symtable_node(st, CHILD(n, 3));
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004794 else
4795 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004796 if (NCH(n) > 4)
4797 symtable_node(st, CHILD(n, 5));
4798 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004799
4800 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00004801 case assert_stmt:
4802 if (Py_OptimizeFlag)
4803 return;
4804 if (NCH(n) == 2) {
4805 n = CHILD(n, 1);
4806 goto loop;
4807 } else {
4808 symtable_node(st, CHILD(n, 1));
4809 n = CHILD(n, 3);
4810 goto loop;
4811 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004812 case except_clause:
4813 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004814 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004815 if (NCH(n) > 1) {
4816 n = CHILD(n, 1);
4817 goto loop;
4818 }
4819 break;
4820 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004821 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004822 break;
4823 case expr_stmt:
4824 if (NCH(n) == 1)
4825 n = CHILD(n, 0);
4826 else {
4827 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004828 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004829 symtable_node(st, CHILD(n, 2));
4830 break;
4831 } else {
4832 int i;
4833 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004834 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004835 n = CHILD(n, NCH(n) - 1);
4836 }
4837 }
4838 goto loop;
4839 /* watchout for fall-through logic below */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004840 case argument:
4841 if (NCH(n) == 3) {
4842 n = CHILD(n, 2);
4843 goto loop;
4844 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004845 case listmaker:
4846 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton23b42272001-03-19 20:38:06 +00004847 st->st_tmpname++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004848 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton23b42272001-03-19 20:38:06 +00004849 symtable_node(st, CHILD(n, 0));
4850 st->st_tmpname--;
4851 return;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004852 }
4853 case atom:
4854 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
4855 symtable_add_use(st, STR(CHILD(n, 0)));
4856 break;
4857 }
4858 case for_stmt:
4859 if (TYPE(n) == for_stmt) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004860 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004861 start = 3;
4862 }
4863 default:
4864 if (NCH(n) == 1) {
4865 n = CHILD(n, 0);
4866 goto loop;
4867 }
4868 for (i = start; i < NCH(n); ++i)
4869 if (TYPE(CHILD(n, i)) >= single_input)
4870 symtable_node(st, CHILD(n, i));
4871 }
4872}
4873
4874static void
4875symtable_funcdef(struct symtable *st, node *n)
4876{
4877 node *body;
4878
4879 if (TYPE(n) == lambdef) {
4880 if (NCH(n) == 4)
4881 symtable_params(st, CHILD(n, 1));
4882 } else
4883 symtable_params(st, CHILD(n, 2));
4884 body = CHILD(n, NCH(n) - 1);
4885 symtable_node(st, body);
4886}
4887
4888/* The next two functions parse the argument tuple.
4889 symtable_default_arg() checks for names in the default arguments,
4890 which are references in the defining scope. symtable_params()
4891 parses the parameter names, which are defined in the function's
4892 body.
4893
4894 varargslist:
4895 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
4896 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
4897*/
4898
4899static void
4900symtable_default_args(struct symtable *st, node *n)
4901{
4902 node *c;
4903 int i;
4904
4905 if (TYPE(n) == parameters) {
4906 n = CHILD(n, 1);
4907 if (TYPE(n) == RPAR)
4908 return;
4909 }
4910 REQ(n, varargslist);
4911 for (i = 0; i < NCH(n); i += 2) {
4912 c = CHILD(n, i);
4913 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
4914 break;
4915 }
4916 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
4917 symtable_node(st, CHILD(n, i));
4918 }
4919}
4920
4921static void
4922symtable_params(struct symtable *st, node *n)
4923{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004924 int i, complex = -1, ext = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004925 node *c = NULL;
4926
4927 if (TYPE(n) == parameters) {
4928 n = CHILD(n, 1);
4929 if (TYPE(n) == RPAR)
4930 return;
4931 }
4932 REQ(n, varargslist);
4933 for (i = 0; i < NCH(n); i += 2) {
4934 c = CHILD(n, i);
4935 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
4936 ext = 1;
4937 break;
4938 }
4939 if (TYPE(c) == test) {
4940 continue;
4941 }
4942 if (TYPE(CHILD(c, 0)) == NAME)
4943 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
4944 else {
4945 char nbuf[10];
4946 sprintf(nbuf, ".%d", i);
4947 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004948 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004949 }
4950 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004951 if (ext) {
4952 c = CHILD(n, i);
4953 if (TYPE(c) == STAR) {
4954 i++;
4955 symtable_add_def(st, STR(CHILD(n, i)),
4956 DEF_PARAM | DEF_STAR);
4957 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00004958 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004959 c = NULL;
4960 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004961 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004962 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004963 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004964 i++;
4965 symtable_add_def(st, STR(CHILD(n, i)),
4966 DEF_PARAM | DEF_DOUBLESTAR);
4967 }
4968 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004969 if (complex >= 0) {
4970 int j;
4971 for (j = 0; j <= complex; j++) {
4972 c = CHILD(n, j);
4973 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00004974 c = CHILD(n, ++j);
4975 else if (TYPE(c) == EQUAL)
4976 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004977 if (TYPE(CHILD(c, 0)) == LPAR)
4978 symtable_params_fplist(st, CHILD(c, 1));
4979 }
4980 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004981}
4982
4983static void
4984symtable_params_fplist(struct symtable *st, node *n)
4985{
4986 int i;
4987 node *c;
4988
4989 REQ(n, fplist);
4990 for (i = 0; i < NCH(n); i += 2) {
4991 c = CHILD(n, i);
4992 REQ(c, fpdef);
4993 if (NCH(c) == 1)
4994 symtable_add_def(st, STR(CHILD(c, 0)),
4995 DEF_PARAM | DEF_INTUPLE);
4996 else
4997 symtable_params_fplist(st, CHILD(c, 1));
4998 }
4999
5000}
5001
5002static void
5003symtable_global(struct symtable *st, node *n)
5004{
5005 int i;
5006
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005007 /* XXX It might be helpful to warn about module-level global
5008 statements, but it's hard to tell the difference between
5009 module-level and a string passed to exec.
5010 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00005011
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005012 for (i = 1; i < NCH(n); i += 2) {
5013 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005014 int flags;
5015
5016 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005017 if (flags < 0)
5018 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005019 if (flags && flags != DEF_GLOBAL) {
5020 char buf[500];
5021 if (flags & DEF_PARAM) {
5022 PyErr_Format(PyExc_SyntaxError,
5023 "name '%.400s' is local and global",
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005024 name);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005025 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005026 st->st_cur->ste_lineno);
5027 st->st_errors++;
5028 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005029 }
5030 else {
5031 if (flags & DEF_LOCAL)
5032 sprintf(buf, GLOBAL_AFTER_ASSIGN,
5033 name);
5034 else
5035 sprintf(buf, GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005036 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005037 }
5038 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005039 symtable_add_def(st, name, DEF_GLOBAL);
5040 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005041}
5042
5043static void
5044symtable_list_comprehension(struct symtable *st, node *n)
5045{
5046 char tmpname[12];
5047
Jeremy Hylton23b42272001-03-19 20:38:06 +00005048 sprintf(tmpname, "_[%d]", st->st_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005049 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005050 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005051 symtable_node(st, CHILD(n, 3));
5052 if (NCH(n) == 5)
5053 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005054}
5055
5056static void
5057symtable_import(struct symtable *st, node *n)
5058{
5059 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005060 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005061 | 'from' dotted_name 'import'
5062 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00005063 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005064 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005065 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005066 node *dotname = CHILD(n, 1);
5067 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
5068 /* check for bogus imports */
5069 if (n->n_lineno >= st->st_future->ff_last_lineno) {
5070 PyErr_SetString(PyExc_SyntaxError,
5071 LATE_FUTURE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005072 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005073 n->n_lineno);
5074 st->st_errors++;
5075 return;
5076 }
5077 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005078 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005079 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005080 } else {
5081 for (i = 3; i < NCH(n); i += 2) {
5082 node *c = CHILD(n, i);
5083 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005084 symtable_assign(st, CHILD(c, 2),
5085 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005086 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005087 symtable_assign(st, CHILD(c, 0),
5088 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005089 }
5090 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005091 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005092 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005093 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005094 }
5095 }
5096}
5097
5098static void
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005099symtable_assign(struct symtable *st, node *n, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005100{
5101 node *tmp;
5102 int i;
5103
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005104 loop:
5105 switch (TYPE(n)) {
5106 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005107 /* invalid assignment, e.g. lambda x:x=2. The next
5108 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005109 return;
5110 case power:
5111 if (NCH(n) > 2) {
5112 for (i = 2; i < NCH(n); ++i)
5113 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
5114 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005115 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005116 if (NCH(n) > 1) {
5117 symtable_node(st, CHILD(n, 0));
5118 symtable_node(st, CHILD(n, 1));
5119 } else {
5120 n = CHILD(n, 0);
5121 goto loop;
5122 }
5123 return;
5124 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00005125 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
5126 /* XXX This is an error, but the next pass
5127 will catch it. */
5128 return;
5129 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005130 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005131 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005132 }
5133 return;
5134 case exprlist:
5135 case testlist:
5136 if (NCH(n) == 1) {
5137 n = CHILD(n, 0);
5138 goto loop;
5139 }
5140 else {
5141 int i;
5142 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005143 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005144 return;
5145 }
5146 goto loop;
5147 case atom:
5148 tmp = CHILD(n, 0);
5149 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
5150 n = CHILD(n, 1);
5151 goto loop;
5152 } else if (TYPE(tmp) == NAME)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005153 symtable_add_def(st, STR(tmp), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005154 return;
5155 case dotted_as_name:
5156 if (NCH(n) == 3)
5157 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005158 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005159 else
5160 symtable_add_def(st,
5161 STR(CHILD(CHILD(n,
5162 0), 0)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005163 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005164 return;
5165 case dotted_name:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005166 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005167 return;
5168 case NAME:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005169 symtable_add_def(st, STR(n), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005170 return;
5171 default:
5172 if (NCH(n) == 0)
5173 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00005174 if (NCH(n) == 1) {
5175 n = CHILD(n, 0);
5176 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005177 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00005178 /* Should only occur for errors like x + 1 = 1,
5179 which will be caught in the next pass. */
5180 for (i = 0; i < NCH(n); ++i)
5181 if (TYPE(CHILD(n, i)) >= single_input)
5182 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005183 }
5184}