blob: 07729b1b3c27a93b7a90981a9e8d663b551d97e6 [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 Hylton64949cb2001-01-25 20:06:59 +00003555 if (TYPE(fp) == NAME) {
3556 PyObject *v;
3557 name = STR(fp);
3558 v = PyDict_GetItemString(c->c_cellvars, name);
3559 if (v) {
3560 com_addoparg(c, LOAD_FAST, narg);
3561 com_addoparg(c, STORE_DEREF,
3562 PyInt_AS_LONG(v));
3563 }
3564 } else {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003565 name = nbuf;
3566 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003567 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003568 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003569 narg++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003570 /* all name updates handled by symtable */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003571 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003572 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003573 ch = CHILD(n, i);
3574 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003575 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003576 else
3577 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003578 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003579 /* Handle *arguments */
3580 if (i < nch) {
3581 node *ch;
3582 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003583 if (TYPE(ch) != DOUBLESTAR) {
3584 REQ(ch, STAR);
3585 ch = CHILD(n, i+1);
3586 if (TYPE(ch) == NAME) {
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003587 PyObject *v;
Guido van Rossum50564e81996-01-12 01:13:16 +00003588 i += 3;
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003589 v = PyDict_GetItemString(c->c_cellvars,
3590 STR(ch));
3591 if (v) {
3592 com_addoparg(c, LOAD_FAST, narg);
3593 com_addoparg(c, STORE_DEREF,
3594 PyInt_AS_LONG(v));
Guido van Rossum50564e81996-01-12 01:13:16 +00003595 }
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003596 narg++;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003597 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003598 }
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003599 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003600 /* Handle **keywords */
3601 if (i < nch) {
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003602 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003603 node *ch;
3604 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003605 if (TYPE(ch) != DOUBLESTAR) {
3606 REQ(ch, STAR);
3607 ch = CHILD(n, i+1);
3608 REQ(ch, STAR);
3609 ch = CHILD(n, i+2);
3610 }
3611 else
3612 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003613 REQ(ch, NAME);
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003614 v = PyDict_GetItemString(c->c_cellvars, STR(ch));
3615 if (v) {
3616 com_addoparg(c, LOAD_FAST, narg);
3617 com_addoparg(c, STORE_DEREF, PyInt_AS_LONG(v));
3618 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003619 }
3620 if (complex) {
3621 /* Generate code for complex arguments only after
3622 having counted the simple arguments */
3623 int ilocal = 0;
3624 for (i = 0; i < nch; i++) {
3625 node *ch = CHILD(n, i);
3626 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003627 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003628 break;
3629 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3630 fp = CHILD(ch, 0);
3631 if (TYPE(fp) != NAME) {
3632 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003633 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003634 com_fpdef(c, ch);
3635 }
3636 ilocal++;
3637 if (++i >= nch)
3638 break;
3639 ch = CHILD(n, i);
3640 if (TYPE(ch) == EQUAL)
3641 i += 2;
3642 else
3643 REQ(ch, COMMA);
3644 }
3645 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003646}
3647
3648static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003649com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003650{
3651 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003652 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003653 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003654 doc = get_docstring(n);
3655 if (doc != NULL) {
3656 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003657 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003658 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003659 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003660 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003661 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003662 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003663 for (i = 0; i < NCH(n); i++) {
3664 node *ch = CHILD(n, i);
3665 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3666 com_node(c, ch);
3667 }
3668}
3669
3670/* Top-level compile-node interface */
3671
3672static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003673compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003674{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003675 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003676 node *ch;
3677 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003678 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003679 doc = get_docstring(CHILD(n, 4));
3680 if (doc != NULL) {
3681 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003682 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003683 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003684 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003685 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003686 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3687 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003688 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003689 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003690 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003691 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003692 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003693 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003694 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003695 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003696 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003697}
3698
3699static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003700compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003701{
Guido van Rossum590baa41993-11-30 13:40:46 +00003702 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003703 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003704 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003705
3706 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003707 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003708 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003709 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003710 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003711 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003712 else
3713 ch = CHILD(n, 2);
3714 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003715 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003716 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003717}
3718
3719static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003720compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003721{
3722 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003723 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003724 REQ(n, classdef);
3725 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3726 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003727 c->c_private = c->c_name;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003728 ch = CHILD(n, NCH(n)-1); /* The suite */
3729 doc = get_docstring(ch);
3730 if (doc != NULL) {
3731 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003732 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003733 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003734 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003735 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003736 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003737 }
3738 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003739 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003740 com_node(c, ch);
3741 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003742 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003743 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003744 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003745}
3746
3747static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003748compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003749{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003750 com_addoparg(c, SET_LINENO, n->n_lineno);
3751
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003752 switch (TYPE(n)) {
3753
Guido van Rossum4c417781991-01-21 16:09:22 +00003754 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003755 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003756 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003757 n = CHILD(n, 0);
3758 if (TYPE(n) != NEWLINE)
3759 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003760 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003761 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003762 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003763 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003764 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003765 break;
3766
Guido van Rossum4c417781991-01-21 16:09:22 +00003767 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003768 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003769 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003770 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003771 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003772 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003773 break;
3774
Guido van Rossum590baa41993-11-30 13:40:46 +00003775 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003776 com_node(c, CHILD(n, 0));
3777 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003778 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003779 break;
3780
Guido van Rossum590baa41993-11-30 13:40:46 +00003781 case lambdef: /* anonymous function definition */
3782 compile_lambdef(c, n);
3783 break;
3784
Guido van Rossum4c417781991-01-21 16:09:22 +00003785 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003786 compile_funcdef(c, n);
3787 break;
3788
Guido van Rossum4c417781991-01-21 16:09:22 +00003789 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003790 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003791 break;
3792
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003793 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003794 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003795 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003796 }
3797}
3798
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003799static PyObject *
3800dict_keys_inorder(PyObject *dict, int offset)
3801{
3802 PyObject *tuple, *k, *v;
3803 int i, pos = 0, size = PyDict_Size(dict);
3804
3805 tuple = PyTuple_New(size);
3806 if (tuple == NULL)
3807 return NULL;
3808 while (PyDict_Next(dict, &pos, &k, &v)) {
3809 i = PyInt_AS_LONG(v);
3810 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00003811 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003812 PyTuple_SET_ITEM(tuple, i - offset, k);
3813 }
3814 return tuple;
3815}
3816
Guido van Rossum79f25d91997-04-29 20:08:16 +00003817PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003818PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003819{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003820 return PyNode_CompileFlags(n, filename, NULL);
3821}
3822
3823PyCodeObject *
3824PyNode_CompileFlags(node *n, char *filename, PyCompilerFlags *flags)
3825{
3826 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003827}
3828
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003829struct symtable *
3830PyNode_CompileSymtable(node *n, char *filename)
3831{
3832 struct symtable *st;
3833
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003834 st = symtable_init();
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003835 if (st == NULL)
3836 return NULL;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00003837 assert(st->st_symbols != NULL);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003838 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
3839 if (st->st_errors > 0) {
3840 PySymtable_Free(st);
3841 return NULL;
3842 }
3843 symtable_node(st, n);
3844 if (st->st_errors > 0) {
3845 PySymtable_Free(st);
3846 return NULL;
3847 }
3848 return st;
3849}
3850
Guido van Rossum79f25d91997-04-29 20:08:16 +00003851static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003852icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003853{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003854 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003855}
3856
Guido van Rossum79f25d91997-04-29 20:08:16 +00003857static PyCodeObject *
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003858jcompile(node *n, char *filename, struct compiling *base,
3859 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003860{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003861 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003862 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003863 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003864 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003865 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003866 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003867 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003868 /* c_symtable still points to parent's symbols */
3869 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003870 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003871 sc.c_nested = 1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003872 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003873 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00003874 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003875 if (sc.c_future == NULL) {
3876 com_free(&sc);
3877 return NULL;
3878 }
3879 if (flags) {
3880 if (flags->cf_nested_scopes)
3881 sc.c_future->ff_nested_scopes = 1;
3882 else if (sc.c_future->ff_nested_scopes)
3883 flags->cf_nested_scopes = 1;
3884 }
3885 if (symtable_build(&sc, n) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003886 com_free(&sc);
3887 return NULL;
3888 }
3889 }
3890 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003891 if (symtable_load_symbols(&sc) < 0) {
3892 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003893 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003894 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003895 compile_node(&sc, n);
3896 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00003897 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003898 PyObject *consts, *names, *varnames, *filename, *name,
3899 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003900 consts = PyList_AsTuple(sc.c_consts);
3901 names = PyList_AsTuple(sc.c_names);
3902 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003903 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
3904 freevars = dict_keys_inorder(sc.c_freevars,
3905 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003906 filename = PyString_InternFromString(sc.c_filename);
3907 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003908 if (!PyErr_Occurred())
3909 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003910 sc.c_nlocals,
3911 sc.c_maxstacklevel,
3912 sc.c_flags,
3913 sc.c_code,
3914 consts,
3915 names,
3916 varnames,
3917 freevars,
3918 cellvars,
3919 filename,
3920 name,
3921 sc.c_firstlineno,
3922 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003923 Py_XDECREF(consts);
3924 Py_XDECREF(names);
3925 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003926 Py_XDECREF(freevars);
3927 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003928 Py_XDECREF(filename);
3929 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003930 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00003931 else if (!PyErr_Occurred()) {
3932 /* This could happen if someone called PyErr_Clear() after an
3933 error was reported above. That's not supposed to happen,
3934 but I just plugged one case and I'm not sure there can't be
3935 others. In that case, raise SystemError so that at least
3936 it gets reported instead dumping core. */
3937 PyErr_SetString(PyExc_SystemError, "lost syntax error");
3938 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003939 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00003940 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003941 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00003942 sc.c_symtable = NULL;
3943 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003944 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003945 return co;
3946}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003947
3948int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003949PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003950{
3951 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003952 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003953 int line = co->co_firstlineno;
3954 int addr = 0;
3955 while (--size >= 0) {
3956 addr += *p++;
3957 if (addr > addrq)
3958 break;
3959 line += *p++;
3960 }
3961 return line;
3962}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003963
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003964/* The test for LOCAL must come before the test for FREE in order to
3965 handle classes where name is both local and free. The local var is
3966 a method and the free var is a free var referenced within a method.
3967*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003968
3969static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003970get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003971{
3972 PyObject *v;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00003973 if (c->c_symtable->st_nested_scopes) {
3974 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
3975 return CELL;
3976 if (PyDict_GetItemString(c->c_locals, name) != NULL)
3977 return LOCAL;
3978 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
3979 return FREE;
3980 v = PyDict_GetItemString(c->c_globals, name);
3981 if (v) {
3982 if (v == Py_None)
3983 return GLOBAL_EXPLICIT;
3984 else {
3985 return GLOBAL_IMPLICIT;
3986 }
3987 }
3988 } else {
3989 if (PyDict_GetItemString(c->c_locals, name) != NULL)
3990 return LOCAL;
3991 v = PyDict_GetItemString(c->c_globals, name);
3992 if (v) {
3993 if (v == Py_None)
3994 return GLOBAL_EXPLICIT;
3995 else {
3996 return GLOBAL_IMPLICIT;
3997 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003998 }
3999 }
4000 {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004001 char buf[350];
4002 sprintf(buf,
Jeremy Hylton51257732001-03-01 00:42:55 +00004003 "unknown scope for %.100s in %.100s(%s) "
4004 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
Jeremy Hylton483638c2001-02-01 20:20:45 +00004005 name, c->c_name,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004006 PyObject_REPR(c->c_symtable->st_cur->ste_id),
Jeremy Hylton51257732001-03-01 00:42:55 +00004007 c->c_filename,
4008 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4009 PyObject_REPR(c->c_locals),
4010 PyObject_REPR(c->c_globals)
4011 );
4012
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004013 Py_FatalError(buf);
4014 }
4015 return -1; /* can't get here */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004016}
4017
Guido van Rossum207fda62001-03-02 03:30:41 +00004018/* Helper functions to issue warnings */
4019
4020static int
4021issue_warning(char *msg, char *filename, int lineno)
4022{
4023 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4024 lineno, NULL, NULL) < 0) {
4025 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4026 PyErr_SetString(PyExc_SyntaxError, msg);
4027 PyErr_SyntaxLocation(filename, lineno);
4028 }
4029 return -1;
4030 }
4031 return 0;
4032}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004033
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004034static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004035symtable_warn(struct symtable *st, char *msg)
4036{
Guido van Rossum207fda62001-03-02 03:30:41 +00004037 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004038 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004039 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004040 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004041 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004042}
4043
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004044/* Helper function for setting lineno and filename */
4045
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004046static int
4047symtable_build(struct compiling *c, node *n)
4048{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004049 if ((c->c_symtable = symtable_init()) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004050 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004051 c->c_symtable->st_future = c->c_future;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004052 if (c->c_future->ff_nested_scopes)
4053 c->c_symtable->st_nested_scopes = 1;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004054 c->c_symtable->st_filename = c->c_filename;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004055 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
4056 if (c->c_symtable->st_errors > 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004057 return -1;
4058 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004059 if (c->c_symtable->st_errors > 0)
4060 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004061 /* reset for second pass */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004062 c->c_symtable->st_nscopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004063 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004064 return 0;
4065}
4066
4067static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004068symtable_init_compiling_symbols(struct compiling *c)
4069{
4070 PyObject *varnames;
4071
4072 varnames = c->c_symtable->st_cur->ste_varnames;
4073 if (varnames == NULL) {
4074 varnames = PyList_New(0);
4075 if (varnames == NULL)
4076 return -1;
4077 c->c_symtable->st_cur->ste_varnames = varnames;
4078 Py_INCREF(varnames);
4079 } else
4080 Py_INCREF(varnames);
4081 c->c_varnames = varnames;
4082
4083 c->c_globals = PyDict_New();
4084 if (c->c_globals == NULL)
4085 return -1;
4086 c->c_freevars = PyDict_New();
4087 if (c->c_freevars == NULL)
4088 return -1;
4089 c->c_cellvars = PyDict_New();
4090 if (c->c_cellvars == NULL)
4091 return -1;
4092 return 0;
4093}
4094
4095struct symbol_info {
4096 int si_nlocals;
4097 int si_ncells;
4098 int si_nfrees;
4099 int si_nimplicit;
4100};
4101
4102static void
4103symtable_init_info(struct symbol_info *si)
4104{
4105 si->si_nlocals = 0;
4106 si->si_ncells = 0;
4107 si->si_nfrees = 0;
4108 si->si_nimplicit = 0;
4109}
4110
4111static int
4112symtable_resolve_free(struct compiling *c, PyObject *name,
4113 struct symbol_info *si)
4114{
4115 PyObject *dict, *v;
4116
4117 /* Seperate logic for DEF_FREE. If it occurs in a function,
4118 it indicates a local that we must allocate storage for (a
4119 cell var). If it occurs in a class, then the class has a
4120 method and a free variable with the same name.
4121 */
4122
4123 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
4124 v = PyInt_FromLong(si->si_ncells++);
4125 dict = c->c_cellvars;
4126 } else {
4127 v = PyInt_FromLong(si->si_nfrees++);
4128 dict = c->c_freevars;
4129 }
4130 if (v == NULL)
4131 return -1;
4132 if (PyDict_SetItem(dict, name, v) < 0) {
4133 Py_DECREF(v);
4134 return -1;
4135 }
4136 Py_DECREF(v);
4137 return 0;
4138}
4139
4140static int
4141symtable_freevar_offsets(PyObject *freevars, int offset)
4142{
4143 PyObject *name, *v;
4144 int pos;
4145
4146 /* The cell vars are the first elements of the closure,
4147 followed by the free vars. Update the offsets in
4148 c_freevars to account for number of cellvars. */
4149 pos = 0;
4150 while (PyDict_Next(freevars, &pos, &name, &v)) {
4151 int i = PyInt_AS_LONG(v) + offset;
4152 PyObject *o = PyInt_FromLong(i);
4153 if (o == NULL)
4154 return -1;
4155 if (PyDict_SetItem(freevars, name, o) < 0) {
4156 Py_DECREF(o);
4157 return -1;
4158 }
4159 Py_DECREF(o);
4160 }
4161 return 0;
4162}
4163
4164static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004165symtable_check_unoptimized(struct compiling *c,
4166 PySymtableEntryObject *ste,
4167 struct symbol_info *si)
4168{
4169 char buf[300];
4170
4171 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4172 || (ste->ste_nested && si->si_nimplicit)))
4173 return 0;
4174
4175#define ILLEGAL_IMPORT_STAR \
4176"import * is not allowed in function '%.100s' " \
4177"because it contains a nested function with free variables"
4178
4179#define ILLEGAL_BARE_EXEC \
4180"unqualified exec is not allowed in function '%.100s' " \
4181"because it contains a nested function with free variables"
4182
4183#define ILLEGAL_EXEC_AND_IMPORT_STAR \
4184"function '%.100s' uses import * and bare exec, which are illegal" \
4185"because it contains a nested function with free variables"
4186
4187 /* XXX perhaps the linenos for these opt-breaking statements
4188 should be stored so the exception can point to them. */
4189
4190 if (ste->ste_optimized == OPT_IMPORT_STAR)
4191 sprintf(buf, ILLEGAL_IMPORT_STAR,
4192 PyString_AS_STRING(ste->ste_name));
4193 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
4194 sprintf(buf, ILLEGAL_BARE_EXEC,
4195 PyString_AS_STRING(ste->ste_name));
4196 else {
4197 sprintf(buf, ILLEGAL_EXEC_AND_IMPORT_STAR,
4198 PyString_AS_STRING(ste->ste_name));
4199 }
4200
4201 if (c->c_symtable->st_nested_scopes) {
4202 PyErr_SetString(PyExc_SyntaxError, buf);
4203 PyErr_SyntaxLocation(c->c_symtable->st_filename,
4204 ste->ste_lineno);
4205 return -1;
Guido van Rossum207fda62001-03-02 03:30:41 +00004206 }
4207 else {
4208 return issue_warning(buf, c->c_filename, ste->ste_lineno);
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004209 }
4210 return 0;
4211}
4212
4213static int
4214symtable_check_shadow(struct symtable *st, PyObject *name, int flags)
4215{
4216 char buf[500];
4217 PyObject *children, *v;
Jeremy Hyltonc1761322001-02-28 23:44:45 +00004218 PySymtableEntryObject *child = NULL;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004219 int i;
4220
4221 if (!(flags & DEF_BOUND))
4222 return 0;
4223 /* The semantics of this code will change with nested scopes.
4224 It is defined in the current scope and referenced in a
4225 child scope. Under the old rules, the child will see a
4226 global. Under the new rules, the child will see the
4227 binding in the current scope.
4228 */
4229
4230 /* Find name of child function that has free variable */
4231 children = st->st_cur->ste_children;
4232 for (i = 0; i < PyList_GET_SIZE(children); i++) {
4233 int cflags;
4234 child = (PySymtableEntryObject *)PyList_GET_ITEM(children, i);
4235 v = PyDict_GetItem(child->ste_symbols, name);
4236 if (v == NULL)
4237 continue;
4238 cflags = PyInt_AS_LONG(v);
4239 if (!(cflags & DEF_BOUND))
4240 break;
4241 }
Jeremy Hyltonc1761322001-02-28 23:44:45 +00004242
4243 assert(child != NULL);
4244
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004245 sprintf(buf, "local name '%.100s' in '%.100s' shadows "
4246 "use of '%.100s' as global in nested scope '%.100s'",
4247 PyString_AS_STRING(name),
4248 PyString_AS_STRING(st->st_cur->ste_name),
4249 PyString_AS_STRING(name),
4250 PyString_AS_STRING(child->ste_name)
4251 );
4252
4253 return symtable_warn(st, buf);
4254}
4255
4256static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004257symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4258 struct symbol_info *si)
4259{
4260 if (ste->ste_type != TYPE_MODULE)
4261 c->c_flags |= CO_NEWLOCALS;
4262 if (ste->ste_type == TYPE_FUNCTION) {
4263 c->c_nlocals = si->si_nlocals;
4264 if (ste->ste_optimized == 0)
4265 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004266 else if (ste->ste_optimized != OPT_EXEC)
4267 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004268 }
4269 return 0;
4270}
4271
4272static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004273symtable_load_symbols(struct compiling *c)
4274{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004275 static PyObject *implicit = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004276 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004277 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004278 PyObject *name, *varnames, *v;
4279 int i, flags, pos;
4280 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004281
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004282 if (implicit == NULL) {
4283 implicit = PyInt_FromLong(1);
4284 if (implicit == NULL)
4285 return -1;
4286 }
4287 v = NULL;
4288
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004289 if (symtable_init_compiling_symbols(c) < 0)
4290 goto fail;
4291 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004292 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004293 si.si_nlocals = PyList_GET_SIZE(varnames);
4294 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004295
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004296 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004297 v = PyInt_FromLong(i);
4298 if (PyDict_SetItem(c->c_locals,
4299 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004300 goto fail;
4301 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004302 }
4303
4304 /* XXX The cases below define the rules for whether a name is
4305 local or global. The logic could probably be clearer. */
4306 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004307 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4308 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004309
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004310 if (st->st_nested_scopes == 0
4311 && (flags & (DEF_FREE | DEF_FREE_CLASS))) {
4312 if (symtable_check_shadow(st, name, flags) < 0)
4313 goto fail;
4314 }
4315
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004316 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004317 /* undo the original DEF_FREE */
4318 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004319
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004320 /* Deal with names that need two actions:
4321 1. Cell variables, which are also locals.
4322 2. Free variables in methods that are also class
4323 variables or declared global.
4324 */
4325 if (flags & (DEF_FREE | DEF_FREE_CLASS)) {
4326 if ((ste->ste_type == TYPE_CLASS
4327 && flags != DEF_FREE_CLASS)
4328 || (flags & (DEF_LOCAL | DEF_PARAM)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004329 symtable_resolve_free(c, name, &si);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004330 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004331
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004332 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004333 c->c_argcount--;
4334 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004335 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004336 c->c_argcount--;
4337 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004338 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004339 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004340 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004341 if (flags & DEF_PARAM) {
4342 PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004343 PyString_AS_STRING(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004344 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004345 ste->ste_lineno);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004346 st->st_errors++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004347 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004348 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004349 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4350 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004351 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004352 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004353 if (PyDict_SetItem(c->c_globals, name, implicit) < 0)
4354 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004355 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004356 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004357 if (v == NULL)
4358 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004359 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004360 goto fail;
4361 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004362 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004363 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004364 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004365 } else if (is_free(flags)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004366 if (ste->ste_nested && st->st_nested_scopes) {
4367 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004368 if (v == NULL)
4369 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004370 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004371 goto fail;
4372 Py_DECREF(v);
4373 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004374 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004375 if (PyDict_SetItem(c->c_globals, name,
4376 implicit) < 0)
4377 goto fail;
Jeremy Hylton51257732001-03-01 00:42:55 +00004378 if (st->st_nscopes != 1) {
4379 v = PyInt_FromLong(flags);
4380 if (PyDict_SetItem(st->st_global,
4381 name, v))
4382 goto fail;
4383 Py_DECREF(v);
4384 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004385 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004386 }
4387 }
4388
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004389 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4390 return -1;
4391 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004392 fail:
4393 /* is this always the right thing to do? */
4394 Py_XDECREF(v);
4395 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004396}
4397
4398static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004399symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004400{
4401 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004402
4403 st = (struct symtable *)PyMem_Malloc(sizeof(struct symtable));
4404 if (st == NULL)
4405 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004406 st->st_pass = 1;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004407 st->st_nested_scopes = NESTED_SCOPES_DEFAULT;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004408 st->st_filename = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004409 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004410 goto fail;
4411 if ((st->st_symbols = PyDict_New()) == NULL)
4412 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004413 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004414 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004415 st->st_errors = 0;
4416 st->st_tmpname = 0;
4417 st->st_private = NULL;
4418 return st;
4419 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004420 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004421 return NULL;
4422}
4423
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004424void
4425PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004426{
4427 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004428 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004429 Py_XDECREF(st->st_cur);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004430 PyMem_Free((void *)st);
4431}
4432
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004433/* When the compiler exits a scope, it must should update the scope's
4434 free variable information with the list of free variables in its
4435 children.
4436
4437 Variables that are free in children and defined in the current
4438 scope are cellvars.
4439
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004440 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004441 false), free variables in children that are not defined here are
4442 implicit globals.
4443
4444*/
4445
4446static int
4447symtable_update_free_vars(struct symtable *st)
4448{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004449 int i, j, def;
4450 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004451 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004452
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004453 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004454 def = DEF_FREE_CLASS;
4455 else
4456 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004457 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004458 int pos = 0;
4459
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004460 if (list)
4461 PyList_SetSlice(list, 0,
4462 ((PyVarObject*)list)->ob_size, 0);
Barry Warsaw0372af72001-02-23 18:22:59 +00004463 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004464 PyList_GET_ITEM(ste->ste_children, i);
4465 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004466 int flags = PyInt_AS_LONG(o);
4467 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004468 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004469 if (list == NULL) {
4470 list = PyList_New(0);
4471 if (list == NULL)
4472 return -1;
4473 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004474 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004475 if (PyList_Append(list, name) < 0) {
4476 Py_DECREF(list);
4477 return -1;
4478 }
4479 }
4480 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004481 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004482 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00004483 v = PyDict_GetItem(ste->ste_symbols, name);
4484 /* If a name N is declared global in scope A and
4485 referenced in scope B contained (perhaps
4486 indirectly) in A and there are no scopes
4487 with bindings for N between B and A, then N
4488 is global in B.
4489 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004490 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004491 int flags = PyInt_AS_LONG(v);
4492 if (flags & DEF_GLOBAL) {
4493 symtable_undo_free(st, child->ste_id,
4494 name);
4495 continue;
4496 }
4497 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004498 if (ste->ste_nested) {
4499 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004500 name, def) < 0) {
4501 Py_DECREF(list);
4502 return -1;
4503 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004504 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004505 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004506 name) < 0) {
4507 Py_DECREF(list);
4508 return -1;
4509 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004510 }
4511 }
4512 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004513
4514 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004515 return 0;
4516}
4517
4518/* If the current scope is a non-nested class or if name is not
4519 defined in the current, non-nested scope, then it is an implicit
4520 global in all nested scopes.
4521*/
4522
4523static int
4524symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
4525{
4526 PyObject *o;
4527 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004528 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00004529
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004530 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004531 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004532 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004533 if (o == NULL)
4534 return symtable_undo_free(st, child, name);
4535 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00004536
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004537 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004538 return symtable_undo_free(st, child, name);
4539 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004540 return symtable_add_def_o(st, ste->ste_symbols,
4541 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004542}
4543
4544static int
4545symtable_undo_free(struct symtable *st, PyObject *id,
4546 PyObject *name)
4547{
4548 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004549 PyObject *info;
4550 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004551
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004552 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
4553 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004554 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00004555
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004556 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004557 if (info == NULL)
4558 return 0;
4559 v = PyInt_AS_LONG(info);
4560 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004561 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004562 DEF_FREE_GLOBAL) < 0)
4563 return -1;
4564 } else
4565 /* If the name is defined here or declared global,
4566 then the recursion stops. */
4567 return 0;
4568
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004569 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
4570 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00004571 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004572 PyList_GET_ITEM(ste->ste_children, i);
4573 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004574 if (x < 0)
4575 return x;
4576 }
4577 return 0;
4578}
4579
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004580/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
4581 This reference is released when the scope is exited, via the DECREF
4582 in symtable_exit_scope().
4583*/
4584
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004585static int
4586symtable_exit_scope(struct symtable *st)
4587{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004588 int end;
4589
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004590 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004591 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004592 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004593 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004594 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
4595 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004596 if (PySequence_DelItem(st->st_stack, end) < 0)
4597 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004598 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004599}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004600
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004601static void
4602symtable_enter_scope(struct symtable *st, char *name, int type,
4603 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004604{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004605 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004606
4607 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004608 prev = st->st_cur;
4609 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
4610 Py_DECREF(st->st_cur);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004611 st->st_errors++;
4612 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004613 }
4614 }
Barry Warsaw0372af72001-02-23 18:22:59 +00004615 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004616 PySymtableEntry_New(st, name, type, lineno);
4617 if (strcmp(name, TOP) == 0)
4618 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004619 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004620 if (PyList_Append(prev->ste_children,
4621 (PyObject *)st->st_cur) < 0)
4622 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004623 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004624}
4625
4626static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004627symtable_lookup(struct symtable *st, char *name)
4628{
4629 char buffer[MANGLE_LEN];
4630 PyObject *v;
4631 int flags;
4632
4633 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
4634 name = buffer;
4635 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
4636 if (v == NULL) {
4637 if (PyErr_Occurred())
4638 return -1;
4639 else
4640 return 0;
4641 }
4642
4643 flags = PyInt_AS_LONG(v);
4644 return flags;
4645}
4646
4647static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004648symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004649{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004650 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004651 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004652 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004653
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004654 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004655 name = buffer;
4656 if ((s = PyString_InternFromString(name)) == NULL)
4657 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004658 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
4659 Py_DECREF(s);
4660 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004661}
4662
4663/* Must only be called with mangled names */
4664
4665static int
4666symtable_add_def_o(struct symtable *st, PyObject *dict,
4667 PyObject *name, int flag)
4668{
4669 PyObject *o;
4670 int val;
4671
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004672 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004673 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004674 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004675 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00004676 PyString_AsString(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004677 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004678 st->st_cur->ste_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004679 return -1;
4680 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004681 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004682 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004683 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004684 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004685 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004686 Py_DECREF(o);
4687 return -1;
4688 }
4689 Py_DECREF(o);
4690
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004691 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004692 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004693 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004694 } else if (flag & DEF_GLOBAL) {
4695 /* XXX need to update DEF_GLOBAL for other flags too;
4696 perhaps only DEF_FREE_GLOBAL */
4697 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004698 val = PyInt_AS_LONG(o);
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(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004704 Py_DECREF(o);
4705 return -1;
4706 }
4707 Py_DECREF(o);
4708 }
4709 return 0;
4710}
4711
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004712#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004713
4714static void
4715symtable_node(struct symtable *st, node *n)
4716{
4717 int i, start = 0;
4718
4719 loop:
4720 switch (TYPE(n)) {
4721 case funcdef: {
4722 char *func_name = STR(CHILD(n, 1));
4723 symtable_add_def(st, func_name, DEF_LOCAL);
4724 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004725 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004726 symtable_funcdef(st, n);
4727 symtable_exit_scope(st);
4728 break;
4729 }
4730 case lambdef:
4731 if (NCH(n) == 4)
4732 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004733 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004734 symtable_funcdef(st, n);
4735 symtable_exit_scope(st);
4736 break;
4737 case classdef: {
4738 char *tmp, *class_name = STR(CHILD(n, 1));
4739 symtable_add_def(st, class_name, DEF_LOCAL);
4740 if (TYPE(CHILD(n, 2)) == LPAR) {
4741 node *bases = CHILD(n, 3);
4742 int i;
4743 for (i = 0; i < NCH(bases); i += 2) {
4744 symtable_node(st, CHILD(bases, i));
4745 }
4746 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004747 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004748 tmp = st->st_private;
4749 st->st_private = class_name;
4750 symtable_node(st, CHILD(n, NCH(n) - 1));
4751 st->st_private = tmp;
4752 symtable_exit_scope(st);
4753 break;
4754 }
4755 case if_stmt:
4756 for (i = 0; i + 3 < NCH(n); i += 4) {
4757 if (is_constant_false(NULL, (CHILD(n, i + 1))))
4758 continue;
4759 symtable_node(st, CHILD(n, i + 1));
4760 symtable_node(st, CHILD(n, i + 3));
4761 }
4762 if (i + 2 < NCH(n))
4763 symtable_node(st, CHILD(n, i + 2));
4764 break;
4765 case global_stmt:
4766 symtable_global(st, n);
4767 break;
4768 case import_stmt:
4769 symtable_import(st, n);
4770 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004771 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004772 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004773 symtable_node(st, CHILD(n, 1));
4774 if (NCH(n) > 2)
4775 symtable_node(st, CHILD(n, 3));
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004776 else
4777 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004778 if (NCH(n) > 4)
4779 symtable_node(st, CHILD(n, 5));
4780 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004781
4782 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00004783 case assert_stmt:
4784 if (Py_OptimizeFlag)
4785 return;
4786 if (NCH(n) == 2) {
4787 n = CHILD(n, 1);
4788 goto loop;
4789 } else {
4790 symtable_node(st, CHILD(n, 1));
4791 n = CHILD(n, 3);
4792 goto loop;
4793 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004794 case except_clause:
4795 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004796 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004797 if (NCH(n) > 1) {
4798 n = CHILD(n, 1);
4799 goto loop;
4800 }
4801 break;
4802 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004803 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004804 break;
4805 case expr_stmt:
4806 if (NCH(n) == 1)
4807 n = CHILD(n, 0);
4808 else {
4809 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004810 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004811 symtable_node(st, CHILD(n, 2));
4812 break;
4813 } else {
4814 int i;
4815 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004816 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004817 n = CHILD(n, NCH(n) - 1);
4818 }
4819 }
4820 goto loop;
4821 /* watchout for fall-through logic below */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004822 case argument:
4823 if (NCH(n) == 3) {
4824 n = CHILD(n, 2);
4825 goto loop;
4826 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004827 case listmaker:
4828 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton23b42272001-03-19 20:38:06 +00004829 st->st_tmpname++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004830 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton23b42272001-03-19 20:38:06 +00004831 symtable_node(st, CHILD(n, 0));
4832 st->st_tmpname--;
4833 return;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004834 }
4835 case atom:
4836 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
4837 symtable_add_use(st, STR(CHILD(n, 0)));
4838 break;
4839 }
4840 case for_stmt:
4841 if (TYPE(n) == for_stmt) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004842 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004843 start = 3;
4844 }
4845 default:
4846 if (NCH(n) == 1) {
4847 n = CHILD(n, 0);
4848 goto loop;
4849 }
4850 for (i = start; i < NCH(n); ++i)
4851 if (TYPE(CHILD(n, i)) >= single_input)
4852 symtable_node(st, CHILD(n, i));
4853 }
4854}
4855
4856static void
4857symtable_funcdef(struct symtable *st, node *n)
4858{
4859 node *body;
4860
4861 if (TYPE(n) == lambdef) {
4862 if (NCH(n) == 4)
4863 symtable_params(st, CHILD(n, 1));
4864 } else
4865 symtable_params(st, CHILD(n, 2));
4866 body = CHILD(n, NCH(n) - 1);
4867 symtable_node(st, body);
4868}
4869
4870/* The next two functions parse the argument tuple.
4871 symtable_default_arg() checks for names in the default arguments,
4872 which are references in the defining scope. symtable_params()
4873 parses the parameter names, which are defined in the function's
4874 body.
4875
4876 varargslist:
4877 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
4878 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
4879*/
4880
4881static void
4882symtable_default_args(struct symtable *st, node *n)
4883{
4884 node *c;
4885 int i;
4886
4887 if (TYPE(n) == parameters) {
4888 n = CHILD(n, 1);
4889 if (TYPE(n) == RPAR)
4890 return;
4891 }
4892 REQ(n, varargslist);
4893 for (i = 0; i < NCH(n); i += 2) {
4894 c = CHILD(n, i);
4895 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
4896 break;
4897 }
4898 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
4899 symtable_node(st, CHILD(n, i));
4900 }
4901}
4902
4903static void
4904symtable_params(struct symtable *st, node *n)
4905{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004906 int i, complex = -1, ext = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004907 node *c = NULL;
4908
4909 if (TYPE(n) == parameters) {
4910 n = CHILD(n, 1);
4911 if (TYPE(n) == RPAR)
4912 return;
4913 }
4914 REQ(n, varargslist);
4915 for (i = 0; i < NCH(n); i += 2) {
4916 c = CHILD(n, i);
4917 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
4918 ext = 1;
4919 break;
4920 }
4921 if (TYPE(c) == test) {
4922 continue;
4923 }
4924 if (TYPE(CHILD(c, 0)) == NAME)
4925 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
4926 else {
4927 char nbuf[10];
4928 sprintf(nbuf, ".%d", i);
4929 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004930 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004931 }
4932 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004933 if (ext) {
4934 c = CHILD(n, i);
4935 if (TYPE(c) == STAR) {
4936 i++;
4937 symtable_add_def(st, STR(CHILD(n, i)),
4938 DEF_PARAM | DEF_STAR);
4939 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00004940 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004941 c = NULL;
4942 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004943 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004944 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004945 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004946 i++;
4947 symtable_add_def(st, STR(CHILD(n, i)),
4948 DEF_PARAM | DEF_DOUBLESTAR);
4949 }
4950 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004951 if (complex >= 0) {
4952 int j;
4953 for (j = 0; j <= complex; j++) {
4954 c = CHILD(n, j);
4955 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00004956 c = CHILD(n, ++j);
4957 else if (TYPE(c) == EQUAL)
4958 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004959 if (TYPE(CHILD(c, 0)) == LPAR)
4960 symtable_params_fplist(st, CHILD(c, 1));
4961 }
4962 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004963}
4964
4965static void
4966symtable_params_fplist(struct symtable *st, node *n)
4967{
4968 int i;
4969 node *c;
4970
4971 REQ(n, fplist);
4972 for (i = 0; i < NCH(n); i += 2) {
4973 c = CHILD(n, i);
4974 REQ(c, fpdef);
4975 if (NCH(c) == 1)
4976 symtable_add_def(st, STR(CHILD(c, 0)),
4977 DEF_PARAM | DEF_INTUPLE);
4978 else
4979 symtable_params_fplist(st, CHILD(c, 1));
4980 }
4981
4982}
4983
4984static void
4985symtable_global(struct symtable *st, node *n)
4986{
4987 int i;
4988
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004989 /* XXX It might be helpful to warn about module-level global
4990 statements, but it's hard to tell the difference between
4991 module-level and a string passed to exec.
4992 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00004993
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004994 for (i = 1; i < NCH(n); i += 2) {
4995 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00004996 int flags;
4997
4998 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004999 if (flags < 0)
5000 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005001 if (flags && flags != DEF_GLOBAL) {
5002 char buf[500];
5003 if (flags & DEF_PARAM) {
5004 PyErr_Format(PyExc_SyntaxError,
5005 "name '%.400s' is local and global",
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005006 name);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005007 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005008 st->st_cur->ste_lineno);
5009 st->st_errors++;
5010 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005011 }
5012 else {
5013 if (flags & DEF_LOCAL)
5014 sprintf(buf, GLOBAL_AFTER_ASSIGN,
5015 name);
5016 else
5017 sprintf(buf, GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005018 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005019 }
5020 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005021 symtable_add_def(st, name, DEF_GLOBAL);
5022 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005023}
5024
5025static void
5026symtable_list_comprehension(struct symtable *st, node *n)
5027{
5028 char tmpname[12];
5029
Jeremy Hylton23b42272001-03-19 20:38:06 +00005030 sprintf(tmpname, "_[%d]", st->st_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005031 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005032 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005033 symtable_node(st, CHILD(n, 3));
5034 if (NCH(n) == 5)
5035 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005036}
5037
5038static void
5039symtable_import(struct symtable *st, node *n)
5040{
5041 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005042 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005043 | 'from' dotted_name 'import'
5044 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00005045 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005046 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005047 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005048 node *dotname = CHILD(n, 1);
5049 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
5050 /* check for bogus imports */
5051 if (n->n_lineno >= st->st_future->ff_last_lineno) {
5052 PyErr_SetString(PyExc_SyntaxError,
5053 LATE_FUTURE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005054 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005055 n->n_lineno);
5056 st->st_errors++;
5057 return;
5058 }
5059 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005060 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005061 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005062 } else {
5063 for (i = 3; i < NCH(n); i += 2) {
5064 node *c = CHILD(n, i);
5065 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005066 symtable_assign(st, CHILD(c, 2),
5067 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005068 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005069 symtable_assign(st, CHILD(c, 0),
5070 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005071 }
5072 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005073 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005074 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005075 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005076 }
5077 }
5078}
5079
5080static void
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005081symtable_assign(struct symtable *st, node *n, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005082{
5083 node *tmp;
5084 int i;
5085
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005086 loop:
5087 switch (TYPE(n)) {
5088 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005089 /* invalid assignment, e.g. lambda x:x=2. The next
5090 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005091 return;
5092 case power:
5093 if (NCH(n) > 2) {
5094 for (i = 2; i < NCH(n); ++i)
5095 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
5096 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005097 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005098 if (NCH(n) > 1) {
5099 symtable_node(st, CHILD(n, 0));
5100 symtable_node(st, CHILD(n, 1));
5101 } else {
5102 n = CHILD(n, 0);
5103 goto loop;
5104 }
5105 return;
5106 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00005107 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
5108 /* XXX This is an error, but the next pass
5109 will catch it. */
5110 return;
5111 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005112 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005113 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005114 }
5115 return;
5116 case exprlist:
5117 case testlist:
5118 if (NCH(n) == 1) {
5119 n = CHILD(n, 0);
5120 goto loop;
5121 }
5122 else {
5123 int i;
5124 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005125 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005126 return;
5127 }
5128 goto loop;
5129 case atom:
5130 tmp = CHILD(n, 0);
5131 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
5132 n = CHILD(n, 1);
5133 goto loop;
5134 } else if (TYPE(tmp) == NAME)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005135 symtable_add_def(st, STR(tmp), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005136 return;
5137 case dotted_as_name:
5138 if (NCH(n) == 3)
5139 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005140 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005141 else
5142 symtable_add_def(st,
5143 STR(CHILD(CHILD(n,
5144 0), 0)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005145 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005146 return;
5147 case dotted_name:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005148 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005149 return;
5150 case NAME:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005151 symtable_add_def(st, STR(n), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005152 return;
5153 default:
5154 if (NCH(n) == 0)
5155 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00005156 if (NCH(n) == 1) {
5157 n = CHILD(n, 0);
5158 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005159 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00005160 /* Should only occur for errors like x + 1 = 1,
5161 which will be caught in the next pass. */
5162 for (i = 0; i < NCH(n); ++i)
5163 if (TYPE(CHILD(n, i)) >= single_input)
5164 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005165 }
5166}