blob: e950f0fb088a6d8101321256b3bedd8d8aadebf5 [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
Tim Peters2a7f3842001-06-09 09:26:21 +0000339/* All about c_lnotab.
340
341c_lnotab is an array of unsigned bytes disguised as a Python string. In -O
342mode, SET_LINENO opcodes aren't generated, and bytecode offsets are mapped
343to source code line #s (when needed for tracebacks) via c_lnotab instead.
344The array is conceptually a list of
345 (bytecode offset increment, line number increment)
346pairs. The details are important and delicate, best illustrated by example:
347
348 byte code offset source code line number
349 0 1
350 6 2
351 50 7
352 350 307
353 361 308
354
355The first trick is that these numbers aren't stored, only the increments
356from one row to the next (this doesn't really work, but it's a start):
357
358 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
359
360The second trick is that an unsigned byte can't hold negative values, or
361values larger than 255, so (a) there's a deep assumption that byte code
362offsets and their corresponding line #s both increase monotonically, and (b)
363if at least one column jumps by more than 255 from one row to the next, more
364than one pair is written to the table. In case #b, there's no way to know
365from looking at the table later how many were written. That's the delicate
366part. A user of c_lnotab desiring to find the source line number
367corresponding to a bytecode address A should do something like this
368
369 lineno = addr = 0
370 for addr_incr, line_incr in c_lnotab:
371 addr += addr_incr
372 if addr > A:
373 return lineno
374 lineno += line_incr
375
376In order for this to work, when the addr field increments by more than 255,
377the line # increment in each pair generated must be 0 until the remaining addr
378increment is < 256. So, in the example above, com_set_lineno should not (as
379was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
380255, 0, 45, 255, 0, 45.
381*/
382
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000383struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000384 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000385 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000386 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000387 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000388 PyObject *c_name_dict; /* inverse of c_names */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000389 PyObject *c_globals; /* dictionary (value=None) */
390 PyObject *c_locals; /* dictionary (value=localID) */
391 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000392 PyObject *c_freevars; /* dictionary (value=None) */
393 PyObject *c_cellvars; /* list */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000394 int c_nlocals; /* index of next local */
395 int c_argcount; /* number of top-level arguments */
396 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000397 int c_nexti; /* index into c_code */
398 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000399 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000400 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000401 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000402 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000403 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000404 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000405 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000406 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000407 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000408 int c_stacklevel; /* Current stack level */
409 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000410 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000411 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000412 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000413 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000414 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000415 int c_nested; /* Is block nested funcdef or lamdef? */
416 int c_closure; /* Is nested w/freevars? */
417 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000418 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000419};
420
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000421static int
422is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000423{
424 if ((v & (USE | DEF_FREE))
425 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
426 return 1;
427 if (v & DEF_FREE_CLASS)
428 return 1;
429 return 0;
430}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000431
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000432static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000433com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000434{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000435 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
436
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000437 if (c == NULL) {
438 /* Error occurred via symtable call to
439 is_constant_false */
440 PyErr_SetString(exc, msg);
441 return;
442 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000443 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000444 if (c->c_lineno < 1 || c->c_interactive) {
445 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000446 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000447 return;
448 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000449 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000450 if (v == NULL)
451 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000452
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000453 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000454 if (line == NULL) {
455 Py_INCREF(Py_None);
456 line = Py_None;
457 }
458 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
459 Py_None, line);
460 if (t == NULL)
461 goto exit;
462 w = Py_BuildValue("(OO)", v, t);
463 if (w == NULL)
464 goto exit;
465 PyErr_SetObject(exc, w);
466 exit:
467 Py_XDECREF(t);
468 Py_XDECREF(v);
469 Py_XDECREF(w);
470 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000471}
472
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000473/* Interface to the block stack */
474
475static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000476block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000477{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000478 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000479 com_error(c, PyExc_SystemError,
480 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000481 }
482 else {
483 c->c_block[c->c_nblocks++] = type;
484 }
485}
486
487static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000488block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000489{
490 if (c->c_nblocks > 0)
491 c->c_nblocks--;
492 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000493 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000494 }
495}
496
Guido van Rossum681d79a1995-07-18 14:51:37 +0000497/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000498
Tim Petersdbd9ba62000-07-09 03:09:57 +0000499static int com_init(struct compiling *, char *);
500static void com_free(struct compiling *);
501static void com_push(struct compiling *, int);
502static void com_pop(struct compiling *, int);
503static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000504static void com_node(struct compiling *, node *);
505static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000506static void com_addbyte(struct compiling *, int);
507static void com_addint(struct compiling *, int);
508static void com_addoparg(struct compiling *, int, int);
509static void com_addfwref(struct compiling *, int, int *);
510static void com_backpatch(struct compiling *, int);
511static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
512static int com_addconst(struct compiling *, PyObject *);
513static int com_addname(struct compiling *, PyObject *);
514static void com_addopname(struct compiling *, int, node *);
515static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000516static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000517static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000518static void com_assign(struct compiling *, node *, int, node *);
519static void com_assign_name(struct compiling *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000520static PyCodeObject *icompile(node *, struct compiling *);
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000521static PyCodeObject *jcompile(node *, char *, struct compiling *,
522 PyCompilerFlags *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000523static PyObject *parsestrplus(node *);
524static PyObject *parsestr(char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000525static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000526
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000527static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000528
529/* symtable operations */
530static int symtable_build(struct compiling *, node *);
531static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000532static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000533static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000534static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000535static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000536static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000537
538static void symtable_node(struct symtable *, node *);
539static void symtable_funcdef(struct symtable *, node *);
540static void symtable_default_args(struct symtable *, node *);
541static void symtable_params(struct symtable *, node *);
542static void symtable_params_fplist(struct symtable *, node *n);
543static void symtable_global(struct symtable *, node *);
544static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000545static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000546static void symtable_list_comprehension(struct symtable *, node *);
547
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000548static int symtable_update_free_vars(struct symtable *);
549static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
550static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
551
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000552/* helper */
553static void
554do_pad(int pad)
555{
556 int i;
557 for (i = 0; i < pad; ++i)
558 fprintf(stderr, " ");
559}
560
561static void
562dump(node *n, int pad, int depth)
563{
564 int i;
565 if (depth == 0)
566 return;
567 do_pad(pad);
568 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
569 if (depth > 0)
570 depth--;
571 for (i = 0; i < NCH(n); ++i)
572 dump(CHILD(n, i), pad + 1, depth);
573}
574
575#define DUMP(N) dump(N, 0, -1)
576
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000577static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000578com_init(struct compiling *c, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000579{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000580 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000581 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
582 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000583 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000584 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000585 goto fail;
586 if ((c->c_const_dict = PyDict_New()) == NULL)
587 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000588 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000589 goto fail;
590 if ((c->c_name_dict = PyDict_New()) == NULL)
591 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000592 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000593 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000594 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
595 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000596 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000597 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000598 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000599 c->c_freevars = NULL;
600 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000601 c->c_nlocals = 0;
602 c->c_argcount = 0;
603 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000604 c->c_nexti = 0;
605 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000606 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000607 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000608 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000609 c->c_begin = 0;
610 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000611 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000612 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000613 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000614 c->c_stacklevel = 0;
615 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000616 c->c_firstlineno = 0;
617 c->c_last_addr = 0;
618 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000619 c->c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000620 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000621 c->c_nested = 0;
622 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000623 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000624 return 1;
625
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000626 fail:
627 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000628 return 0;
629}
630
631static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000632com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000633{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000634 Py_XDECREF(c->c_code);
635 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000636 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000637 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000638 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000639 Py_XDECREF(c->c_globals);
640 Py_XDECREF(c->c_locals);
641 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000642 Py_XDECREF(c->c_freevars);
643 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000644 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +0000645 if (c->c_future)
646 PyMem_Free((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000647}
648
649static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000650com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000651{
652 c->c_stacklevel += n;
653 if (c->c_stacklevel > c->c_maxstacklevel)
654 c->c_maxstacklevel = c->c_stacklevel;
655}
656
657static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000658com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000659{
660 if (c->c_stacklevel < n) {
Guido van Rossum90f827c1998-08-25 18:22:17 +0000661 /* fprintf(stderr,
Guido van Rossum8b993a91997-01-17 21:04:03 +0000662 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
663 c->c_filename, c->c_lineno,
Guido van Rossum90f827c1998-08-25 18:22:17 +0000664 c->c_nexti, c->c_stacklevel, n); */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000665 c->c_stacklevel = 0;
666 }
667 else
668 c->c_stacklevel -= n;
669}
670
671static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000672com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000673{
674 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000675 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000676 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000677 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000678}
679
680static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000681com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000682{
683 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000684 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000685 assert(byte >= 0 && byte <= 255);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000686 if (byte < 0 || byte > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000687 com_error(c, PyExc_SystemError,
688 "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000689 }
690 if (c->c_code == NULL)
691 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000692 len = PyString_Size(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000693 if (c->c_nexti >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000694 if (_PyString_Resize(&c->c_code, len+1000) != 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000695 c->c_errors++;
696 return;
697 }
698 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000699 PyString_AsString(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000700}
701
702static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000703com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000704{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000705 com_addbyte(c, x & 0xff);
706 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000707}
708
709static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000710com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000711{
712 int size;
713 char *p;
714 if (c->c_lnotab == NULL)
715 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000716 size = PyString_Size(c->c_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000717 if (c->c_lnotab_next+2 > size) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000718 if (_PyString_Resize(&c->c_lnotab, size + 1000) < 0) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000719 c->c_errors++;
720 return;
721 }
722 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000723 p = PyString_AsString(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000724 *p++ = addr;
725 *p++ = line;
726 c->c_lnotab_next += 2;
727}
728
729static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000730com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000731{
732 c->c_lineno = lineno;
733 if (c->c_firstlineno == 0) {
734 c->c_firstlineno = c->c_last_line = lineno;
735 }
736 else {
737 int incr_addr = c->c_nexti - c->c_last_addr;
738 int incr_line = lineno - c->c_last_line;
Tim Peters2a7f3842001-06-09 09:26:21 +0000739 while (incr_addr > 255) {
740 com_add_lnotab(c, 255, 0);
741 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000742 }
Tim Peters2a7f3842001-06-09 09:26:21 +0000743 while (incr_line > 255) {
744 com_add_lnotab(c, incr_addr, 255);
745 incr_line -=255;
746 incr_addr = 0;
747 }
748 if (incr_addr > 0 || incr_line > 0)
749 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000750 c->c_last_addr = c->c_nexti;
751 c->c_last_line = lineno;
752 }
753}
754
755static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000756com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000757{
Fred Drakeef8ace32000-08-24 00:32:09 +0000758 int extended_arg = arg >> 16;
Guido van Rossum8e793d91997-03-03 19:13:14 +0000759 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000760 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000761 if (Py_OptimizeFlag)
762 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000763 }
Fred Drakeef8ace32000-08-24 00:32:09 +0000764 if (extended_arg){
765 com_addbyte(c, EXTENDED_ARG);
766 com_addint(c, extended_arg);
767 arg &= 0xffff;
768 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000769 com_addbyte(c, op);
770 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000771}
772
773static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000774com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000775{
776 /* Compile a forward reference for backpatching */
777 int here;
778 int anchor;
779 com_addbyte(c, op);
780 here = c->c_nexti;
781 anchor = *p_anchor;
782 *p_anchor = here;
783 com_addint(c, anchor == 0 ? 0 : here - anchor);
784}
785
786static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000787com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000788{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000789 unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000790 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000791 int dist;
792 int prev;
793 for (;;) {
794 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000795 prev = code[anchor] + (code[anchor+1] << 8);
796 dist = target - (anchor+2);
797 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +0000798 dist >>= 8;
799 code[anchor+1] = dist;
800 dist >>= 8;
801 if (dist) {
802 com_error(c, PyExc_SystemError,
803 "com_backpatch: offset too large");
804 break;
805 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000806 if (!prev)
807 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000808 anchor -= prev;
809 }
810}
811
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000812/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000813
814static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000815com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000816{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000817 PyObject *w, *t, *np=NULL;
818 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000819
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000820 t = Py_BuildValue("(OO)", v, v->ob_type);
821 if (t == NULL)
822 goto fail;
823 w = PyDict_GetItem(dict, t);
824 if (w != NULL) {
825 n = PyInt_AsLong(w);
826 } else {
827 n = PyList_Size(list);
828 np = PyInt_FromLong(n);
829 if (np == NULL)
830 goto fail;
831 if (PyList_Append(list, v) != 0)
832 goto fail;
833 if (PyDict_SetItem(dict, t, np) != 0)
834 goto fail;
835 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000836 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000837 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000838 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000839 fail:
840 Py_XDECREF(np);
841 Py_XDECREF(t);
842 c->c_errors++;
843 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000844}
845
846static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000847com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000848{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000849 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000850}
851
852static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000853com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000854{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000855 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000856}
857
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000858static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000859mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000860{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000861 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000862 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +0000863 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000864 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
865 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000866 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000867 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000868 return 0; /* Don't mangle __extremely_long_names */
869 if (name[nlen-1] == '_' && name[nlen-2] == '_')
870 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000871 /* Strip leading underscores from class name */
872 while (*p == '_')
873 p++;
874 if (*p == '\0')
875 return 0; /* Don't mangle if class is just underscores */
876 plen = strlen(p);
877 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000878 plen = maxlen-nlen-2; /* Truncate class name if too long */
879 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000880 buffer[0] = '_';
881 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000882 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000883 return 1;
884}
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000885
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000886static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000887com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000888{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000889 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000890 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000891 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000892
893 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000894 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000895 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000896 c->c_errors++;
897 i = 255;
898 }
899 else {
900 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000901 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000902 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000903 com_addoparg(c, op, i);
904}
905
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000906#define NAME_LOCAL 0
907#define NAME_GLOBAL 1
908#define NAME_DEFAULT 2
909#define NAME_CLOSURE 3
910
911static int
912com_lookup_arg(PyObject *dict, PyObject *name)
913{
914 PyObject *v = PyDict_GetItem(dict, name);
915 if (v == NULL)
916 return -1;
917 else
918 return PyInt_AS_LONG(v);
919}
920
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000921static void
922com_addop_varname(struct compiling *c, int kind, char *name)
923{
924 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000925 int i, reftype;
926 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000927 int op = STOP_CODE;
928 char buffer[MANGLE_LEN];
929
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000930 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000931 name = buffer;
932 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
933 c->c_errors++;
934 i = 255;
935 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000936 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000937
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000938 reftype = get_ref_type(c, name);
939 switch (reftype) {
940 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000941 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000942 scope = NAME_LOCAL;
943 break;
944 case GLOBAL_EXPLICIT:
945 scope = NAME_GLOBAL;
946 break;
947 case GLOBAL_IMPLICIT:
948 if (c->c_flags & CO_OPTIMIZED)
949 scope = NAME_GLOBAL;
950 break;
951 case FREE:
952 case CELL:
953 scope = NAME_CLOSURE;
954 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000955 }
956
957 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000958 if (scope == NAME_LOCAL)
959 i = com_lookup_arg(c->c_locals, v);
960 else if (reftype == FREE)
961 i = com_lookup_arg(c->c_freevars, v);
962 else if (reftype == CELL)
963 i = com_lookup_arg(c->c_cellvars, v);
964 if (i == -1) {
965 c->c_errors++; /* XXX no exception set */
966 i = 255;
967 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000968 }
969 Py_DECREF(v);
970
971 switch (kind) {
972 case VAR_LOAD:
973 switch (scope) {
974 case NAME_LOCAL:
975 op = LOAD_FAST;
976 break;
977 case NAME_GLOBAL:
978 op = LOAD_GLOBAL;
979 break;
980 case NAME_DEFAULT:
981 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000982 break;
983 case NAME_CLOSURE:
984 op = LOAD_DEREF;
985 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000986 }
987 break;
988 case VAR_STORE:
989 switch (scope) {
990 case NAME_LOCAL:
991 op = STORE_FAST;
992 break;
993 case NAME_GLOBAL:
994 op = STORE_GLOBAL;
995 break;
996 case NAME_DEFAULT:
997 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000998 break;
999 case NAME_CLOSURE:
1000 op = STORE_DEREF;
1001 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001002 }
1003 break;
1004 case VAR_DELETE:
1005 switch (scope) {
1006 case NAME_LOCAL:
1007 op = DELETE_FAST;
1008 break;
1009 case NAME_GLOBAL:
1010 op = DELETE_GLOBAL;
1011 break;
1012 case NAME_DEFAULT:
1013 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001014 break;
1015 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001016 char buf[500];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001017 sprintf(buf, DEL_CLOSURE_ERROR, name);
1018 com_error(c, PyExc_SyntaxError, buf);
1019 i = 255;
1020 break;
1021 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001022 }
1023 break;
1024 }
1025done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001026 com_addoparg(c, op, i);
1027}
1028
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001029static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001030com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001031{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001032 char *name;
1033 char buffer[1000];
1034 /* XXX it is possible to write this code without the 1000
1035 chars on the total length of dotted names, I just can't be
1036 bothered right now */
1037 if (TYPE(n) == STAR)
1038 name = "*";
1039 else if (TYPE(n) == dotted_name) {
1040 char *p = buffer;
1041 int i;
1042 name = buffer;
1043 for (i = 0; i < NCH(n); i += 2) {
1044 char *s = STR(CHILD(n, i));
1045 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001046 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001047 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001048 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001049 break;
1050 }
1051 if (p != buffer)
1052 *p++ = '.';
1053 strcpy(p, s);
1054 p = strchr(p, '\0');
1055 }
1056 }
1057 else {
1058 REQ(n, NAME);
1059 name = STR(n);
1060 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001061 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001062}
1063
Guido van Rossum79f25d91997-04-29 20:08:16 +00001064static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001065parsenumber(struct compiling *co, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001066{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001067 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001068 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001069 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001070#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +00001071 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +00001072 int imflag;
1073#endif
1074
Guido van Rossum282914b1991-04-04 10:42:56 +00001075 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001076 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001077#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001078 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001079#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001080 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001081 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001082 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001083 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001084 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001085 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001086 if (*end == '\0') {
1087 if (errno != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001088 com_error(co, PyExc_OverflowError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001089 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +00001090 return NULL;
1091 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001092 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001093 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001094 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001095#ifndef WITHOUT_COMPLEX
1096 if (imflag) {
1097 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001098 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +00001099 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001100 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001101 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +00001102 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001103 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001104#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001105 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001106 PyFPE_START_PROTECT("atof", return 0)
1107 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001108 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001109 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001110 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001111}
1112
Guido van Rossum79f25d91997-04-29 20:08:16 +00001113static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001114parsestr(char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001115{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001116 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001117 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001118 char *buf;
1119 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001120 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001121 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001122 int first = *s;
1123 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001124 int rawmode = 0;
1125 int unicode = 0;
1126 if (isalpha(quote) || quote == '_') {
1127 if (quote == 'u' || quote == 'U') {
1128 quote = *++s;
1129 unicode = 1;
1130 }
1131 if (quote == 'r' || quote == 'R') {
1132 quote = *++s;
1133 rawmode = 1;
1134 }
1135 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001136 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001137 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001138 return NULL;
1139 }
1140 s++;
1141 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001142 if (len > INT_MAX) {
1143 PyErr_SetString(PyExc_OverflowError, "string to parse is too long");
1144 return NULL;
1145 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001146 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001147 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001148 return NULL;
1149 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001150 if (len >= 4 && s[0] == quote && s[1] == quote) {
1151 s += 2;
1152 len -= 2;
1153 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001154 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001155 return NULL;
1156 }
1157 }
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001158 if (unicode || Py_UnicodeFlag) {
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001159 if (rawmode)
1160 return PyUnicode_DecodeRawUnicodeEscape(
1161 s, len, NULL);
1162 else
1163 return PyUnicode_DecodeUnicodeEscape(
1164 s, len, NULL);
1165 }
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001166 if (rawmode || strchr(s, '\\') == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001167 return PyString_FromStringAndSize(s, len);
1168 v = PyString_FromStringAndSize((char *)NULL, len);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001169 if (v == NULL)
1170 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001171 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001172 end = s + len;
1173 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001174 if (*s != '\\') {
1175 *p++ = *s++;
1176 continue;
1177 }
1178 s++;
1179 switch (*s++) {
1180 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001181 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001182 case '\\': *p++ = '\\'; break;
1183 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +00001184 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001185 case 'b': *p++ = '\b'; break;
1186 case 'f': *p++ = '\014'; break; /* FF */
1187 case 't': *p++ = '\t'; break;
1188 case 'n': *p++ = '\n'; break;
1189 case 'r': *p++ = '\r'; break;
1190 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001191 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
1192 case '0': case '1': case '2': case '3':
1193 case '4': case '5': case '6': case '7':
1194 c = s[-1] - '0';
1195 if ('0' <= *s && *s <= '7') {
1196 c = (c<<3) + *s++ - '0';
1197 if ('0' <= *s && *s <= '7')
1198 c = (c<<3) + *s++ - '0';
1199 }
1200 *p++ = c;
1201 break;
1202 case 'x':
Jeremy Hylton4419ac12001-02-28 22:54:51 +00001203 if (isxdigit(Py_CHARMASK(s[0]))
1204 && isxdigit(Py_CHARMASK(s[1]))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +00001205 unsigned int x = 0;
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001206 c = Py_CHARMASK(*s);
1207 s++;
1208 if (isdigit(c))
1209 x = c - '0';
1210 else if (islower(c))
1211 x = 10 + c - 'a';
1212 else
1213 x = 10 + c - 'A';
1214 x = x << 4;
1215 c = Py_CHARMASK(*s);
1216 s++;
1217 if (isdigit(c))
1218 x += c - '0';
1219 else if (islower(c))
1220 x += 10 + c - 'a';
1221 else
1222 x += 10 + c - 'A';
Guido van Rossumed1100f1997-10-20 23:24:07 +00001223 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001224 break;
1225 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00001226 PyErr_SetString(PyExc_ValueError,
1227 "invalid \\x escape");
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001228 Py_DECREF(v);
1229 return NULL;
1230 default:
1231 *p++ = '\\';
1232 *p++ = s[-1];
1233 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001234 }
1235 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001236 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001237 return v;
1238}
1239
Guido van Rossum79f25d91997-04-29 20:08:16 +00001240static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001241parsestrplus(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001242{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001243 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001244 int i;
1245 REQ(CHILD(n, 0), STRING);
1246 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
1247 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001248 for (i = 1; i < NCH(n); i++) {
1249 PyObject *s;
1250 s = parsestr(STR(CHILD(n, i)));
1251 if (s == NULL)
1252 goto onError;
1253 if (PyString_Check(v) && PyString_Check(s)) {
1254 PyString_ConcatAndDel(&v, s);
1255 if (v == NULL)
1256 goto onError;
1257 }
1258 else {
1259 PyObject *temp;
1260 temp = PyUnicode_Concat(v, s);
1261 Py_DECREF(s);
1262 if (temp == NULL)
1263 goto onError;
1264 Py_DECREF(v);
1265 v = temp;
1266 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001267 }
1268 }
1269 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001270
1271 onError:
1272 Py_XDECREF(v);
1273 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001274}
1275
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001276static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001277com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001278{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001279 int anchor = 0;
1280 int save_begin = c->c_begin;
1281
1282 /* list_iter: for v in expr [list_iter] */
1283 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001284 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001285 c->c_begin = c->c_nexti;
1286 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001287 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001288 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001289 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001290 c->c_loops++;
1291 com_list_iter(c, n, e, t);
1292 c->c_loops--;
1293 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1294 c->c_begin = save_begin;
1295 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001296 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001297}
1298
1299static void
1300com_list_if(struct compiling *c, node *n, node *e, char *t)
1301{
1302 int anchor = 0;
1303 int a = 0;
1304 /* list_iter: 'if' test [list_iter] */
1305 com_addoparg(c, SET_LINENO, n->n_lineno);
1306 com_node(c, CHILD(n, 1));
1307 com_addfwref(c, JUMP_IF_FALSE, &a);
1308 com_addbyte(c, POP_TOP);
1309 com_pop(c, 1);
1310 com_list_iter(c, n, e, t);
1311 com_addfwref(c, JUMP_FORWARD, &anchor);
1312 com_backpatch(c, a);
1313 /* We jump here with an extra entry which we now pop */
1314 com_addbyte(c, POP_TOP);
1315 com_backpatch(c, anchor);
1316}
1317
1318static void
1319com_list_iter(struct compiling *c,
1320 node *p, /* parent of list_iter node */
1321 node *e, /* element expression node */
1322 char *t /* name of result list temp local */)
1323{
1324 /* list_iter is the last child in a listmaker, list_for, or list_if */
1325 node *n = CHILD(p, NCH(p)-1);
1326 if (TYPE(n) == list_iter) {
1327 n = CHILD(n, 0);
1328 switch (TYPE(n)) {
1329 case list_for:
1330 com_list_for(c, n, e, t);
1331 break;
1332 case list_if:
1333 com_list_if(c, n, e, t);
1334 break;
1335 default:
1336 com_error(c, PyExc_SystemError,
1337 "invalid list_iter node type");
1338 }
1339 }
1340 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001341 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001342 com_push(c, 1);
1343 com_node(c, e);
1344 com_addoparg(c, CALL_FUNCTION, 1);
1345 com_addbyte(c, POP_TOP);
1346 com_pop(c, 2);
1347 }
1348}
1349
1350static void
1351com_list_comprehension(struct compiling *c, node *n)
1352{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001353 /* listmaker: test list_for */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001354 char tmpname[12];
Tim Peters30814212001-02-17 05:30:26 +00001355 sprintf(tmpname, "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001356 com_addoparg(c, BUILD_LIST, 0);
1357 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1358 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001359 com_addop_name(c, LOAD_ATTR, "append");
1360 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001361 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001362 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001363 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001364 --c->c_tmpname;
1365}
1366
1367static void
1368com_listmaker(struct compiling *c, node *n)
1369{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001370 /* listmaker: test ( list_for | (',' test)* [','] ) */
1371 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001372 com_list_comprehension(c, n);
1373 else {
1374 int len = 0;
1375 int i;
1376 for (i = 0; i < NCH(n); i += 2, len++)
1377 com_node(c, CHILD(n, i));
1378 com_addoparg(c, BUILD_LIST, len);
1379 com_pop(c, len-1);
1380 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001381}
1382
1383static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001384com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001385{
1386 int i;
1387 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1388 for (i = 0; i+2 < NCH(n); i += 4) {
1389 /* We must arrange things just right for STORE_SUBSCR.
1390 It wants the stack to look like (value) (dict) (key) */
1391 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001392 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001393 com_node(c, CHILD(n, i+2)); /* value */
1394 com_addbyte(c, ROT_TWO);
1395 com_node(c, CHILD(n, i)); /* key */
1396 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001397 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001398 }
1399}
1400
1401static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001402com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001403{
1404 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001405 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001406 int i;
1407 REQ(n, atom);
1408 ch = CHILD(n, 0);
1409 switch (TYPE(ch)) {
1410 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001411 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001412 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001413 com_push(c, 1);
1414 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001415 else
1416 com_node(c, CHILD(n, 1));
1417 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001418 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001419 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001420 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001421 com_push(c, 1);
1422 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001423 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001424 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001425 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001426 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001427 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001428 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001429 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001430 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001431 break;
1432 case BACKQUOTE:
1433 com_node(c, CHILD(n, 1));
1434 com_addbyte(c, UNARY_CONVERT);
1435 break;
1436 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001437 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001438 i = 255;
1439 }
1440 else {
1441 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001442 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001443 }
1444 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001445 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001446 break;
1447 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001448 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001449 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001450 c->c_errors++;
1451 i = 255;
1452 }
1453 else {
1454 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001455 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001456 }
1457 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001458 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001459 break;
1460 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001461 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001462 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001463 break;
1464 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001465 com_error(c, PyExc_SystemError,
1466 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001467 }
1468}
1469
1470static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001471com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001472{
1473 if (NCH(n) == 1) {
1474 com_addbyte(c, op);
1475 }
1476 else if (NCH(n) == 2) {
1477 if (TYPE(CHILD(n, 0)) != COLON) {
1478 com_node(c, CHILD(n, 0));
1479 com_addbyte(c, op+1);
1480 }
1481 else {
1482 com_node(c, CHILD(n, 1));
1483 com_addbyte(c, op+2);
1484 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001485 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001486 }
1487 else {
1488 com_node(c, CHILD(n, 0));
1489 com_node(c, CHILD(n, 2));
1490 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001491 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001492 }
1493}
1494
Guido van Rossum635abd21997-01-06 22:56:52 +00001495static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001496com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1497{
1498 if (NCH(n) == 1) {
1499 com_addbyte(c, DUP_TOP);
1500 com_push(c, 1);
1501 com_addbyte(c, SLICE);
1502 com_node(c, augn);
1503 com_addbyte(c, opcode);
1504 com_pop(c, 1);
1505 com_addbyte(c, ROT_TWO);
1506 com_addbyte(c, STORE_SLICE);
1507 com_pop(c, 2);
1508 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1509 com_node(c, CHILD(n, 0));
1510 com_addoparg(c, DUP_TOPX, 2);
1511 com_push(c, 2);
1512 com_addbyte(c, SLICE+1);
1513 com_pop(c, 1);
1514 com_node(c, augn);
1515 com_addbyte(c, opcode);
1516 com_pop(c, 1);
1517 com_addbyte(c, ROT_THREE);
1518 com_addbyte(c, STORE_SLICE+1);
1519 com_pop(c, 3);
1520 } else if (NCH(n) == 2) {
1521 com_node(c, CHILD(n, 1));
1522 com_addoparg(c, DUP_TOPX, 2);
1523 com_push(c, 2);
1524 com_addbyte(c, SLICE+2);
1525 com_pop(c, 1);
1526 com_node(c, augn);
1527 com_addbyte(c, opcode);
1528 com_pop(c, 1);
1529 com_addbyte(c, ROT_THREE);
1530 com_addbyte(c, STORE_SLICE+2);
1531 com_pop(c, 3);
1532 } else {
1533 com_node(c, CHILD(n, 0));
1534 com_node(c, CHILD(n, 2));
1535 com_addoparg(c, DUP_TOPX, 3);
1536 com_push(c, 3);
1537 com_addbyte(c, SLICE+3);
1538 com_pop(c, 2);
1539 com_node(c, augn);
1540 com_addbyte(c, opcode);
1541 com_pop(c, 1);
1542 com_addbyte(c, ROT_FOUR);
1543 com_addbyte(c, STORE_SLICE+3);
1544 com_pop(c, 4);
1545 }
1546}
1547
1548static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001549com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001550{
1551 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001552 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001553 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001554 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001555 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001556 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001557 }
1558 else {
1559 com_node(c, CHILD(n, 0));
1560 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001561 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001562 }
1563 m = n;
1564 do {
1565 m = CHILD(m, 0);
1566 } while (NCH(m) == 1);
1567 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00001568 /* f(lambda x: x[0] = 3) ends up getting parsed with
1569 * LHS test = lambda x: x[0], and RHS test = 3.
1570 * SF bug 132313 points out that complaining about a keyword
1571 * then is very confusing.
1572 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001573 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00001574 TYPE(m) == lambdef ?
1575 "lambda cannot contain assignment" :
1576 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001577 }
1578 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001579 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001580 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001581 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001582 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001583 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001584 else if (*pkeywords == NULL) {
1585 c->c_errors++;
1586 Py_DECREF(v);
1587 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001588 if (PyDict_GetItem(*pkeywords, v) != NULL)
1589 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001590 "duplicate keyword argument");
1591 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001592 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001593 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001594 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001595 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001596 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001597 }
1598 }
1599 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001600}
1601
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001602static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001603com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001604{
1605 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001606 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001607 }
1608 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001609 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001610 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001611 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001612 int star_flag = 0;
1613 int starstar_flag = 0;
1614 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001615 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001616 na = 0;
1617 nk = 0;
1618 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001619 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001620 if (TYPE(ch) == STAR ||
1621 TYPE(ch) == DOUBLESTAR)
1622 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001623 if (ch->n_lineno != lineno) {
1624 lineno = ch->n_lineno;
1625 com_addoparg(c, SET_LINENO, lineno);
1626 }
1627 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001628 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001629 na++;
1630 else
1631 nk++;
1632 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001633 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001634 while (i < NCH(n)) {
1635 node *tok = CHILD(n, i);
1636 node *ch = CHILD(n, i+1);
1637 i += 3;
1638 switch (TYPE(tok)) {
1639 case STAR: star_flag = 1; break;
1640 case DOUBLESTAR: starstar_flag = 1; break;
1641 }
1642 com_node(c, ch);
1643 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001644 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001645 com_error(c, PyExc_SyntaxError,
1646 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001647 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001648 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001649 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001650 star_flag + (starstar_flag << 1);
1651 else
1652 opcode = CALL_FUNCTION;
1653 com_addoparg(c, opcode, na | (nk << 8));
1654 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001655 }
1656}
1657
1658static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001659com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001660{
1661 com_addopname(c, LOAD_ATTR, n);
1662}
1663
1664static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001665com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001666{
1667 int i=0;
1668 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001669 node *ch;
1670
1671 /* first argument */
1672 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001673 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001674 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001675 i++;
1676 }
1677 else {
1678 com_node(c, CHILD(n,i));
1679 i++;
1680 REQ(CHILD(n,i),COLON);
1681 i++;
1682 }
1683 /* second argument */
1684 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1685 com_node(c, CHILD(n,i));
1686 i++;
1687 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001688 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001689 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001690 com_push(c, 1);
1691 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001692 /* remaining arguments */
1693 for (; i < NCH(n); i++) {
1694 ns++;
1695 ch=CHILD(n,i);
1696 REQ(ch, sliceop);
1697 if (NCH(ch) == 1) {
1698 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001699 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001700 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001701 }
1702 else
1703 com_node(c, CHILD(ch,1));
1704 }
1705 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001706 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001707}
1708
1709static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001710com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001711{
1712 node *ch;
1713 REQ(n, subscript);
1714 ch = CHILD(n,0);
1715 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001716 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001717 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001718 com_push(c, 1);
1719 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001720 else {
1721 /* check for slice */
1722 if ((TYPE(ch) == COLON || NCH(n) > 1))
1723 com_sliceobj(c, n);
1724 else {
1725 REQ(ch, test);
1726 com_node(c, ch);
1727 }
1728 }
1729}
1730
1731static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001732com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001733{
1734 int i, op;
1735 REQ(n, subscriptlist);
1736 /* Check to make backward compatible slice behavior for '[i:j]' */
1737 if (NCH(n) == 1) {
1738 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001739 /* 'Basic' slice, should have exactly one colon. */
1740 if ((TYPE(CHILD(sub, 0)) == COLON
1741 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1742 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1743 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001744 switch (assigning) {
1745 case OP_DELETE:
1746 op = DELETE_SLICE;
1747 break;
1748 case OP_ASSIGN:
1749 op = STORE_SLICE;
1750 break;
1751 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001752 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001753 break;
1754 default:
1755 com_augassign_slice(c, sub, assigning, augn);
1756 return;
1757 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001758 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001759 if (op == STORE_SLICE)
1760 com_pop(c, 2);
1761 else if (op == DELETE_SLICE)
1762 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001763 return;
1764 }
1765 }
1766 /* Else normal subscriptlist. Compile each subscript. */
1767 for (i = 0; i < NCH(n); i += 2)
1768 com_subscript(c, CHILD(n, i));
1769 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001770 if (NCH(n) > 1) {
1771 i = (NCH(n)+1) / 2;
1772 com_addoparg(c, BUILD_TUPLE, i);
1773 com_pop(c, i-1);
1774 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001775 switch (assigning) {
1776 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001777 op = DELETE_SUBSCR;
1778 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00001779 break;
1780 default:
1781 case OP_ASSIGN:
1782 op = STORE_SUBSCR;
1783 i = 3;
1784 break;
1785 case OP_APPLY:
1786 op = BINARY_SUBSCR;
1787 i = 1;
1788 break;
1789 }
1790 if (assigning > OP_APPLY) {
1791 com_addoparg(c, DUP_TOPX, 2);
1792 com_push(c, 2);
1793 com_addbyte(c, BINARY_SUBSCR);
1794 com_pop(c, 1);
1795 com_node(c, augn);
1796 com_addbyte(c, assigning);
1797 com_pop(c, 1);
1798 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001799 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001800 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001801 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001802}
1803
1804static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001805com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001806{
1807 REQ(n, trailer);
1808 switch (TYPE(CHILD(n, 0))) {
1809 case LPAR:
1810 com_call_function(c, CHILD(n, 1));
1811 break;
1812 case DOT:
1813 com_select_member(c, CHILD(n, 1));
1814 break;
1815 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00001816 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001817 break;
1818 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001819 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001820 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001821 }
1822}
1823
1824static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001825com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001826{
1827 int i;
1828 REQ(n, power);
1829 com_atom(c, CHILD(n, 0));
1830 for (i = 1; i < NCH(n); i++) {
1831 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1832 com_factor(c, CHILD(n, i+1));
1833 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001834 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001835 break;
1836 }
1837 else
1838 com_apply_trailer(c, CHILD(n, i));
1839 }
1840}
1841
1842static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001843com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001844{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001845 REQ(n, factor);
1846 if (TYPE(CHILD(n, 0)) == PLUS) {
1847 com_factor(c, CHILD(n, 1));
1848 com_addbyte(c, UNARY_POSITIVE);
1849 }
1850 else if (TYPE(CHILD(n, 0)) == MINUS) {
1851 com_factor(c, CHILD(n, 1));
1852 com_addbyte(c, UNARY_NEGATIVE);
1853 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001854 else if (TYPE(CHILD(n, 0)) == TILDE) {
1855 com_factor(c, CHILD(n, 1));
1856 com_addbyte(c, UNARY_INVERT);
1857 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001858 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001859 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001860 }
1861}
1862
1863static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001864com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001865{
1866 int i;
1867 int op;
1868 REQ(n, term);
1869 com_factor(c, CHILD(n, 0));
1870 for (i = 2; i < NCH(n); i += 2) {
1871 com_factor(c, CHILD(n, i));
1872 switch (TYPE(CHILD(n, i-1))) {
1873 case STAR:
1874 op = BINARY_MULTIPLY;
1875 break;
1876 case SLASH:
1877 op = BINARY_DIVIDE;
1878 break;
1879 case PERCENT:
1880 op = BINARY_MODULO;
1881 break;
1882 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001883 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001884 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001885 op = 255;
1886 }
1887 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001888 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001889 }
1890}
1891
1892static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001893com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001894{
1895 int i;
1896 int op;
1897 REQ(n, arith_expr);
1898 com_term(c, CHILD(n, 0));
1899 for (i = 2; i < NCH(n); i += 2) {
1900 com_term(c, CHILD(n, i));
1901 switch (TYPE(CHILD(n, i-1))) {
1902 case PLUS:
1903 op = BINARY_ADD;
1904 break;
1905 case MINUS:
1906 op = BINARY_SUBTRACT;
1907 break;
1908 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001909 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001910 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001911 op = 255;
1912 }
1913 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001914 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001915 }
1916}
1917
1918static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001919com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001920{
1921 int i;
1922 int op;
1923 REQ(n, shift_expr);
1924 com_arith_expr(c, CHILD(n, 0));
1925 for (i = 2; i < NCH(n); i += 2) {
1926 com_arith_expr(c, CHILD(n, i));
1927 switch (TYPE(CHILD(n, i-1))) {
1928 case LEFTSHIFT:
1929 op = BINARY_LSHIFT;
1930 break;
1931 case RIGHTSHIFT:
1932 op = BINARY_RSHIFT;
1933 break;
1934 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001935 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001936 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001937 op = 255;
1938 }
1939 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001940 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001941 }
1942}
1943
1944static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001945com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001946{
1947 int i;
1948 int op;
1949 REQ(n, and_expr);
1950 com_shift_expr(c, CHILD(n, 0));
1951 for (i = 2; i < NCH(n); i += 2) {
1952 com_shift_expr(c, CHILD(n, i));
1953 if (TYPE(CHILD(n, i-1)) == AMPER) {
1954 op = BINARY_AND;
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_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001959 op = 255;
1960 }
1961 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001962 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001963 }
1964}
1965
1966static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001967com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001968{
1969 int i;
1970 int op;
1971 REQ(n, xor_expr);
1972 com_and_expr(c, CHILD(n, 0));
1973 for (i = 2; i < NCH(n); i += 2) {
1974 com_and_expr(c, CHILD(n, i));
1975 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1976 op = BINARY_XOR;
1977 }
1978 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001979 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001980 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001981 op = 255;
1982 }
1983 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001984 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001985 }
1986}
1987
1988static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001989com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001990{
1991 int i;
1992 int op;
1993 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001994 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001995 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001996 com_xor_expr(c, CHILD(n, i));
1997 if (TYPE(CHILD(n, i-1)) == VBAR) {
1998 op = BINARY_OR;
1999 }
2000 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002001 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002002 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002003 op = 255;
2004 }
2005 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002006 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002007 }
2008}
2009
2010static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002011cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002012{
2013 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00002014 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002015 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2016 if (NCH(n) == 1) {
2017 n = CHILD(n, 0);
2018 switch (TYPE(n)) {
2019 case LESS: return LT;
2020 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00002021 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002022 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00002023 case LESSEQUAL: return LE;
2024 case GREATEREQUAL: return GE;
2025 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002026 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
2027 if (strcmp(STR(n), "is") == 0) return IS;
2028 }
2029 }
2030 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002031 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002032 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
2033 return NOT_IN;
2034 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
2035 return IS_NOT;
2036 }
2037 }
2038 return BAD;
2039}
2040
2041static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002042com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002043{
2044 int i;
2045 enum cmp_op op;
2046 int anchor;
2047 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2048 com_expr(c, CHILD(n, 0));
2049 if (NCH(n) == 1)
2050 return;
2051
2052 /****************************************************************
2053 The following code is generated for all but the last
2054 comparison in a chain:
2055
2056 label: on stack: opcode: jump to:
2057
2058 a <code to load b>
2059 a, b DUP_TOP
2060 a, b, b ROT_THREE
2061 b, a, b COMPARE_OP
2062 b, 0-or-1 JUMP_IF_FALSE L1
2063 b, 1 POP_TOP
2064 b
2065
2066 We are now ready to repeat this sequence for the next
2067 comparison in the chain.
2068
2069 For the last we generate:
2070
2071 b <code to load c>
2072 b, c COMPARE_OP
2073 0-or-1
2074
2075 If there were any jumps to L1 (i.e., there was more than one
2076 comparison), we generate:
2077
2078 0-or-1 JUMP_FORWARD L2
2079 L1: b, 0 ROT_TWO
2080 0, b POP_TOP
2081 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002082 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002083 ****************************************************************/
2084
2085 anchor = 0;
2086
2087 for (i = 2; i < NCH(n); i += 2) {
2088 com_expr(c, CHILD(n, i));
2089 if (i+2 < NCH(n)) {
2090 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002091 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002092 com_addbyte(c, ROT_THREE);
2093 }
2094 op = cmp_type(CHILD(n, i-1));
2095 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002096 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002097 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002098 }
2099 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002100 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002101 if (i+2 < NCH(n)) {
2102 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2103 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002104 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002105 }
2106 }
2107
2108 if (anchor) {
2109 int anchor2 = 0;
2110 com_addfwref(c, JUMP_FORWARD, &anchor2);
2111 com_backpatch(c, anchor);
2112 com_addbyte(c, ROT_TWO);
2113 com_addbyte(c, POP_TOP);
2114 com_backpatch(c, anchor2);
2115 }
2116}
2117
2118static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002119com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002120{
2121 REQ(n, not_test); /* 'not' not_test | comparison */
2122 if (NCH(n) == 1) {
2123 com_comparison(c, CHILD(n, 0));
2124 }
2125 else {
2126 com_not_test(c, CHILD(n, 1));
2127 com_addbyte(c, UNARY_NOT);
2128 }
2129}
2130
2131static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002132com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002133{
2134 int i;
2135 int anchor;
2136 REQ(n, and_test); /* not_test ('and' not_test)* */
2137 anchor = 0;
2138 i = 0;
2139 for (;;) {
2140 com_not_test(c, CHILD(n, i));
2141 if ((i += 2) >= NCH(n))
2142 break;
2143 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2144 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002145 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002146 }
2147 if (anchor)
2148 com_backpatch(c, anchor);
2149}
2150
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002151static int
2152com_make_closure(struct compiling *c, PyCodeObject *co)
2153{
2154 int i, free = PyTuple_GET_SIZE(co->co_freevars);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002155 /* If the code is compiled with st->st_nested_scopes == 0,
2156 then no variable will ever be added to co_freevars.
2157 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002158 if (free == 0)
2159 return 0;
2160 for (i = 0; i < free; ++i) {
2161 /* Bypass com_addop_varname because it will generate
2162 LOAD_DEREF but LOAD_CLOSURE is needed.
2163 */
2164 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2165 int arg, reftype;
2166
2167 /* Special case: If a class contains a method with a
2168 free variable that has the same name as a method,
2169 the name will be considered free *and* local in the
2170 class. It should be handled by the closure, as
2171 well as by the normal name loookup logic.
2172 */
2173 reftype = get_ref_type(c, PyString_AS_STRING(name));
2174 if (reftype == CELL)
2175 arg = com_lookup_arg(c->c_cellvars, name);
2176 else /* (reftype == FREE) */
2177 arg = com_lookup_arg(c->c_freevars, name);
2178 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002179 fprintf(stderr, "lookup %s in %s %d %d\n"
2180 "freevars of %s: %s\n",
2181 PyObject_REPR(name),
2182 c->c_name,
2183 reftype, arg,
2184 PyString_AS_STRING(co->co_name),
2185 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002186 Py_FatalError("com_make_closure()");
2187 }
2188 com_addoparg(c, LOAD_CLOSURE, arg);
2189
2190 }
2191 com_push(c, free);
2192 return 1;
2193}
2194
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002195static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002196com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002197{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002198 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002199 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002200 PyObject *co;
2201 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002202 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002203 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2204 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002205 co = (PyObject *) icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002206 if (co == NULL) {
2207 c->c_errors++;
2208 return;
2209 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002210 symtable_exit_scope(c->c_symtable);
Tim Peters1e542112001-02-23 22:23:53 +00002211 i = com_addconst(c, co);
2212 closure = com_make_closure(c, (PyCodeObject *)co);
2213 Py_DECREF(co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002214 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002215 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002216 if (closure)
2217 com_addoparg(c, MAKE_CLOSURE, ndefs);
2218 else
2219 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002220 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002221 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002222 else {
2223 int anchor = 0;
2224 int i = 0;
2225 for (;;) {
2226 com_and_test(c, CHILD(n, i));
2227 if ((i += 2) >= NCH(n))
2228 break;
2229 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2230 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002231 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002232 }
2233 if (anchor)
2234 com_backpatch(c, anchor);
2235 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002236}
2237
2238static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002239com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002240{
2241 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002242 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002243 com_node(c, CHILD(n, 0));
2244 }
2245 else {
2246 int i;
2247 int len;
2248 len = (NCH(n) + 1) / 2;
2249 for (i = 0; i < NCH(n); i += 2)
2250 com_node(c, CHILD(n, i));
2251 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002252 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002253 }
2254}
2255
2256
2257/* Begin of assignment compilation */
2258
Thomas Wouters434d0822000-08-24 20:11:32 +00002259
2260static void
2261com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2262{
2263 com_addbyte(c, DUP_TOP);
2264 com_push(c, 1);
2265 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002266 com_node(c, augn);
2267 com_addbyte(c, opcode);
2268 com_pop(c, 1);
2269 com_addbyte(c, ROT_TWO);
2270 com_addopname(c, STORE_ATTR, n);
2271 com_pop(c, 2);
2272}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002273
2274static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002275com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002276{
2277 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002278 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002279}
2280
2281static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002282com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002283{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002284 REQ(n, trailer);
2285 switch (TYPE(CHILD(n, 0))) {
2286 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002287 com_error(c, PyExc_SyntaxError,
2288 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002289 break;
2290 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002291 if (assigning > OP_APPLY)
2292 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2293 else
2294 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002295 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002296 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002297 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002298 break;
2299 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002300 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002301 }
2302}
2303
2304static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002305com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002306{
2307 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002308 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002309 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002310 if (assigning) {
2311 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002312 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002313 com_push(c, i-1);
2314 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002315 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002316 com_assign(c, CHILD(n, i), assigning, NULL);
2317}
2318
2319static void
2320com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2321{
2322 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002323 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002324 com_push(c, 1);
2325 com_node(c, augn);
2326 com_addbyte(c, opcode);
2327 com_pop(c, 1);
2328 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002329}
2330
2331static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002332com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002333{
2334 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002335 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002336 if (assigning)
2337 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002338}
2339
2340static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002341com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002342{
2343 /* Loop to avoid trivial recursion */
2344 for (;;) {
2345 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002346
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002347 case exprlist:
2348 case testlist:
2349 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002350 if (assigning > OP_APPLY) {
2351 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002352 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002353 return;
2354 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002355 com_assign_sequence(c, n, assigning);
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 test:
2362 case and_test:
2363 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002364 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002365 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002366 case xor_expr:
2367 case and_expr:
2368 case shift_expr:
2369 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002370 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002371 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002372 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002373 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002374 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002375 return;
2376 }
2377 n = CHILD(n, 0);
2378 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002379
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002380 case power: /* atom trailer* ('**' power)*
2381 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002382 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002383 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002384 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002385 return;
2386 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002387 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002388 int i;
2389 com_node(c, CHILD(n, 0));
2390 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002391 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002392 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002393 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002394 return;
2395 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002396 com_apply_trailer(c, CHILD(n, i));
2397 } /* NB i is still alive */
2398 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002399 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002400 return;
2401 }
2402 n = CHILD(n, 0);
2403 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002404
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002405 case atom:
2406 switch (TYPE(CHILD(n, 0))) {
2407 case LPAR:
2408 n = CHILD(n, 1);
2409 if (TYPE(n) == RPAR) {
2410 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002411 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002412 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002413 return;
2414 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002415 if (assigning > OP_APPLY) {
2416 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002417 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002418 return;
2419 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002420 break;
2421 case LSQB:
2422 n = CHILD(n, 1);
2423 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002424 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002425 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002426 return;
2427 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002428 if (assigning > OP_APPLY) {
2429 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002430 "augmented assign to list not possible");
2431 return;
2432 }
2433 if (NCH(n) > 1
2434 && TYPE(CHILD(n, 1)) == list_for) {
2435 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002436 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002437 return;
2438 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002439 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002440 return;
2441 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002442 if (assigning > OP_APPLY)
2443 com_augassign_name(c, CHILD(n, 0),
2444 assigning, augn);
2445 else
2446 com_assign_name(c, CHILD(n, 0),
2447 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002448 return;
2449 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002450 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002451 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002452 return;
2453 }
2454 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002455
2456 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002457 com_error(c, PyExc_SyntaxError,
2458 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002459 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002460
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002461 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002462 com_error(c, PyExc_SystemError,
2463 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002464 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002465
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002466 }
2467 }
2468}
Guido van Rossum7c531111997-03-11 18:42:21 +00002469
Thomas Wouters434d0822000-08-24 20:11:32 +00002470static void
2471com_augassign(struct compiling *c, node *n)
2472{
2473 int opcode;
2474
2475 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2476 case '+': opcode = INPLACE_ADD; break;
2477 case '-': opcode = INPLACE_SUBTRACT; break;
2478 case '/': opcode = INPLACE_DIVIDE; break;
2479 case '%': opcode = INPLACE_MODULO; break;
2480 case '<': opcode = INPLACE_LSHIFT; break;
2481 case '>': opcode = INPLACE_RSHIFT; break;
2482 case '&': opcode = INPLACE_AND; break;
2483 case '^': opcode = INPLACE_XOR; break;
2484 case '|': opcode = INPLACE_OR; break;
2485 case '*':
2486 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2487 opcode = INPLACE_POWER;
2488 else
2489 opcode = INPLACE_MULTIPLY;
2490 break;
2491 default:
2492 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2493 return;
2494 }
2495 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2496}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002497
2498static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002499com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002500{
Thomas Wouters434d0822000-08-24 20:11:32 +00002501 REQ(n, expr_stmt);
2502 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002503 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002504 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002505 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002506 if (NCH(n) == 1) {
2507 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002508 if (c->c_interactive)
2509 com_addbyte(c, PRINT_EXPR);
2510 else
2511 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002512 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002513 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002514 else if (TYPE(CHILD(n,1)) == augassign)
2515 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002516 else {
2517 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002518 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002519 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002520 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002521 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002522 com_push(c, 1);
2523 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002524 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002525 }
2526 }
2527}
2528
2529static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002530com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002531{
2532 int a = 0, b = 0;
2533 int i;
2534 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2535 /* Generate code like for
2536
2537 if __debug__:
2538 if not <test>:
2539 raise AssertionError [, <message>]
2540
2541 where <message> is the second test, if present.
2542 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002543
Guido van Rossum228d7f31997-04-02 05:24:36 +00002544 if (Py_OptimizeFlag)
2545 return;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002546 com_addop_name(c, LOAD_GLOBAL, "__debug__");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002547 com_push(c, 1);
2548 com_addfwref(c, JUMP_IF_FALSE, &a);
2549 com_addbyte(c, POP_TOP);
2550 com_pop(c, 1);
2551 com_node(c, CHILD(n, 1));
2552 com_addfwref(c, JUMP_IF_TRUE, &b);
2553 com_addbyte(c, POP_TOP);
2554 com_pop(c, 1);
2555 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002556 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002557 com_push(c, 1);
2558 i = NCH(n)/2; /* Either 2 or 4 */
2559 if (i > 1)
2560 com_node(c, CHILD(n, 3));
2561 com_addoparg(c, RAISE_VARARGS, i);
2562 com_pop(c, i);
2563 /* The interpreter does not fall through */
2564 /* All jumps converge here */
2565 com_backpatch(c, a);
2566 com_backpatch(c, b);
2567 com_addbyte(c, POP_TOP);
2568}
2569
2570static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002571com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002572{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002573 int i = 1;
2574 node* stream = NULL;
2575
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002576 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002577
2578 /* are we using the extended print form? */
2579 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2580 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002581 com_node(c, stream);
2582 /* stack: [...] => [... stream] */
2583 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002584 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2585 i = 4;
2586 else
2587 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002588 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002589 for (; i < NCH(n); i += 2) {
2590 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002591 com_addbyte(c, DUP_TOP);
2592 /* stack: [stream] => [stream stream] */
2593 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002594 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002595 /* stack: [stream stream] => [stream stream obj] */
2596 com_addbyte(c, ROT_TWO);
2597 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002598 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002599 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002600 com_pop(c, 2);
2601 }
2602 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002603 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002604 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002605 com_addbyte(c, PRINT_ITEM);
2606 com_pop(c, 1);
2607 }
2608 }
2609 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002610 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002611 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002612 /* must pop the extra stream object off the stack */
2613 com_addbyte(c, POP_TOP);
2614 /* stack: [... stream] => [...] */
2615 com_pop(c, 1);
2616 }
2617 }
2618 else {
2619 if (stream != NULL) {
2620 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002621 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002622 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002623 com_pop(c, 1);
2624 }
2625 else
2626 com_addbyte(c, PRINT_NEWLINE);
2627 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002628}
2629
2630static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002631com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002632{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002633 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002634 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002635 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002636 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002637 if (c->c_flags & CO_GENERATOR) {
2638 if (NCH(n) > 1) {
2639 com_error(c, PyExc_SyntaxError,
2640 "'return' with argument inside generator");
2641 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002642 }
2643 if (NCH(n) < 2) {
2644 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002645 com_push(c, 1);
2646 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002647 else
2648 com_node(c, CHILD(n, 1));
2649 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00002650 com_pop(c, 1);
2651}
2652
2653static void
2654com_yield_stmt(struct compiling *c, node *n)
2655{
Tim Peters95c80f82001-06-23 02:07:08 +00002656 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00002657 REQ(n, yield_stmt); /* 'yield' testlist */
2658 if (!c->c_infunction) {
2659 com_error(c, PyExc_SyntaxError, "'yield' outside function");
2660 }
Tim Peters95c80f82001-06-23 02:07:08 +00002661
2662 for (i = 0; i < c->c_nblocks; ++i) {
2663 if (c->c_block[i] == SETUP_FINALLY) {
2664 com_error(c, PyExc_SyntaxError,
2665 "'yield' not allowed in a 'try' block "
2666 "with a 'finally' clause");
2667 return;
2668 }
2669 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002670 com_node(c, CHILD(n, 1));
2671 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002672 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002673}
2674
2675static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002676com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002677{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002678 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002679 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2680 if (NCH(n) > 1) {
2681 com_node(c, CHILD(n, 1));
2682 if (NCH(n) > 3) {
2683 com_node(c, CHILD(n, 3));
2684 if (NCH(n) > 5)
2685 com_node(c, CHILD(n, 5));
2686 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002687 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002688 i = NCH(n)/2;
2689 com_addoparg(c, RAISE_VARARGS, i);
2690 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002691}
2692
2693static void
Thomas Wouters52152252000-08-17 22:55:00 +00002694com_from_import(struct compiling *c, node *n)
2695{
2696 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2697 com_push(c, 1);
2698 if (NCH(n) > 1) {
2699 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2700 com_error(c, PyExc_SyntaxError, "invalid syntax");
2701 return;
2702 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002703 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002704 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002705 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00002706 com_pop(c, 1);
2707}
2708
2709static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002710com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002711{
2712 int i;
2713 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002714 /* 'import' dotted_name (',' dotted_name)* |
2715 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002716 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00002717 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002718 /* 'from' dotted_name 'import' ... */
2719 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002720
2721 if (TYPE(CHILD(n, 3)) == STAR) {
2722 tup = Py_BuildValue("(s)", "*");
2723 } else {
2724 tup = PyTuple_New((NCH(n) - 2)/2);
2725 for (i = 3; i < NCH(n); i += 2) {
2726 PyTuple_SET_ITEM(tup, (i-3)/2,
2727 PyString_FromString(STR(
Jeremy Hylton4419ac12001-02-28 22:54:51 +00002728 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002729 }
2730 }
2731 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00002732 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002733 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002734 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00002735 if (TYPE(CHILD(n, 3)) == STAR)
2736 com_addbyte(c, IMPORT_STAR);
2737 else {
2738 for (i = 3; i < NCH(n); i += 2)
2739 com_from_import(c, CHILD(n, i));
2740 com_addbyte(c, POP_TOP);
2741 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002742 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002743 }
2744 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002745 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002746 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00002747 node *subn = CHILD(n, i);
2748 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002749 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002750 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002751 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00002752 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00002753 int j;
2754 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00002755 com_error(c, PyExc_SyntaxError,
2756 "invalid syntax");
2757 return;
2758 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00002759 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
2760 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002761 CHILD(CHILD(subn, 0),
2762 j));
2763 com_addop_varname(c, VAR_STORE,
2764 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002765 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002766 com_addop_varname(c, VAR_STORE,
2767 STR(CHILD(CHILD(subn, 0),
2768 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002769 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002770 }
2771 }
2772}
2773
2774static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002775com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002776{
2777 REQ(n, exec_stmt);
2778 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2779 com_node(c, CHILD(n, 1));
2780 if (NCH(n) >= 4)
2781 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002782 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002783 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002784 com_push(c, 1);
2785 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002786 if (NCH(n) >= 6)
2787 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002788 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002789 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002790 com_push(c, 1);
2791 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002792 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002793 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002794}
2795
Guido van Rossum7c531111997-03-11 18:42:21 +00002796static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002797is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002798{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002799 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002800 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002801 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00002802
2803 /* Label to avoid tail recursion */
2804 next:
2805 switch (TYPE(n)) {
2806
2807 case suite:
2808 if (NCH(n) == 1) {
2809 n = CHILD(n, 0);
2810 goto next;
2811 }
2812 /* Fall through */
2813 case file_input:
2814 for (i = 0; i < NCH(n); i++) {
2815 node *ch = CHILD(n, i);
2816 if (TYPE(ch) == stmt) {
2817 n = ch;
2818 goto next;
2819 }
2820 }
2821 break;
2822
2823 case stmt:
2824 case simple_stmt:
2825 case small_stmt:
2826 n = CHILD(n, 0);
2827 goto next;
2828
2829 case expr_stmt:
2830 case testlist:
2831 case test:
2832 case and_test:
2833 case not_test:
2834 case comparison:
2835 case expr:
2836 case xor_expr:
2837 case and_expr:
2838 case shift_expr:
2839 case arith_expr:
2840 case term:
2841 case factor:
2842 case power:
2843 case atom:
2844 if (NCH(n) == 1) {
2845 n = CHILD(n, 0);
2846 goto next;
2847 }
2848 break;
2849
2850 case NAME:
2851 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2852 return 1;
2853 break;
2854
2855 case NUMBER:
2856 v = parsenumber(c, STR(n));
2857 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002858 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002859 break;
2860 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002861 i = PyObject_IsTrue(v);
2862 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002863 return i == 0;
2864
2865 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002866 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002867 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002868 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002869 break;
2870 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002871 i = PyObject_IsTrue(v);
2872 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002873 return i == 0;
2874
2875 }
2876 return 0;
2877}
2878
Tim Peters08a898f2001-06-28 01:52:22 +00002879
2880/* Look under n for a return stmt with an expression.
2881 * This hack is used to find illegal returns under "if 0:" blocks in
2882 * functions already known to be generators (as determined by the symtable
2883 * pass).
2884 * Return the offending return node if found, else NULL.
2885 */
2886static node *
2887look_for_offending_return(node *n)
2888{
2889 int i;
2890
2891 for (i = 0; i < NCH(n); ++i) {
2892 node *kid = CHILD(n, i);
2893
2894 switch (TYPE(kid)) {
2895 case classdef:
2896 case funcdef:
2897 case lambdef:
2898 /* Stuff in nested functions & classes doesn't
2899 affect the code block we started in. */
2900 return NULL;
2901
2902 case return_stmt:
2903 if (NCH(kid) > 1)
2904 return kid;
2905 break;
2906
2907 default: {
2908 node *bad = look_for_offending_return(kid);
2909 if (bad != NULL)
2910 return bad;
2911 }
2912 }
2913 }
2914
2915 return NULL;
2916}
2917
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002918static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002919com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002920{
2921 int i;
2922 int anchor = 0;
2923 REQ(n, if_stmt);
2924 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2925 for (i = 0; i+3 < NCH(n); i+=4) {
2926 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002927 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00002928 if (is_constant_false(c, ch)) {
2929 /* We're going to skip this block. However, if this
2930 is a generator, we have to check the dead code
2931 anyway to make sure there aren't any return stmts
2932 with expressions, in the same scope. */
2933 if (c->c_flags & CO_GENERATOR) {
2934 node *p = look_for_offending_return(n);
2935 if (p != NULL) {
2936 int savelineno = c->c_lineno;
2937 c->c_lineno = p->n_lineno;
2938 com_error(c, PyExc_SyntaxError,
2939 "'return' with argument "
2940 "inside generator");
2941 c->c_lineno = savelineno;
2942 }
2943 }
Guido van Rossum7c531111997-03-11 18:42:21 +00002944 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00002945 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002946 if (i > 0)
2947 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002948 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002949 com_addfwref(c, JUMP_IF_FALSE, &a);
2950 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002951 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002952 com_node(c, CHILD(n, i+3));
2953 com_addfwref(c, JUMP_FORWARD, &anchor);
2954 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002955 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002956 com_addbyte(c, POP_TOP);
2957 }
2958 if (i+2 < NCH(n))
2959 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002960 if (anchor)
2961 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002962}
2963
2964static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002965com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002966{
2967 int break_anchor = 0;
2968 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002969 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002970 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2971 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002972 block_push(c, SETUP_LOOP);
2973 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002974 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002975 com_node(c, CHILD(n, 1));
2976 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2977 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002978 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002979 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002980 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002981 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002982 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2983 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002984 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002985 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002986 com_addbyte(c, POP_TOP);
2987 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002988 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002989 if (NCH(n) > 4)
2990 com_node(c, CHILD(n, 6));
2991 com_backpatch(c, break_anchor);
2992}
2993
2994static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002995com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002996{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002997 int break_anchor = 0;
2998 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002999 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003000 REQ(n, for_stmt);
3001 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3002 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003003 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003004 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003005 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003006 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003007 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003008 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003009 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003010 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003011 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003012 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003013 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003014 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3015 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003016 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003017 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003018 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003019 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003020 if (NCH(n) > 8)
3021 com_node(c, CHILD(n, 8));
3022 com_backpatch(c, break_anchor);
3023}
3024
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003025/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003026
3027 SETUP_FINALLY L
3028 <code for S>
3029 POP_BLOCK
3030 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003031 L: <code for Sf>
3032 END_FINALLY
3033
3034 The special instructions use the block stack. Each block
3035 stack entry contains the instruction that created it (here
3036 SETUP_FINALLY), the level of the value stack at the time the
3037 block stack entry was created, and a label (here L).
3038
3039 SETUP_FINALLY:
3040 Pushes the current value stack level and the label
3041 onto the block stack.
3042 POP_BLOCK:
3043 Pops en entry from the block stack, and pops the value
3044 stack until its level is the same as indicated on the
3045 block stack. (The label is ignored.)
3046 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003047 Pops a variable number of entries from the *value* stack
3048 and re-raises the exception they specify. The number of
3049 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003050
3051 The block stack is unwound when an exception is raised:
3052 when a SETUP_FINALLY entry is found, the exception is pushed
3053 onto the value stack (and the exception condition is cleared),
3054 and the interpreter jumps to the label gotten from the block
3055 stack.
3056
3057 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003058 (The contents of the value stack is shown in [], with the top
3059 at the right; 'tb' is trace-back info, 'val' the exception's
3060 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003061
3062 Value stack Label Instruction Argument
3063 [] SETUP_EXCEPT L1
3064 [] <code for S>
3065 [] POP_BLOCK
3066 [] JUMP_FORWARD L0
3067
Guido van Rossum3f5da241990-12-20 15:06:42 +00003068 [tb, val, exc] L1: DUP )
3069 [tb, val, exc, exc] <evaluate E1> )
3070 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3071 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3072 [tb, val, exc, 1] POP )
3073 [tb, val, exc] POP
3074 [tb, val] <assign to V1> (or POP if no V1)
3075 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003076 [] <code for S1>
3077 JUMP_FORWARD L0
3078
Guido van Rossum3f5da241990-12-20 15:06:42 +00003079 [tb, val, exc, 0] L2: POP
3080 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003081 .............................etc.......................
3082
Guido van Rossum3f5da241990-12-20 15:06:42 +00003083 [tb, val, exc, 0] Ln+1: POP
3084 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003085
3086 [] L0: <next statement>
3087
3088 Of course, parts are not generated if Vi or Ei is not present.
3089*/
3090
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003091static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003092com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003093{
3094 int except_anchor = 0;
3095 int end_anchor = 0;
3096 int else_anchor = 0;
3097 int i;
3098 node *ch;
3099
3100 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3101 block_push(c, SETUP_EXCEPT);
3102 com_node(c, CHILD(n, 2));
3103 com_addbyte(c, POP_BLOCK);
3104 block_pop(c, SETUP_EXCEPT);
3105 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3106 com_backpatch(c, except_anchor);
3107 for (i = 3;
3108 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3109 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003110 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003111 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003112 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003113 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003114 break;
3115 }
3116 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003117 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003118 com_addoparg(c, SET_LINENO, ch->n_lineno);
3119 if (NCH(ch) > 1) {
3120 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003121 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003122 com_node(c, CHILD(ch, 1));
3123 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003124 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003125 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3126 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003127 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003128 }
3129 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003130 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003131 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003132 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003133 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003134 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003135 com_pop(c, 1);
3136 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003137 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003138 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003139 com_node(c, CHILD(n, i+2));
3140 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3141 if (except_anchor) {
3142 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003143 /* We come in with [tb, val, exc, 0] on the
3144 stack; one pop and it's the same as
3145 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003146 com_addbyte(c, POP_TOP);
3147 }
3148 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003149 /* We actually come in here with [tb, val, exc] but the
3150 END_FINALLY will zap those and jump around.
3151 The c_stacklevel does not reflect them so we need not pop
3152 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003153 com_addbyte(c, END_FINALLY);
3154 com_backpatch(c, else_anchor);
3155 if (i < NCH(n))
3156 com_node(c, CHILD(n, i+2));
3157 com_backpatch(c, end_anchor);
3158}
3159
3160static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003161com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003162{
3163 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003164 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003165
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003166 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3167 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003168 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003169 com_addbyte(c, POP_BLOCK);
3170 block_pop(c, SETUP_FINALLY);
3171 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003172 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003173 /* While the generated code pushes only one item,
3174 the try-finally handling can enter here with
3175 up to three items. OK, here are the details:
3176 3 for an exception, 2 for RETURN, 1 for BREAK. */
3177 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003178 com_backpatch(c, finally_anchor);
3179 ch = CHILD(n, NCH(n)-1);
3180 com_addoparg(c, SET_LINENO, ch->n_lineno);
3181 com_node(c, ch);
3182 com_addbyte(c, END_FINALLY);
3183 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003184 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003185}
3186
3187static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003188com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003189{
3190 REQ(n, try_stmt);
3191 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3192 | 'try' ':' suite 'finally' ':' suite */
3193 if (TYPE(CHILD(n, 3)) != except_clause)
3194 com_try_finally(c, n);
3195 else
3196 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003197}
3198
Guido van Rossum8b993a91997-01-17 21:04:03 +00003199static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003200get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003201{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003202 int i;
3203
Guido van Rossum8b993a91997-01-17 21:04:03 +00003204 /* Label to avoid tail recursion */
3205 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003206 switch (TYPE(n)) {
3207
3208 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003209 if (NCH(n) == 1) {
3210 n = CHILD(n, 0);
3211 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003212 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003213 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003214 case file_input:
3215 for (i = 0; i < NCH(n); i++) {
3216 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003217 if (TYPE(ch) == stmt) {
3218 n = ch;
3219 goto next;
3220 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003221 }
3222 break;
3223
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003224 case stmt:
3225 case simple_stmt:
3226 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003227 n = CHILD(n, 0);
3228 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003229
3230 case expr_stmt:
3231 case testlist:
3232 case test:
3233 case and_test:
3234 case not_test:
3235 case comparison:
3236 case expr:
3237 case xor_expr:
3238 case and_expr:
3239 case shift_expr:
3240 case arith_expr:
3241 case term:
3242 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003243 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003244 if (NCH(n) == 1) {
3245 n = CHILD(n, 0);
3246 goto next;
3247 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003248 break;
3249
3250 case atom:
3251 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003252 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003253 break;
3254
3255 }
3256 return NULL;
3257}
3258
Guido van Rossum79f25d91997-04-29 20:08:16 +00003259static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003260get_docstring(node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003261{
Guido van Rossum541563e1999-01-28 15:08:09 +00003262 /* Don't generate doc-strings if run with -OO */
3263 if (Py_OptimizeFlag > 1)
3264 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003265 n = get_rawdocstring(n);
3266 if (n == NULL)
3267 return NULL;
3268 return parsestrplus(n);
3269}
3270
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003271static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003272com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003273{
3274 REQ(n, suite);
3275 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3276 if (NCH(n) == 1) {
3277 com_node(c, CHILD(n, 0));
3278 }
3279 else {
3280 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003281 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003282 node *ch = CHILD(n, i);
3283 if (TYPE(ch) == stmt)
3284 com_node(c, ch);
3285 }
3286 }
3287}
3288
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003289/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003290static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003291com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003292{
3293 int i = c->c_nblocks;
3294 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3295 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3296 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003297 else if (i <= 0) {
3298 /* at the outer level */
3299 com_error(c, PyExc_SyntaxError,
3300 "'continue' not properly in loop");
3301 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003302 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003303 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003304 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003305 if (c->c_block[j] == SETUP_LOOP)
3306 break;
3307 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003308 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003309 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003310 for (; i > j; --i) {
3311 if (c->c_block[i] == SETUP_EXCEPT ||
3312 c->c_block[i] == SETUP_FINALLY) {
3313 com_addoparg(c, CONTINUE_LOOP,
3314 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003315 return;
3316 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003317 if (c->c_block[i] == END_FINALLY) {
3318 com_error(c, PyExc_SyntaxError,
3319 "'continue' not supported inside 'finally' clause");
3320 return;
3321 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003322 }
3323 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003324 com_error(c, PyExc_SyntaxError,
3325 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003326 }
3327 /* XXX Could allow it inside a 'finally' clause
3328 XXX if we could pop the exception still on the stack */
3329}
3330
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003331static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003332com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003333{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003334 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003335 if (TYPE(n) == lambdef) {
3336 /* lambdef: 'lambda' [varargslist] ':' test */
3337 n = CHILD(n, 1);
3338 }
3339 else {
3340 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3341 n = CHILD(n, 2);
3342 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3343 n = CHILD(n, 1);
3344 }
3345 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003346 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003347 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003348 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003349 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3350 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003351 nargs = 0;
3352 ndefs = 0;
3353 for (i = 0; i < nch; i++) {
3354 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003355 if (TYPE(CHILD(n, i)) == STAR ||
3356 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003357 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003358 nargs++;
3359 i++;
3360 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003361 t = RPAR; /* Anything except EQUAL or COMMA */
3362 else
3363 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003364 if (t == EQUAL) {
3365 i++;
3366 ndefs++;
3367 com_node(c, CHILD(n, i));
3368 i++;
3369 if (i >= nch)
3370 break;
3371 t = TYPE(CHILD(n, i));
3372 }
3373 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003374 /* Treat "(a=1, b)" as an error */
3375 if (ndefs)
3376 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003377 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003378 }
3379 if (t != COMMA)
3380 break;
3381 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003382 return ndefs;
3383}
3384
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003385static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003386com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003387{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003388 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003389 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003390 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003391 ndefs = com_argdefs(c, n);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003392 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3393 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003394 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003395 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003396 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003397 c->c_errors++;
3398 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003399 int closure = com_make_closure(c, (PyCodeObject *)co);
3400 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003401 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003402 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003403 if (closure)
3404 com_addoparg(c, MAKE_CLOSURE, ndefs);
3405 else
3406 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003407 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003408 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003409 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003410 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003411 }
3412}
3413
3414static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003415com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003416{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003417 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003418 REQ(n, testlist);
3419 /* testlist: test (',' test)* [','] */
3420 for (i = 0; i < NCH(n); i += 2)
3421 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003422 i = (NCH(n)+1) / 2;
3423 com_addoparg(c, BUILD_TUPLE, i);
3424 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003425}
3426
3427static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003428com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003429{
Guido van Rossum25831651993-05-19 14:50:45 +00003430 int i;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003431 PyObject *co, *v;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003432 char *name;
3433
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003434 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003435 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003436 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003437 c->c_errors++;
3438 return;
3439 }
3440 /* Push the class name on the stack */
3441 i = com_addconst(c, v);
3442 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003443 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003444 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003445 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003446 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003447 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003448 com_push(c, 1);
3449 }
Guido van Rossum25831651993-05-19 14:50:45 +00003450 else
3451 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003452 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003453 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003454 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003455 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003456 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003457 c->c_errors++;
3458 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003459 int closure = com_make_closure(c, (PyCodeObject *)co);
3460 i = com_addconst(c, co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003461 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003462 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003463 if (closure)
3464 com_addoparg(c, MAKE_CLOSURE, 0);
3465 else
3466 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003467 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003468 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003469 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003470 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003471 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003472 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003473}
3474
3475static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003476com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003477{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003478 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003479 if (c->c_errors)
3480 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003481 switch (TYPE(n)) {
3482
3483 /* Definition nodes */
3484
3485 case funcdef:
3486 com_funcdef(c, n);
3487 break;
3488 case classdef:
3489 com_classdef(c, n);
3490 break;
3491
3492 /* Trivial parse tree nodes */
3493
3494 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003495 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003496 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003497 n = CHILD(n, 0);
3498 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003499
3500 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003501 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
3502 com_addoparg(c, SET_LINENO, n->n_lineno);
3503 {
3504 int i;
3505 for (i = 0; i < NCH(n)-1; i += 2)
3506 com_node(c, CHILD(n, i));
3507 }
3508 break;
3509
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003510 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003511 com_addoparg(c, SET_LINENO, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003512 n = CHILD(n, 0);
3513 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003514
3515 /* Statement nodes */
3516
3517 case expr_stmt:
3518 com_expr_stmt(c, n);
3519 break;
3520 case print_stmt:
3521 com_print_stmt(c, n);
3522 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003523 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003524 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003525 break;
3526 case pass_stmt:
3527 break;
3528 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003529 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003530 com_error(c, PyExc_SyntaxError,
3531 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003532 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003533 com_addbyte(c, BREAK_LOOP);
3534 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003535 case continue_stmt:
3536 com_continue_stmt(c, n);
3537 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003538 case return_stmt:
3539 com_return_stmt(c, n);
3540 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00003541 case yield_stmt:
3542 com_yield_stmt(c, n);
3543 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003544 case raise_stmt:
3545 com_raise_stmt(c, n);
3546 break;
3547 case import_stmt:
3548 com_import_stmt(c, n);
3549 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003550 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003551 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003552 case exec_stmt:
3553 com_exec_stmt(c, n);
3554 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003555 case assert_stmt:
3556 com_assert_stmt(c, n);
3557 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003558 case if_stmt:
3559 com_if_stmt(c, n);
3560 break;
3561 case while_stmt:
3562 com_while_stmt(c, n);
3563 break;
3564 case for_stmt:
3565 com_for_stmt(c, n);
3566 break;
3567 case try_stmt:
3568 com_try_stmt(c, n);
3569 break;
3570 case suite:
3571 com_suite(c, n);
3572 break;
3573
3574 /* Expression nodes */
3575
3576 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003577 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003578 break;
3579 case test:
3580 com_test(c, n);
3581 break;
3582 case and_test:
3583 com_and_test(c, n);
3584 break;
3585 case not_test:
3586 com_not_test(c, n);
3587 break;
3588 case comparison:
3589 com_comparison(c, n);
3590 break;
3591 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003592 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003593 break;
3594 case expr:
3595 com_expr(c, n);
3596 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003597 case xor_expr:
3598 com_xor_expr(c, n);
3599 break;
3600 case and_expr:
3601 com_and_expr(c, n);
3602 break;
3603 case shift_expr:
3604 com_shift_expr(c, n);
3605 break;
3606 case arith_expr:
3607 com_arith_expr(c, n);
3608 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003609 case term:
3610 com_term(c, n);
3611 break;
3612 case factor:
3613 com_factor(c, n);
3614 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003615 case power:
3616 com_power(c, n);
3617 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003618 case atom:
3619 com_atom(c, n);
3620 break;
3621
3622 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003623 com_error(c, PyExc_SystemError,
3624 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003625 }
3626}
3627
Tim Petersdbd9ba62000-07-09 03:09:57 +00003628static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003629
3630static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003631com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003632{
3633 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3634 if (TYPE(CHILD(n, 0)) == LPAR)
3635 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003636 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003637 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003638 com_pop(c, 1);
3639 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003640}
3641
3642static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003643com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003644{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003645 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003646 if (NCH(n) == 1) {
3647 com_fpdef(c, CHILD(n, 0));
3648 }
3649 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003650 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003651 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003652 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003653 for (i = 0; i < NCH(n); i += 2)
3654 com_fpdef(c, CHILD(n, i));
3655 }
3656}
3657
3658static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003659com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003660{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003661 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003662 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003663 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003664 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003665 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003666 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003667 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003668 /* Enter all arguments in table of locals */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003669 for (i = 0, narg = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003670 node *ch = CHILD(n, i);
3671 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003672 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003673 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003674 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3675 fp = CHILD(ch, 0);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00003676 if (TYPE(fp) != NAME) {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003677 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003678 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003679 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003680 narg++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003681 /* all name updates handled by symtable */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003682 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003683 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003684 ch = CHILD(n, i);
3685 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003686 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003687 else
3688 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003689 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003690 if (complex) {
3691 /* Generate code for complex arguments only after
3692 having counted the simple arguments */
3693 int ilocal = 0;
3694 for (i = 0; i < nch; i++) {
3695 node *ch = CHILD(n, i);
3696 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003697 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003698 break;
3699 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3700 fp = CHILD(ch, 0);
3701 if (TYPE(fp) != NAME) {
3702 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003703 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003704 com_fpdef(c, ch);
3705 }
3706 ilocal++;
3707 if (++i >= nch)
3708 break;
3709 ch = CHILD(n, i);
3710 if (TYPE(ch) == EQUAL)
3711 i += 2;
3712 else
3713 REQ(ch, COMMA);
3714 }
3715 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003716}
3717
3718static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003719com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003720{
3721 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003722 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003723 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003724 doc = get_docstring(n);
3725 if (doc != NULL) {
3726 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003727 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003728 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003729 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003730 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003731 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003732 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003733 for (i = 0; i < NCH(n); i++) {
3734 node *ch = CHILD(n, i);
3735 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3736 com_node(c, ch);
3737 }
3738}
3739
3740/* Top-level compile-node interface */
3741
3742static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003743compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003744{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003745 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003746 node *ch;
3747 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003748 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003749 doc = get_docstring(CHILD(n, 4));
3750 if (doc != NULL) {
3751 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003752 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003753 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003754 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003755 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003756 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3757 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003758 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003759 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003760 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003761 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003762 c->c_infunction = 0;
Tim Petersad1a18b2001-06-23 06:19:16 +00003763 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
3764 com_push(c, 1);
3765 com_addbyte(c, RETURN_VALUE);
3766 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003767}
3768
3769static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003770compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003771{
Guido van Rossum590baa41993-11-30 13:40:46 +00003772 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003773 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003774 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003775
3776 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003777 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003778 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003779 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003780 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003781 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003782 else
3783 ch = CHILD(n, 2);
3784 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003785 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003786 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003787}
3788
3789static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003790compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003791{
3792 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003793 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003794 REQ(n, classdef);
3795 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3796 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003797 c->c_private = c->c_name;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003798 ch = CHILD(n, NCH(n)-1); /* The suite */
3799 doc = get_docstring(ch);
3800 if (doc != NULL) {
3801 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003802 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003803 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003804 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003805 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003806 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003807 }
3808 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003809 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003810 com_node(c, ch);
3811 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003812 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003813 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003814 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003815}
3816
3817static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003818compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003819{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003820 com_addoparg(c, SET_LINENO, n->n_lineno);
3821
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003822 switch (TYPE(n)) {
3823
Guido van Rossum4c417781991-01-21 16:09:22 +00003824 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003825 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003826 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003827 n = CHILD(n, 0);
3828 if (TYPE(n) != NEWLINE)
3829 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003830 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003831 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003832 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003833 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003834 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003835 break;
3836
Guido van Rossum4c417781991-01-21 16:09:22 +00003837 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003838 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003839 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003840 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003841 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003842 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003843 break;
3844
Guido van Rossum590baa41993-11-30 13:40:46 +00003845 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003846 com_node(c, CHILD(n, 0));
3847 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003848 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003849 break;
3850
Guido van Rossum590baa41993-11-30 13:40:46 +00003851 case lambdef: /* anonymous function definition */
3852 compile_lambdef(c, n);
3853 break;
3854
Guido van Rossum4c417781991-01-21 16:09:22 +00003855 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003856 compile_funcdef(c, n);
3857 break;
3858
Guido van Rossum4c417781991-01-21 16:09:22 +00003859 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003860 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003861 break;
3862
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003863 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003864 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003865 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003866 }
3867}
3868
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003869static PyObject *
3870dict_keys_inorder(PyObject *dict, int offset)
3871{
3872 PyObject *tuple, *k, *v;
3873 int i, pos = 0, size = PyDict_Size(dict);
3874
3875 tuple = PyTuple_New(size);
3876 if (tuple == NULL)
3877 return NULL;
3878 while (PyDict_Next(dict, &pos, &k, &v)) {
3879 i = PyInt_AS_LONG(v);
3880 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00003881 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003882 PyTuple_SET_ITEM(tuple, i - offset, k);
3883 }
3884 return tuple;
3885}
3886
Guido van Rossum79f25d91997-04-29 20:08:16 +00003887PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003888PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003889{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003890 return PyNode_CompileFlags(n, filename, NULL);
3891}
3892
3893PyCodeObject *
3894PyNode_CompileFlags(node *n, char *filename, PyCompilerFlags *flags)
3895{
3896 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003897}
3898
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003899struct symtable *
3900PyNode_CompileSymtable(node *n, char *filename)
3901{
3902 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003903 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003904
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003905 ff = PyNode_Future(n, filename);
3906 if (ff == NULL)
3907 return NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003908 st = symtable_init();
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003909 if (st == NULL)
3910 return NULL;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003911 st->st_future = ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003912 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003913 if (st->st_errors > 0)
3914 goto fail;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003915 symtable_node(st, n);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003916 if (st->st_errors > 0)
3917 goto fail;
3918
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003919 return st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003920 fail:
3921 PyMem_Free((void *)ff);
3922 st->st_future = NULL;
3923 PySymtable_Free(st);
3924 return NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003925}
3926
Guido van Rossum79f25d91997-04-29 20:08:16 +00003927static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003928icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003929{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003930 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003931}
3932
Guido van Rossum79f25d91997-04-29 20:08:16 +00003933static PyCodeObject *
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003934jcompile(node *n, char *filename, struct compiling *base,
3935 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003936{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003937 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003938 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003939 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003940 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003941 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003942 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003943 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003944 /* c_symtable still points to parent's symbols */
3945 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003946 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003947 sc.c_nested = 1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003948 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003949 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00003950 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003951 if (sc.c_future == NULL) {
3952 com_free(&sc);
3953 return NULL;
3954 }
3955 if (flags) {
Tim Peters5ba58662001-07-16 02:29:45 +00003956 if (flags->cf_flags & PyCF_NESTED_SCOPES)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003957 sc.c_future->ff_nested_scopes = 1;
3958 else if (sc.c_future->ff_nested_scopes)
Tim Peters5ba58662001-07-16 02:29:45 +00003959 flags->cf_flags |= PyCF_NESTED_SCOPES;
3960
3961 if (flags->cf_flags & PyCF_GENERATORS)
3962 sc.c_future->ff_generators = 1;
3963 else if (sc.c_future->ff_generators)
3964 flags->cf_flags |= PyCF_GENERATORS;
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003965 }
3966 if (symtable_build(&sc, n) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003967 com_free(&sc);
3968 return NULL;
3969 }
3970 }
3971 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003972 if (symtable_load_symbols(&sc) < 0) {
3973 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003974 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003975 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003976 compile_node(&sc, n);
3977 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00003978 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003979 PyObject *consts, *names, *varnames, *filename, *name,
3980 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003981 consts = PyList_AsTuple(sc.c_consts);
3982 names = PyList_AsTuple(sc.c_names);
3983 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003984 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
3985 freevars = dict_keys_inorder(sc.c_freevars,
3986 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003987 filename = PyString_InternFromString(sc.c_filename);
3988 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003989 if (!PyErr_Occurred())
3990 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003991 sc.c_nlocals,
3992 sc.c_maxstacklevel,
3993 sc.c_flags,
3994 sc.c_code,
3995 consts,
3996 names,
3997 varnames,
3998 freevars,
3999 cellvars,
4000 filename,
4001 name,
4002 sc.c_firstlineno,
4003 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004004 Py_XDECREF(consts);
4005 Py_XDECREF(names);
4006 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004007 Py_XDECREF(freevars);
4008 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004009 Py_XDECREF(filename);
4010 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004011 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004012 else if (!PyErr_Occurred()) {
4013 /* This could happen if someone called PyErr_Clear() after an
4014 error was reported above. That's not supposed to happen,
4015 but I just plugged one case and I'm not sure there can't be
4016 others. In that case, raise SystemError so that at least
4017 it gets reported instead dumping core. */
4018 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4019 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004020 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004021 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004022 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004023 sc.c_symtable = NULL;
4024 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004025 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004026 return co;
4027}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004028
4029int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004030PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004031{
4032 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004033 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004034 int line = co->co_firstlineno;
4035 int addr = 0;
4036 while (--size >= 0) {
4037 addr += *p++;
4038 if (addr > addrq)
4039 break;
4040 line += *p++;
4041 }
4042 return line;
4043}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004044
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004045/* The test for LOCAL must come before the test for FREE in order to
4046 handle classes where name is both local and free. The local var is
4047 a method and the free var is a free var referenced within a method.
4048*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004049
4050static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004051get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004052{
4053 PyObject *v;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004054 if (c->c_symtable->st_nested_scopes) {
4055 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4056 return CELL;
4057 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4058 return LOCAL;
4059 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4060 return FREE;
4061 v = PyDict_GetItemString(c->c_globals, name);
4062 if (v) {
4063 if (v == Py_None)
4064 return GLOBAL_EXPLICIT;
4065 else {
4066 return GLOBAL_IMPLICIT;
4067 }
4068 }
4069 } else {
4070 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4071 return LOCAL;
4072 v = PyDict_GetItemString(c->c_globals, name);
4073 if (v) {
4074 if (v == Py_None)
4075 return GLOBAL_EXPLICIT;
4076 else {
4077 return GLOBAL_IMPLICIT;
4078 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004079 }
4080 }
4081 {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004082 char buf[350];
4083 sprintf(buf,
Jeremy Hylton51257732001-03-01 00:42:55 +00004084 "unknown scope for %.100s in %.100s(%s) "
4085 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
Jeremy Hylton483638c2001-02-01 20:20:45 +00004086 name, c->c_name,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004087 PyObject_REPR(c->c_symtable->st_cur->ste_id),
Jeremy Hylton51257732001-03-01 00:42:55 +00004088 c->c_filename,
4089 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4090 PyObject_REPR(c->c_locals),
4091 PyObject_REPR(c->c_globals)
4092 );
4093
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004094 Py_FatalError(buf);
4095 }
4096 return -1; /* can't get here */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004097}
4098
Guido van Rossum207fda62001-03-02 03:30:41 +00004099/* Helper functions to issue warnings */
4100
4101static int
4102issue_warning(char *msg, char *filename, int lineno)
4103{
4104 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4105 lineno, NULL, NULL) < 0) {
4106 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4107 PyErr_SetString(PyExc_SyntaxError, msg);
4108 PyErr_SyntaxLocation(filename, lineno);
4109 }
4110 return -1;
4111 }
4112 return 0;
4113}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004114
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004115static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004116symtable_warn(struct symtable *st, char *msg)
4117{
Guido van Rossum207fda62001-03-02 03:30:41 +00004118 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004119 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004120 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004121 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004122 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004123}
4124
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004125/* Helper function for setting lineno and filename */
4126
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004127static int
4128symtable_build(struct compiling *c, node *n)
4129{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004130 if ((c->c_symtable = symtable_init()) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004131 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004132 c->c_symtable->st_future = c->c_future;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004133 if (c->c_future->ff_nested_scopes)
4134 c->c_symtable->st_nested_scopes = 1;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004135 c->c_symtable->st_filename = c->c_filename;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004136 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
4137 if (c->c_symtable->st_errors > 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004138 return -1;
4139 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004140 if (c->c_symtable->st_errors > 0)
4141 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004142 /* reset for second pass */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004143 c->c_symtable->st_nscopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004144 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004145 return 0;
4146}
4147
4148static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004149symtable_init_compiling_symbols(struct compiling *c)
4150{
4151 PyObject *varnames;
4152
4153 varnames = c->c_symtable->st_cur->ste_varnames;
4154 if (varnames == NULL) {
4155 varnames = PyList_New(0);
4156 if (varnames == NULL)
4157 return -1;
4158 c->c_symtable->st_cur->ste_varnames = varnames;
4159 Py_INCREF(varnames);
4160 } else
4161 Py_INCREF(varnames);
4162 c->c_varnames = varnames;
4163
4164 c->c_globals = PyDict_New();
4165 if (c->c_globals == NULL)
4166 return -1;
4167 c->c_freevars = PyDict_New();
4168 if (c->c_freevars == NULL)
4169 return -1;
4170 c->c_cellvars = PyDict_New();
4171 if (c->c_cellvars == NULL)
4172 return -1;
4173 return 0;
4174}
4175
4176struct symbol_info {
4177 int si_nlocals;
4178 int si_ncells;
4179 int si_nfrees;
4180 int si_nimplicit;
4181};
4182
4183static void
4184symtable_init_info(struct symbol_info *si)
4185{
4186 si->si_nlocals = 0;
4187 si->si_ncells = 0;
4188 si->si_nfrees = 0;
4189 si->si_nimplicit = 0;
4190}
4191
4192static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004193symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004194 struct symbol_info *si)
4195{
4196 PyObject *dict, *v;
4197
4198 /* Seperate logic for DEF_FREE. If it occurs in a function,
4199 it indicates a local that we must allocate storage for (a
4200 cell var). If it occurs in a class, then the class has a
4201 method and a free variable with the same name.
4202 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004203 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004204 /* If it isn't declared locally, it can't be a cell. */
4205 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4206 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004207 v = PyInt_FromLong(si->si_ncells++);
4208 dict = c->c_cellvars;
4209 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004210 /* If it is free anyway, then there is no need to do
4211 anything here.
4212 */
4213 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00004214 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004215 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004216 v = PyInt_FromLong(si->si_nfrees++);
4217 dict = c->c_freevars;
4218 }
4219 if (v == NULL)
4220 return -1;
4221 if (PyDict_SetItem(dict, name, v) < 0) {
4222 Py_DECREF(v);
4223 return -1;
4224 }
4225 Py_DECREF(v);
4226 return 0;
4227}
4228
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004229/* If a variable is a cell and an argument, make sure that appears in
4230 co_cellvars before any variable to its right in varnames.
4231*/
4232
4233
4234static int
4235symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4236 PyObject *varnames, int flags)
4237{
4238 PyObject *v, *w, *d, *list = NULL;
4239 int i, pos;
4240
4241 if (flags & CO_VARARGS)
4242 argcount++;
4243 if (flags & CO_VARKEYWORDS)
4244 argcount++;
4245 for (i = argcount; --i >= 0; ) {
4246 v = PyList_GET_ITEM(varnames, i);
4247 if (PyDict_GetItem(*cellvars, v)) {
4248 if (list == NULL) {
4249 list = PyList_New(1);
4250 if (list == NULL)
4251 return -1;
4252 PyList_SET_ITEM(list, 0, v);
4253 Py_INCREF(v);
4254 } else
4255 PyList_Insert(list, 0, v);
4256 }
4257 }
4258 if (list == NULL || PyList_GET_SIZE(list) == 0)
4259 return 0;
4260 /* There are cellvars that are also arguments. Create a dict
4261 to replace cellvars and put the args at the front.
4262 */
4263 d = PyDict_New();
4264 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
4265 v = PyInt_FromLong(i);
4266 if (v == NULL)
4267 goto fail;
4268 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
4269 goto fail;
4270 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
4271 goto fail;
4272 }
4273 pos = 0;
4274 i = PyList_GET_SIZE(list);
4275 Py_DECREF(list);
4276 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
4277 w = PyInt_FromLong(i++); /* don't care about the old key */
4278 if (PyDict_SetItem(d, v, w) < 0) {
4279 Py_DECREF(w);
4280 goto fail;
4281 }
4282 Py_DECREF(w);
4283 }
4284 Py_DECREF(*cellvars);
4285 *cellvars = d;
4286 return 1;
4287 fail:
4288 Py_DECREF(d);
4289 return -1;
4290}
4291
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004292static int
4293symtable_freevar_offsets(PyObject *freevars, int offset)
4294{
4295 PyObject *name, *v;
4296 int pos;
4297
4298 /* The cell vars are the first elements of the closure,
4299 followed by the free vars. Update the offsets in
4300 c_freevars to account for number of cellvars. */
4301 pos = 0;
4302 while (PyDict_Next(freevars, &pos, &name, &v)) {
4303 int i = PyInt_AS_LONG(v) + offset;
4304 PyObject *o = PyInt_FromLong(i);
4305 if (o == NULL)
4306 return -1;
4307 if (PyDict_SetItem(freevars, name, o) < 0) {
4308 Py_DECREF(o);
4309 return -1;
4310 }
4311 Py_DECREF(o);
4312 }
4313 return 0;
4314}
4315
4316static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004317symtable_check_unoptimized(struct compiling *c,
4318 PySymtableEntryObject *ste,
4319 struct symbol_info *si)
4320{
4321 char buf[300];
4322
4323 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4324 || (ste->ste_nested && si->si_nimplicit)))
4325 return 0;
4326
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004327#define ILLEGAL_CONTAINS "contains a nested function with free variables"
4328
4329#define ILLEGAL_IS "is a nested function"
4330
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004331#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004332"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004333
4334#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004335"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004336
4337#define ILLEGAL_EXEC_AND_IMPORT_STAR \
4338"function '%.100s' uses import * and bare exec, which are illegal" \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004339"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004340
4341 /* XXX perhaps the linenos for these opt-breaking statements
4342 should be stored so the exception can point to them. */
4343
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004344 if (ste->ste_child_free) {
4345 if (ste->ste_optimized == OPT_IMPORT_STAR)
4346 sprintf(buf, ILLEGAL_IMPORT_STAR,
4347 PyString_AS_STRING(ste->ste_name),
4348 ILLEGAL_CONTAINS);
4349 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
4350 sprintf(buf, ILLEGAL_BARE_EXEC,
4351 PyString_AS_STRING(ste->ste_name),
4352 ILLEGAL_CONTAINS);
4353 else {
4354 sprintf(buf, ILLEGAL_EXEC_AND_IMPORT_STAR,
4355 PyString_AS_STRING(ste->ste_name),
4356 ILLEGAL_CONTAINS);
4357 }
4358 } else {
4359 if (ste->ste_optimized == OPT_IMPORT_STAR)
4360 sprintf(buf, ILLEGAL_IMPORT_STAR,
4361 PyString_AS_STRING(ste->ste_name),
4362 ILLEGAL_IS);
4363 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
4364 sprintf(buf, ILLEGAL_BARE_EXEC,
4365 PyString_AS_STRING(ste->ste_name),
4366 ILLEGAL_IS);
4367 else {
4368 sprintf(buf, ILLEGAL_EXEC_AND_IMPORT_STAR,
4369 PyString_AS_STRING(ste->ste_name),
4370 ILLEGAL_IS);
4371 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004372 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004373
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004374 if (c->c_symtable->st_nested_scopes) {
4375 PyErr_SetString(PyExc_SyntaxError, buf);
4376 PyErr_SyntaxLocation(c->c_symtable->st_filename,
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00004377 ste->ste_opt_lineno);
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004378 return -1;
Guido van Rossum207fda62001-03-02 03:30:41 +00004379 }
4380 else {
4381 return issue_warning(buf, c->c_filename, ste->ste_lineno);
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004382 }
4383 return 0;
4384}
4385
4386static int
4387symtable_check_shadow(struct symtable *st, PyObject *name, int flags)
4388{
4389 char buf[500];
4390 PyObject *children, *v;
Jeremy Hyltonc1761322001-02-28 23:44:45 +00004391 PySymtableEntryObject *child = NULL;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004392 int i;
4393
4394 if (!(flags & DEF_BOUND))
4395 return 0;
Jeremy Hylton9c901052001-05-08 04:12:34 +00004396
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004397 /* The semantics of this code will change with nested scopes.
4398 It is defined in the current scope and referenced in a
4399 child scope. Under the old rules, the child will see a
4400 global. Under the new rules, the child will see the
4401 binding in the current scope.
4402 */
4403
4404 /* Find name of child function that has free variable */
4405 children = st->st_cur->ste_children;
4406 for (i = 0; i < PyList_GET_SIZE(children); i++) {
4407 int cflags;
4408 child = (PySymtableEntryObject *)PyList_GET_ITEM(children, i);
4409 v = PyDict_GetItem(child->ste_symbols, name);
4410 if (v == NULL)
4411 continue;
4412 cflags = PyInt_AS_LONG(v);
4413 if (!(cflags & DEF_BOUND))
4414 break;
4415 }
Jeremy Hyltonc1761322001-02-28 23:44:45 +00004416
4417 assert(child != NULL);
4418
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004419 sprintf(buf, "local name '%.100s' in '%.100s' shadows "
4420 "use of '%.100s' as global in nested scope '%.100s'",
4421 PyString_AS_STRING(name),
4422 PyString_AS_STRING(st->st_cur->ste_name),
4423 PyString_AS_STRING(name),
4424 PyString_AS_STRING(child->ste_name)
4425 );
4426
4427 return symtable_warn(st, buf);
4428}
4429
4430static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004431symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4432 struct symbol_info *si)
4433{
Tim Peters5ba58662001-07-16 02:29:45 +00004434 if (c->c_future) {
4435 if (c->c_future->ff_nested_scopes)
4436 c->c_flags |= CO_NESTED;
4437 if (c->c_future->ff_generators)
4438 c->c_flags |= CO_GENERATOR_ALLOWED;
4439 }
Tim Peters5ca576e2001-06-18 22:08:13 +00004440 if (ste->ste_generator)
4441 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004442 if (ste->ste_type != TYPE_MODULE)
4443 c->c_flags |= CO_NEWLOCALS;
4444 if (ste->ste_type == TYPE_FUNCTION) {
4445 c->c_nlocals = si->si_nlocals;
4446 if (ste->ste_optimized == 0)
4447 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004448 else if (ste->ste_optimized != OPT_EXEC)
4449 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004450 }
4451 return 0;
4452}
4453
4454static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004455symtable_load_symbols(struct compiling *c)
4456{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004457 static PyObject *implicit = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004458 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004459 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004460 PyObject *name, *varnames, *v;
4461 int i, flags, pos;
4462 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004463
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004464 if (implicit == NULL) {
4465 implicit = PyInt_FromLong(1);
4466 if (implicit == NULL)
4467 return -1;
4468 }
4469 v = NULL;
4470
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004471 if (symtable_init_compiling_symbols(c) < 0)
4472 goto fail;
4473 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004474 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004475 si.si_nlocals = PyList_GET_SIZE(varnames);
4476 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004477
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004478 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004479 v = PyInt_FromLong(i);
4480 if (PyDict_SetItem(c->c_locals,
4481 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004482 goto fail;
4483 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004484 }
4485
4486 /* XXX The cases below define the rules for whether a name is
4487 local or global. The logic could probably be clearer. */
4488 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004489 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4490 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004491
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004492 if (st->st_nested_scopes == 0
4493 && (flags & (DEF_FREE | DEF_FREE_CLASS))) {
4494 if (symtable_check_shadow(st, name, flags) < 0)
4495 goto fail;
4496 }
4497
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004498 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004499 /* undo the original DEF_FREE */
4500 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004501
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004502 /* Deal with names that need two actions:
4503 1. Cell variables, which are also locals.
4504 2. Free variables in methods that are also class
4505 variables or declared global.
4506 */
Jeremy Hylton9c901052001-05-08 04:12:34 +00004507 if (st->st_nested_scopes) {
4508 if (flags & (DEF_FREE | DEF_FREE_CLASS)) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004509 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton9c901052001-05-08 04:12:34 +00004510 }
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004511 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004512
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004513 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004514 c->c_argcount--;
4515 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004516 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004517 c->c_argcount--;
4518 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004519 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004520 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004521 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004522 if (flags & DEF_PARAM) {
4523 PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004524 PyString_AS_STRING(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004525 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004526 ste->ste_lineno);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004527 st->st_errors++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004528 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004529 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004530 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4531 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004532 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004533 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004534 if (PyDict_SetItem(c->c_globals, name, implicit) < 0)
4535 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004536 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004537 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004538 if (v == NULL)
4539 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004540 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004541 goto fail;
4542 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004543 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004544 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004545 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004546 } else if (is_free(flags)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004547 if (ste->ste_nested && st->st_nested_scopes) {
4548 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004549 if (v == NULL)
4550 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004551 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004552 goto fail;
4553 Py_DECREF(v);
4554 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004555 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004556 if (PyDict_SetItem(c->c_globals, name,
4557 implicit) < 0)
4558 goto fail;
Jeremy Hylton51257732001-03-01 00:42:55 +00004559 if (st->st_nscopes != 1) {
4560 v = PyInt_FromLong(flags);
4561 if (PyDict_SetItem(st->st_global,
4562 name, v))
4563 goto fail;
4564 Py_DECREF(v);
4565 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004566 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004567 }
4568 }
4569
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004570 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
4571
Jeremy Hylton9c901052001-05-08 04:12:34 +00004572 if (st->st_nested_scopes == 0)
4573 assert(si.si_nfrees == 0);
4574
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004575 if (si.si_ncells > 1) { /* one cell is always in order */
4576 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
4577 c->c_varnames, c->c_flags) < 0)
4578 return -1;
4579 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004580 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4581 return -1;
4582 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004583 fail:
4584 /* is this always the right thing to do? */
4585 Py_XDECREF(v);
4586 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004587}
4588
4589static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004590symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004591{
4592 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004593
4594 st = (struct symtable *)PyMem_Malloc(sizeof(struct symtable));
4595 if (st == NULL)
4596 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004597 st->st_pass = 1;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004598 st->st_nested_scopes = NESTED_SCOPES_DEFAULT;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004599 st->st_filename = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004600 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004601 goto fail;
4602 if ((st->st_symbols = PyDict_New()) == NULL)
4603 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004604 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004605 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004606 st->st_errors = 0;
4607 st->st_tmpname = 0;
4608 st->st_private = NULL;
4609 return st;
4610 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004611 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004612 return NULL;
4613}
4614
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004615void
4616PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004617{
4618 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004619 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004620 Py_XDECREF(st->st_cur);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004621 PyMem_Free((void *)st);
4622}
4623
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004624/* When the compiler exits a scope, it must should update the scope's
4625 free variable information with the list of free variables in its
4626 children.
4627
4628 Variables that are free in children and defined in the current
4629 scope are cellvars.
4630
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004631 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004632 false), free variables in children that are not defined here are
4633 implicit globals.
4634
4635*/
4636
4637static int
4638symtable_update_free_vars(struct symtable *st)
4639{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004640 int i, j, def;
4641 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004642 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004643
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004644 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004645 def = DEF_FREE_CLASS;
4646 else
4647 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004648 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004649 int pos = 0;
4650
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004651 if (list)
4652 PyList_SetSlice(list, 0,
4653 ((PyVarObject*)list)->ob_size, 0);
Barry Warsaw0372af72001-02-23 18:22:59 +00004654 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004655 PyList_GET_ITEM(ste->ste_children, i);
4656 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004657 int flags = PyInt_AS_LONG(o);
4658 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004659 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004660 if (list == NULL) {
4661 list = PyList_New(0);
4662 if (list == NULL)
4663 return -1;
4664 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004665 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004666 if (PyList_Append(list, name) < 0) {
4667 Py_DECREF(list);
4668 return -1;
4669 }
4670 }
4671 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004672 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004673 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00004674 v = PyDict_GetItem(ste->ste_symbols, name);
4675 /* If a name N is declared global in scope A and
4676 referenced in scope B contained (perhaps
4677 indirectly) in A and there are no scopes
4678 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00004679 is global in B. Unless A is a class scope,
4680 because class scopes are not considered for
4681 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00004682 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004683 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004684 int flags = PyInt_AS_LONG(v);
4685 if (flags & DEF_GLOBAL) {
4686 symtable_undo_free(st, child->ste_id,
4687 name);
4688 continue;
4689 }
4690 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004691 if (ste->ste_nested) {
4692 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004693 name, def) < 0) {
4694 Py_DECREF(list);
4695 return -1;
4696 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004697 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004698 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004699 name) < 0) {
4700 Py_DECREF(list);
4701 return -1;
4702 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004703 }
4704 }
4705 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004706
4707 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004708 return 0;
4709}
4710
4711/* If the current scope is a non-nested class or if name is not
4712 defined in the current, non-nested scope, then it is an implicit
4713 global in all nested scopes.
4714*/
4715
4716static int
4717symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
4718{
4719 PyObject *o;
4720 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004721 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00004722
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004723 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004724 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004725 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004726 if (o == NULL)
4727 return symtable_undo_free(st, child, name);
4728 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00004729
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004730 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004731 return symtable_undo_free(st, child, name);
4732 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004733 return symtable_add_def_o(st, ste->ste_symbols,
4734 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004735}
4736
4737static int
4738symtable_undo_free(struct symtable *st, PyObject *id,
4739 PyObject *name)
4740{
4741 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004742 PyObject *info;
4743 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004744
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004745 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
4746 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004747 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00004748
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004749 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004750 if (info == NULL)
4751 return 0;
4752 v = PyInt_AS_LONG(info);
4753 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004754 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004755 DEF_FREE_GLOBAL) < 0)
4756 return -1;
4757 } else
4758 /* If the name is defined here or declared global,
4759 then the recursion stops. */
4760 return 0;
4761
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004762 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
4763 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00004764 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004765 PyList_GET_ITEM(ste->ste_children, i);
4766 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004767 if (x < 0)
4768 return x;
4769 }
4770 return 0;
4771}
4772
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004773/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
4774 This reference is released when the scope is exited, via the DECREF
4775 in symtable_exit_scope().
4776*/
4777
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004778static int
4779symtable_exit_scope(struct symtable *st)
4780{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004781 int end;
4782
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004783 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004784 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004785 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004786 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004787 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
4788 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004789 if (PySequence_DelItem(st->st_stack, end) < 0)
4790 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004791 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004792}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004793
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004794static void
4795symtable_enter_scope(struct symtable *st, char *name, int type,
4796 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004797{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004798 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004799
4800 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004801 prev = st->st_cur;
4802 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
4803 Py_DECREF(st->st_cur);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004804 st->st_errors++;
4805 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004806 }
4807 }
Barry Warsaw0372af72001-02-23 18:22:59 +00004808 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004809 PySymtableEntry_New(st, name, type, lineno);
4810 if (strcmp(name, TOP) == 0)
4811 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004812 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004813 if (PyList_Append(prev->ste_children,
4814 (PyObject *)st->st_cur) < 0)
4815 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004816 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004817}
4818
4819static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004820symtable_lookup(struct symtable *st, char *name)
4821{
4822 char buffer[MANGLE_LEN];
4823 PyObject *v;
4824 int flags;
4825
4826 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
4827 name = buffer;
4828 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
4829 if (v == NULL) {
4830 if (PyErr_Occurred())
4831 return -1;
4832 else
4833 return 0;
4834 }
4835
4836 flags = PyInt_AS_LONG(v);
4837 return flags;
4838}
4839
4840static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004841symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004842{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004843 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004844 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004845 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004846
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004847 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004848 name = buffer;
4849 if ((s = PyString_InternFromString(name)) == NULL)
4850 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004851 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
4852 Py_DECREF(s);
4853 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004854}
4855
4856/* Must only be called with mangled names */
4857
4858static int
4859symtable_add_def_o(struct symtable *st, PyObject *dict,
4860 PyObject *name, int flag)
4861{
4862 PyObject *o;
4863 int val;
4864
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004865 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004866 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004867 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004868 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00004869 PyString_AsString(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004870 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004871 st->st_cur->ste_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004872 return -1;
4873 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004874 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004875 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004876 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004877 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004878 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004879 Py_DECREF(o);
4880 return -1;
4881 }
4882 Py_DECREF(o);
4883
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004884 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004885 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004886 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004887 } else if (flag & DEF_GLOBAL) {
4888 /* XXX need to update DEF_GLOBAL for other flags too;
4889 perhaps only DEF_FREE_GLOBAL */
4890 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004891 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004892 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004893 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004894 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004895 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004896 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004897 Py_DECREF(o);
4898 return -1;
4899 }
4900 Py_DECREF(o);
4901 }
4902 return 0;
4903}
4904
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004905#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004906
Tim Peters08a898f2001-06-28 01:52:22 +00004907/* Look for a yield stmt under n. Return 1 if found, else 0.
4908 This hack is used to look inside "if 0:" blocks (which are normally
4909 ignored) in case those are the only places a yield occurs (so that this
4910 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00004911static int
4912look_for_yield(node *n)
4913{
4914 int i;
4915
4916 for (i = 0; i < NCH(n); ++i) {
4917 node *kid = CHILD(n, i);
4918
4919 switch (TYPE(kid)) {
4920
4921 case classdef:
4922 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00004923 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00004924 /* Stuff in nested functions and classes can't make
4925 the parent a generator. */
4926 return 0;
4927
4928 case yield_stmt:
4929 return 1;
4930
4931 default:
4932 if (look_for_yield(kid))
4933 return 1;
4934 }
4935 }
4936 return 0;
4937}
4938
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004939static void
4940symtable_node(struct symtable *st, node *n)
4941{
4942 int i, start = 0;
4943
4944 loop:
4945 switch (TYPE(n)) {
4946 case funcdef: {
4947 char *func_name = STR(CHILD(n, 1));
4948 symtable_add_def(st, func_name, DEF_LOCAL);
4949 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004950 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004951 symtable_funcdef(st, n);
4952 symtable_exit_scope(st);
4953 break;
4954 }
4955 case lambdef:
4956 if (NCH(n) == 4)
4957 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004958 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004959 symtable_funcdef(st, n);
4960 symtable_exit_scope(st);
4961 break;
4962 case classdef: {
4963 char *tmp, *class_name = STR(CHILD(n, 1));
4964 symtable_add_def(st, class_name, DEF_LOCAL);
4965 if (TYPE(CHILD(n, 2)) == LPAR) {
4966 node *bases = CHILD(n, 3);
4967 int i;
4968 for (i = 0; i < NCH(bases); i += 2) {
4969 symtable_node(st, CHILD(bases, i));
4970 }
4971 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004972 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004973 tmp = st->st_private;
4974 st->st_private = class_name;
4975 symtable_node(st, CHILD(n, NCH(n) - 1));
4976 st->st_private = tmp;
4977 symtable_exit_scope(st);
4978 break;
4979 }
4980 case if_stmt:
4981 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00004982 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
4983 if (st->st_cur->ste_generator == 0)
4984 st->st_cur->ste_generator =
4985 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004986 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00004987 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004988 symtable_node(st, CHILD(n, i + 1));
4989 symtable_node(st, CHILD(n, i + 3));
4990 }
4991 if (i + 2 < NCH(n))
4992 symtable_node(st, CHILD(n, i + 2));
4993 break;
4994 case global_stmt:
4995 symtable_global(st, n);
4996 break;
4997 case import_stmt:
4998 symtable_import(st, n);
4999 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005000 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005001 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005002 symtable_node(st, CHILD(n, 1));
5003 if (NCH(n) > 2)
5004 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005005 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005006 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005007 st->st_cur->ste_opt_lineno = n->n_lineno;
5008 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005009 if (NCH(n) > 4)
5010 symtable_node(st, CHILD(n, 5));
5011 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005012
5013 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005014 case assert_stmt:
5015 if (Py_OptimizeFlag)
5016 return;
5017 if (NCH(n) == 2) {
5018 n = CHILD(n, 1);
5019 goto loop;
5020 } else {
5021 symtable_node(st, CHILD(n, 1));
5022 n = CHILD(n, 3);
5023 goto loop;
5024 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005025 case except_clause:
5026 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005027 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005028 if (NCH(n) > 1) {
5029 n = CHILD(n, 1);
5030 goto loop;
5031 }
5032 break;
5033 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005034 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005035 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005036 case yield_stmt:
5037 st->st_cur->ste_generator = 1;
5038 n = CHILD(n, 1);
5039 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005040 case expr_stmt:
5041 if (NCH(n) == 1)
5042 n = CHILD(n, 0);
5043 else {
5044 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005045 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005046 symtable_node(st, CHILD(n, 2));
5047 break;
5048 } else {
5049 int i;
5050 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005051 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005052 n = CHILD(n, NCH(n) - 1);
5053 }
5054 }
5055 goto loop;
5056 /* watchout for fall-through logic below */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005057 case argument:
5058 if (NCH(n) == 3) {
5059 n = CHILD(n, 2);
5060 goto loop;
5061 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005062 case listmaker:
5063 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton23b42272001-03-19 20:38:06 +00005064 st->st_tmpname++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005065 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton23b42272001-03-19 20:38:06 +00005066 symtable_node(st, CHILD(n, 0));
5067 st->st_tmpname--;
5068 return;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005069 }
5070 case atom:
5071 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
5072 symtable_add_use(st, STR(CHILD(n, 0)));
5073 break;
5074 }
5075 case for_stmt:
5076 if (TYPE(n) == for_stmt) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005077 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005078 start = 3;
5079 }
5080 default:
5081 if (NCH(n) == 1) {
5082 n = CHILD(n, 0);
5083 goto loop;
5084 }
5085 for (i = start; i < NCH(n); ++i)
5086 if (TYPE(CHILD(n, i)) >= single_input)
5087 symtable_node(st, CHILD(n, i));
5088 }
5089}
5090
5091static void
5092symtable_funcdef(struct symtable *st, node *n)
5093{
5094 node *body;
5095
5096 if (TYPE(n) == lambdef) {
5097 if (NCH(n) == 4)
5098 symtable_params(st, CHILD(n, 1));
5099 } else
5100 symtable_params(st, CHILD(n, 2));
5101 body = CHILD(n, NCH(n) - 1);
5102 symtable_node(st, body);
5103}
5104
5105/* The next two functions parse the argument tuple.
5106 symtable_default_arg() checks for names in the default arguments,
5107 which are references in the defining scope. symtable_params()
5108 parses the parameter names, which are defined in the function's
5109 body.
5110
5111 varargslist:
5112 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5113 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5114*/
5115
5116static void
5117symtable_default_args(struct symtable *st, node *n)
5118{
5119 node *c;
5120 int i;
5121
5122 if (TYPE(n) == parameters) {
5123 n = CHILD(n, 1);
5124 if (TYPE(n) == RPAR)
5125 return;
5126 }
5127 REQ(n, varargslist);
5128 for (i = 0; i < NCH(n); i += 2) {
5129 c = CHILD(n, i);
5130 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5131 break;
5132 }
5133 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5134 symtable_node(st, CHILD(n, i));
5135 }
5136}
5137
5138static void
5139symtable_params(struct symtable *st, node *n)
5140{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005141 int i, complex = -1, ext = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005142 node *c = NULL;
5143
5144 if (TYPE(n) == parameters) {
5145 n = CHILD(n, 1);
5146 if (TYPE(n) == RPAR)
5147 return;
5148 }
5149 REQ(n, varargslist);
5150 for (i = 0; i < NCH(n); i += 2) {
5151 c = CHILD(n, i);
5152 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5153 ext = 1;
5154 break;
5155 }
5156 if (TYPE(c) == test) {
5157 continue;
5158 }
5159 if (TYPE(CHILD(c, 0)) == NAME)
5160 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
5161 else {
5162 char nbuf[10];
5163 sprintf(nbuf, ".%d", i);
5164 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005165 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005166 }
5167 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005168 if (ext) {
5169 c = CHILD(n, i);
5170 if (TYPE(c) == STAR) {
5171 i++;
5172 symtable_add_def(st, STR(CHILD(n, i)),
5173 DEF_PARAM | DEF_STAR);
5174 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00005175 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005176 c = NULL;
5177 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005178 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005179 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005180 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005181 i++;
5182 symtable_add_def(st, STR(CHILD(n, i)),
5183 DEF_PARAM | DEF_DOUBLESTAR);
5184 }
5185 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005186 if (complex >= 0) {
5187 int j;
5188 for (j = 0; j <= complex; j++) {
5189 c = CHILD(n, j);
5190 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005191 c = CHILD(n, ++j);
5192 else if (TYPE(c) == EQUAL)
5193 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005194 if (TYPE(CHILD(c, 0)) == LPAR)
5195 symtable_params_fplist(st, CHILD(c, 1));
5196 }
5197 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005198}
5199
5200static void
5201symtable_params_fplist(struct symtable *st, node *n)
5202{
5203 int i;
5204 node *c;
5205
5206 REQ(n, fplist);
5207 for (i = 0; i < NCH(n); i += 2) {
5208 c = CHILD(n, i);
5209 REQ(c, fpdef);
5210 if (NCH(c) == 1)
5211 symtable_add_def(st, STR(CHILD(c, 0)),
5212 DEF_PARAM | DEF_INTUPLE);
5213 else
5214 symtable_params_fplist(st, CHILD(c, 1));
5215 }
5216
5217}
5218
5219static void
5220symtable_global(struct symtable *st, node *n)
5221{
5222 int i;
5223
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005224 /* XXX It might be helpful to warn about module-level global
5225 statements, but it's hard to tell the difference between
5226 module-level and a string passed to exec.
5227 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00005228
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005229 for (i = 1; i < NCH(n); i += 2) {
5230 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005231 int flags;
5232
5233 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005234 if (flags < 0)
5235 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005236 if (flags && flags != DEF_GLOBAL) {
5237 char buf[500];
5238 if (flags & DEF_PARAM) {
5239 PyErr_Format(PyExc_SyntaxError,
5240 "name '%.400s' is local and global",
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005241 name);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005242 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005243 st->st_cur->ste_lineno);
5244 st->st_errors++;
5245 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005246 }
5247 else {
5248 if (flags & DEF_LOCAL)
5249 sprintf(buf, GLOBAL_AFTER_ASSIGN,
5250 name);
5251 else
5252 sprintf(buf, GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005253 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005254 }
5255 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005256 symtable_add_def(st, name, DEF_GLOBAL);
5257 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005258}
5259
5260static void
5261symtable_list_comprehension(struct symtable *st, node *n)
5262{
5263 char tmpname[12];
5264
Jeremy Hylton23b42272001-03-19 20:38:06 +00005265 sprintf(tmpname, "_[%d]", st->st_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005266 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005267 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005268 symtable_node(st, CHILD(n, 3));
5269 if (NCH(n) == 5)
5270 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005271}
5272
5273static void
5274symtable_import(struct symtable *st, node *n)
5275{
5276 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005277 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005278 | 'from' dotted_name 'import'
5279 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00005280 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005281 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005282 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005283 node *dotname = CHILD(n, 1);
5284 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
5285 /* check for bogus imports */
5286 if (n->n_lineno >= st->st_future->ff_last_lineno) {
5287 PyErr_SetString(PyExc_SyntaxError,
5288 LATE_FUTURE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005289 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005290 n->n_lineno);
5291 st->st_errors++;
5292 return;
5293 }
5294 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005295 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005296 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005297 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005298 } else {
5299 for (i = 3; i < NCH(n); i += 2) {
5300 node *c = CHILD(n, i);
5301 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005302 symtable_assign(st, CHILD(c, 2),
5303 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005304 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005305 symtable_assign(st, CHILD(c, 0),
5306 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005307 }
5308 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005309 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005310 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005311 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005312 }
5313 }
5314}
5315
5316static void
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005317symtable_assign(struct symtable *st, node *n, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005318{
5319 node *tmp;
5320 int i;
5321
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005322 loop:
5323 switch (TYPE(n)) {
5324 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005325 /* invalid assignment, e.g. lambda x:x=2. The next
5326 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005327 return;
5328 case power:
5329 if (NCH(n) > 2) {
5330 for (i = 2; i < NCH(n); ++i)
5331 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
5332 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005333 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005334 if (NCH(n) > 1) {
5335 symtable_node(st, CHILD(n, 0));
5336 symtable_node(st, CHILD(n, 1));
5337 } else {
5338 n = CHILD(n, 0);
5339 goto loop;
5340 }
5341 return;
5342 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00005343 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
5344 /* XXX This is an error, but the next pass
5345 will catch it. */
5346 return;
5347 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005348 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005349 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005350 }
5351 return;
5352 case exprlist:
5353 case testlist:
5354 if (NCH(n) == 1) {
5355 n = CHILD(n, 0);
5356 goto loop;
5357 }
5358 else {
5359 int i;
5360 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005361 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005362 return;
5363 }
5364 goto loop;
5365 case atom:
5366 tmp = CHILD(n, 0);
5367 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
5368 n = CHILD(n, 1);
5369 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00005370 } else if (TYPE(tmp) == NAME) {
Jeremy Hyltona830b382001-04-09 16:07:59 +00005371 if (strcmp(STR(tmp), "__debug__") == 0)
5372 symtable_warn(st, ASSIGN_DEBUG);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005373 symtable_add_def(st, STR(tmp), DEF_LOCAL | flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00005374 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005375 return;
5376 case dotted_as_name:
5377 if (NCH(n) == 3)
5378 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005379 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005380 else
5381 symtable_add_def(st,
5382 STR(CHILD(CHILD(n,
5383 0), 0)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005384 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005385 return;
5386 case dotted_name:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005387 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005388 return;
5389 case NAME:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005390 symtable_add_def(st, STR(n), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005391 return;
5392 default:
5393 if (NCH(n) == 0)
5394 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00005395 if (NCH(n) == 1) {
5396 n = CHILD(n, 0);
5397 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005398 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00005399 /* Should only occur for errors like x + 1 = 1,
5400 which will be caught in the next pass. */
5401 for (i = 0; i < NCH(n); ++i)
5402 if (TYPE(CHILD(n, i)) >= single_input)
5403 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005404 }
5405}