blob: 1f1d44c9ff030dbebdbf02bd38aaa390fc74a601 [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 Hylton897b8212001-03-23 14:08:38 +000069#define ASSIGN_DEBUG \
70"can not assign to __debug__"
71
Jeremy Hyltone36f7782001-01-19 03:21:30 +000072#define MANGLE_LEN 256
73
Guido van Rossum79f25d91997-04-29 20:08:16 +000074#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000075
76static struct memberlist code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000077 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
78 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000079 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000080 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000081 {"co_code", T_OBJECT, OFF(co_code), READONLY},
82 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
83 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000084 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Jeremy Hylton64949cb2001-01-25 20:06:59 +000085 {"co_freevars", T_OBJECT, OFF(co_freevars), READONLY},
86 {"co_cellvars", T_OBJECT, OFF(co_cellvars), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000087 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000088 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000089 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
90 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000091 {NULL} /* Sentinel */
92};
93
Guido van Rossum79f25d91997-04-29 20:08:16 +000094static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000095code_getattr(PyCodeObject *co, char *name)
Guido van Rossum3f5da241990-12-20 15:06:42 +000096{
Guido van Rossum79f25d91997-04-29 20:08:16 +000097 return PyMember_Get((char *)co, code_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +000098}
Guido van Rossum10dc2e81990-11-18 17:27:39 +000099
100static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000101code_dealloc(PyCodeObject *co)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000102{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000103 Py_XDECREF(co->co_code);
104 Py_XDECREF(co->co_consts);
105 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +0000106 Py_XDECREF(co->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000107 Py_XDECREF(co->co_freevars);
108 Py_XDECREF(co->co_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000109 Py_XDECREF(co->co_filename);
110 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +0000111 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000112 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000113}
114
Guido van Rossum79f25d91997-04-29 20:08:16 +0000115static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000116code_repr(PyCodeObject *co)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000117{
118 char buf[500];
119 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000120 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000121 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000122
Guido van Rossuma396a882000-04-07 01:21:36 +0000123 if (co->co_firstlineno != 0)
124 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000125 if (co->co_filename && PyString_Check(co->co_filename))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000126 filename = PyString_AS_STRING(co->co_filename);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000127 if (co->co_name && PyString_Check(co->co_name))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000128 name = PyString_AS_STRING(co->co_name);
Fred Drake615ae552000-06-30 16:20:13 +0000129 sprintf(buf, "<code object %.100s at %p, file \"%.300s\", line %d>",
130 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000131 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000132}
133
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000134static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000135code_compare(PyCodeObject *co, PyCodeObject *cp)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000136{
137 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000138 cmp = PyObject_Compare(co->co_name, cp->co_name);
139 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000140 cmp = co->co_argcount - cp->co_argcount;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000141 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000142 cmp = co->co_nlocals - cp->co_nlocals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000143 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000144 cmp = co->co_flags - cp->co_flags;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000145 if (cmp) return cmp;
Guido van Rossumd076c731998-10-07 19:42:25 +0000146 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000147 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000148 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000149 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000150 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000151 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000152 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000153 if (cmp) return cmp;
154 cmp = PyObject_Compare(co->co_freevars, cp->co_freevars);
155 if (cmp) return cmp;
156 cmp = PyObject_Compare(co->co_cellvars, cp->co_cellvars);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000157 return cmp;
158}
159
160static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000161code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000162{
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000163 long h, h0, h1, h2, h3, h4, h5, h6;
Guido van Rossum44679592000-04-10 16:20:31 +0000164 h0 = PyObject_Hash(co->co_name);
165 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000166 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000167 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000168 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000169 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000170 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000171 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000172 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000173 if (h4 == -1) return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000174 h5 = PyObject_Hash(co->co_freevars);
175 if (h5 == -1) return -1;
176 h6 = PyObject_Hash(co->co_cellvars);
177 if (h6 == -1) return -1;
178 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^ h5 ^ h6 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000179 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000180 if (h == -1) h = -2;
181 return h;
182}
183
Jeremy Hylton78891072001-03-01 06:09:34 +0000184/* XXX code objects need to participate in GC? */
185
Guido van Rossum79f25d91997-04-29 20:08:16 +0000186PyTypeObject PyCode_Type = {
187 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000188 0,
189 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000190 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000191 0,
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000192 (destructor)code_dealloc, /*tp_dealloc*/
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000193 0, /*tp_print*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000194 (getattrfunc)code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000195 0, /*tp_setattr*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000196 (cmpfunc)code_compare, /*tp_compare*/
197 (reprfunc)code_repr, /*tp_repr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000198 0, /*tp_as_number*/
199 0, /*tp_as_sequence*/
200 0, /*tp_as_mapping*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000201 (hashfunc)code_hash, /*tp_hash*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000202};
203
Guido van Rossum644a12b1997-04-09 19:24:53 +0000204#define NAME_CHARS \
205 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
206
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000207/* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
208
209static int
210all_name_chars(unsigned char *s)
211{
Guido van Rossumcd90c202001-02-09 15:06:42 +0000212 static char ok_name_char[256];
213 static unsigned char *name_chars = (unsigned char *)NAME_CHARS;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000214
Guido van Rossumcd90c202001-02-09 15:06:42 +0000215 if (ok_name_char[*name_chars] == 0) {
216 unsigned char *p;
217 for (p = name_chars; *p; p++)
218 ok_name_char[*p] = 1;
219 }
220 while (*s) {
221 if (ok_name_char[*s++] == 0)
222 return 0;
223 }
224 return 1;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000225}
226
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000227static int
228intern_strings(PyObject *tuple)
229{
230 int i;
231
232 for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) {
233 PyObject *v = PyTuple_GET_ITEM(tuple, i);
234 if (v == NULL || !PyString_Check(v)) {
235 Py_FatalError("non-string found in code slot");
236 PyErr_BadInternalCall();
237 return -1;
238 }
239 PyString_InternInPlace(&PyTuple_GET_ITEM(tuple, i));
240 }
241 return 0;
242}
243
Guido van Rossum79f25d91997-04-29 20:08:16 +0000244PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000245PyCode_New(int argcount, int nlocals, int stacksize, int flags,
246 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000247 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
248 PyObject *filename, PyObject *name, int firstlineno,
249 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000250{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000251 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000252 int i;
Guido van Rossumd076c731998-10-07 19:42:25 +0000253 PyBufferProcs *pb;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000254 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000255 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000256 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000257 consts == NULL || !PyTuple_Check(consts) ||
258 names == NULL || !PyTuple_Check(names) ||
259 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000260 freevars == NULL || !PyTuple_Check(freevars) ||
261 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000262 name == NULL || !PyString_Check(name) ||
263 filename == NULL || !PyString_Check(filename) ||
264 lnotab == NULL || !PyString_Check(lnotab)) {
265 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000266 return NULL;
267 }
Guido van Rossumd076c731998-10-07 19:42:25 +0000268 pb = code->ob_type->tp_as_buffer;
269 if (pb == NULL ||
270 pb->bf_getreadbuffer == NULL ||
271 pb->bf_getsegcount == NULL ||
272 (*pb->bf_getsegcount)(code, NULL) != 1)
273 {
274 PyErr_BadInternalCall();
275 return NULL;
276 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000277 intern_strings(names);
278 intern_strings(varnames);
279 if (freevars == NULL)
280 freevars = PyTuple_New(0);
281 intern_strings(freevars);
282 if (cellvars == NULL)
283 cellvars = PyTuple_New(0);
284 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000285 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000286 for (i = PyTuple_Size(consts); --i >= 0; ) {
287 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000288 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000289 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000290 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000291 continue;
292 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000293 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000294 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000295 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000296 co->co_argcount = argcount;
297 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000298 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000299 co->co_flags = flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000300 Py_INCREF(code);
Guido van Rossumd076c731998-10-07 19:42:25 +0000301 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000302 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000303 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000304 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000305 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000306 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000307 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000308 Py_INCREF(freevars);
309 co->co_freevars = freevars;
310 Py_INCREF(cellvars);
311 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000312 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000313 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000314 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000315 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000316 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000317 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000318 co->co_lnotab = lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000319 }
320 return co;
321}
322
323
324/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000325
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000326/* The compiler uses two passes to generate bytecodes. The first pass
327 builds the symbol table. The second pass generates the bytecode.
328
329 The first pass uses a single symtable struct. The second pass uses
330 a compiling struct for each code block. The compiling structs
331 share a reference to the symtable.
332
333 The two passes communicate via symtable_load_symbols() and via
334 is_local() and is_global(). The former initializes several slots
335 in the compiling struct: c_varnames, c_locals, c_nlocals,
336 c_argcount, c_globals, and c_flags.
337*/
338
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000339struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000340 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000341 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000342 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000343 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000344 PyObject *c_name_dict; /* inverse of c_names */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000345 PyObject *c_globals; /* dictionary (value=None) */
346 PyObject *c_locals; /* dictionary (value=localID) */
347 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000348 PyObject *c_freevars; /* dictionary (value=None) */
349 PyObject *c_cellvars; /* list */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000350 int c_nlocals; /* index of next local */
351 int c_argcount; /* number of top-level arguments */
352 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000353 int c_nexti; /* index into c_code */
354 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000355 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000356 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000357 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000358 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000359 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000360 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000361 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000362 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000363 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000364 int c_stacklevel; /* Current stack level */
365 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000366 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000367 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000368 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000369 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000370 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000371 int c_nested; /* Is block nested funcdef or lamdef? */
372 int c_closure; /* Is nested w/freevars? */
373 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000374 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000375};
376
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000377static int
378is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000379{
380 if ((v & (USE | DEF_FREE))
381 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
382 return 1;
383 if (v & DEF_FREE_CLASS)
384 return 1;
385 return 0;
386}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000387
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000388static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000389com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000390{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000391 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
392
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000393 if (c == NULL) {
394 /* Error occurred via symtable call to
395 is_constant_false */
396 PyErr_SetString(exc, msg);
397 return;
398 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000399 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000400 if (c->c_lineno < 1 || c->c_interactive) {
401 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000402 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000403 return;
404 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000405 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000406 if (v == NULL)
407 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000408
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000409 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000410 if (line == NULL) {
411 Py_INCREF(Py_None);
412 line = Py_None;
413 }
414 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
415 Py_None, line);
416 if (t == NULL)
417 goto exit;
418 w = Py_BuildValue("(OO)", v, t);
419 if (w == NULL)
420 goto exit;
421 PyErr_SetObject(exc, w);
422 exit:
423 Py_XDECREF(t);
424 Py_XDECREF(v);
425 Py_XDECREF(w);
426 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000427}
428
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000429/* Interface to the block stack */
430
431static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000432block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000433{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000434 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000435 com_error(c, PyExc_SystemError,
436 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000437 }
438 else {
439 c->c_block[c->c_nblocks++] = type;
440 }
441}
442
443static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000444block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000445{
446 if (c->c_nblocks > 0)
447 c->c_nblocks--;
448 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000449 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000450 }
451}
452
Guido van Rossum681d79a1995-07-18 14:51:37 +0000453/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000454
Tim Petersdbd9ba62000-07-09 03:09:57 +0000455static int com_init(struct compiling *, char *);
456static void com_free(struct compiling *);
457static void com_push(struct compiling *, int);
458static void com_pop(struct compiling *, int);
459static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000460static void com_node(struct compiling *, node *);
461static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000462static void com_addbyte(struct compiling *, int);
463static void com_addint(struct compiling *, int);
464static void com_addoparg(struct compiling *, int, int);
465static void com_addfwref(struct compiling *, int, int *);
466static void com_backpatch(struct compiling *, int);
467static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
468static int com_addconst(struct compiling *, PyObject *);
469static int com_addname(struct compiling *, PyObject *);
470static void com_addopname(struct compiling *, int, node *);
471static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000472static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000473static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000474static void com_assign(struct compiling *, node *, int, node *);
475static void com_assign_name(struct compiling *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000476static PyCodeObject *icompile(node *, struct compiling *);
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000477static PyCodeObject *jcompile(node *, char *, struct compiling *,
478 PyCompilerFlags *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000479static PyObject *parsestrplus(node *);
480static PyObject *parsestr(char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000481static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000482
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000483static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000484
485/* symtable operations */
486static int symtable_build(struct compiling *, node *);
487static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000488static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000489static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000490static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000491static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000492static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000493
494static void symtable_node(struct symtable *, node *);
495static void symtable_funcdef(struct symtable *, node *);
496static void symtable_default_args(struct symtable *, node *);
497static void symtable_params(struct symtable *, node *);
498static void symtable_params_fplist(struct symtable *, node *n);
499static void symtable_global(struct symtable *, node *);
500static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000501static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000502static void symtable_list_comprehension(struct symtable *, node *);
503
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000504static int symtable_update_free_vars(struct symtable *);
505static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
506static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
507
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000508/* helper */
509static void
510do_pad(int pad)
511{
512 int i;
513 for (i = 0; i < pad; ++i)
514 fprintf(stderr, " ");
515}
516
517static void
518dump(node *n, int pad, int depth)
519{
520 int i;
521 if (depth == 0)
522 return;
523 do_pad(pad);
524 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
525 if (depth > 0)
526 depth--;
527 for (i = 0; i < NCH(n); ++i)
528 dump(CHILD(n, i), pad + 1, depth);
529}
530
531#define DUMP(N) dump(N, 0, -1)
532
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000533static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000534com_init(struct compiling *c, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000535{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000536 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000537 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
538 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000539 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000540 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000541 goto fail;
542 if ((c->c_const_dict = PyDict_New()) == NULL)
543 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000544 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000545 goto fail;
546 if ((c->c_name_dict = PyDict_New()) == NULL)
547 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000548 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000549 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000550 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
551 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000552 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000553 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000554 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000555 c->c_freevars = NULL;
556 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000557 c->c_nlocals = 0;
558 c->c_argcount = 0;
559 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000560 c->c_nexti = 0;
561 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000562 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000563 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000564 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000565 c->c_begin = 0;
566 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000567 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000568 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000569 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000570 c->c_stacklevel = 0;
571 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000572 c->c_firstlineno = 0;
573 c->c_last_addr = 0;
574 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000575 c->c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000576 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000577 c->c_nested = 0;
578 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000579 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000580 return 1;
581
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000582 fail:
583 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000584 return 0;
585}
586
587static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000588com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000589{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000590 Py_XDECREF(c->c_code);
591 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000592 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000593 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000594 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000595 Py_XDECREF(c->c_globals);
596 Py_XDECREF(c->c_locals);
597 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000598 Py_XDECREF(c->c_freevars);
599 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000600 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +0000601 if (c->c_future)
602 PyMem_Free((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000603}
604
605static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000606com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000607{
608 c->c_stacklevel += n;
609 if (c->c_stacklevel > c->c_maxstacklevel)
610 c->c_maxstacklevel = c->c_stacklevel;
611}
612
613static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000614com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000615{
616 if (c->c_stacklevel < n) {
Guido van Rossum90f827c1998-08-25 18:22:17 +0000617 /* fprintf(stderr,
Guido van Rossum8b993a91997-01-17 21:04:03 +0000618 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
619 c->c_filename, c->c_lineno,
Guido van Rossum90f827c1998-08-25 18:22:17 +0000620 c->c_nexti, c->c_stacklevel, n); */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000621 c->c_stacklevel = 0;
622 }
623 else
624 c->c_stacklevel -= n;
625}
626
627static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000628com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000629{
630 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000631 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000632 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000633 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000634}
635
636static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000637com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000638{
639 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000640 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000641 assert(byte >= 0 && byte <= 255);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000642 if (byte < 0 || byte > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000643 com_error(c, PyExc_SystemError,
644 "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000645 }
646 if (c->c_code == NULL)
647 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000648 len = PyString_Size(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000649 if (c->c_nexti >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000650 if (_PyString_Resize(&c->c_code, len+1000) != 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000651 c->c_errors++;
652 return;
653 }
654 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000655 PyString_AsString(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000656}
657
658static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000659com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000660{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000661 com_addbyte(c, x & 0xff);
662 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000663}
664
665static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000666com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000667{
668 int size;
669 char *p;
670 if (c->c_lnotab == NULL)
671 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000672 size = PyString_Size(c->c_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000673 if (c->c_lnotab_next+2 > size) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000674 if (_PyString_Resize(&c->c_lnotab, size + 1000) < 0) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000675 c->c_errors++;
676 return;
677 }
678 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000679 p = PyString_AsString(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000680 *p++ = addr;
681 *p++ = line;
682 c->c_lnotab_next += 2;
683}
684
685static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000686com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000687{
688 c->c_lineno = lineno;
689 if (c->c_firstlineno == 0) {
690 c->c_firstlineno = c->c_last_line = lineno;
691 }
692 else {
693 int incr_addr = c->c_nexti - c->c_last_addr;
694 int incr_line = lineno - c->c_last_line;
695 while (incr_addr > 0 || incr_line > 0) {
696 int trunc_addr = incr_addr;
697 int trunc_line = incr_line;
698 if (trunc_addr > 255)
699 trunc_addr = 255;
700 if (trunc_line > 255)
701 trunc_line = 255;
702 com_add_lnotab(c, trunc_addr, trunc_line);
703 incr_addr -= trunc_addr;
704 incr_line -= trunc_line;
705 }
706 c->c_last_addr = c->c_nexti;
707 c->c_last_line = lineno;
708 }
709}
710
711static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000712com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000713{
Fred Drakeef8ace32000-08-24 00:32:09 +0000714 int extended_arg = arg >> 16;
Guido van Rossum8e793d91997-03-03 19:13:14 +0000715 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000716 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000717 if (Py_OptimizeFlag)
718 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000719 }
Fred Drakeef8ace32000-08-24 00:32:09 +0000720 if (extended_arg){
721 com_addbyte(c, EXTENDED_ARG);
722 com_addint(c, extended_arg);
723 arg &= 0xffff;
724 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000725 com_addbyte(c, op);
726 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000727}
728
729static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000730com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000731{
732 /* Compile a forward reference for backpatching */
733 int here;
734 int anchor;
735 com_addbyte(c, op);
736 here = c->c_nexti;
737 anchor = *p_anchor;
738 *p_anchor = here;
739 com_addint(c, anchor == 0 ? 0 : here - anchor);
740}
741
742static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000743com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000744{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000745 unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000746 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000747 int dist;
748 int prev;
749 for (;;) {
750 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000751 prev = code[anchor] + (code[anchor+1] << 8);
752 dist = target - (anchor+2);
753 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +0000754 dist >>= 8;
755 code[anchor+1] = dist;
756 dist >>= 8;
757 if (dist) {
758 com_error(c, PyExc_SystemError,
759 "com_backpatch: offset too large");
760 break;
761 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000762 if (!prev)
763 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000764 anchor -= prev;
765 }
766}
767
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000768/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000769
770static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000771com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000772{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000773 PyObject *w, *t, *np=NULL;
774 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000775
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000776 t = Py_BuildValue("(OO)", v, v->ob_type);
777 if (t == NULL)
778 goto fail;
779 w = PyDict_GetItem(dict, t);
780 if (w != NULL) {
781 n = PyInt_AsLong(w);
782 } else {
783 n = PyList_Size(list);
784 np = PyInt_FromLong(n);
785 if (np == NULL)
786 goto fail;
787 if (PyList_Append(list, v) != 0)
788 goto fail;
789 if (PyDict_SetItem(dict, t, np) != 0)
790 goto fail;
791 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000792 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000793 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000794 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000795 fail:
796 Py_XDECREF(np);
797 Py_XDECREF(t);
798 c->c_errors++;
799 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000800}
801
802static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000803com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000804{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000805 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000806}
807
808static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000809com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000810{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000811 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000812}
813
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000814static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000815mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000816{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000817 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000818 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +0000819 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000820 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
821 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000822 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000823 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000824 return 0; /* Don't mangle __extremely_long_names */
825 if (name[nlen-1] == '_' && name[nlen-2] == '_')
826 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000827 /* Strip leading underscores from class name */
828 while (*p == '_')
829 p++;
830 if (*p == '\0')
831 return 0; /* Don't mangle if class is just underscores */
832 plen = strlen(p);
833 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000834 plen = maxlen-nlen-2; /* Truncate class name if too long */
835 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000836 buffer[0] = '_';
837 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000838 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000839 return 1;
840}
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000841
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000842static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000843com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000844{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000845 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000846 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000847 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000848
849 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000850 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000851 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000852 c->c_errors++;
853 i = 255;
854 }
855 else {
856 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000857 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000858 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000859 com_addoparg(c, op, i);
860}
861
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000862#define NAME_LOCAL 0
863#define NAME_GLOBAL 1
864#define NAME_DEFAULT 2
865#define NAME_CLOSURE 3
866
867static int
868com_lookup_arg(PyObject *dict, PyObject *name)
869{
870 PyObject *v = PyDict_GetItem(dict, name);
871 if (v == NULL)
872 return -1;
873 else
874 return PyInt_AS_LONG(v);
875}
876
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000877static void
878com_addop_varname(struct compiling *c, int kind, char *name)
879{
880 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000881 int i, reftype;
882 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000883 int op = STOP_CODE;
884 char buffer[MANGLE_LEN];
885
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000886 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000887 name = buffer;
888 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
889 c->c_errors++;
890 i = 255;
891 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000892 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000893
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000894 reftype = get_ref_type(c, name);
895 switch (reftype) {
896 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000897 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000898 scope = NAME_LOCAL;
899 break;
900 case GLOBAL_EXPLICIT:
901 scope = NAME_GLOBAL;
902 break;
903 case GLOBAL_IMPLICIT:
904 if (c->c_flags & CO_OPTIMIZED)
905 scope = NAME_GLOBAL;
906 break;
907 case FREE:
908 case CELL:
909 scope = NAME_CLOSURE;
910 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000911 }
912
913 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000914 if (scope == NAME_LOCAL)
915 i = com_lookup_arg(c->c_locals, v);
916 else if (reftype == FREE)
917 i = com_lookup_arg(c->c_freevars, v);
918 else if (reftype == CELL)
919 i = com_lookup_arg(c->c_cellvars, v);
920 if (i == -1) {
921 c->c_errors++; /* XXX no exception set */
922 i = 255;
923 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000924 }
925 Py_DECREF(v);
926
927 switch (kind) {
928 case VAR_LOAD:
929 switch (scope) {
930 case NAME_LOCAL:
931 op = LOAD_FAST;
932 break;
933 case NAME_GLOBAL:
934 op = LOAD_GLOBAL;
935 break;
936 case NAME_DEFAULT:
937 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000938 break;
939 case NAME_CLOSURE:
940 op = LOAD_DEREF;
941 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000942 }
943 break;
944 case VAR_STORE:
945 switch (scope) {
946 case NAME_LOCAL:
947 op = STORE_FAST;
948 break;
949 case NAME_GLOBAL:
950 op = STORE_GLOBAL;
951 break;
952 case NAME_DEFAULT:
953 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000954 break;
955 case NAME_CLOSURE:
956 op = STORE_DEREF;
957 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000958 }
959 break;
960 case VAR_DELETE:
961 switch (scope) {
962 case NAME_LOCAL:
963 op = DELETE_FAST;
964 break;
965 case NAME_GLOBAL:
966 op = DELETE_GLOBAL;
967 break;
968 case NAME_DEFAULT:
969 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000970 break;
971 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000972 char buf[500];
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000973 sprintf(buf, DEL_CLOSURE_ERROR, name);
974 com_error(c, PyExc_SyntaxError, buf);
975 i = 255;
976 break;
977 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000978 }
979 break;
980 }
981done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000982 com_addoparg(c, op, i);
983}
984
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000985static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000986com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000987{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000988 char *name;
989 char buffer[1000];
990 /* XXX it is possible to write this code without the 1000
991 chars on the total length of dotted names, I just can't be
992 bothered right now */
993 if (TYPE(n) == STAR)
994 name = "*";
995 else if (TYPE(n) == dotted_name) {
996 char *p = buffer;
997 int i;
998 name = buffer;
999 for (i = 0; i < NCH(n); i += 2) {
1000 char *s = STR(CHILD(n, i));
1001 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001002 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001003 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001004 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001005 break;
1006 }
1007 if (p != buffer)
1008 *p++ = '.';
1009 strcpy(p, s);
1010 p = strchr(p, '\0');
1011 }
1012 }
1013 else {
1014 REQ(n, NAME);
1015 name = STR(n);
1016 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001017 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001018}
1019
Guido van Rossum79f25d91997-04-29 20:08:16 +00001020static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001021parsenumber(struct compiling *co, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001022{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001023 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001024 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001025 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001026#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +00001027 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +00001028 int imflag;
1029#endif
1030
Guido van Rossum282914b1991-04-04 10:42:56 +00001031 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001032 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001033#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001034 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001035#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001036 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001037 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001038 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001039 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001040 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001041 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001042 if (*end == '\0') {
1043 if (errno != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001044 com_error(co, PyExc_OverflowError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001045 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +00001046 return NULL;
1047 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001048 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001049 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001050 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001051#ifndef WITHOUT_COMPLEX
1052 if (imflag) {
1053 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001054 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +00001055 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001056 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001057 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +00001058 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001059 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001060#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001061 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001062 PyFPE_START_PROTECT("atof", return 0)
1063 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001064 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001065 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001066 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001067}
1068
Guido van Rossum79f25d91997-04-29 20:08:16 +00001069static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001070parsestr(char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001071{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001072 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001073 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001074 char *buf;
1075 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001076 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001077 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001078 int first = *s;
1079 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001080 int rawmode = 0;
1081 int unicode = 0;
1082 if (isalpha(quote) || quote == '_') {
1083 if (quote == 'u' || quote == 'U') {
1084 quote = *++s;
1085 unicode = 1;
1086 }
1087 if (quote == 'r' || quote == 'R') {
1088 quote = *++s;
1089 rawmode = 1;
1090 }
1091 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001092 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001093 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001094 return NULL;
1095 }
1096 s++;
1097 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001098 if (len > INT_MAX) {
1099 PyErr_SetString(PyExc_OverflowError, "string to parse is too long");
1100 return NULL;
1101 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001102 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001103 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001104 return NULL;
1105 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001106 if (len >= 4 && s[0] == quote && s[1] == quote) {
1107 s += 2;
1108 len -= 2;
1109 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001110 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001111 return NULL;
1112 }
1113 }
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001114 if (unicode || Py_UnicodeFlag) {
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001115 if (rawmode)
1116 return PyUnicode_DecodeRawUnicodeEscape(
1117 s, len, NULL);
1118 else
1119 return PyUnicode_DecodeUnicodeEscape(
1120 s, len, NULL);
1121 }
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001122 if (rawmode || strchr(s, '\\') == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001123 return PyString_FromStringAndSize(s, len);
1124 v = PyString_FromStringAndSize((char *)NULL, len);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001125 if (v == NULL)
1126 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001127 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001128 end = s + len;
1129 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001130 if (*s != '\\') {
1131 *p++ = *s++;
1132 continue;
1133 }
1134 s++;
1135 switch (*s++) {
1136 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001137 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001138 case '\\': *p++ = '\\'; break;
1139 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +00001140 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001141 case 'b': *p++ = '\b'; break;
1142 case 'f': *p++ = '\014'; break; /* FF */
1143 case 't': *p++ = '\t'; break;
1144 case 'n': *p++ = '\n'; break;
1145 case 'r': *p++ = '\r'; break;
1146 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001147 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
1148 case '0': case '1': case '2': case '3':
1149 case '4': case '5': case '6': case '7':
1150 c = s[-1] - '0';
1151 if ('0' <= *s && *s <= '7') {
1152 c = (c<<3) + *s++ - '0';
1153 if ('0' <= *s && *s <= '7')
1154 c = (c<<3) + *s++ - '0';
1155 }
1156 *p++ = c;
1157 break;
1158 case 'x':
Jeremy Hylton4419ac12001-02-28 22:54:51 +00001159 if (isxdigit(Py_CHARMASK(s[0]))
1160 && isxdigit(Py_CHARMASK(s[1]))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +00001161 unsigned int x = 0;
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001162 c = Py_CHARMASK(*s);
1163 s++;
1164 if (isdigit(c))
1165 x = c - '0';
1166 else if (islower(c))
1167 x = 10 + c - 'a';
1168 else
1169 x = 10 + c - 'A';
1170 x = x << 4;
1171 c = Py_CHARMASK(*s);
1172 s++;
1173 if (isdigit(c))
1174 x += c - '0';
1175 else if (islower(c))
1176 x += 10 + c - 'a';
1177 else
1178 x += 10 + c - 'A';
Guido van Rossumed1100f1997-10-20 23:24:07 +00001179 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001180 break;
1181 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00001182 PyErr_SetString(PyExc_ValueError,
1183 "invalid \\x escape");
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001184 Py_DECREF(v);
1185 return NULL;
1186 default:
1187 *p++ = '\\';
1188 *p++ = s[-1];
1189 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001190 }
1191 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001192 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001193 return v;
1194}
1195
Guido van Rossum79f25d91997-04-29 20:08:16 +00001196static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001197parsestrplus(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001198{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001199 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001200 int i;
1201 REQ(CHILD(n, 0), STRING);
1202 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
1203 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001204 for (i = 1; i < NCH(n); i++) {
1205 PyObject *s;
1206 s = parsestr(STR(CHILD(n, i)));
1207 if (s == NULL)
1208 goto onError;
1209 if (PyString_Check(v) && PyString_Check(s)) {
1210 PyString_ConcatAndDel(&v, s);
1211 if (v == NULL)
1212 goto onError;
1213 }
1214 else {
1215 PyObject *temp;
1216 temp = PyUnicode_Concat(v, s);
1217 Py_DECREF(s);
1218 if (temp == NULL)
1219 goto onError;
1220 Py_DECREF(v);
1221 v = temp;
1222 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001223 }
1224 }
1225 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001226
1227 onError:
1228 Py_XDECREF(v);
1229 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001230}
1231
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001232static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001233com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001234{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001235 int anchor = 0;
1236 int save_begin = c->c_begin;
1237
1238 /* list_iter: for v in expr [list_iter] */
1239 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001240 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001241 c->c_begin = c->c_nexti;
1242 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001243 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001244 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001245 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001246 c->c_loops++;
1247 com_list_iter(c, n, e, t);
1248 c->c_loops--;
1249 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1250 c->c_begin = save_begin;
1251 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001252 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001253}
1254
1255static void
1256com_list_if(struct compiling *c, node *n, node *e, char *t)
1257{
1258 int anchor = 0;
1259 int a = 0;
1260 /* list_iter: 'if' test [list_iter] */
1261 com_addoparg(c, SET_LINENO, n->n_lineno);
1262 com_node(c, CHILD(n, 1));
1263 com_addfwref(c, JUMP_IF_FALSE, &a);
1264 com_addbyte(c, POP_TOP);
1265 com_pop(c, 1);
1266 com_list_iter(c, n, e, t);
1267 com_addfwref(c, JUMP_FORWARD, &anchor);
1268 com_backpatch(c, a);
1269 /* We jump here with an extra entry which we now pop */
1270 com_addbyte(c, POP_TOP);
1271 com_backpatch(c, anchor);
1272}
1273
1274static void
1275com_list_iter(struct compiling *c,
1276 node *p, /* parent of list_iter node */
1277 node *e, /* element expression node */
1278 char *t /* name of result list temp local */)
1279{
1280 /* list_iter is the last child in a listmaker, list_for, or list_if */
1281 node *n = CHILD(p, NCH(p)-1);
1282 if (TYPE(n) == list_iter) {
1283 n = CHILD(n, 0);
1284 switch (TYPE(n)) {
1285 case list_for:
1286 com_list_for(c, n, e, t);
1287 break;
1288 case list_if:
1289 com_list_if(c, n, e, t);
1290 break;
1291 default:
1292 com_error(c, PyExc_SystemError,
1293 "invalid list_iter node type");
1294 }
1295 }
1296 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001297 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001298 com_push(c, 1);
1299 com_node(c, e);
1300 com_addoparg(c, CALL_FUNCTION, 1);
1301 com_addbyte(c, POP_TOP);
1302 com_pop(c, 2);
1303 }
1304}
1305
1306static void
1307com_list_comprehension(struct compiling *c, node *n)
1308{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001309 /* listmaker: test list_for */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001310 char tmpname[12];
Tim Peters30814212001-02-17 05:30:26 +00001311 sprintf(tmpname, "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001312 com_addoparg(c, BUILD_LIST, 0);
1313 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1314 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001315 com_addop_name(c, LOAD_ATTR, "append");
1316 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001317 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001318 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001319 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001320 --c->c_tmpname;
1321}
1322
1323static void
1324com_listmaker(struct compiling *c, node *n)
1325{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001326 /* listmaker: test ( list_for | (',' test)* [','] ) */
1327 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001328 com_list_comprehension(c, n);
1329 else {
1330 int len = 0;
1331 int i;
1332 for (i = 0; i < NCH(n); i += 2, len++)
1333 com_node(c, CHILD(n, i));
1334 com_addoparg(c, BUILD_LIST, len);
1335 com_pop(c, len-1);
1336 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001337}
1338
1339static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001340com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001341{
1342 int i;
1343 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1344 for (i = 0; i+2 < NCH(n); i += 4) {
1345 /* We must arrange things just right for STORE_SUBSCR.
1346 It wants the stack to look like (value) (dict) (key) */
1347 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001348 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001349 com_node(c, CHILD(n, i+2)); /* value */
1350 com_addbyte(c, ROT_TWO);
1351 com_node(c, CHILD(n, i)); /* key */
1352 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001353 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001354 }
1355}
1356
1357static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001358com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001359{
1360 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001361 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001362 int i;
1363 REQ(n, atom);
1364 ch = CHILD(n, 0);
1365 switch (TYPE(ch)) {
1366 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001367 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001368 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001369 com_push(c, 1);
1370 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001371 else
1372 com_node(c, CHILD(n, 1));
1373 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001374 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001375 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001376 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001377 com_push(c, 1);
1378 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001379 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001380 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001381 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001382 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001383 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001384 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001385 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001386 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001387 break;
1388 case BACKQUOTE:
1389 com_node(c, CHILD(n, 1));
1390 com_addbyte(c, UNARY_CONVERT);
1391 break;
1392 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001393 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001394 i = 255;
1395 }
1396 else {
1397 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001398 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001399 }
1400 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001401 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001402 break;
1403 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001404 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001405 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001406 c->c_errors++;
1407 i = 255;
1408 }
1409 else {
1410 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001411 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001412 }
1413 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001414 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001415 break;
1416 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001417 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001418 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001419 break;
1420 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001421 com_error(c, PyExc_SystemError,
1422 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001423 }
1424}
1425
1426static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001427com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001428{
1429 if (NCH(n) == 1) {
1430 com_addbyte(c, op);
1431 }
1432 else if (NCH(n) == 2) {
1433 if (TYPE(CHILD(n, 0)) != COLON) {
1434 com_node(c, CHILD(n, 0));
1435 com_addbyte(c, op+1);
1436 }
1437 else {
1438 com_node(c, CHILD(n, 1));
1439 com_addbyte(c, op+2);
1440 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001441 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001442 }
1443 else {
1444 com_node(c, CHILD(n, 0));
1445 com_node(c, CHILD(n, 2));
1446 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001447 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001448 }
1449}
1450
Guido van Rossum635abd21997-01-06 22:56:52 +00001451static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001452com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1453{
1454 if (NCH(n) == 1) {
1455 com_addbyte(c, DUP_TOP);
1456 com_push(c, 1);
1457 com_addbyte(c, SLICE);
1458 com_node(c, augn);
1459 com_addbyte(c, opcode);
1460 com_pop(c, 1);
1461 com_addbyte(c, ROT_TWO);
1462 com_addbyte(c, STORE_SLICE);
1463 com_pop(c, 2);
1464 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1465 com_node(c, CHILD(n, 0));
1466 com_addoparg(c, DUP_TOPX, 2);
1467 com_push(c, 2);
1468 com_addbyte(c, SLICE+1);
1469 com_pop(c, 1);
1470 com_node(c, augn);
1471 com_addbyte(c, opcode);
1472 com_pop(c, 1);
1473 com_addbyte(c, ROT_THREE);
1474 com_addbyte(c, STORE_SLICE+1);
1475 com_pop(c, 3);
1476 } else if (NCH(n) == 2) {
1477 com_node(c, CHILD(n, 1));
1478 com_addoparg(c, DUP_TOPX, 2);
1479 com_push(c, 2);
1480 com_addbyte(c, SLICE+2);
1481 com_pop(c, 1);
1482 com_node(c, augn);
1483 com_addbyte(c, opcode);
1484 com_pop(c, 1);
1485 com_addbyte(c, ROT_THREE);
1486 com_addbyte(c, STORE_SLICE+2);
1487 com_pop(c, 3);
1488 } else {
1489 com_node(c, CHILD(n, 0));
1490 com_node(c, CHILD(n, 2));
1491 com_addoparg(c, DUP_TOPX, 3);
1492 com_push(c, 3);
1493 com_addbyte(c, SLICE+3);
1494 com_pop(c, 2);
1495 com_node(c, augn);
1496 com_addbyte(c, opcode);
1497 com_pop(c, 1);
1498 com_addbyte(c, ROT_FOUR);
1499 com_addbyte(c, STORE_SLICE+3);
1500 com_pop(c, 4);
1501 }
1502}
1503
1504static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001505com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001506{
1507 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001508 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001509 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001510 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001511 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001512 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001513 }
1514 else {
1515 com_node(c, CHILD(n, 0));
1516 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001517 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001518 }
1519 m = n;
1520 do {
1521 m = CHILD(m, 0);
1522 } while (NCH(m) == 1);
1523 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00001524 /* f(lambda x: x[0] = 3) ends up getting parsed with
1525 * LHS test = lambda x: x[0], and RHS test = 3.
1526 * SF bug 132313 points out that complaining about a keyword
1527 * then is very confusing.
1528 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001529 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00001530 TYPE(m) == lambdef ?
1531 "lambda cannot contain assignment" :
1532 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001533 }
1534 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001535 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001536 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001537 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001538 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001539 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001540 else if (*pkeywords == NULL) {
1541 c->c_errors++;
1542 Py_DECREF(v);
1543 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001544 if (PyDict_GetItem(*pkeywords, v) != NULL)
1545 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001546 "duplicate keyword argument");
1547 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001548 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001549 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001550 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001551 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001552 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001553 }
1554 }
1555 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001556}
1557
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001558static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001559com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001560{
1561 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001562 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001563 }
1564 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001565 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001566 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001567 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001568 int star_flag = 0;
1569 int starstar_flag = 0;
1570 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001571 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001572 na = 0;
1573 nk = 0;
1574 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001575 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001576 if (TYPE(ch) == STAR ||
1577 TYPE(ch) == DOUBLESTAR)
1578 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001579 if (ch->n_lineno != lineno) {
1580 lineno = ch->n_lineno;
1581 com_addoparg(c, SET_LINENO, lineno);
1582 }
1583 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001584 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001585 na++;
1586 else
1587 nk++;
1588 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001589 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001590 while (i < NCH(n)) {
1591 node *tok = CHILD(n, i);
1592 node *ch = CHILD(n, i+1);
1593 i += 3;
1594 switch (TYPE(tok)) {
1595 case STAR: star_flag = 1; break;
1596 case DOUBLESTAR: starstar_flag = 1; break;
1597 }
1598 com_node(c, ch);
1599 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001600 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001601 com_error(c, PyExc_SyntaxError,
1602 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001603 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001604 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001605 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001606 star_flag + (starstar_flag << 1);
1607 else
1608 opcode = CALL_FUNCTION;
1609 com_addoparg(c, opcode, na | (nk << 8));
1610 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001611 }
1612}
1613
1614static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001615com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001616{
1617 com_addopname(c, LOAD_ATTR, n);
1618}
1619
1620static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001621com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001622{
1623 int i=0;
1624 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001625 node *ch;
1626
1627 /* first argument */
1628 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001629 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001630 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001631 i++;
1632 }
1633 else {
1634 com_node(c, CHILD(n,i));
1635 i++;
1636 REQ(CHILD(n,i),COLON);
1637 i++;
1638 }
1639 /* second argument */
1640 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1641 com_node(c, CHILD(n,i));
1642 i++;
1643 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001644 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001645 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001646 com_push(c, 1);
1647 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001648 /* remaining arguments */
1649 for (; i < NCH(n); i++) {
1650 ns++;
1651 ch=CHILD(n,i);
1652 REQ(ch, sliceop);
1653 if (NCH(ch) == 1) {
1654 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001655 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001656 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001657 }
1658 else
1659 com_node(c, CHILD(ch,1));
1660 }
1661 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001662 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001663}
1664
1665static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001666com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001667{
1668 node *ch;
1669 REQ(n, subscript);
1670 ch = CHILD(n,0);
1671 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001672 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001673 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001674 com_push(c, 1);
1675 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001676 else {
1677 /* check for slice */
1678 if ((TYPE(ch) == COLON || NCH(n) > 1))
1679 com_sliceobj(c, n);
1680 else {
1681 REQ(ch, test);
1682 com_node(c, ch);
1683 }
1684 }
1685}
1686
1687static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001688com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001689{
1690 int i, op;
1691 REQ(n, subscriptlist);
1692 /* Check to make backward compatible slice behavior for '[i:j]' */
1693 if (NCH(n) == 1) {
1694 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001695 /* 'Basic' slice, should have exactly one colon. */
1696 if ((TYPE(CHILD(sub, 0)) == COLON
1697 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1698 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1699 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001700 switch (assigning) {
1701 case OP_DELETE:
1702 op = DELETE_SLICE;
1703 break;
1704 case OP_ASSIGN:
1705 op = STORE_SLICE;
1706 break;
1707 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001708 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001709 break;
1710 default:
1711 com_augassign_slice(c, sub, assigning, augn);
1712 return;
1713 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001714 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001715 if (op == STORE_SLICE)
1716 com_pop(c, 2);
1717 else if (op == DELETE_SLICE)
1718 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001719 return;
1720 }
1721 }
1722 /* Else normal subscriptlist. Compile each subscript. */
1723 for (i = 0; i < NCH(n); i += 2)
1724 com_subscript(c, CHILD(n, i));
1725 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001726 if (NCH(n) > 1) {
1727 i = (NCH(n)+1) / 2;
1728 com_addoparg(c, BUILD_TUPLE, i);
1729 com_pop(c, i-1);
1730 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001731 switch (assigning) {
1732 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001733 op = DELETE_SUBSCR;
1734 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00001735 break;
1736 default:
1737 case OP_ASSIGN:
1738 op = STORE_SUBSCR;
1739 i = 3;
1740 break;
1741 case OP_APPLY:
1742 op = BINARY_SUBSCR;
1743 i = 1;
1744 break;
1745 }
1746 if (assigning > OP_APPLY) {
1747 com_addoparg(c, DUP_TOPX, 2);
1748 com_push(c, 2);
1749 com_addbyte(c, BINARY_SUBSCR);
1750 com_pop(c, 1);
1751 com_node(c, augn);
1752 com_addbyte(c, assigning);
1753 com_pop(c, 1);
1754 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001755 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001756 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001757 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001758}
1759
1760static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001761com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001762{
1763 REQ(n, trailer);
1764 switch (TYPE(CHILD(n, 0))) {
1765 case LPAR:
1766 com_call_function(c, CHILD(n, 1));
1767 break;
1768 case DOT:
1769 com_select_member(c, CHILD(n, 1));
1770 break;
1771 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00001772 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001773 break;
1774 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001775 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001776 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001777 }
1778}
1779
1780static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001781com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001782{
1783 int i;
1784 REQ(n, power);
1785 com_atom(c, CHILD(n, 0));
1786 for (i = 1; i < NCH(n); i++) {
1787 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1788 com_factor(c, CHILD(n, i+1));
1789 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001790 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001791 break;
1792 }
1793 else
1794 com_apply_trailer(c, CHILD(n, i));
1795 }
1796}
1797
1798static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001799com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001800{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001801 REQ(n, factor);
1802 if (TYPE(CHILD(n, 0)) == PLUS) {
1803 com_factor(c, CHILD(n, 1));
1804 com_addbyte(c, UNARY_POSITIVE);
1805 }
1806 else if (TYPE(CHILD(n, 0)) == MINUS) {
1807 com_factor(c, CHILD(n, 1));
1808 com_addbyte(c, UNARY_NEGATIVE);
1809 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001810 else if (TYPE(CHILD(n, 0)) == TILDE) {
1811 com_factor(c, CHILD(n, 1));
1812 com_addbyte(c, UNARY_INVERT);
1813 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001814 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001815 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001816 }
1817}
1818
1819static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001820com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001821{
1822 int i;
1823 int op;
1824 REQ(n, term);
1825 com_factor(c, CHILD(n, 0));
1826 for (i = 2; i < NCH(n); i += 2) {
1827 com_factor(c, CHILD(n, i));
1828 switch (TYPE(CHILD(n, i-1))) {
1829 case STAR:
1830 op = BINARY_MULTIPLY;
1831 break;
1832 case SLASH:
1833 op = BINARY_DIVIDE;
1834 break;
1835 case PERCENT:
1836 op = BINARY_MODULO;
1837 break;
1838 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001839 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001840 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001841 op = 255;
1842 }
1843 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001844 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001845 }
1846}
1847
1848static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001849com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001850{
1851 int i;
1852 int op;
1853 REQ(n, arith_expr);
1854 com_term(c, CHILD(n, 0));
1855 for (i = 2; i < NCH(n); i += 2) {
1856 com_term(c, CHILD(n, i));
1857 switch (TYPE(CHILD(n, i-1))) {
1858 case PLUS:
1859 op = BINARY_ADD;
1860 break;
1861 case MINUS:
1862 op = BINARY_SUBTRACT;
1863 break;
1864 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001865 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001866 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001867 op = 255;
1868 }
1869 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001870 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001871 }
1872}
1873
1874static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001875com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001876{
1877 int i;
1878 int op;
1879 REQ(n, shift_expr);
1880 com_arith_expr(c, CHILD(n, 0));
1881 for (i = 2; i < NCH(n); i += 2) {
1882 com_arith_expr(c, CHILD(n, i));
1883 switch (TYPE(CHILD(n, i-1))) {
1884 case LEFTSHIFT:
1885 op = BINARY_LSHIFT;
1886 break;
1887 case RIGHTSHIFT:
1888 op = BINARY_RSHIFT;
1889 break;
1890 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001891 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001892 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001893 op = 255;
1894 }
1895 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001896 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001897 }
1898}
1899
1900static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001901com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001902{
1903 int i;
1904 int op;
1905 REQ(n, and_expr);
1906 com_shift_expr(c, CHILD(n, 0));
1907 for (i = 2; i < NCH(n); i += 2) {
1908 com_shift_expr(c, CHILD(n, i));
1909 if (TYPE(CHILD(n, i-1)) == AMPER) {
1910 op = BINARY_AND;
1911 }
1912 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001913 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001914 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001915 op = 255;
1916 }
1917 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001918 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001919 }
1920}
1921
1922static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001923com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001924{
1925 int i;
1926 int op;
1927 REQ(n, xor_expr);
1928 com_and_expr(c, CHILD(n, 0));
1929 for (i = 2; i < NCH(n); i += 2) {
1930 com_and_expr(c, CHILD(n, i));
1931 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1932 op = BINARY_XOR;
1933 }
1934 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001935 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001936 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001937 op = 255;
1938 }
1939 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001940 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001941 }
1942}
1943
1944static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001945com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001946{
1947 int i;
1948 int op;
1949 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001950 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001951 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001952 com_xor_expr(c, CHILD(n, i));
1953 if (TYPE(CHILD(n, i-1)) == VBAR) {
1954 op = BINARY_OR;
1955 }
1956 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001957 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001958 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001959 op = 255;
1960 }
1961 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001962 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001963 }
1964}
1965
1966static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001967cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001968{
1969 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001970 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001971 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1972 if (NCH(n) == 1) {
1973 n = CHILD(n, 0);
1974 switch (TYPE(n)) {
1975 case LESS: return LT;
1976 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001977 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001978 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001979 case LESSEQUAL: return LE;
1980 case GREATEREQUAL: return GE;
1981 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001982 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1983 if (strcmp(STR(n), "is") == 0) return IS;
1984 }
1985 }
1986 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001987 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001988 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1989 return NOT_IN;
1990 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1991 return IS_NOT;
1992 }
1993 }
1994 return BAD;
1995}
1996
1997static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001998com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001999{
2000 int i;
2001 enum cmp_op op;
2002 int anchor;
2003 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2004 com_expr(c, CHILD(n, 0));
2005 if (NCH(n) == 1)
2006 return;
2007
2008 /****************************************************************
2009 The following code is generated for all but the last
2010 comparison in a chain:
2011
2012 label: on stack: opcode: jump to:
2013
2014 a <code to load b>
2015 a, b DUP_TOP
2016 a, b, b ROT_THREE
2017 b, a, b COMPARE_OP
2018 b, 0-or-1 JUMP_IF_FALSE L1
2019 b, 1 POP_TOP
2020 b
2021
2022 We are now ready to repeat this sequence for the next
2023 comparison in the chain.
2024
2025 For the last we generate:
2026
2027 b <code to load c>
2028 b, c COMPARE_OP
2029 0-or-1
2030
2031 If there were any jumps to L1 (i.e., there was more than one
2032 comparison), we generate:
2033
2034 0-or-1 JUMP_FORWARD L2
2035 L1: b, 0 ROT_TWO
2036 0, b POP_TOP
2037 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002038 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002039 ****************************************************************/
2040
2041 anchor = 0;
2042
2043 for (i = 2; i < NCH(n); i += 2) {
2044 com_expr(c, CHILD(n, i));
2045 if (i+2 < NCH(n)) {
2046 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002047 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002048 com_addbyte(c, ROT_THREE);
2049 }
2050 op = cmp_type(CHILD(n, i-1));
2051 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002052 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002053 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002054 }
2055 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002056 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002057 if (i+2 < NCH(n)) {
2058 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2059 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002060 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002061 }
2062 }
2063
2064 if (anchor) {
2065 int anchor2 = 0;
2066 com_addfwref(c, JUMP_FORWARD, &anchor2);
2067 com_backpatch(c, anchor);
2068 com_addbyte(c, ROT_TWO);
2069 com_addbyte(c, POP_TOP);
2070 com_backpatch(c, anchor2);
2071 }
2072}
2073
2074static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002075com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002076{
2077 REQ(n, not_test); /* 'not' not_test | comparison */
2078 if (NCH(n) == 1) {
2079 com_comparison(c, CHILD(n, 0));
2080 }
2081 else {
2082 com_not_test(c, CHILD(n, 1));
2083 com_addbyte(c, UNARY_NOT);
2084 }
2085}
2086
2087static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002088com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002089{
2090 int i;
2091 int anchor;
2092 REQ(n, and_test); /* not_test ('and' not_test)* */
2093 anchor = 0;
2094 i = 0;
2095 for (;;) {
2096 com_not_test(c, CHILD(n, i));
2097 if ((i += 2) >= NCH(n))
2098 break;
2099 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2100 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002101 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002102 }
2103 if (anchor)
2104 com_backpatch(c, anchor);
2105}
2106
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002107static int
2108com_make_closure(struct compiling *c, PyCodeObject *co)
2109{
2110 int i, free = PyTuple_GET_SIZE(co->co_freevars);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002111 /* If the code is compiled with st->st_nested_scopes == 0,
2112 then no variable will ever be added to co_freevars.
2113 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002114 if (free == 0)
2115 return 0;
2116 for (i = 0; i < free; ++i) {
2117 /* Bypass com_addop_varname because it will generate
2118 LOAD_DEREF but LOAD_CLOSURE is needed.
2119 */
2120 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2121 int arg, reftype;
2122
2123 /* Special case: If a class contains a method with a
2124 free variable that has the same name as a method,
2125 the name will be considered free *and* local in the
2126 class. It should be handled by the closure, as
2127 well as by the normal name loookup logic.
2128 */
2129 reftype = get_ref_type(c, PyString_AS_STRING(name));
2130 if (reftype == CELL)
2131 arg = com_lookup_arg(c->c_cellvars, name);
2132 else /* (reftype == FREE) */
2133 arg = com_lookup_arg(c->c_freevars, name);
2134 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002135 fprintf(stderr, "lookup %s in %s %d %d\n"
2136 "freevars of %s: %s\n",
2137 PyObject_REPR(name),
2138 c->c_name,
2139 reftype, arg,
2140 PyString_AS_STRING(co->co_name),
2141 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002142 Py_FatalError("com_make_closure()");
2143 }
2144 com_addoparg(c, LOAD_CLOSURE, arg);
2145
2146 }
2147 com_push(c, free);
2148 return 1;
2149}
2150
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002151static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002152com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002153{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002154 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002155 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002156 PyObject *co;
2157 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002158 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002159 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2160 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002161 co = (PyObject *) icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002162 if (co == NULL) {
2163 c->c_errors++;
2164 return;
2165 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002166 symtable_exit_scope(c->c_symtable);
Tim Peters1e542112001-02-23 22:23:53 +00002167 i = com_addconst(c, co);
2168 closure = com_make_closure(c, (PyCodeObject *)co);
2169 Py_DECREF(co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002170 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002171 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002172 if (closure)
2173 com_addoparg(c, MAKE_CLOSURE, ndefs);
2174 else
2175 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002176 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002177 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002178 else {
2179 int anchor = 0;
2180 int i = 0;
2181 for (;;) {
2182 com_and_test(c, CHILD(n, i));
2183 if ((i += 2) >= NCH(n))
2184 break;
2185 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2186 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002187 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002188 }
2189 if (anchor)
2190 com_backpatch(c, anchor);
2191 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002192}
2193
2194static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002195com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002196{
2197 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002198 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002199 com_node(c, CHILD(n, 0));
2200 }
2201 else {
2202 int i;
2203 int len;
2204 len = (NCH(n) + 1) / 2;
2205 for (i = 0; i < NCH(n); i += 2)
2206 com_node(c, CHILD(n, i));
2207 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002208 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002209 }
2210}
2211
2212
2213/* Begin of assignment compilation */
2214
Thomas Wouters434d0822000-08-24 20:11:32 +00002215
2216static void
2217com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2218{
2219 com_addbyte(c, DUP_TOP);
2220 com_push(c, 1);
2221 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002222 com_node(c, augn);
2223 com_addbyte(c, opcode);
2224 com_pop(c, 1);
2225 com_addbyte(c, ROT_TWO);
2226 com_addopname(c, STORE_ATTR, n);
2227 com_pop(c, 2);
2228}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002229
2230static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002231com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002232{
2233 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002234 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002235}
2236
2237static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002238com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002239{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002240 REQ(n, trailer);
2241 switch (TYPE(CHILD(n, 0))) {
2242 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002243 com_error(c, PyExc_SyntaxError,
2244 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002245 break;
2246 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002247 if (assigning > OP_APPLY)
2248 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2249 else
2250 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002251 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002252 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002253 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002254 break;
2255 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002256 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002257 }
2258}
2259
2260static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002261com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002262{
2263 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002264 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002265 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002266 if (assigning) {
2267 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002268 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002269 com_push(c, i-1);
2270 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002271 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002272 com_assign(c, CHILD(n, i), assigning, NULL);
2273}
2274
2275static void
2276com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2277{
2278 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002279 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002280 com_push(c, 1);
2281 com_node(c, augn);
2282 com_addbyte(c, opcode);
2283 com_pop(c, 1);
2284 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002285}
2286
2287static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002288com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002289{
2290 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002291 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002292 if (assigning)
2293 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002294}
2295
2296static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002297com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002298{
2299 /* Loop to avoid trivial recursion */
2300 for (;;) {
2301 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002302
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002303 case exprlist:
2304 case testlist:
2305 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002306 if (assigning > OP_APPLY) {
2307 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002308 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002309 return;
2310 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002311 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002312 return;
2313 }
2314 n = CHILD(n, 0);
2315 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002316
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002317 case test:
2318 case and_test:
2319 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002320 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002321 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002322 case xor_expr:
2323 case and_expr:
2324 case shift_expr:
2325 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002326 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002327 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002328 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002329 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002330 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002331 return;
2332 }
2333 n = CHILD(n, 0);
2334 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002335
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002336 case power: /* atom trailer* ('**' power)*
2337 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002338 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002339 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002340 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002341 return;
2342 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002343 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002344 int i;
2345 com_node(c, CHILD(n, 0));
2346 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002347 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002348 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002349 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002350 return;
2351 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002352 com_apply_trailer(c, CHILD(n, i));
2353 } /* NB i is still alive */
2354 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002355 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002356 return;
2357 }
2358 n = CHILD(n, 0);
2359 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002360
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002361 case atom:
2362 switch (TYPE(CHILD(n, 0))) {
2363 case LPAR:
2364 n = CHILD(n, 1);
2365 if (TYPE(n) == RPAR) {
2366 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002367 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002368 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002369 return;
2370 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002371 if (assigning > OP_APPLY) {
2372 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002373 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002374 return;
2375 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002376 break;
2377 case LSQB:
2378 n = CHILD(n, 1);
2379 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002380 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002381 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002382 return;
2383 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002384 if (assigning > OP_APPLY) {
2385 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002386 "augmented assign to list not possible");
2387 return;
2388 }
2389 if (NCH(n) > 1
2390 && TYPE(CHILD(n, 1)) == list_for) {
2391 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002392 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002393 return;
2394 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002395 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002396 return;
2397 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002398 if (assigning > OP_APPLY)
2399 com_augassign_name(c, CHILD(n, 0),
2400 assigning, augn);
2401 else
2402 com_assign_name(c, CHILD(n, 0),
2403 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002404 return;
2405 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002406 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002407 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002408 return;
2409 }
2410 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002411
2412 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002413 com_error(c, PyExc_SyntaxError,
2414 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002415 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002416
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002417 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002418 com_error(c, PyExc_SystemError,
2419 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002420 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002421
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002422 }
2423 }
2424}
Guido van Rossum7c531111997-03-11 18:42:21 +00002425
Thomas Wouters434d0822000-08-24 20:11:32 +00002426static void
2427com_augassign(struct compiling *c, node *n)
2428{
2429 int opcode;
2430
2431 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2432 case '+': opcode = INPLACE_ADD; break;
2433 case '-': opcode = INPLACE_SUBTRACT; break;
2434 case '/': opcode = INPLACE_DIVIDE; break;
2435 case '%': opcode = INPLACE_MODULO; break;
2436 case '<': opcode = INPLACE_LSHIFT; break;
2437 case '>': opcode = INPLACE_RSHIFT; break;
2438 case '&': opcode = INPLACE_AND; break;
2439 case '^': opcode = INPLACE_XOR; break;
2440 case '|': opcode = INPLACE_OR; break;
2441 case '*':
2442 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2443 opcode = INPLACE_POWER;
2444 else
2445 opcode = INPLACE_MULTIPLY;
2446 break;
2447 default:
2448 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2449 return;
2450 }
2451 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2452}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002453
2454static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002455com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002456{
Thomas Wouters434d0822000-08-24 20:11:32 +00002457 REQ(n, expr_stmt);
2458 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002459 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002460 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002461 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002462 if (NCH(n) == 1) {
2463 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002464 if (c->c_interactive)
2465 com_addbyte(c, PRINT_EXPR);
2466 else
2467 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002468 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002469 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002470 else if (TYPE(CHILD(n,1)) == augassign)
2471 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002472 else {
2473 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002474 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002475 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002476 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002477 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002478 com_push(c, 1);
2479 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002480 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002481 }
2482 }
2483}
2484
2485static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002486com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002487{
2488 int a = 0, b = 0;
2489 int i;
2490 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2491 /* Generate code like for
2492
2493 if __debug__:
2494 if not <test>:
2495 raise AssertionError [, <message>]
2496
2497 where <message> is the second test, if present.
2498 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002499
Guido van Rossum228d7f31997-04-02 05:24:36 +00002500 if (Py_OptimizeFlag)
2501 return;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002502 com_addop_name(c, LOAD_GLOBAL, "__debug__");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002503 com_push(c, 1);
2504 com_addfwref(c, JUMP_IF_FALSE, &a);
2505 com_addbyte(c, POP_TOP);
2506 com_pop(c, 1);
2507 com_node(c, CHILD(n, 1));
2508 com_addfwref(c, JUMP_IF_TRUE, &b);
2509 com_addbyte(c, POP_TOP);
2510 com_pop(c, 1);
2511 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002512 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002513 com_push(c, 1);
2514 i = NCH(n)/2; /* Either 2 or 4 */
2515 if (i > 1)
2516 com_node(c, CHILD(n, 3));
2517 com_addoparg(c, RAISE_VARARGS, i);
2518 com_pop(c, i);
2519 /* The interpreter does not fall through */
2520 /* All jumps converge here */
2521 com_backpatch(c, a);
2522 com_backpatch(c, b);
2523 com_addbyte(c, POP_TOP);
2524}
2525
2526static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002527com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002528{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002529 int i = 1;
2530 node* stream = NULL;
2531
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002532 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002533
2534 /* are we using the extended print form? */
2535 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2536 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002537 com_node(c, stream);
2538 /* stack: [...] => [... stream] */
2539 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002540 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2541 i = 4;
2542 else
2543 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002544 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002545 for (; i < NCH(n); i += 2) {
2546 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002547 com_addbyte(c, DUP_TOP);
2548 /* stack: [stream] => [stream stream] */
2549 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002550 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002551 /* stack: [stream stream] => [stream stream obj] */
2552 com_addbyte(c, ROT_TWO);
2553 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002554 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002555 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002556 com_pop(c, 2);
2557 }
2558 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002559 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002560 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002561 com_addbyte(c, PRINT_ITEM);
2562 com_pop(c, 1);
2563 }
2564 }
2565 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002566 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002567 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002568 /* must pop the extra stream object off the stack */
2569 com_addbyte(c, POP_TOP);
2570 /* stack: [... stream] => [...] */
2571 com_pop(c, 1);
2572 }
2573 }
2574 else {
2575 if (stream != NULL) {
2576 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002577 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002578 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002579 com_pop(c, 1);
2580 }
2581 else
2582 com_addbyte(c, PRINT_NEWLINE);
2583 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002584}
2585
2586static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002587com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002588{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002589 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002590 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002591 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002592 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002593 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002594 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002595 com_push(c, 1);
2596 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002597 else
2598 com_node(c, CHILD(n, 1));
2599 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002600 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002601}
2602
2603static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002604com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002605{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002606 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002607 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2608 if (NCH(n) > 1) {
2609 com_node(c, CHILD(n, 1));
2610 if (NCH(n) > 3) {
2611 com_node(c, CHILD(n, 3));
2612 if (NCH(n) > 5)
2613 com_node(c, CHILD(n, 5));
2614 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002615 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002616 i = NCH(n)/2;
2617 com_addoparg(c, RAISE_VARARGS, i);
2618 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002619}
2620
2621static void
Thomas Wouters52152252000-08-17 22:55:00 +00002622com_from_import(struct compiling *c, node *n)
2623{
2624 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2625 com_push(c, 1);
2626 if (NCH(n) > 1) {
2627 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2628 com_error(c, PyExc_SyntaxError, "invalid syntax");
2629 return;
2630 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002631 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002632 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002633 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00002634 com_pop(c, 1);
2635}
2636
2637static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002638com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002639{
2640 int i;
2641 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002642 /* 'import' dotted_name (',' dotted_name)* |
2643 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002644 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00002645 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002646 /* 'from' dotted_name 'import' ... */
2647 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002648
2649 if (TYPE(CHILD(n, 3)) == STAR) {
2650 tup = Py_BuildValue("(s)", "*");
2651 } else {
2652 tup = PyTuple_New((NCH(n) - 2)/2);
2653 for (i = 3; i < NCH(n); i += 2) {
2654 PyTuple_SET_ITEM(tup, (i-3)/2,
2655 PyString_FromString(STR(
Jeremy Hylton4419ac12001-02-28 22:54:51 +00002656 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002657 }
2658 }
2659 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00002660 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002661 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002662 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00002663 if (TYPE(CHILD(n, 3)) == STAR)
2664 com_addbyte(c, IMPORT_STAR);
2665 else {
2666 for (i = 3; i < NCH(n); i += 2)
2667 com_from_import(c, CHILD(n, i));
2668 com_addbyte(c, POP_TOP);
2669 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002670 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002671 }
2672 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002673 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002674 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00002675 node *subn = CHILD(n, i);
2676 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002677 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002678 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002679 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00002680 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00002681 int j;
2682 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00002683 com_error(c, PyExc_SyntaxError,
2684 "invalid syntax");
2685 return;
2686 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00002687 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
2688 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002689 CHILD(CHILD(subn, 0),
2690 j));
2691 com_addop_varname(c, VAR_STORE,
2692 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002693 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002694 com_addop_varname(c, VAR_STORE,
2695 STR(CHILD(CHILD(subn, 0),
2696 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002697 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002698 }
2699 }
2700}
2701
2702static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002703com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002704{
2705 REQ(n, exec_stmt);
2706 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2707 com_node(c, CHILD(n, 1));
2708 if (NCH(n) >= 4)
2709 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002710 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002711 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002712 com_push(c, 1);
2713 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002714 if (NCH(n) >= 6)
2715 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002716 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002717 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002718 com_push(c, 1);
2719 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002720 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002721 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002722}
2723
Guido van Rossum7c531111997-03-11 18:42:21 +00002724static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002725is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002726{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002727 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002728 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002729 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00002730
2731 /* Label to avoid tail recursion */
2732 next:
2733 switch (TYPE(n)) {
2734
2735 case suite:
2736 if (NCH(n) == 1) {
2737 n = CHILD(n, 0);
2738 goto next;
2739 }
2740 /* Fall through */
2741 case file_input:
2742 for (i = 0; i < NCH(n); i++) {
2743 node *ch = CHILD(n, i);
2744 if (TYPE(ch) == stmt) {
2745 n = ch;
2746 goto next;
2747 }
2748 }
2749 break;
2750
2751 case stmt:
2752 case simple_stmt:
2753 case small_stmt:
2754 n = CHILD(n, 0);
2755 goto next;
2756
2757 case expr_stmt:
2758 case testlist:
2759 case test:
2760 case and_test:
2761 case not_test:
2762 case comparison:
2763 case expr:
2764 case xor_expr:
2765 case and_expr:
2766 case shift_expr:
2767 case arith_expr:
2768 case term:
2769 case factor:
2770 case power:
2771 case atom:
2772 if (NCH(n) == 1) {
2773 n = CHILD(n, 0);
2774 goto next;
2775 }
2776 break;
2777
2778 case NAME:
2779 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2780 return 1;
2781 break;
2782
2783 case NUMBER:
2784 v = parsenumber(c, STR(n));
2785 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002786 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002787 break;
2788 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002789 i = PyObject_IsTrue(v);
2790 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002791 return i == 0;
2792
2793 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002794 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002795 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002796 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002797 break;
2798 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002799 i = PyObject_IsTrue(v);
2800 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002801 return i == 0;
2802
2803 }
2804 return 0;
2805}
2806
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002807static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002808com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002809{
2810 int i;
2811 int anchor = 0;
2812 REQ(n, if_stmt);
2813 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2814 for (i = 0; i+3 < NCH(n); i+=4) {
2815 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002816 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002817 if (is_constant_false(c, ch))
2818 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002819 if (i > 0)
2820 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002821 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002822 com_addfwref(c, JUMP_IF_FALSE, &a);
2823 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002824 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002825 com_node(c, CHILD(n, i+3));
2826 com_addfwref(c, JUMP_FORWARD, &anchor);
2827 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002828 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002829 com_addbyte(c, POP_TOP);
2830 }
2831 if (i+2 < NCH(n))
2832 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002833 if (anchor)
2834 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002835}
2836
2837static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002838com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002839{
2840 int break_anchor = 0;
2841 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002842 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002843 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2844 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002845 block_push(c, SETUP_LOOP);
2846 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002847 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002848 com_node(c, CHILD(n, 1));
2849 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2850 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002851 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002852 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002853 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002854 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002855 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2856 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002857 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002858 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002859 com_addbyte(c, POP_TOP);
2860 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002861 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002862 if (NCH(n) > 4)
2863 com_node(c, CHILD(n, 6));
2864 com_backpatch(c, break_anchor);
2865}
2866
2867static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002868com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002869{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002870 int break_anchor = 0;
2871 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002872 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002873 REQ(n, for_stmt);
2874 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2875 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002876 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002877 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002878 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002879 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002880 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002881 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002882 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00002883 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002884 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002885 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002886 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002887 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2888 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002889 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002890 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002891 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002892 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002893 if (NCH(n) > 8)
2894 com_node(c, CHILD(n, 8));
2895 com_backpatch(c, break_anchor);
2896}
2897
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002898/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002899
2900 SETUP_FINALLY L
2901 <code for S>
2902 POP_BLOCK
2903 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002904 L: <code for Sf>
2905 END_FINALLY
2906
2907 The special instructions use the block stack. Each block
2908 stack entry contains the instruction that created it (here
2909 SETUP_FINALLY), the level of the value stack at the time the
2910 block stack entry was created, and a label (here L).
2911
2912 SETUP_FINALLY:
2913 Pushes the current value stack level and the label
2914 onto the block stack.
2915 POP_BLOCK:
2916 Pops en entry from the block stack, and pops the value
2917 stack until its level is the same as indicated on the
2918 block stack. (The label is ignored.)
2919 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002920 Pops a variable number of entries from the *value* stack
2921 and re-raises the exception they specify. The number of
2922 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002923
2924 The block stack is unwound when an exception is raised:
2925 when a SETUP_FINALLY entry is found, the exception is pushed
2926 onto the value stack (and the exception condition is cleared),
2927 and the interpreter jumps to the label gotten from the block
2928 stack.
2929
2930 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002931 (The contents of the value stack is shown in [], with the top
2932 at the right; 'tb' is trace-back info, 'val' the exception's
2933 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002934
2935 Value stack Label Instruction Argument
2936 [] SETUP_EXCEPT L1
2937 [] <code for S>
2938 [] POP_BLOCK
2939 [] JUMP_FORWARD L0
2940
Guido van Rossum3f5da241990-12-20 15:06:42 +00002941 [tb, val, exc] L1: DUP )
2942 [tb, val, exc, exc] <evaluate E1> )
2943 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2944 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2945 [tb, val, exc, 1] POP )
2946 [tb, val, exc] POP
2947 [tb, val] <assign to V1> (or POP if no V1)
2948 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002949 [] <code for S1>
2950 JUMP_FORWARD L0
2951
Guido van Rossum3f5da241990-12-20 15:06:42 +00002952 [tb, val, exc, 0] L2: POP
2953 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002954 .............................etc.......................
2955
Guido van Rossum3f5da241990-12-20 15:06:42 +00002956 [tb, val, exc, 0] Ln+1: POP
2957 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002958
2959 [] L0: <next statement>
2960
2961 Of course, parts are not generated if Vi or Ei is not present.
2962*/
2963
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002964static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002965com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002966{
2967 int except_anchor = 0;
2968 int end_anchor = 0;
2969 int else_anchor = 0;
2970 int i;
2971 node *ch;
2972
2973 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2974 block_push(c, SETUP_EXCEPT);
2975 com_node(c, CHILD(n, 2));
2976 com_addbyte(c, POP_BLOCK);
2977 block_pop(c, SETUP_EXCEPT);
2978 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2979 com_backpatch(c, except_anchor);
2980 for (i = 3;
2981 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2982 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002983 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002984 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002985 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002986 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002987 break;
2988 }
2989 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002990 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002991 com_addoparg(c, SET_LINENO, ch->n_lineno);
2992 if (NCH(ch) > 1) {
2993 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002994 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002995 com_node(c, CHILD(ch, 1));
2996 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002997 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002998 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
2999 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003000 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003001 }
3002 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003003 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003004 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003005 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003006 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003007 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003008 com_pop(c, 1);
3009 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003010 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 com_node(c, CHILD(n, i+2));
3013 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3014 if (except_anchor) {
3015 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003016 /* We come in with [tb, val, exc, 0] on the
3017 stack; one pop and it's the same as
3018 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003019 com_addbyte(c, POP_TOP);
3020 }
3021 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003022 /* We actually come in here with [tb, val, exc] but the
3023 END_FINALLY will zap those and jump around.
3024 The c_stacklevel does not reflect them so we need not pop
3025 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003026 com_addbyte(c, END_FINALLY);
3027 com_backpatch(c, else_anchor);
3028 if (i < NCH(n))
3029 com_node(c, CHILD(n, i+2));
3030 com_backpatch(c, end_anchor);
3031}
3032
3033static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003034com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003035{
3036 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003037 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003038
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003039 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3040 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003041 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003042 com_addbyte(c, POP_BLOCK);
3043 block_pop(c, SETUP_FINALLY);
3044 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003045 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003046 /* While the generated code pushes only one item,
3047 the try-finally handling can enter here with
3048 up to three items. OK, here are the details:
3049 3 for an exception, 2 for RETURN, 1 for BREAK. */
3050 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003051 com_backpatch(c, finally_anchor);
3052 ch = CHILD(n, NCH(n)-1);
3053 com_addoparg(c, SET_LINENO, ch->n_lineno);
3054 com_node(c, ch);
3055 com_addbyte(c, END_FINALLY);
3056 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003057 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003058}
3059
3060static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003061com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003062{
3063 REQ(n, try_stmt);
3064 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3065 | 'try' ':' suite 'finally' ':' suite */
3066 if (TYPE(CHILD(n, 3)) != except_clause)
3067 com_try_finally(c, n);
3068 else
3069 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003070}
3071
Guido van Rossum8b993a91997-01-17 21:04:03 +00003072static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003073get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003074{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003075 int i;
3076
Guido van Rossum8b993a91997-01-17 21:04:03 +00003077 /* Label to avoid tail recursion */
3078 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003079 switch (TYPE(n)) {
3080
3081 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003082 if (NCH(n) == 1) {
3083 n = CHILD(n, 0);
3084 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003085 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003086 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003087 case file_input:
3088 for (i = 0; i < NCH(n); i++) {
3089 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003090 if (TYPE(ch) == stmt) {
3091 n = ch;
3092 goto next;
3093 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003094 }
3095 break;
3096
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003097 case stmt:
3098 case simple_stmt:
3099 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003100 n = CHILD(n, 0);
3101 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003102
3103 case expr_stmt:
3104 case testlist:
3105 case test:
3106 case and_test:
3107 case not_test:
3108 case comparison:
3109 case expr:
3110 case xor_expr:
3111 case and_expr:
3112 case shift_expr:
3113 case arith_expr:
3114 case term:
3115 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003116 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003117 if (NCH(n) == 1) {
3118 n = CHILD(n, 0);
3119 goto next;
3120 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003121 break;
3122
3123 case atom:
3124 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003125 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003126 break;
3127
3128 }
3129 return NULL;
3130}
3131
Guido van Rossum79f25d91997-04-29 20:08:16 +00003132static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003133get_docstring(node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003134{
Guido van Rossum541563e1999-01-28 15:08:09 +00003135 /* Don't generate doc-strings if run with -OO */
3136 if (Py_OptimizeFlag > 1)
3137 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003138 n = get_rawdocstring(n);
3139 if (n == NULL)
3140 return NULL;
3141 return parsestrplus(n);
3142}
3143
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003144static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003145com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003146{
3147 REQ(n, suite);
3148 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3149 if (NCH(n) == 1) {
3150 com_node(c, CHILD(n, 0));
3151 }
3152 else {
3153 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003154 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003155 node *ch = CHILD(n, i);
3156 if (TYPE(ch) == stmt)
3157 com_node(c, ch);
3158 }
3159 }
3160}
3161
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003162/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003163static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003164com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003165{
3166 int i = c->c_nblocks;
3167 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3168 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3169 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003170 else if (i <= 0) {
3171 /* at the outer level */
3172 com_error(c, PyExc_SyntaxError,
3173 "'continue' not properly in loop");
3174 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003175 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003176 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003177 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003178 if (c->c_block[j] == SETUP_LOOP)
3179 break;
3180 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003181 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003182 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003183 for (; i > j; --i) {
3184 if (c->c_block[i] == SETUP_EXCEPT ||
3185 c->c_block[i] == SETUP_FINALLY) {
3186 com_addoparg(c, CONTINUE_LOOP,
3187 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003188 return;
3189 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003190 if (c->c_block[i] == END_FINALLY) {
3191 com_error(c, PyExc_SyntaxError,
3192 "'continue' not supported inside 'finally' clause");
3193 return;
3194 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003195 }
3196 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003197 com_error(c, PyExc_SyntaxError,
3198 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003199 }
3200 /* XXX Could allow it inside a 'finally' clause
3201 XXX if we could pop the exception still on the stack */
3202}
3203
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003204static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003205com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003206{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003207 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003208 if (TYPE(n) == lambdef) {
3209 /* lambdef: 'lambda' [varargslist] ':' test */
3210 n = CHILD(n, 1);
3211 }
3212 else {
3213 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3214 n = CHILD(n, 2);
3215 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3216 n = CHILD(n, 1);
3217 }
3218 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003219 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003220 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003221 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003222 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3223 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003224 nargs = 0;
3225 ndefs = 0;
3226 for (i = 0; i < nch; i++) {
3227 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003228 if (TYPE(CHILD(n, i)) == STAR ||
3229 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003230 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003231 nargs++;
3232 i++;
3233 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003234 t = RPAR; /* Anything except EQUAL or COMMA */
3235 else
3236 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003237 if (t == EQUAL) {
3238 i++;
3239 ndefs++;
3240 com_node(c, CHILD(n, i));
3241 i++;
3242 if (i >= nch)
3243 break;
3244 t = TYPE(CHILD(n, i));
3245 }
3246 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003247 /* Treat "(a=1, b)" as an error */
3248 if (ndefs)
3249 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003250 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003251 }
3252 if (t != COMMA)
3253 break;
3254 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003255 return ndefs;
3256}
3257
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003258static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003259com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003260{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003261 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003262 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003263 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003264 ndefs = com_argdefs(c, n);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003265 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3266 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003267 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003268 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003269 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003270 c->c_errors++;
3271 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003272 int closure = com_make_closure(c, (PyCodeObject *)co);
3273 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003274 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003275 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003276 if (closure)
3277 com_addoparg(c, MAKE_CLOSURE, ndefs);
3278 else
3279 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003280 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003281 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003282 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003283 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003284 }
3285}
3286
3287static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003288com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003289{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003290 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003291 REQ(n, testlist);
3292 /* testlist: test (',' test)* [','] */
3293 for (i = 0; i < NCH(n); i += 2)
3294 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003295 i = (NCH(n)+1) / 2;
3296 com_addoparg(c, BUILD_TUPLE, i);
3297 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003298}
3299
3300static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003301com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003302{
Guido van Rossum25831651993-05-19 14:50:45 +00003303 int i;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003304 PyObject *co, *v;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003305 char *name;
3306
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003307 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003308 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003309 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003310 c->c_errors++;
3311 return;
3312 }
3313 /* Push the class name on the stack */
3314 i = com_addconst(c, v);
3315 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003316 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003317 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003318 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003319 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003320 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003321 com_push(c, 1);
3322 }
Guido van Rossum25831651993-05-19 14:50:45 +00003323 else
3324 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003325 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003326 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003327 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003328 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003329 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003330 c->c_errors++;
3331 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003332 int closure = com_make_closure(c, (PyCodeObject *)co);
3333 i = com_addconst(c, co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003334 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003335 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003336 if (closure)
3337 com_addoparg(c, MAKE_CLOSURE, 0);
3338 else
3339 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003340 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003341 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003342 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003343 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003344 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003345 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003346}
3347
3348static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003349com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003350{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003351 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003352 if (c->c_errors)
3353 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003354 switch (TYPE(n)) {
3355
3356 /* Definition nodes */
3357
3358 case funcdef:
3359 com_funcdef(c, n);
3360 break;
3361 case classdef:
3362 com_classdef(c, n);
3363 break;
3364
3365 /* Trivial parse tree nodes */
3366
3367 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003368 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003369 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003370 n = CHILD(n, 0);
3371 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003372
3373 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003374 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
3375 com_addoparg(c, SET_LINENO, n->n_lineno);
3376 {
3377 int i;
3378 for (i = 0; i < NCH(n)-1; i += 2)
3379 com_node(c, CHILD(n, i));
3380 }
3381 break;
3382
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003383 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003384 com_addoparg(c, SET_LINENO, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003385 n = CHILD(n, 0);
3386 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003387
3388 /* Statement nodes */
3389
3390 case expr_stmt:
3391 com_expr_stmt(c, n);
3392 break;
3393 case print_stmt:
3394 com_print_stmt(c, n);
3395 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003396 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003397 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003398 break;
3399 case pass_stmt:
3400 break;
3401 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003402 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003403 com_error(c, PyExc_SyntaxError,
3404 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003405 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003406 com_addbyte(c, BREAK_LOOP);
3407 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003408 case continue_stmt:
3409 com_continue_stmt(c, n);
3410 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003411 case return_stmt:
3412 com_return_stmt(c, n);
3413 break;
3414 case raise_stmt:
3415 com_raise_stmt(c, n);
3416 break;
3417 case import_stmt:
3418 com_import_stmt(c, n);
3419 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003420 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003421 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003422 case exec_stmt:
3423 com_exec_stmt(c, n);
3424 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003425 case assert_stmt:
3426 com_assert_stmt(c, n);
3427 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003428 case if_stmt:
3429 com_if_stmt(c, n);
3430 break;
3431 case while_stmt:
3432 com_while_stmt(c, n);
3433 break;
3434 case for_stmt:
3435 com_for_stmt(c, n);
3436 break;
3437 case try_stmt:
3438 com_try_stmt(c, n);
3439 break;
3440 case suite:
3441 com_suite(c, n);
3442 break;
3443
3444 /* Expression nodes */
3445
3446 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003447 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003448 break;
3449 case test:
3450 com_test(c, n);
3451 break;
3452 case and_test:
3453 com_and_test(c, n);
3454 break;
3455 case not_test:
3456 com_not_test(c, n);
3457 break;
3458 case comparison:
3459 com_comparison(c, n);
3460 break;
3461 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003462 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003463 break;
3464 case expr:
3465 com_expr(c, n);
3466 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003467 case xor_expr:
3468 com_xor_expr(c, n);
3469 break;
3470 case and_expr:
3471 com_and_expr(c, n);
3472 break;
3473 case shift_expr:
3474 com_shift_expr(c, n);
3475 break;
3476 case arith_expr:
3477 com_arith_expr(c, n);
3478 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003479 case term:
3480 com_term(c, n);
3481 break;
3482 case factor:
3483 com_factor(c, n);
3484 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003485 case power:
3486 com_power(c, n);
3487 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003488 case atom:
3489 com_atom(c, n);
3490 break;
3491
3492 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003493 com_error(c, PyExc_SystemError,
3494 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003495 }
3496}
3497
Tim Petersdbd9ba62000-07-09 03:09:57 +00003498static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003499
3500static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003501com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003502{
3503 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3504 if (TYPE(CHILD(n, 0)) == LPAR)
3505 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003506 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003507 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003508 com_pop(c, 1);
3509 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003510}
3511
3512static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003513com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003514{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003515 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003516 if (NCH(n) == 1) {
3517 com_fpdef(c, CHILD(n, 0));
3518 }
3519 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003520 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003521 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003522 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003523 for (i = 0; i < NCH(n); i += 2)
3524 com_fpdef(c, CHILD(n, i));
3525 }
3526}
3527
3528static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003529com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003530{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003531 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003532 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003533 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003534 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003535 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003536 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003537 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003538 /* Enter all arguments in table of locals */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003539 for (i = 0, narg = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003540 node *ch = CHILD(n, i);
3541 node *fp;
3542 char *name;
Guido van Rossum50564e81996-01-12 01:13:16 +00003543 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003544 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003545 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3546 fp = CHILD(ch, 0);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00003547 if (TYPE(fp) != NAME) {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003548 name = nbuf;
3549 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003550 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003551 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003552 narg++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003553 /* all name updates handled by symtable */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003554 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003555 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003556 ch = CHILD(n, i);
3557 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003558 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003559 else
3560 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003561 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003562 if (complex) {
3563 /* Generate code for complex arguments only after
3564 having counted the simple arguments */
3565 int ilocal = 0;
3566 for (i = 0; i < nch; i++) {
3567 node *ch = CHILD(n, i);
3568 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003569 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003570 break;
3571 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3572 fp = CHILD(ch, 0);
3573 if (TYPE(fp) != NAME) {
3574 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003575 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003576 com_fpdef(c, ch);
3577 }
3578 ilocal++;
3579 if (++i >= nch)
3580 break;
3581 ch = CHILD(n, i);
3582 if (TYPE(ch) == EQUAL)
3583 i += 2;
3584 else
3585 REQ(ch, COMMA);
3586 }
3587 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003588}
3589
3590static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003591com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003592{
3593 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003594 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003595 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003596 doc = get_docstring(n);
3597 if (doc != NULL) {
3598 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003599 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003600 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003601 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003602 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003603 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003604 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003605 for (i = 0; i < NCH(n); i++) {
3606 node *ch = CHILD(n, i);
3607 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3608 com_node(c, ch);
3609 }
3610}
3611
3612/* Top-level compile-node interface */
3613
3614static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003615compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003616{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003617 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003618 node *ch;
3619 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003620 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003621 doc = get_docstring(CHILD(n, 4));
3622 if (doc != NULL) {
3623 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003624 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003625 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003626 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003627 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003628 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3629 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003630 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003631 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003632 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003633 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003634 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003635 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003636 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003637 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003638 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003639}
3640
3641static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003642compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003643{
Guido van Rossum590baa41993-11-30 13:40:46 +00003644 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003645 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003646 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003647
3648 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003649 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003650 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003651 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003652 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003653 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003654 else
3655 ch = CHILD(n, 2);
3656 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003657 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003658 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003659}
3660
3661static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003662compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003663{
3664 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003665 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003666 REQ(n, classdef);
3667 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3668 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003669 c->c_private = c->c_name;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003670 ch = CHILD(n, NCH(n)-1); /* The suite */
3671 doc = get_docstring(ch);
3672 if (doc != NULL) {
3673 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003674 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003675 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003676 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003677 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003678 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003679 }
3680 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003681 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003682 com_node(c, ch);
3683 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003684 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003685 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003686 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003687}
3688
3689static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003690compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003691{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003692 com_addoparg(c, SET_LINENO, n->n_lineno);
3693
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003694 switch (TYPE(n)) {
3695
Guido van Rossum4c417781991-01-21 16:09:22 +00003696 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003697 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003698 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003699 n = CHILD(n, 0);
3700 if (TYPE(n) != NEWLINE)
3701 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003702 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003703 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003704 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003705 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003706 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003707 break;
3708
Guido van Rossum4c417781991-01-21 16:09:22 +00003709 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003710 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003711 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003712 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003713 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003714 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003715 break;
3716
Guido van Rossum590baa41993-11-30 13:40:46 +00003717 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003718 com_node(c, CHILD(n, 0));
3719 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003720 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003721 break;
3722
Guido van Rossum590baa41993-11-30 13:40:46 +00003723 case lambdef: /* anonymous function definition */
3724 compile_lambdef(c, n);
3725 break;
3726
Guido van Rossum4c417781991-01-21 16:09:22 +00003727 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003728 compile_funcdef(c, n);
3729 break;
3730
Guido van Rossum4c417781991-01-21 16:09:22 +00003731 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003732 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003733 break;
3734
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003735 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003736 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003737 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003738 }
3739}
3740
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003741static PyObject *
3742dict_keys_inorder(PyObject *dict, int offset)
3743{
3744 PyObject *tuple, *k, *v;
3745 int i, pos = 0, size = PyDict_Size(dict);
3746
3747 tuple = PyTuple_New(size);
3748 if (tuple == NULL)
3749 return NULL;
3750 while (PyDict_Next(dict, &pos, &k, &v)) {
3751 i = PyInt_AS_LONG(v);
3752 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00003753 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003754 PyTuple_SET_ITEM(tuple, i - offset, k);
3755 }
3756 return tuple;
3757}
3758
Guido van Rossum79f25d91997-04-29 20:08:16 +00003759PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003760PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003761{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003762 return PyNode_CompileFlags(n, filename, NULL);
3763}
3764
3765PyCodeObject *
3766PyNode_CompileFlags(node *n, char *filename, PyCompilerFlags *flags)
3767{
3768 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003769}
3770
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003771struct symtable *
3772PyNode_CompileSymtable(node *n, char *filename)
3773{
3774 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003775 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003776
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003777 ff = PyNode_Future(n, filename);
3778 if (ff == NULL)
3779 return NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003780 st = symtable_init();
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003781 if (st == NULL)
3782 return NULL;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003783 st->st_future = ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003784 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003785 if (st->st_errors > 0)
3786 goto fail;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003787 symtable_node(st, n);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003788 if (st->st_errors > 0)
3789 goto fail;
3790
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003791 return st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003792 fail:
3793 PyMem_Free((void *)ff);
3794 st->st_future = NULL;
3795 PySymtable_Free(st);
3796 return NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003797}
3798
Guido van Rossum79f25d91997-04-29 20:08:16 +00003799static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003800icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003801{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003802 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003803}
3804
Guido van Rossum79f25d91997-04-29 20:08:16 +00003805static PyCodeObject *
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003806jcompile(node *n, char *filename, struct compiling *base,
3807 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003808{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003809 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003810 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003811 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003812 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003813 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003814 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003815 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003816 /* c_symtable still points to parent's symbols */
3817 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003818 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003819 sc.c_nested = 1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003820 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003821 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00003822 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003823 if (sc.c_future == NULL) {
3824 com_free(&sc);
3825 return NULL;
3826 }
3827 if (flags) {
3828 if (flags->cf_nested_scopes)
3829 sc.c_future->ff_nested_scopes = 1;
3830 else if (sc.c_future->ff_nested_scopes)
3831 flags->cf_nested_scopes = 1;
3832 }
3833 if (symtable_build(&sc, n) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003834 com_free(&sc);
3835 return NULL;
3836 }
3837 }
3838 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003839 if (symtable_load_symbols(&sc) < 0) {
3840 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003841 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003842 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003843 compile_node(&sc, n);
3844 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00003845 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003846 PyObject *consts, *names, *varnames, *filename, *name,
3847 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003848 consts = PyList_AsTuple(sc.c_consts);
3849 names = PyList_AsTuple(sc.c_names);
3850 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003851 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
3852 freevars = dict_keys_inorder(sc.c_freevars,
3853 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003854 filename = PyString_InternFromString(sc.c_filename);
3855 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003856 if (!PyErr_Occurred())
3857 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003858 sc.c_nlocals,
3859 sc.c_maxstacklevel,
3860 sc.c_flags,
3861 sc.c_code,
3862 consts,
3863 names,
3864 varnames,
3865 freevars,
3866 cellvars,
3867 filename,
3868 name,
3869 sc.c_firstlineno,
3870 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003871 Py_XDECREF(consts);
3872 Py_XDECREF(names);
3873 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003874 Py_XDECREF(freevars);
3875 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003876 Py_XDECREF(filename);
3877 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003878 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00003879 else if (!PyErr_Occurred()) {
3880 /* This could happen if someone called PyErr_Clear() after an
3881 error was reported above. That's not supposed to happen,
3882 but I just plugged one case and I'm not sure there can't be
3883 others. In that case, raise SystemError so that at least
3884 it gets reported instead dumping core. */
3885 PyErr_SetString(PyExc_SystemError, "lost syntax error");
3886 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003887 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00003888 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003889 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00003890 sc.c_symtable = NULL;
3891 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003892 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003893 return co;
3894}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003895
3896int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003897PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003898{
3899 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003900 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003901 int line = co->co_firstlineno;
3902 int addr = 0;
3903 while (--size >= 0) {
3904 addr += *p++;
3905 if (addr > addrq)
3906 break;
3907 line += *p++;
3908 }
3909 return line;
3910}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003911
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003912/* The test for LOCAL must come before the test for FREE in order to
3913 handle classes where name is both local and free. The local var is
3914 a method and the free var is a free var referenced within a method.
3915*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003916
3917static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003918get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003919{
3920 PyObject *v;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00003921 if (c->c_symtable->st_nested_scopes) {
3922 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
3923 return CELL;
3924 if (PyDict_GetItemString(c->c_locals, name) != NULL)
3925 return LOCAL;
3926 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
3927 return FREE;
3928 v = PyDict_GetItemString(c->c_globals, name);
3929 if (v) {
3930 if (v == Py_None)
3931 return GLOBAL_EXPLICIT;
3932 else {
3933 return GLOBAL_IMPLICIT;
3934 }
3935 }
3936 } else {
3937 if (PyDict_GetItemString(c->c_locals, name) != NULL)
3938 return LOCAL;
3939 v = PyDict_GetItemString(c->c_globals, name);
3940 if (v) {
3941 if (v == Py_None)
3942 return GLOBAL_EXPLICIT;
3943 else {
3944 return GLOBAL_IMPLICIT;
3945 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003946 }
3947 }
3948 {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003949 char buf[350];
3950 sprintf(buf,
Jeremy Hylton51257732001-03-01 00:42:55 +00003951 "unknown scope for %.100s in %.100s(%s) "
3952 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
Jeremy Hylton483638c2001-02-01 20:20:45 +00003953 name, c->c_name,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003954 PyObject_REPR(c->c_symtable->st_cur->ste_id),
Jeremy Hylton51257732001-03-01 00:42:55 +00003955 c->c_filename,
3956 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
3957 PyObject_REPR(c->c_locals),
3958 PyObject_REPR(c->c_globals)
3959 );
3960
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003961 Py_FatalError(buf);
3962 }
3963 return -1; /* can't get here */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003964}
3965
Guido van Rossum207fda62001-03-02 03:30:41 +00003966/* Helper functions to issue warnings */
3967
3968static int
3969issue_warning(char *msg, char *filename, int lineno)
3970{
3971 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
3972 lineno, NULL, NULL) < 0) {
3973 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
3974 PyErr_SetString(PyExc_SyntaxError, msg);
3975 PyErr_SyntaxLocation(filename, lineno);
3976 }
3977 return -1;
3978 }
3979 return 0;
3980}
Guido van Rossumee34ac12001-02-28 22:08:12 +00003981
Jeremy Hylton4419ac12001-02-28 22:54:51 +00003982static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00003983symtable_warn(struct symtable *st, char *msg)
3984{
Guido van Rossum207fda62001-03-02 03:30:41 +00003985 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00003986 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00003987 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00003988 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00003989 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00003990}
3991
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00003992/* Helper function for setting lineno and filename */
3993
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003994static int
3995symtable_build(struct compiling *c, node *n)
3996{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003997 if ((c->c_symtable = symtable_init()) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003998 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00003999 c->c_symtable->st_future = c->c_future;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004000 if (c->c_future->ff_nested_scopes)
4001 c->c_symtable->st_nested_scopes = 1;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004002 c->c_symtable->st_filename = c->c_filename;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004003 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
4004 if (c->c_symtable->st_errors > 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004005 return -1;
4006 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004007 if (c->c_symtable->st_errors > 0)
4008 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004009 /* reset for second pass */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004010 c->c_symtable->st_nscopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004011 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004012 return 0;
4013}
4014
4015static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004016symtable_init_compiling_symbols(struct compiling *c)
4017{
4018 PyObject *varnames;
4019
4020 varnames = c->c_symtable->st_cur->ste_varnames;
4021 if (varnames == NULL) {
4022 varnames = PyList_New(0);
4023 if (varnames == NULL)
4024 return -1;
4025 c->c_symtable->st_cur->ste_varnames = varnames;
4026 Py_INCREF(varnames);
4027 } else
4028 Py_INCREF(varnames);
4029 c->c_varnames = varnames;
4030
4031 c->c_globals = PyDict_New();
4032 if (c->c_globals == NULL)
4033 return -1;
4034 c->c_freevars = PyDict_New();
4035 if (c->c_freevars == NULL)
4036 return -1;
4037 c->c_cellvars = PyDict_New();
4038 if (c->c_cellvars == NULL)
4039 return -1;
4040 return 0;
4041}
4042
4043struct symbol_info {
4044 int si_nlocals;
4045 int si_ncells;
4046 int si_nfrees;
4047 int si_nimplicit;
4048};
4049
4050static void
4051symtable_init_info(struct symbol_info *si)
4052{
4053 si->si_nlocals = 0;
4054 si->si_ncells = 0;
4055 si->si_nfrees = 0;
4056 si->si_nimplicit = 0;
4057}
4058
4059static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004060symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004061 struct symbol_info *si)
4062{
4063 PyObject *dict, *v;
4064
4065 /* Seperate logic for DEF_FREE. If it occurs in a function,
4066 it indicates a local that we must allocate storage for (a
4067 cell var). If it occurs in a class, then the class has a
4068 method and a free variable with the same name.
4069 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004070 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004071 /* If it isn't declared locally, it can't be a cell. */
4072 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4073 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004074 v = PyInt_FromLong(si->si_ncells++);
4075 dict = c->c_cellvars;
4076 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004077 /* If it is free anyway, then there is no need to do
4078 anything here.
4079 */
4080 if (is_free(flags ^ DEF_FREE_CLASS)
4081 || flags == DEF_FREE_CLASS)
4082 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004083 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
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004194#define ILLEGAL_CONTAINS "contains a nested function with free variables"
4195
4196#define ILLEGAL_IS "is a nested function"
4197
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004198#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004199"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004200
4201#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004202"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004203
4204#define ILLEGAL_EXEC_AND_IMPORT_STAR \
4205"function '%.100s' uses import * and bare exec, which are illegal" \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004206"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004207
4208 /* XXX perhaps the linenos for these opt-breaking statements
4209 should be stored so the exception can point to them. */
4210
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004211 if (ste->ste_child_free) {
4212 if (ste->ste_optimized == OPT_IMPORT_STAR)
4213 sprintf(buf, ILLEGAL_IMPORT_STAR,
4214 PyString_AS_STRING(ste->ste_name),
4215 ILLEGAL_CONTAINS);
4216 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
4217 sprintf(buf, ILLEGAL_BARE_EXEC,
4218 PyString_AS_STRING(ste->ste_name),
4219 ILLEGAL_CONTAINS);
4220 else {
4221 sprintf(buf, ILLEGAL_EXEC_AND_IMPORT_STAR,
4222 PyString_AS_STRING(ste->ste_name),
4223 ILLEGAL_CONTAINS);
4224 }
4225 } else {
4226 if (ste->ste_optimized == OPT_IMPORT_STAR)
4227 sprintf(buf, ILLEGAL_IMPORT_STAR,
4228 PyString_AS_STRING(ste->ste_name),
4229 ILLEGAL_IS);
4230 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
4231 sprintf(buf, ILLEGAL_BARE_EXEC,
4232 PyString_AS_STRING(ste->ste_name),
4233 ILLEGAL_IS);
4234 else {
4235 sprintf(buf, ILLEGAL_EXEC_AND_IMPORT_STAR,
4236 PyString_AS_STRING(ste->ste_name),
4237 ILLEGAL_IS);
4238 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004239 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004240
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004241 if (c->c_symtable->st_nested_scopes) {
4242 PyErr_SetString(PyExc_SyntaxError, buf);
4243 PyErr_SyntaxLocation(c->c_symtable->st_filename,
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00004244 ste->ste_opt_lineno);
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004245 return -1;
Guido van Rossum207fda62001-03-02 03:30:41 +00004246 }
4247 else {
4248 return issue_warning(buf, c->c_filename, ste->ste_lineno);
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004249 }
4250 return 0;
4251}
4252
4253static int
4254symtable_check_shadow(struct symtable *st, PyObject *name, int flags)
4255{
4256 char buf[500];
4257 PyObject *children, *v;
Jeremy Hyltonc1761322001-02-28 23:44:45 +00004258 PySymtableEntryObject *child = NULL;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004259 int i;
4260
4261 if (!(flags & DEF_BOUND))
4262 return 0;
4263 /* The semantics of this code will change with nested scopes.
4264 It is defined in the current scope and referenced in a
4265 child scope. Under the old rules, the child will see a
4266 global. Under the new rules, the child will see the
4267 binding in the current scope.
4268 */
4269
4270 /* Find name of child function that has free variable */
4271 children = st->st_cur->ste_children;
4272 for (i = 0; i < PyList_GET_SIZE(children); i++) {
4273 int cflags;
4274 child = (PySymtableEntryObject *)PyList_GET_ITEM(children, i);
4275 v = PyDict_GetItem(child->ste_symbols, name);
4276 if (v == NULL)
4277 continue;
4278 cflags = PyInt_AS_LONG(v);
4279 if (!(cflags & DEF_BOUND))
4280 break;
4281 }
Jeremy Hyltonc1761322001-02-28 23:44:45 +00004282
4283 assert(child != NULL);
4284
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004285 sprintf(buf, "local name '%.100s' in '%.100s' shadows "
4286 "use of '%.100s' as global in nested scope '%.100s'",
4287 PyString_AS_STRING(name),
4288 PyString_AS_STRING(st->st_cur->ste_name),
4289 PyString_AS_STRING(name),
4290 PyString_AS_STRING(child->ste_name)
4291 );
4292
4293 return symtable_warn(st, buf);
4294}
4295
4296static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004297symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4298 struct symbol_info *si)
4299{
Jeremy Hylton061d1062001-03-22 02:32:48 +00004300 if (c->c_future && c->c_future->ff_nested_scopes)
4301 c->c_flags |= CO_NESTED;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004302 if (ste->ste_type != TYPE_MODULE)
4303 c->c_flags |= CO_NEWLOCALS;
4304 if (ste->ste_type == TYPE_FUNCTION) {
4305 c->c_nlocals = si->si_nlocals;
4306 if (ste->ste_optimized == 0)
4307 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004308 else if (ste->ste_optimized != OPT_EXEC)
4309 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004310 }
4311 return 0;
4312}
4313
4314static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004315symtable_load_symbols(struct compiling *c)
4316{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004317 static PyObject *implicit = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004318 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004319 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004320 PyObject *name, *varnames, *v;
4321 int i, flags, pos;
4322 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004323
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004324 if (implicit == NULL) {
4325 implicit = PyInt_FromLong(1);
4326 if (implicit == NULL)
4327 return -1;
4328 }
4329 v = NULL;
4330
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004331 if (symtable_init_compiling_symbols(c) < 0)
4332 goto fail;
4333 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004334 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004335 si.si_nlocals = PyList_GET_SIZE(varnames);
4336 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004337
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004338 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004339 v = PyInt_FromLong(i);
4340 if (PyDict_SetItem(c->c_locals,
4341 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004342 goto fail;
4343 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004344 }
4345
4346 /* XXX The cases below define the rules for whether a name is
4347 local or global. The logic could probably be clearer. */
4348 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004349 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4350 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004351
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004352 if (st->st_nested_scopes == 0
4353 && (flags & (DEF_FREE | DEF_FREE_CLASS))) {
4354 if (symtable_check_shadow(st, name, flags) < 0)
4355 goto fail;
4356 }
4357
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004358 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004359 /* undo the original DEF_FREE */
4360 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004361
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004362 /* Deal with names that need two actions:
4363 1. Cell variables, which are also locals.
4364 2. Free variables in methods that are also class
4365 variables or declared global.
4366 */
4367 if (flags & (DEF_FREE | DEF_FREE_CLASS)) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004368 symtable_resolve_free(c, name, flags, &si);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004369 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004370
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004371 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004372 c->c_argcount--;
4373 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004374 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004375 c->c_argcount--;
4376 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004377 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004378 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004379 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004380 if (flags & DEF_PARAM) {
4381 PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004382 PyString_AS_STRING(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004383 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004384 ste->ste_lineno);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004385 st->st_errors++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004386 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004387 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004388 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4389 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004390 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004391 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004392 if (PyDict_SetItem(c->c_globals, name, implicit) < 0)
4393 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004394 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004395 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004396 if (v == NULL)
4397 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004398 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004399 goto fail;
4400 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004401 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004402 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004403 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004404 } else if (is_free(flags)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004405 if (ste->ste_nested && st->st_nested_scopes) {
4406 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004407 if (v == NULL)
4408 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004409 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004410 goto fail;
4411 Py_DECREF(v);
4412 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004413 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004414 if (PyDict_SetItem(c->c_globals, name,
4415 implicit) < 0)
4416 goto fail;
Jeremy Hylton51257732001-03-01 00:42:55 +00004417 if (st->st_nscopes != 1) {
4418 v = PyInt_FromLong(flags);
4419 if (PyDict_SetItem(st->st_global,
4420 name, v))
4421 goto fail;
4422 Py_DECREF(v);
4423 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004424 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004425 }
4426 }
4427
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004428 /*
4429 fprintf(stderr,
4430 "cells %d: %s\n"
4431 "frees %d: %s\n",
4432 si.si_ncells, PyObject_REPR(c->c_cellvars),
4433 si.si_nfrees, PyObject_REPR(c->c_freevars));
4434 */
4435 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
4436
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004437 if (si.si_ncells > 1) { /* one cell is always in order */
4438 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
4439 c->c_varnames, c->c_flags) < 0)
4440 return -1;
4441 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004442 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4443 return -1;
4444 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004445 fail:
4446 /* is this always the right thing to do? */
4447 Py_XDECREF(v);
4448 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004449}
4450
4451static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004452symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004453{
4454 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004455
4456 st = (struct symtable *)PyMem_Malloc(sizeof(struct symtable));
4457 if (st == NULL)
4458 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004459 st->st_pass = 1;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004460 st->st_nested_scopes = NESTED_SCOPES_DEFAULT;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004461 st->st_filename = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004462 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004463 goto fail;
4464 if ((st->st_symbols = PyDict_New()) == NULL)
4465 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004466 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004467 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004468 st->st_errors = 0;
4469 st->st_tmpname = 0;
4470 st->st_private = NULL;
4471 return st;
4472 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004473 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004474 return NULL;
4475}
4476
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004477void
4478PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004479{
4480 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004481 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004482 Py_XDECREF(st->st_cur);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004483 PyMem_Free((void *)st);
4484}
4485
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004486/* When the compiler exits a scope, it must should update the scope's
4487 free variable information with the list of free variables in its
4488 children.
4489
4490 Variables that are free in children and defined in the current
4491 scope are cellvars.
4492
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004493 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004494 false), free variables in children that are not defined here are
4495 implicit globals.
4496
4497*/
4498
4499static int
4500symtable_update_free_vars(struct symtable *st)
4501{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004502 int i, j, def;
4503 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004504 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004505
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004506 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004507 def = DEF_FREE_CLASS;
4508 else
4509 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004510 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004511 int pos = 0;
4512
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004513 if (list)
4514 PyList_SetSlice(list, 0,
4515 ((PyVarObject*)list)->ob_size, 0);
Barry Warsaw0372af72001-02-23 18:22:59 +00004516 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004517 PyList_GET_ITEM(ste->ste_children, i);
4518 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004519 int flags = PyInt_AS_LONG(o);
4520 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004521 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004522 if (list == NULL) {
4523 list = PyList_New(0);
4524 if (list == NULL)
4525 return -1;
4526 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004527 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004528 if (PyList_Append(list, name) < 0) {
4529 Py_DECREF(list);
4530 return -1;
4531 }
4532 }
4533 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004534 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004535 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00004536 v = PyDict_GetItem(ste->ste_symbols, name);
4537 /* If a name N is declared global in scope A and
4538 referenced in scope B contained (perhaps
4539 indirectly) in A and there are no scopes
4540 with bindings for N between B and A, then N
4541 is global in B.
4542 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004543 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004544 int flags = PyInt_AS_LONG(v);
4545 if (flags & DEF_GLOBAL) {
4546 symtable_undo_free(st, child->ste_id,
4547 name);
4548 continue;
4549 }
4550 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004551 if (ste->ste_nested) {
4552 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004553 name, def) < 0) {
4554 Py_DECREF(list);
4555 return -1;
4556 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004557 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004558 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004559 name) < 0) {
4560 Py_DECREF(list);
4561 return -1;
4562 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004563 }
4564 }
4565 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004566
4567 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004568 return 0;
4569}
4570
4571/* If the current scope is a non-nested class or if name is not
4572 defined in the current, non-nested scope, then it is an implicit
4573 global in all nested scopes.
4574*/
4575
4576static int
4577symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
4578{
4579 PyObject *o;
4580 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004581 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00004582
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004583 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004584 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004585 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004586 if (o == NULL)
4587 return symtable_undo_free(st, child, name);
4588 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00004589
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004590 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004591 return symtable_undo_free(st, child, name);
4592 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004593 return symtable_add_def_o(st, ste->ste_symbols,
4594 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004595}
4596
4597static int
4598symtable_undo_free(struct symtable *st, PyObject *id,
4599 PyObject *name)
4600{
4601 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004602 PyObject *info;
4603 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004604
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004605 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
4606 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004607 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00004608
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004609 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004610 if (info == NULL)
4611 return 0;
4612 v = PyInt_AS_LONG(info);
4613 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004614 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004615 DEF_FREE_GLOBAL) < 0)
4616 return -1;
4617 } else
4618 /* If the name is defined here or declared global,
4619 then the recursion stops. */
4620 return 0;
4621
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004622 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
4623 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00004624 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004625 PyList_GET_ITEM(ste->ste_children, i);
4626 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004627 if (x < 0)
4628 return x;
4629 }
4630 return 0;
4631}
4632
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004633/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
4634 This reference is released when the scope is exited, via the DECREF
4635 in symtable_exit_scope().
4636*/
4637
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004638static int
4639symtable_exit_scope(struct symtable *st)
4640{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004641 int end;
4642
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004643 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004644 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004645 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004646 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004647 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
4648 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004649 if (PySequence_DelItem(st->st_stack, end) < 0)
4650 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004651 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004652}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004653
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004654static void
4655symtable_enter_scope(struct symtable *st, char *name, int type,
4656 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004657{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004658 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004659
4660 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004661 prev = st->st_cur;
4662 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
4663 Py_DECREF(st->st_cur);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004664 st->st_errors++;
4665 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004666 }
4667 }
Barry Warsaw0372af72001-02-23 18:22:59 +00004668 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004669 PySymtableEntry_New(st, name, type, lineno);
4670 if (strcmp(name, TOP) == 0)
4671 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004672 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004673 if (PyList_Append(prev->ste_children,
4674 (PyObject *)st->st_cur) < 0)
4675 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004676 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004677}
4678
4679static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004680symtable_lookup(struct symtable *st, char *name)
4681{
4682 char buffer[MANGLE_LEN];
4683 PyObject *v;
4684 int flags;
4685
4686 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
4687 name = buffer;
4688 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
4689 if (v == NULL) {
4690 if (PyErr_Occurred())
4691 return -1;
4692 else
4693 return 0;
4694 }
4695
4696 flags = PyInt_AS_LONG(v);
4697 return flags;
4698}
4699
4700static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004701symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004702{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004703 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004704 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004705 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004706
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004707 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004708 name = buffer;
4709 if ((s = PyString_InternFromString(name)) == NULL)
4710 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004711 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
4712 Py_DECREF(s);
4713 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004714}
4715
4716/* Must only be called with mangled names */
4717
4718static int
4719symtable_add_def_o(struct symtable *st, PyObject *dict,
4720 PyObject *name, int flag)
4721{
4722 PyObject *o;
4723 int val;
4724
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004725 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004726 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004727 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004728 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00004729 PyString_AsString(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004730 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004731 st->st_cur->ste_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004732 return -1;
4733 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004734 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004735 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004736 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004737 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004738 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004739 Py_DECREF(o);
4740 return -1;
4741 }
4742 Py_DECREF(o);
4743
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004744 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004745 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004746 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004747 } else if (flag & DEF_GLOBAL) {
4748 /* XXX need to update DEF_GLOBAL for other flags too;
4749 perhaps only DEF_FREE_GLOBAL */
4750 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004751 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004752 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004753 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004754 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004755 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004756 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004757 Py_DECREF(o);
4758 return -1;
4759 }
4760 Py_DECREF(o);
4761 }
4762 return 0;
4763}
4764
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004765#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004766
4767static void
4768symtable_node(struct symtable *st, node *n)
4769{
4770 int i, start = 0;
4771
4772 loop:
4773 switch (TYPE(n)) {
4774 case funcdef: {
4775 char *func_name = STR(CHILD(n, 1));
4776 symtable_add_def(st, func_name, DEF_LOCAL);
4777 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004778 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004779 symtable_funcdef(st, n);
4780 symtable_exit_scope(st);
4781 break;
4782 }
4783 case lambdef:
4784 if (NCH(n) == 4)
4785 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004786 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004787 symtable_funcdef(st, n);
4788 symtable_exit_scope(st);
4789 break;
4790 case classdef: {
4791 char *tmp, *class_name = STR(CHILD(n, 1));
4792 symtable_add_def(st, class_name, DEF_LOCAL);
4793 if (TYPE(CHILD(n, 2)) == LPAR) {
4794 node *bases = CHILD(n, 3);
4795 int i;
4796 for (i = 0; i < NCH(bases); i += 2) {
4797 symtable_node(st, CHILD(bases, i));
4798 }
4799 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004800 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004801 tmp = st->st_private;
4802 st->st_private = class_name;
4803 symtable_node(st, CHILD(n, NCH(n) - 1));
4804 st->st_private = tmp;
4805 symtable_exit_scope(st);
4806 break;
4807 }
4808 case if_stmt:
4809 for (i = 0; i + 3 < NCH(n); i += 4) {
4810 if (is_constant_false(NULL, (CHILD(n, i + 1))))
4811 continue;
4812 symtable_node(st, CHILD(n, i + 1));
4813 symtable_node(st, CHILD(n, i + 3));
4814 }
4815 if (i + 2 < NCH(n))
4816 symtable_node(st, CHILD(n, i + 2));
4817 break;
4818 case global_stmt:
4819 symtable_global(st, n);
4820 break;
4821 case import_stmt:
4822 symtable_import(st, n);
4823 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004824 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004825 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004826 symtable_node(st, CHILD(n, 1));
4827 if (NCH(n) > 2)
4828 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00004829 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004830 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00004831 st->st_cur->ste_opt_lineno = n->n_lineno;
4832 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004833 if (NCH(n) > 4)
4834 symtable_node(st, CHILD(n, 5));
4835 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004836
4837 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00004838 case assert_stmt:
4839 if (Py_OptimizeFlag)
4840 return;
4841 if (NCH(n) == 2) {
4842 n = CHILD(n, 1);
4843 goto loop;
4844 } else {
4845 symtable_node(st, CHILD(n, 1));
4846 n = CHILD(n, 3);
4847 goto loop;
4848 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004849 case except_clause:
4850 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004851 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004852 if (NCH(n) > 1) {
4853 n = CHILD(n, 1);
4854 goto loop;
4855 }
4856 break;
4857 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004858 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004859 break;
4860 case expr_stmt:
4861 if (NCH(n) == 1)
4862 n = CHILD(n, 0);
4863 else {
4864 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004865 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004866 symtable_node(st, CHILD(n, 2));
4867 break;
4868 } else {
4869 int i;
4870 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004871 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004872 n = CHILD(n, NCH(n) - 1);
4873 }
4874 }
4875 goto loop;
4876 /* watchout for fall-through logic below */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004877 case argument:
4878 if (NCH(n) == 3) {
4879 n = CHILD(n, 2);
4880 goto loop;
4881 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004882 case listmaker:
4883 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton23b42272001-03-19 20:38:06 +00004884 st->st_tmpname++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004885 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton23b42272001-03-19 20:38:06 +00004886 symtable_node(st, CHILD(n, 0));
4887 st->st_tmpname--;
4888 return;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004889 }
4890 case atom:
4891 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
4892 symtable_add_use(st, STR(CHILD(n, 0)));
4893 break;
4894 }
4895 case for_stmt:
4896 if (TYPE(n) == for_stmt) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004897 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004898 start = 3;
4899 }
4900 default:
4901 if (NCH(n) == 1) {
4902 n = CHILD(n, 0);
4903 goto loop;
4904 }
4905 for (i = start; i < NCH(n); ++i)
4906 if (TYPE(CHILD(n, i)) >= single_input)
4907 symtable_node(st, CHILD(n, i));
4908 }
4909}
4910
4911static void
4912symtable_funcdef(struct symtable *st, node *n)
4913{
4914 node *body;
4915
4916 if (TYPE(n) == lambdef) {
4917 if (NCH(n) == 4)
4918 symtable_params(st, CHILD(n, 1));
4919 } else
4920 symtable_params(st, CHILD(n, 2));
4921 body = CHILD(n, NCH(n) - 1);
4922 symtable_node(st, body);
4923}
4924
4925/* The next two functions parse the argument tuple.
4926 symtable_default_arg() checks for names in the default arguments,
4927 which are references in the defining scope. symtable_params()
4928 parses the parameter names, which are defined in the function's
4929 body.
4930
4931 varargslist:
4932 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
4933 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
4934*/
4935
4936static void
4937symtable_default_args(struct symtable *st, node *n)
4938{
4939 node *c;
4940 int i;
4941
4942 if (TYPE(n) == parameters) {
4943 n = CHILD(n, 1);
4944 if (TYPE(n) == RPAR)
4945 return;
4946 }
4947 REQ(n, varargslist);
4948 for (i = 0; i < NCH(n); i += 2) {
4949 c = CHILD(n, i);
4950 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
4951 break;
4952 }
4953 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
4954 symtable_node(st, CHILD(n, i));
4955 }
4956}
4957
4958static void
4959symtable_params(struct symtable *st, node *n)
4960{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004961 int i, complex = -1, ext = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004962 node *c = NULL;
4963
4964 if (TYPE(n) == parameters) {
4965 n = CHILD(n, 1);
4966 if (TYPE(n) == RPAR)
4967 return;
4968 }
4969 REQ(n, varargslist);
4970 for (i = 0; i < NCH(n); i += 2) {
4971 c = CHILD(n, i);
4972 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
4973 ext = 1;
4974 break;
4975 }
4976 if (TYPE(c) == test) {
4977 continue;
4978 }
4979 if (TYPE(CHILD(c, 0)) == NAME)
4980 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
4981 else {
4982 char nbuf[10];
4983 sprintf(nbuf, ".%d", i);
4984 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004985 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004986 }
4987 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004988 if (ext) {
4989 c = CHILD(n, i);
4990 if (TYPE(c) == STAR) {
4991 i++;
4992 symtable_add_def(st, STR(CHILD(n, i)),
4993 DEF_PARAM | DEF_STAR);
4994 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00004995 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004996 c = NULL;
4997 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004998 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004999 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005000 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005001 i++;
5002 symtable_add_def(st, STR(CHILD(n, i)),
5003 DEF_PARAM | DEF_DOUBLESTAR);
5004 }
5005 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005006 if (complex >= 0) {
5007 int j;
5008 for (j = 0; j <= complex; j++) {
5009 c = CHILD(n, j);
5010 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005011 c = CHILD(n, ++j);
5012 else if (TYPE(c) == EQUAL)
5013 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005014 if (TYPE(CHILD(c, 0)) == LPAR)
5015 symtable_params_fplist(st, CHILD(c, 1));
5016 }
5017 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005018}
5019
5020static void
5021symtable_params_fplist(struct symtable *st, node *n)
5022{
5023 int i;
5024 node *c;
5025
5026 REQ(n, fplist);
5027 for (i = 0; i < NCH(n); i += 2) {
5028 c = CHILD(n, i);
5029 REQ(c, fpdef);
5030 if (NCH(c) == 1)
5031 symtable_add_def(st, STR(CHILD(c, 0)),
5032 DEF_PARAM | DEF_INTUPLE);
5033 else
5034 symtable_params_fplist(st, CHILD(c, 1));
5035 }
5036
5037}
5038
5039static void
5040symtable_global(struct symtable *st, node *n)
5041{
5042 int i;
5043
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005044 /* XXX It might be helpful to warn about module-level global
5045 statements, but it's hard to tell the difference between
5046 module-level and a string passed to exec.
5047 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00005048
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005049 for (i = 1; i < NCH(n); i += 2) {
5050 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005051 int flags;
5052
5053 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005054 if (flags < 0)
5055 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005056 if (flags && flags != DEF_GLOBAL) {
5057 char buf[500];
5058 if (flags & DEF_PARAM) {
5059 PyErr_Format(PyExc_SyntaxError,
5060 "name '%.400s' is local and global",
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005061 name);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005062 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005063 st->st_cur->ste_lineno);
5064 st->st_errors++;
5065 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005066 }
5067 else {
5068 if (flags & DEF_LOCAL)
5069 sprintf(buf, GLOBAL_AFTER_ASSIGN,
5070 name);
5071 else
5072 sprintf(buf, GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005073 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005074 }
5075 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005076 symtable_add_def(st, name, DEF_GLOBAL);
5077 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005078}
5079
5080static void
5081symtable_list_comprehension(struct symtable *st, node *n)
5082{
5083 char tmpname[12];
5084
Jeremy Hylton23b42272001-03-19 20:38:06 +00005085 sprintf(tmpname, "_[%d]", st->st_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005086 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005087 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005088 symtable_node(st, CHILD(n, 3));
5089 if (NCH(n) == 5)
5090 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005091}
5092
5093static void
5094symtable_import(struct symtable *st, node *n)
5095{
5096 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005097 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005098 | 'from' dotted_name 'import'
5099 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00005100 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005101 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005102 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005103 node *dotname = CHILD(n, 1);
5104 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
5105 /* check for bogus imports */
5106 if (n->n_lineno >= st->st_future->ff_last_lineno) {
5107 PyErr_SetString(PyExc_SyntaxError,
5108 LATE_FUTURE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005109 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005110 n->n_lineno);
5111 st->st_errors++;
5112 return;
5113 }
5114 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005115 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005116 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005117 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005118 } else {
5119 for (i = 3; i < NCH(n); i += 2) {
5120 node *c = CHILD(n, i);
5121 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005122 symtable_assign(st, CHILD(c, 2),
5123 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005124 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005125 symtable_assign(st, CHILD(c, 0),
5126 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005127 }
5128 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005129 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005130 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005131 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005132 }
5133 }
5134}
5135
5136static void
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005137symtable_assign(struct symtable *st, node *n, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005138{
5139 node *tmp;
5140 int i;
5141
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005142 loop:
5143 switch (TYPE(n)) {
5144 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005145 /* invalid assignment, e.g. lambda x:x=2. The next
5146 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005147 return;
5148 case power:
5149 if (NCH(n) > 2) {
5150 for (i = 2; i < NCH(n); ++i)
5151 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
5152 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005153 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005154 if (NCH(n) > 1) {
5155 symtable_node(st, CHILD(n, 0));
5156 symtable_node(st, CHILD(n, 1));
5157 } else {
5158 n = CHILD(n, 0);
5159 goto loop;
5160 }
5161 return;
5162 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00005163 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
5164 /* XXX This is an error, but the next pass
5165 will catch it. */
5166 return;
5167 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005168 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005169 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005170 }
5171 return;
5172 case exprlist:
5173 case testlist:
5174 if (NCH(n) == 1) {
5175 n = CHILD(n, 0);
5176 goto loop;
5177 }
5178 else {
5179 int i;
5180 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005181 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005182 return;
5183 }
5184 goto loop;
5185 case atom:
5186 tmp = CHILD(n, 0);
5187 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
5188 n = CHILD(n, 1);
5189 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00005190 } else if (TYPE(tmp) == NAME) {
Jeremy Hyltona830b382001-04-09 16:07:59 +00005191 if (strcmp(STR(tmp), "__debug__") == 0)
5192 symtable_warn(st, ASSIGN_DEBUG);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005193 symtable_add_def(st, STR(tmp), DEF_LOCAL | flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00005194 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005195 return;
5196 case dotted_as_name:
5197 if (NCH(n) == 3)
5198 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005199 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005200 else
5201 symtable_add_def(st,
5202 STR(CHILD(CHILD(n,
5203 0), 0)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005204 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005205 return;
5206 case dotted_name:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005207 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005208 return;
5209 case NAME:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005210 symtable_add_def(st, STR(n), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005211 return;
5212 default:
5213 if (NCH(n) == 0)
5214 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00005215 if (NCH(n) == 1) {
5216 n = CHILD(n, 0);
5217 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005218 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00005219 /* Should only occur for errors like x + 1 = 1,
5220 which will be caught in the next pass. */
5221 for (i = 0; i < NCH(n); ++i)
5222 if (TYPE(CHILD(n, i)) >= single_input)
5223 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005224 }
5225}