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