blob: e82c34c6132486b255c585457da966b5f9a8e31a [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
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002879static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002880com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002881{
2882 int i;
2883 int anchor = 0;
2884 REQ(n, if_stmt);
2885 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2886 for (i = 0; i+3 < NCH(n); i+=4) {
2887 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002888 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002889 if (is_constant_false(c, ch))
2890 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002891 if (i > 0)
2892 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002893 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002894 com_addfwref(c, JUMP_IF_FALSE, &a);
2895 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002896 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002897 com_node(c, CHILD(n, i+3));
2898 com_addfwref(c, JUMP_FORWARD, &anchor);
2899 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002900 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002901 com_addbyte(c, POP_TOP);
2902 }
2903 if (i+2 < NCH(n))
2904 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002905 if (anchor)
2906 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002907}
2908
2909static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002910com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002911{
2912 int break_anchor = 0;
2913 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002914 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002915 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2916 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002917 block_push(c, SETUP_LOOP);
2918 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002919 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002920 com_node(c, CHILD(n, 1));
2921 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2922 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002923 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002924 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002925 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002926 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002927 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2928 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002929 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002930 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002931 com_addbyte(c, POP_TOP);
2932 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002933 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002934 if (NCH(n) > 4)
2935 com_node(c, CHILD(n, 6));
2936 com_backpatch(c, break_anchor);
2937}
2938
2939static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002940com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002941{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002942 int break_anchor = 0;
2943 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002944 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002945 REQ(n, for_stmt);
2946 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2947 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002948 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002949 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002950 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002951 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002952 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002953 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002954 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00002955 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002956 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002957 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002958 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002959 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2960 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002961 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002962 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002963 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002964 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002965 if (NCH(n) > 8)
2966 com_node(c, CHILD(n, 8));
2967 com_backpatch(c, break_anchor);
2968}
2969
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002970/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002971
2972 SETUP_FINALLY L
2973 <code for S>
2974 POP_BLOCK
2975 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002976 L: <code for Sf>
2977 END_FINALLY
2978
2979 The special instructions use the block stack. Each block
2980 stack entry contains the instruction that created it (here
2981 SETUP_FINALLY), the level of the value stack at the time the
2982 block stack entry was created, and a label (here L).
2983
2984 SETUP_FINALLY:
2985 Pushes the current value stack level and the label
2986 onto the block stack.
2987 POP_BLOCK:
2988 Pops en entry from the block stack, and pops the value
2989 stack until its level is the same as indicated on the
2990 block stack. (The label is ignored.)
2991 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002992 Pops a variable number of entries from the *value* stack
2993 and re-raises the exception they specify. The number of
2994 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002995
2996 The block stack is unwound when an exception is raised:
2997 when a SETUP_FINALLY entry is found, the exception is pushed
2998 onto the value stack (and the exception condition is cleared),
2999 and the interpreter jumps to the label gotten from the block
3000 stack.
3001
3002 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003003 (The contents of the value stack is shown in [], with the top
3004 at the right; 'tb' is trace-back info, 'val' the exception's
3005 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003006
3007 Value stack Label Instruction Argument
3008 [] SETUP_EXCEPT L1
3009 [] <code for S>
3010 [] POP_BLOCK
3011 [] JUMP_FORWARD L0
3012
Guido van Rossum3f5da241990-12-20 15:06:42 +00003013 [tb, val, exc] L1: DUP )
3014 [tb, val, exc, exc] <evaluate E1> )
3015 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3016 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3017 [tb, val, exc, 1] POP )
3018 [tb, val, exc] POP
3019 [tb, val] <assign to V1> (or POP if no V1)
3020 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003021 [] <code for S1>
3022 JUMP_FORWARD L0
3023
Guido van Rossum3f5da241990-12-20 15:06:42 +00003024 [tb, val, exc, 0] L2: POP
3025 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003026 .............................etc.......................
3027
Guido van Rossum3f5da241990-12-20 15:06:42 +00003028 [tb, val, exc, 0] Ln+1: POP
3029 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003030
3031 [] L0: <next statement>
3032
3033 Of course, parts are not generated if Vi or Ei is not present.
3034*/
3035
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003036static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003037com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003038{
3039 int except_anchor = 0;
3040 int end_anchor = 0;
3041 int else_anchor = 0;
3042 int i;
3043 node *ch;
3044
3045 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3046 block_push(c, SETUP_EXCEPT);
3047 com_node(c, CHILD(n, 2));
3048 com_addbyte(c, POP_BLOCK);
3049 block_pop(c, SETUP_EXCEPT);
3050 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3051 com_backpatch(c, except_anchor);
3052 for (i = 3;
3053 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3054 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003055 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003056 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003057 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003058 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003059 break;
3060 }
3061 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003062 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003063 com_addoparg(c, SET_LINENO, ch->n_lineno);
3064 if (NCH(ch) > 1) {
3065 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003066 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003067 com_node(c, CHILD(ch, 1));
3068 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003069 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003070 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3071 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003072 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003073 }
3074 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003075 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003076 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003077 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003078 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003079 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003080 com_pop(c, 1);
3081 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003082 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003083 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003084 com_node(c, CHILD(n, i+2));
3085 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3086 if (except_anchor) {
3087 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003088 /* We come in with [tb, val, exc, 0] on the
3089 stack; one pop and it's the same as
3090 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003091 com_addbyte(c, POP_TOP);
3092 }
3093 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003094 /* We actually come in here with [tb, val, exc] but the
3095 END_FINALLY will zap those and jump around.
3096 The c_stacklevel does not reflect them so we need not pop
3097 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003098 com_addbyte(c, END_FINALLY);
3099 com_backpatch(c, else_anchor);
3100 if (i < NCH(n))
3101 com_node(c, CHILD(n, i+2));
3102 com_backpatch(c, end_anchor);
3103}
3104
3105static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003106com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003107{
3108 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003109 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003110
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003111 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3112 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003113 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003114 com_addbyte(c, POP_BLOCK);
3115 block_pop(c, SETUP_FINALLY);
3116 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003117 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003118 /* While the generated code pushes only one item,
3119 the try-finally handling can enter here with
3120 up to three items. OK, here are the details:
3121 3 for an exception, 2 for RETURN, 1 for BREAK. */
3122 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003123 com_backpatch(c, finally_anchor);
3124 ch = CHILD(n, NCH(n)-1);
3125 com_addoparg(c, SET_LINENO, ch->n_lineno);
3126 com_node(c, ch);
3127 com_addbyte(c, END_FINALLY);
3128 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003129 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003130}
3131
3132static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003133com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003134{
3135 REQ(n, try_stmt);
3136 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3137 | 'try' ':' suite 'finally' ':' suite */
3138 if (TYPE(CHILD(n, 3)) != except_clause)
3139 com_try_finally(c, n);
3140 else
3141 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003142}
3143
Guido van Rossum8b993a91997-01-17 21:04:03 +00003144static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003145get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003146{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003147 int i;
3148
Guido van Rossum8b993a91997-01-17 21:04:03 +00003149 /* Label to avoid tail recursion */
3150 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003151 switch (TYPE(n)) {
3152
3153 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003154 if (NCH(n) == 1) {
3155 n = CHILD(n, 0);
3156 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003157 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003158 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003159 case file_input:
3160 for (i = 0; i < NCH(n); i++) {
3161 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003162 if (TYPE(ch) == stmt) {
3163 n = ch;
3164 goto next;
3165 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003166 }
3167 break;
3168
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003169 case stmt:
3170 case simple_stmt:
3171 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003172 n = CHILD(n, 0);
3173 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003174
3175 case expr_stmt:
3176 case testlist:
3177 case test:
3178 case and_test:
3179 case not_test:
3180 case comparison:
3181 case expr:
3182 case xor_expr:
3183 case and_expr:
3184 case shift_expr:
3185 case arith_expr:
3186 case term:
3187 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003188 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003189 if (NCH(n) == 1) {
3190 n = CHILD(n, 0);
3191 goto next;
3192 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003193 break;
3194
3195 case atom:
3196 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003197 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003198 break;
3199
3200 }
3201 return NULL;
3202}
3203
Guido van Rossum79f25d91997-04-29 20:08:16 +00003204static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003205get_docstring(node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003206{
Guido van Rossum541563e1999-01-28 15:08:09 +00003207 /* Don't generate doc-strings if run with -OO */
3208 if (Py_OptimizeFlag > 1)
3209 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003210 n = get_rawdocstring(n);
3211 if (n == NULL)
3212 return NULL;
3213 return parsestrplus(n);
3214}
3215
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003216static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003217com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003218{
3219 REQ(n, suite);
3220 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3221 if (NCH(n) == 1) {
3222 com_node(c, CHILD(n, 0));
3223 }
3224 else {
3225 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003226 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003227 node *ch = CHILD(n, i);
3228 if (TYPE(ch) == stmt)
3229 com_node(c, ch);
3230 }
3231 }
3232}
3233
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003234/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003235static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003236com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003237{
3238 int i = c->c_nblocks;
3239 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3240 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3241 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003242 else if (i <= 0) {
3243 /* at the outer level */
3244 com_error(c, PyExc_SyntaxError,
3245 "'continue' not properly in loop");
3246 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003247 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003248 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003249 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003250 if (c->c_block[j] == SETUP_LOOP)
3251 break;
3252 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003253 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003254 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003255 for (; i > j; --i) {
3256 if (c->c_block[i] == SETUP_EXCEPT ||
3257 c->c_block[i] == SETUP_FINALLY) {
3258 com_addoparg(c, CONTINUE_LOOP,
3259 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003260 return;
3261 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003262 if (c->c_block[i] == END_FINALLY) {
3263 com_error(c, PyExc_SyntaxError,
3264 "'continue' not supported inside 'finally' clause");
3265 return;
3266 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003267 }
3268 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003269 com_error(c, PyExc_SyntaxError,
3270 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003271 }
3272 /* XXX Could allow it inside a 'finally' clause
3273 XXX if we could pop the exception still on the stack */
3274}
3275
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003276static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003277com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003278{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003279 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003280 if (TYPE(n) == lambdef) {
3281 /* lambdef: 'lambda' [varargslist] ':' test */
3282 n = CHILD(n, 1);
3283 }
3284 else {
3285 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3286 n = CHILD(n, 2);
3287 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3288 n = CHILD(n, 1);
3289 }
3290 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003291 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003292 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003293 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003294 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3295 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003296 nargs = 0;
3297 ndefs = 0;
3298 for (i = 0; i < nch; i++) {
3299 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003300 if (TYPE(CHILD(n, i)) == STAR ||
3301 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003302 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003303 nargs++;
3304 i++;
3305 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003306 t = RPAR; /* Anything except EQUAL or COMMA */
3307 else
3308 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003309 if (t == EQUAL) {
3310 i++;
3311 ndefs++;
3312 com_node(c, CHILD(n, i));
3313 i++;
3314 if (i >= nch)
3315 break;
3316 t = TYPE(CHILD(n, i));
3317 }
3318 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003319 /* Treat "(a=1, b)" as an error */
3320 if (ndefs)
3321 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003322 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003323 }
3324 if (t != COMMA)
3325 break;
3326 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003327 return ndefs;
3328}
3329
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003330static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003331com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003332{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003333 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003334 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003335 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003336 ndefs = com_argdefs(c, n);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003337 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3338 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003339 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003340 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003341 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003342 c->c_errors++;
3343 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003344 int closure = com_make_closure(c, (PyCodeObject *)co);
3345 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003346 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003347 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003348 if (closure)
3349 com_addoparg(c, MAKE_CLOSURE, ndefs);
3350 else
3351 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003352 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003353 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003354 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003355 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003356 }
3357}
3358
3359static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003360com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003361{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003362 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003363 REQ(n, testlist);
3364 /* testlist: test (',' test)* [','] */
3365 for (i = 0; i < NCH(n); i += 2)
3366 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003367 i = (NCH(n)+1) / 2;
3368 com_addoparg(c, BUILD_TUPLE, i);
3369 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003370}
3371
3372static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003373com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003374{
Guido van Rossum25831651993-05-19 14:50:45 +00003375 int i;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003376 PyObject *co, *v;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003377 char *name;
3378
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003379 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003380 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003381 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003382 c->c_errors++;
3383 return;
3384 }
3385 /* Push the class name on the stack */
3386 i = com_addconst(c, v);
3387 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003388 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003389 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003390 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003391 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003392 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003393 com_push(c, 1);
3394 }
Guido van Rossum25831651993-05-19 14:50:45 +00003395 else
3396 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003397 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003398 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003399 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003400 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003401 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003402 c->c_errors++;
3403 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003404 int closure = com_make_closure(c, (PyCodeObject *)co);
3405 i = com_addconst(c, co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003406 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003407 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003408 if (closure)
3409 com_addoparg(c, MAKE_CLOSURE, 0);
3410 else
3411 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003412 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003413 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003414 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003415 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003416 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003417 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003418}
3419
3420static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003421com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003422{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003423 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003424 if (c->c_errors)
3425 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003426 switch (TYPE(n)) {
3427
3428 /* Definition nodes */
3429
3430 case funcdef:
3431 com_funcdef(c, n);
3432 break;
3433 case classdef:
3434 com_classdef(c, n);
3435 break;
3436
3437 /* Trivial parse tree nodes */
3438
3439 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003440 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003441 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003442 n = CHILD(n, 0);
3443 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003444
3445 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003446 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
3447 com_addoparg(c, SET_LINENO, n->n_lineno);
3448 {
3449 int i;
3450 for (i = 0; i < NCH(n)-1; i += 2)
3451 com_node(c, CHILD(n, i));
3452 }
3453 break;
3454
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003455 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003456 com_addoparg(c, SET_LINENO, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003457 n = CHILD(n, 0);
3458 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003459
3460 /* Statement nodes */
3461
3462 case expr_stmt:
3463 com_expr_stmt(c, n);
3464 break;
3465 case print_stmt:
3466 com_print_stmt(c, n);
3467 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003468 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003469 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003470 break;
3471 case pass_stmt:
3472 break;
3473 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003474 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003475 com_error(c, PyExc_SyntaxError,
3476 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003477 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003478 com_addbyte(c, BREAK_LOOP);
3479 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003480 case continue_stmt:
3481 com_continue_stmt(c, n);
3482 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003483 case return_stmt:
3484 com_return_stmt(c, n);
3485 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00003486 case yield_stmt:
3487 com_yield_stmt(c, n);
3488 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003489 case raise_stmt:
3490 com_raise_stmt(c, n);
3491 break;
3492 case import_stmt:
3493 com_import_stmt(c, n);
3494 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003495 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003496 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003497 case exec_stmt:
3498 com_exec_stmt(c, n);
3499 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003500 case assert_stmt:
3501 com_assert_stmt(c, n);
3502 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003503 case if_stmt:
3504 com_if_stmt(c, n);
3505 break;
3506 case while_stmt:
3507 com_while_stmt(c, n);
3508 break;
3509 case for_stmt:
3510 com_for_stmt(c, n);
3511 break;
3512 case try_stmt:
3513 com_try_stmt(c, n);
3514 break;
3515 case suite:
3516 com_suite(c, n);
3517 break;
3518
3519 /* Expression nodes */
3520
3521 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003522 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003523 break;
3524 case test:
3525 com_test(c, n);
3526 break;
3527 case and_test:
3528 com_and_test(c, n);
3529 break;
3530 case not_test:
3531 com_not_test(c, n);
3532 break;
3533 case comparison:
3534 com_comparison(c, n);
3535 break;
3536 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003537 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003538 break;
3539 case expr:
3540 com_expr(c, n);
3541 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003542 case xor_expr:
3543 com_xor_expr(c, n);
3544 break;
3545 case and_expr:
3546 com_and_expr(c, n);
3547 break;
3548 case shift_expr:
3549 com_shift_expr(c, n);
3550 break;
3551 case arith_expr:
3552 com_arith_expr(c, n);
3553 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003554 case term:
3555 com_term(c, n);
3556 break;
3557 case factor:
3558 com_factor(c, n);
3559 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003560 case power:
3561 com_power(c, n);
3562 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003563 case atom:
3564 com_atom(c, n);
3565 break;
3566
3567 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003568 com_error(c, PyExc_SystemError,
3569 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003570 }
3571}
3572
Tim Petersdbd9ba62000-07-09 03:09:57 +00003573static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003574
3575static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003576com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003577{
3578 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3579 if (TYPE(CHILD(n, 0)) == LPAR)
3580 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003581 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003582 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003583 com_pop(c, 1);
3584 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003585}
3586
3587static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003588com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003589{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003590 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003591 if (NCH(n) == 1) {
3592 com_fpdef(c, CHILD(n, 0));
3593 }
3594 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003595 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003596 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003597 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003598 for (i = 0; i < NCH(n); i += 2)
3599 com_fpdef(c, CHILD(n, i));
3600 }
3601}
3602
3603static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003604com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003605{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003606 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003607 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003608 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003609 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003610 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003611 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003612 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003613 /* Enter all arguments in table of locals */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003614 for (i = 0, narg = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003615 node *ch = CHILD(n, i);
3616 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003617 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003618 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003619 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3620 fp = CHILD(ch, 0);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00003621 if (TYPE(fp) != NAME) {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003622 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003623 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003624 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003625 narg++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003626 /* all name updates handled by symtable */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003627 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003628 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003629 ch = CHILD(n, i);
3630 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003631 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003632 else
3633 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003634 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003635 if (complex) {
3636 /* Generate code for complex arguments only after
3637 having counted the simple arguments */
3638 int ilocal = 0;
3639 for (i = 0; i < nch; i++) {
3640 node *ch = CHILD(n, i);
3641 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003642 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003643 break;
3644 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3645 fp = CHILD(ch, 0);
3646 if (TYPE(fp) != NAME) {
3647 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003648 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003649 com_fpdef(c, ch);
3650 }
3651 ilocal++;
3652 if (++i >= nch)
3653 break;
3654 ch = CHILD(n, i);
3655 if (TYPE(ch) == EQUAL)
3656 i += 2;
3657 else
3658 REQ(ch, COMMA);
3659 }
3660 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003661}
3662
3663static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003664com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003665{
3666 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003667 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003668 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003669 doc = get_docstring(n);
3670 if (doc != NULL) {
3671 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003672 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003673 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003674 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003675 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003676 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003677 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003678 for (i = 0; i < NCH(n); i++) {
3679 node *ch = CHILD(n, i);
3680 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3681 com_node(c, ch);
3682 }
3683}
3684
3685/* Top-level compile-node interface */
3686
3687static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003688compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003689{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003690 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003691 node *ch;
3692 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003693 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003694 doc = get_docstring(CHILD(n, 4));
3695 if (doc != NULL) {
3696 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003697 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003698 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003699 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003700 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003701 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3702 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003703 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003704 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003705 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003706 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003707 c->c_infunction = 0;
Tim Petersad1a18b2001-06-23 06:19:16 +00003708 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
3709 com_push(c, 1);
3710 com_addbyte(c, RETURN_VALUE);
3711 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003712}
3713
3714static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003715compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003716{
Guido van Rossum590baa41993-11-30 13:40:46 +00003717 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003718 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003719 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003720
3721 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003722 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003723 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003724 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003725 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003726 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003727 else
3728 ch = CHILD(n, 2);
3729 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003730 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003731 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003732}
3733
3734static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003735compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003736{
3737 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003738 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003739 REQ(n, classdef);
3740 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3741 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003742 c->c_private = c->c_name;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003743 ch = CHILD(n, NCH(n)-1); /* The suite */
3744 doc = get_docstring(ch);
3745 if (doc != NULL) {
3746 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003747 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003748 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003749 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003750 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003751 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003752 }
3753 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003754 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003755 com_node(c, ch);
3756 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003757 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003758 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003759 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003760}
3761
3762static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003763compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003764{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003765 com_addoparg(c, SET_LINENO, n->n_lineno);
3766
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003767 switch (TYPE(n)) {
3768
Guido van Rossum4c417781991-01-21 16:09:22 +00003769 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003770 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003771 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003772 n = CHILD(n, 0);
3773 if (TYPE(n) != NEWLINE)
3774 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003775 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003776 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003777 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003778 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003779 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003780 break;
3781
Guido van Rossum4c417781991-01-21 16:09:22 +00003782 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003783 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003784 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003785 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003786 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003787 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003788 break;
3789
Guido van Rossum590baa41993-11-30 13:40:46 +00003790 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003791 com_node(c, CHILD(n, 0));
3792 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003793 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003794 break;
3795
Guido van Rossum590baa41993-11-30 13:40:46 +00003796 case lambdef: /* anonymous function definition */
3797 compile_lambdef(c, n);
3798 break;
3799
Guido van Rossum4c417781991-01-21 16:09:22 +00003800 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003801 compile_funcdef(c, n);
3802 break;
3803
Guido van Rossum4c417781991-01-21 16:09:22 +00003804 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003805 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003806 break;
3807
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003808 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003809 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003810 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003811 }
3812}
3813
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003814static PyObject *
3815dict_keys_inorder(PyObject *dict, int offset)
3816{
3817 PyObject *tuple, *k, *v;
3818 int i, pos = 0, size = PyDict_Size(dict);
3819
3820 tuple = PyTuple_New(size);
3821 if (tuple == NULL)
3822 return NULL;
3823 while (PyDict_Next(dict, &pos, &k, &v)) {
3824 i = PyInt_AS_LONG(v);
3825 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00003826 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003827 PyTuple_SET_ITEM(tuple, i - offset, k);
3828 }
3829 return tuple;
3830}
3831
Guido van Rossum79f25d91997-04-29 20:08:16 +00003832PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003833PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003834{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003835 return PyNode_CompileFlags(n, filename, NULL);
3836}
3837
3838PyCodeObject *
3839PyNode_CompileFlags(node *n, char *filename, PyCompilerFlags *flags)
3840{
3841 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003842}
3843
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003844struct symtable *
3845PyNode_CompileSymtable(node *n, char *filename)
3846{
3847 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003848 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003849
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003850 ff = PyNode_Future(n, filename);
3851 if (ff == NULL)
3852 return NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003853 st = symtable_init();
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003854 if (st == NULL)
3855 return NULL;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003856 st->st_future = ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003857 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003858 if (st->st_errors > 0)
3859 goto fail;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003860 symtable_node(st, n);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003861 if (st->st_errors > 0)
3862 goto fail;
3863
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003864 return st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003865 fail:
3866 PyMem_Free((void *)ff);
3867 st->st_future = NULL;
3868 PySymtable_Free(st);
3869 return NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003870}
3871
Guido van Rossum79f25d91997-04-29 20:08:16 +00003872static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003873icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003874{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003875 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003876}
3877
Guido van Rossum79f25d91997-04-29 20:08:16 +00003878static PyCodeObject *
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003879jcompile(node *n, char *filename, struct compiling *base,
3880 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003881{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003882 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003883 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003884 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003885 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003886 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003887 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003888 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003889 /* c_symtable still points to parent's symbols */
3890 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003891 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003892 sc.c_nested = 1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003893 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003894 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00003895 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003896 if (sc.c_future == NULL) {
3897 com_free(&sc);
3898 return NULL;
3899 }
3900 if (flags) {
3901 if (flags->cf_nested_scopes)
3902 sc.c_future->ff_nested_scopes = 1;
3903 else if (sc.c_future->ff_nested_scopes)
3904 flags->cf_nested_scopes = 1;
3905 }
3906 if (symtable_build(&sc, n) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003907 com_free(&sc);
3908 return NULL;
3909 }
3910 }
3911 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003912 if (symtable_load_symbols(&sc) < 0) {
3913 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003914 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003915 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003916 compile_node(&sc, n);
3917 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00003918 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003919 PyObject *consts, *names, *varnames, *filename, *name,
3920 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003921 consts = PyList_AsTuple(sc.c_consts);
3922 names = PyList_AsTuple(sc.c_names);
3923 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003924 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
3925 freevars = dict_keys_inorder(sc.c_freevars,
3926 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003927 filename = PyString_InternFromString(sc.c_filename);
3928 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003929 if (!PyErr_Occurred())
3930 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003931 sc.c_nlocals,
3932 sc.c_maxstacklevel,
3933 sc.c_flags,
3934 sc.c_code,
3935 consts,
3936 names,
3937 varnames,
3938 freevars,
3939 cellvars,
3940 filename,
3941 name,
3942 sc.c_firstlineno,
3943 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003944 Py_XDECREF(consts);
3945 Py_XDECREF(names);
3946 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003947 Py_XDECREF(freevars);
3948 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003949 Py_XDECREF(filename);
3950 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003951 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00003952 else if (!PyErr_Occurred()) {
3953 /* This could happen if someone called PyErr_Clear() after an
3954 error was reported above. That's not supposed to happen,
3955 but I just plugged one case and I'm not sure there can't be
3956 others. In that case, raise SystemError so that at least
3957 it gets reported instead dumping core. */
3958 PyErr_SetString(PyExc_SystemError, "lost syntax error");
3959 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003960 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00003961 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003962 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00003963 sc.c_symtable = NULL;
3964 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003965 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003966 return co;
3967}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003968
3969int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003970PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003971{
3972 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003973 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003974 int line = co->co_firstlineno;
3975 int addr = 0;
3976 while (--size >= 0) {
3977 addr += *p++;
3978 if (addr > addrq)
3979 break;
3980 line += *p++;
3981 }
3982 return line;
3983}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003984
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003985/* The test for LOCAL must come before the test for FREE in order to
3986 handle classes where name is both local and free. The local var is
3987 a method and the free var is a free var referenced within a method.
3988*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003989
3990static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003991get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003992{
3993 PyObject *v;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00003994 if (c->c_symtable->st_nested_scopes) {
3995 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
3996 return CELL;
3997 if (PyDict_GetItemString(c->c_locals, name) != NULL)
3998 return LOCAL;
3999 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4000 return FREE;
4001 v = PyDict_GetItemString(c->c_globals, name);
4002 if (v) {
4003 if (v == Py_None)
4004 return GLOBAL_EXPLICIT;
4005 else {
4006 return GLOBAL_IMPLICIT;
4007 }
4008 }
4009 } else {
4010 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4011 return LOCAL;
4012 v = PyDict_GetItemString(c->c_globals, name);
4013 if (v) {
4014 if (v == Py_None)
4015 return GLOBAL_EXPLICIT;
4016 else {
4017 return GLOBAL_IMPLICIT;
4018 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004019 }
4020 }
4021 {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004022 char buf[350];
4023 sprintf(buf,
Jeremy Hylton51257732001-03-01 00:42:55 +00004024 "unknown scope for %.100s in %.100s(%s) "
4025 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
Jeremy Hylton483638c2001-02-01 20:20:45 +00004026 name, c->c_name,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004027 PyObject_REPR(c->c_symtable->st_cur->ste_id),
Jeremy Hylton51257732001-03-01 00:42:55 +00004028 c->c_filename,
4029 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4030 PyObject_REPR(c->c_locals),
4031 PyObject_REPR(c->c_globals)
4032 );
4033
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004034 Py_FatalError(buf);
4035 }
4036 return -1; /* can't get here */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004037}
4038
Guido van Rossum207fda62001-03-02 03:30:41 +00004039/* Helper functions to issue warnings */
4040
4041static int
4042issue_warning(char *msg, char *filename, int lineno)
4043{
4044 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4045 lineno, NULL, NULL) < 0) {
4046 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4047 PyErr_SetString(PyExc_SyntaxError, msg);
4048 PyErr_SyntaxLocation(filename, lineno);
4049 }
4050 return -1;
4051 }
4052 return 0;
4053}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004054
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004055static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004056symtable_warn(struct symtable *st, char *msg)
4057{
Guido van Rossum207fda62001-03-02 03:30:41 +00004058 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004059 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004060 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004061 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004062 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004063}
4064
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004065/* Helper function for setting lineno and filename */
4066
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004067static int
4068symtable_build(struct compiling *c, node *n)
4069{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004070 if ((c->c_symtable = symtable_init()) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004071 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004072 c->c_symtable->st_future = c->c_future;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004073 if (c->c_future->ff_nested_scopes)
4074 c->c_symtable->st_nested_scopes = 1;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004075 c->c_symtable->st_filename = c->c_filename;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004076 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
4077 if (c->c_symtable->st_errors > 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004078 return -1;
4079 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004080 if (c->c_symtable->st_errors > 0)
4081 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004082 /* reset for second pass */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004083 c->c_symtable->st_nscopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004084 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004085 return 0;
4086}
4087
4088static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004089symtable_init_compiling_symbols(struct compiling *c)
4090{
4091 PyObject *varnames;
4092
4093 varnames = c->c_symtable->st_cur->ste_varnames;
4094 if (varnames == NULL) {
4095 varnames = PyList_New(0);
4096 if (varnames == NULL)
4097 return -1;
4098 c->c_symtable->st_cur->ste_varnames = varnames;
4099 Py_INCREF(varnames);
4100 } else
4101 Py_INCREF(varnames);
4102 c->c_varnames = varnames;
4103
4104 c->c_globals = PyDict_New();
4105 if (c->c_globals == NULL)
4106 return -1;
4107 c->c_freevars = PyDict_New();
4108 if (c->c_freevars == NULL)
4109 return -1;
4110 c->c_cellvars = PyDict_New();
4111 if (c->c_cellvars == NULL)
4112 return -1;
4113 return 0;
4114}
4115
4116struct symbol_info {
4117 int si_nlocals;
4118 int si_ncells;
4119 int si_nfrees;
4120 int si_nimplicit;
4121};
4122
4123static void
4124symtable_init_info(struct symbol_info *si)
4125{
4126 si->si_nlocals = 0;
4127 si->si_ncells = 0;
4128 si->si_nfrees = 0;
4129 si->si_nimplicit = 0;
4130}
4131
4132static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004133symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004134 struct symbol_info *si)
4135{
4136 PyObject *dict, *v;
4137
4138 /* Seperate logic for DEF_FREE. If it occurs in a function,
4139 it indicates a local that we must allocate storage for (a
4140 cell var). If it occurs in a class, then the class has a
4141 method and a free variable with the same name.
4142 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004143 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004144 /* If it isn't declared locally, it can't be a cell. */
4145 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4146 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004147 v = PyInt_FromLong(si->si_ncells++);
4148 dict = c->c_cellvars;
4149 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004150 /* If it is free anyway, then there is no need to do
4151 anything here.
4152 */
4153 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00004154 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004155 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004156 v = PyInt_FromLong(si->si_nfrees++);
4157 dict = c->c_freevars;
4158 }
4159 if (v == NULL)
4160 return -1;
4161 if (PyDict_SetItem(dict, name, v) < 0) {
4162 Py_DECREF(v);
4163 return -1;
4164 }
4165 Py_DECREF(v);
4166 return 0;
4167}
4168
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004169/* If a variable is a cell and an argument, make sure that appears in
4170 co_cellvars before any variable to its right in varnames.
4171*/
4172
4173
4174static int
4175symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4176 PyObject *varnames, int flags)
4177{
4178 PyObject *v, *w, *d, *list = NULL;
4179 int i, pos;
4180
4181 if (flags & CO_VARARGS)
4182 argcount++;
4183 if (flags & CO_VARKEYWORDS)
4184 argcount++;
4185 for (i = argcount; --i >= 0; ) {
4186 v = PyList_GET_ITEM(varnames, i);
4187 if (PyDict_GetItem(*cellvars, v)) {
4188 if (list == NULL) {
4189 list = PyList_New(1);
4190 if (list == NULL)
4191 return -1;
4192 PyList_SET_ITEM(list, 0, v);
4193 Py_INCREF(v);
4194 } else
4195 PyList_Insert(list, 0, v);
4196 }
4197 }
4198 if (list == NULL || PyList_GET_SIZE(list) == 0)
4199 return 0;
4200 /* There are cellvars that are also arguments. Create a dict
4201 to replace cellvars and put the args at the front.
4202 */
4203 d = PyDict_New();
4204 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
4205 v = PyInt_FromLong(i);
4206 if (v == NULL)
4207 goto fail;
4208 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
4209 goto fail;
4210 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
4211 goto fail;
4212 }
4213 pos = 0;
4214 i = PyList_GET_SIZE(list);
4215 Py_DECREF(list);
4216 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
4217 w = PyInt_FromLong(i++); /* don't care about the old key */
4218 if (PyDict_SetItem(d, v, w) < 0) {
4219 Py_DECREF(w);
4220 goto fail;
4221 }
4222 Py_DECREF(w);
4223 }
4224 Py_DECREF(*cellvars);
4225 *cellvars = d;
4226 return 1;
4227 fail:
4228 Py_DECREF(d);
4229 return -1;
4230}
4231
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004232static int
4233symtable_freevar_offsets(PyObject *freevars, int offset)
4234{
4235 PyObject *name, *v;
4236 int pos;
4237
4238 /* The cell vars are the first elements of the closure,
4239 followed by the free vars. Update the offsets in
4240 c_freevars to account for number of cellvars. */
4241 pos = 0;
4242 while (PyDict_Next(freevars, &pos, &name, &v)) {
4243 int i = PyInt_AS_LONG(v) + offset;
4244 PyObject *o = PyInt_FromLong(i);
4245 if (o == NULL)
4246 return -1;
4247 if (PyDict_SetItem(freevars, name, o) < 0) {
4248 Py_DECREF(o);
4249 return -1;
4250 }
4251 Py_DECREF(o);
4252 }
4253 return 0;
4254}
4255
4256static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004257symtable_check_unoptimized(struct compiling *c,
4258 PySymtableEntryObject *ste,
4259 struct symbol_info *si)
4260{
4261 char buf[300];
4262
4263 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4264 || (ste->ste_nested && si->si_nimplicit)))
4265 return 0;
4266
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004267#define ILLEGAL_CONTAINS "contains a nested function with free variables"
4268
4269#define ILLEGAL_IS "is a nested function"
4270
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004271#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004272"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004273
4274#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004275"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004276
4277#define ILLEGAL_EXEC_AND_IMPORT_STAR \
4278"function '%.100s' uses import * and bare exec, which are illegal" \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004279"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004280
4281 /* XXX perhaps the linenos for these opt-breaking statements
4282 should be stored so the exception can point to them. */
4283
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004284 if (ste->ste_child_free) {
4285 if (ste->ste_optimized == OPT_IMPORT_STAR)
4286 sprintf(buf, ILLEGAL_IMPORT_STAR,
4287 PyString_AS_STRING(ste->ste_name),
4288 ILLEGAL_CONTAINS);
4289 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
4290 sprintf(buf, ILLEGAL_BARE_EXEC,
4291 PyString_AS_STRING(ste->ste_name),
4292 ILLEGAL_CONTAINS);
4293 else {
4294 sprintf(buf, ILLEGAL_EXEC_AND_IMPORT_STAR,
4295 PyString_AS_STRING(ste->ste_name),
4296 ILLEGAL_CONTAINS);
4297 }
4298 } else {
4299 if (ste->ste_optimized == OPT_IMPORT_STAR)
4300 sprintf(buf, ILLEGAL_IMPORT_STAR,
4301 PyString_AS_STRING(ste->ste_name),
4302 ILLEGAL_IS);
4303 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
4304 sprintf(buf, ILLEGAL_BARE_EXEC,
4305 PyString_AS_STRING(ste->ste_name),
4306 ILLEGAL_IS);
4307 else {
4308 sprintf(buf, ILLEGAL_EXEC_AND_IMPORT_STAR,
4309 PyString_AS_STRING(ste->ste_name),
4310 ILLEGAL_IS);
4311 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004312 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004313
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004314 if (c->c_symtable->st_nested_scopes) {
4315 PyErr_SetString(PyExc_SyntaxError, buf);
4316 PyErr_SyntaxLocation(c->c_symtable->st_filename,
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00004317 ste->ste_opt_lineno);
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004318 return -1;
Guido van Rossum207fda62001-03-02 03:30:41 +00004319 }
4320 else {
4321 return issue_warning(buf, c->c_filename, ste->ste_lineno);
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004322 }
4323 return 0;
4324}
4325
4326static int
4327symtable_check_shadow(struct symtable *st, PyObject *name, int flags)
4328{
4329 char buf[500];
4330 PyObject *children, *v;
Jeremy Hyltonc1761322001-02-28 23:44:45 +00004331 PySymtableEntryObject *child = NULL;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004332 int i;
4333
4334 if (!(flags & DEF_BOUND))
4335 return 0;
Jeremy Hylton9c901052001-05-08 04:12:34 +00004336
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004337 /* The semantics of this code will change with nested scopes.
4338 It is defined in the current scope and referenced in a
4339 child scope. Under the old rules, the child will see a
4340 global. Under the new rules, the child will see the
4341 binding in the current scope.
4342 */
4343
4344 /* Find name of child function that has free variable */
4345 children = st->st_cur->ste_children;
4346 for (i = 0; i < PyList_GET_SIZE(children); i++) {
4347 int cflags;
4348 child = (PySymtableEntryObject *)PyList_GET_ITEM(children, i);
4349 v = PyDict_GetItem(child->ste_symbols, name);
4350 if (v == NULL)
4351 continue;
4352 cflags = PyInt_AS_LONG(v);
4353 if (!(cflags & DEF_BOUND))
4354 break;
4355 }
Jeremy Hyltonc1761322001-02-28 23:44:45 +00004356
4357 assert(child != NULL);
4358
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004359 sprintf(buf, "local name '%.100s' in '%.100s' shadows "
4360 "use of '%.100s' as global in nested scope '%.100s'",
4361 PyString_AS_STRING(name),
4362 PyString_AS_STRING(st->st_cur->ste_name),
4363 PyString_AS_STRING(name),
4364 PyString_AS_STRING(child->ste_name)
4365 );
4366
4367 return symtable_warn(st, buf);
4368}
4369
4370static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004371symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4372 struct symbol_info *si)
4373{
Jeremy Hylton061d1062001-03-22 02:32:48 +00004374 if (c->c_future && c->c_future->ff_nested_scopes)
4375 c->c_flags |= CO_NESTED;
Tim Peters5ca576e2001-06-18 22:08:13 +00004376 if (ste->ste_generator)
4377 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004378 if (ste->ste_type != TYPE_MODULE)
4379 c->c_flags |= CO_NEWLOCALS;
4380 if (ste->ste_type == TYPE_FUNCTION) {
4381 c->c_nlocals = si->si_nlocals;
4382 if (ste->ste_optimized == 0)
4383 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004384 else if (ste->ste_optimized != OPT_EXEC)
4385 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004386 }
4387 return 0;
4388}
4389
4390static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004391symtable_load_symbols(struct compiling *c)
4392{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004393 static PyObject *implicit = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004394 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004395 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004396 PyObject *name, *varnames, *v;
4397 int i, flags, pos;
4398 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004399
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004400 if (implicit == NULL) {
4401 implicit = PyInt_FromLong(1);
4402 if (implicit == NULL)
4403 return -1;
4404 }
4405 v = NULL;
4406
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004407 if (symtable_init_compiling_symbols(c) < 0)
4408 goto fail;
4409 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004410 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004411 si.si_nlocals = PyList_GET_SIZE(varnames);
4412 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004413
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004414 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004415 v = PyInt_FromLong(i);
4416 if (PyDict_SetItem(c->c_locals,
4417 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004418 goto fail;
4419 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004420 }
4421
4422 /* XXX The cases below define the rules for whether a name is
4423 local or global. The logic could probably be clearer. */
4424 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004425 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4426 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004427
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004428 if (st->st_nested_scopes == 0
4429 && (flags & (DEF_FREE | DEF_FREE_CLASS))) {
4430 if (symtable_check_shadow(st, name, flags) < 0)
4431 goto fail;
4432 }
4433
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004434 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004435 /* undo the original DEF_FREE */
4436 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004437
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004438 /* Deal with names that need two actions:
4439 1. Cell variables, which are also locals.
4440 2. Free variables in methods that are also class
4441 variables or declared global.
4442 */
Jeremy Hylton9c901052001-05-08 04:12:34 +00004443 if (st->st_nested_scopes) {
4444 if (flags & (DEF_FREE | DEF_FREE_CLASS)) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004445 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton9c901052001-05-08 04:12:34 +00004446 }
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004447 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004448
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004449 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004450 c->c_argcount--;
4451 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004452 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004453 c->c_argcount--;
4454 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004455 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004456 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004457 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004458 if (flags & DEF_PARAM) {
4459 PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004460 PyString_AS_STRING(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004461 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004462 ste->ste_lineno);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004463 st->st_errors++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004464 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004465 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004466 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4467 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004468 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004469 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004470 if (PyDict_SetItem(c->c_globals, name, implicit) < 0)
4471 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004472 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004473 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004474 if (v == NULL)
4475 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004476 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004477 goto fail;
4478 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004479 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004480 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004481 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004482 } else if (is_free(flags)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004483 if (ste->ste_nested && st->st_nested_scopes) {
4484 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004485 if (v == NULL)
4486 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004487 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004488 goto fail;
4489 Py_DECREF(v);
4490 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004491 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004492 if (PyDict_SetItem(c->c_globals, name,
4493 implicit) < 0)
4494 goto fail;
Jeremy Hylton51257732001-03-01 00:42:55 +00004495 if (st->st_nscopes != 1) {
4496 v = PyInt_FromLong(flags);
4497 if (PyDict_SetItem(st->st_global,
4498 name, v))
4499 goto fail;
4500 Py_DECREF(v);
4501 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004502 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004503 }
4504 }
4505
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004506 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
4507
Jeremy Hylton9c901052001-05-08 04:12:34 +00004508 if (st->st_nested_scopes == 0)
4509 assert(si.si_nfrees == 0);
4510
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004511 if (si.si_ncells > 1) { /* one cell is always in order */
4512 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
4513 c->c_varnames, c->c_flags) < 0)
4514 return -1;
4515 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004516 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4517 return -1;
4518 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004519 fail:
4520 /* is this always the right thing to do? */
4521 Py_XDECREF(v);
4522 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004523}
4524
4525static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004526symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004527{
4528 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004529
4530 st = (struct symtable *)PyMem_Malloc(sizeof(struct symtable));
4531 if (st == NULL)
4532 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004533 st->st_pass = 1;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004534 st->st_nested_scopes = NESTED_SCOPES_DEFAULT;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004535 st->st_filename = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004536 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004537 goto fail;
4538 if ((st->st_symbols = PyDict_New()) == NULL)
4539 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004540 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004541 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004542 st->st_errors = 0;
4543 st->st_tmpname = 0;
4544 st->st_private = NULL;
4545 return st;
4546 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004547 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004548 return NULL;
4549}
4550
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004551void
4552PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004553{
4554 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004555 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004556 Py_XDECREF(st->st_cur);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004557 PyMem_Free((void *)st);
4558}
4559
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004560/* When the compiler exits a scope, it must should update the scope's
4561 free variable information with the list of free variables in its
4562 children.
4563
4564 Variables that are free in children and defined in the current
4565 scope are cellvars.
4566
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004567 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004568 false), free variables in children that are not defined here are
4569 implicit globals.
4570
4571*/
4572
4573static int
4574symtable_update_free_vars(struct symtable *st)
4575{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004576 int i, j, def;
4577 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004578 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004579
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004580 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004581 def = DEF_FREE_CLASS;
4582 else
4583 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004584 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004585 int pos = 0;
4586
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004587 if (list)
4588 PyList_SetSlice(list, 0,
4589 ((PyVarObject*)list)->ob_size, 0);
Barry Warsaw0372af72001-02-23 18:22:59 +00004590 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004591 PyList_GET_ITEM(ste->ste_children, i);
4592 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004593 int flags = PyInt_AS_LONG(o);
4594 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004595 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004596 if (list == NULL) {
4597 list = PyList_New(0);
4598 if (list == NULL)
4599 return -1;
4600 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004601 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004602 if (PyList_Append(list, name) < 0) {
4603 Py_DECREF(list);
4604 return -1;
4605 }
4606 }
4607 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004608 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004609 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00004610 v = PyDict_GetItem(ste->ste_symbols, name);
4611 /* If a name N is declared global in scope A and
4612 referenced in scope B contained (perhaps
4613 indirectly) in A and there are no scopes
4614 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00004615 is global in B. Unless A is a class scope,
4616 because class scopes are not considered for
4617 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00004618 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004619 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004620 int flags = PyInt_AS_LONG(v);
4621 if (flags & DEF_GLOBAL) {
4622 symtable_undo_free(st, child->ste_id,
4623 name);
4624 continue;
4625 }
4626 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004627 if (ste->ste_nested) {
4628 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004629 name, def) < 0) {
4630 Py_DECREF(list);
4631 return -1;
4632 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004633 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004634 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004635 name) < 0) {
4636 Py_DECREF(list);
4637 return -1;
4638 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004639 }
4640 }
4641 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004642
4643 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004644 return 0;
4645}
4646
4647/* If the current scope is a non-nested class or if name is not
4648 defined in the current, non-nested scope, then it is an implicit
4649 global in all nested scopes.
4650*/
4651
4652static int
4653symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
4654{
4655 PyObject *o;
4656 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004657 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00004658
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004659 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004660 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004661 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004662 if (o == NULL)
4663 return symtable_undo_free(st, child, name);
4664 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00004665
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004666 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004667 return symtable_undo_free(st, child, name);
4668 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004669 return symtable_add_def_o(st, ste->ste_symbols,
4670 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004671}
4672
4673static int
4674symtable_undo_free(struct symtable *st, PyObject *id,
4675 PyObject *name)
4676{
4677 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004678 PyObject *info;
4679 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004680
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004681 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
4682 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004683 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00004684
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004685 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004686 if (info == NULL)
4687 return 0;
4688 v = PyInt_AS_LONG(info);
4689 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004690 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004691 DEF_FREE_GLOBAL) < 0)
4692 return -1;
4693 } else
4694 /* If the name is defined here or declared global,
4695 then the recursion stops. */
4696 return 0;
4697
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004698 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
4699 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00004700 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004701 PyList_GET_ITEM(ste->ste_children, i);
4702 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004703 if (x < 0)
4704 return x;
4705 }
4706 return 0;
4707}
4708
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004709/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
4710 This reference is released when the scope is exited, via the DECREF
4711 in symtable_exit_scope().
4712*/
4713
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004714static int
4715symtable_exit_scope(struct symtable *st)
4716{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004717 int end;
4718
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004719 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004720 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004721 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004722 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004723 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
4724 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004725 if (PySequence_DelItem(st->st_stack, end) < 0)
4726 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004727 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004728}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004729
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004730static void
4731symtable_enter_scope(struct symtable *st, char *name, int type,
4732 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004733{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004734 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004735
4736 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004737 prev = st->st_cur;
4738 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
4739 Py_DECREF(st->st_cur);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004740 st->st_errors++;
4741 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004742 }
4743 }
Barry Warsaw0372af72001-02-23 18:22:59 +00004744 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004745 PySymtableEntry_New(st, name, type, lineno);
4746 if (strcmp(name, TOP) == 0)
4747 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004748 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004749 if (PyList_Append(prev->ste_children,
4750 (PyObject *)st->st_cur) < 0)
4751 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004752 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004753}
4754
4755static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004756symtable_lookup(struct symtable *st, char *name)
4757{
4758 char buffer[MANGLE_LEN];
4759 PyObject *v;
4760 int flags;
4761
4762 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
4763 name = buffer;
4764 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
4765 if (v == NULL) {
4766 if (PyErr_Occurred())
4767 return -1;
4768 else
4769 return 0;
4770 }
4771
4772 flags = PyInt_AS_LONG(v);
4773 return flags;
4774}
4775
4776static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004777symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004778{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004779 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004780 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004781 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004782
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004783 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004784 name = buffer;
4785 if ((s = PyString_InternFromString(name)) == NULL)
4786 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004787 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
4788 Py_DECREF(s);
4789 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004790}
4791
4792/* Must only be called with mangled names */
4793
4794static int
4795symtable_add_def_o(struct symtable *st, PyObject *dict,
4796 PyObject *name, int flag)
4797{
4798 PyObject *o;
4799 int val;
4800
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004801 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004802 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004803 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004804 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00004805 PyString_AsString(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004806 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004807 st->st_cur->ste_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004808 return -1;
4809 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004810 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004811 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004812 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004813 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004814 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004815 Py_DECREF(o);
4816 return -1;
4817 }
4818 Py_DECREF(o);
4819
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004820 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004821 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004822 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004823 } else if (flag & DEF_GLOBAL) {
4824 /* XXX need to update DEF_GLOBAL for other flags too;
4825 perhaps only DEF_FREE_GLOBAL */
4826 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004827 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004828 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004829 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004830 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004831 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004832 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004833 Py_DECREF(o);
4834 return -1;
4835 }
4836 Py_DECREF(o);
4837 }
4838 return 0;
4839}
4840
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004841#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004842
Tim Petersb6c3cea2001-06-26 03:36:28 +00004843/* Look for a yield stmt under n. Return 1 if found, else 0. */
4844static int
4845look_for_yield(node *n)
4846{
4847 int i;
4848
4849 for (i = 0; i < NCH(n); ++i) {
4850 node *kid = CHILD(n, i);
4851
4852 switch (TYPE(kid)) {
4853
4854 case classdef:
4855 case funcdef:
4856 /* Stuff in nested functions and classes can't make
4857 the parent a generator. */
4858 return 0;
4859
4860 case yield_stmt:
4861 return 1;
4862
4863 default:
4864 if (look_for_yield(kid))
4865 return 1;
4866 }
4867 }
4868 return 0;
4869}
4870
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004871static void
4872symtable_node(struct symtable *st, node *n)
4873{
4874 int i, start = 0;
4875
4876 loop:
4877 switch (TYPE(n)) {
4878 case funcdef: {
4879 char *func_name = STR(CHILD(n, 1));
4880 symtable_add_def(st, func_name, DEF_LOCAL);
4881 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004882 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004883 symtable_funcdef(st, n);
4884 symtable_exit_scope(st);
4885 break;
4886 }
4887 case lambdef:
4888 if (NCH(n) == 4)
4889 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004890 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004891 symtable_funcdef(st, n);
4892 symtable_exit_scope(st);
4893 break;
4894 case classdef: {
4895 char *tmp, *class_name = STR(CHILD(n, 1));
4896 symtable_add_def(st, class_name, DEF_LOCAL);
4897 if (TYPE(CHILD(n, 2)) == LPAR) {
4898 node *bases = CHILD(n, 3);
4899 int i;
4900 for (i = 0; i < NCH(bases); i += 2) {
4901 symtable_node(st, CHILD(bases, i));
4902 }
4903 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004904 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004905 tmp = st->st_private;
4906 st->st_private = class_name;
4907 symtable_node(st, CHILD(n, NCH(n) - 1));
4908 st->st_private = tmp;
4909 symtable_exit_scope(st);
4910 break;
4911 }
4912 case if_stmt:
4913 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00004914 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
4915 if (st->st_cur->ste_generator == 0)
4916 st->st_cur->ste_generator =
4917 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004918 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00004919 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004920 symtable_node(st, CHILD(n, i + 1));
4921 symtable_node(st, CHILD(n, i + 3));
4922 }
4923 if (i + 2 < NCH(n))
4924 symtable_node(st, CHILD(n, i + 2));
4925 break;
4926 case global_stmt:
4927 symtable_global(st, n);
4928 break;
4929 case import_stmt:
4930 symtable_import(st, n);
4931 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004932 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004933 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004934 symtable_node(st, CHILD(n, 1));
4935 if (NCH(n) > 2)
4936 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00004937 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004938 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00004939 st->st_cur->ste_opt_lineno = n->n_lineno;
4940 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004941 if (NCH(n) > 4)
4942 symtable_node(st, CHILD(n, 5));
4943 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004944
4945 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00004946 case assert_stmt:
4947 if (Py_OptimizeFlag)
4948 return;
4949 if (NCH(n) == 2) {
4950 n = CHILD(n, 1);
4951 goto loop;
4952 } else {
4953 symtable_node(st, CHILD(n, 1));
4954 n = CHILD(n, 3);
4955 goto loop;
4956 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004957 case except_clause:
4958 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004959 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004960 if (NCH(n) > 1) {
4961 n = CHILD(n, 1);
4962 goto loop;
4963 }
4964 break;
4965 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004966 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004967 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00004968 case yield_stmt:
4969 st->st_cur->ste_generator = 1;
4970 n = CHILD(n, 1);
4971 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004972 case expr_stmt:
4973 if (NCH(n) == 1)
4974 n = CHILD(n, 0);
4975 else {
4976 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004977 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004978 symtable_node(st, CHILD(n, 2));
4979 break;
4980 } else {
4981 int i;
4982 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004983 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004984 n = CHILD(n, NCH(n) - 1);
4985 }
4986 }
4987 goto loop;
4988 /* watchout for fall-through logic below */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004989 case argument:
4990 if (NCH(n) == 3) {
4991 n = CHILD(n, 2);
4992 goto loop;
4993 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004994 case listmaker:
4995 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton23b42272001-03-19 20:38:06 +00004996 st->st_tmpname++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004997 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton23b42272001-03-19 20:38:06 +00004998 symtable_node(st, CHILD(n, 0));
4999 st->st_tmpname--;
5000 return;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005001 }
5002 case atom:
5003 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
5004 symtable_add_use(st, STR(CHILD(n, 0)));
5005 break;
5006 }
5007 case for_stmt:
5008 if (TYPE(n) == for_stmt) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005009 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005010 start = 3;
5011 }
5012 default:
5013 if (NCH(n) == 1) {
5014 n = CHILD(n, 0);
5015 goto loop;
5016 }
5017 for (i = start; i < NCH(n); ++i)
5018 if (TYPE(CHILD(n, i)) >= single_input)
5019 symtable_node(st, CHILD(n, i));
5020 }
5021}
5022
5023static void
5024symtable_funcdef(struct symtable *st, node *n)
5025{
5026 node *body;
5027
5028 if (TYPE(n) == lambdef) {
5029 if (NCH(n) == 4)
5030 symtable_params(st, CHILD(n, 1));
5031 } else
5032 symtable_params(st, CHILD(n, 2));
5033 body = CHILD(n, NCH(n) - 1);
5034 symtable_node(st, body);
5035}
5036
5037/* The next two functions parse the argument tuple.
5038 symtable_default_arg() checks for names in the default arguments,
5039 which are references in the defining scope. symtable_params()
5040 parses the parameter names, which are defined in the function's
5041 body.
5042
5043 varargslist:
5044 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5045 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5046*/
5047
5048static void
5049symtable_default_args(struct symtable *st, node *n)
5050{
5051 node *c;
5052 int i;
5053
5054 if (TYPE(n) == parameters) {
5055 n = CHILD(n, 1);
5056 if (TYPE(n) == RPAR)
5057 return;
5058 }
5059 REQ(n, varargslist);
5060 for (i = 0; i < NCH(n); i += 2) {
5061 c = CHILD(n, i);
5062 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5063 break;
5064 }
5065 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5066 symtable_node(st, CHILD(n, i));
5067 }
5068}
5069
5070static void
5071symtable_params(struct symtable *st, node *n)
5072{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005073 int i, complex = -1, ext = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005074 node *c = NULL;
5075
5076 if (TYPE(n) == parameters) {
5077 n = CHILD(n, 1);
5078 if (TYPE(n) == RPAR)
5079 return;
5080 }
5081 REQ(n, varargslist);
5082 for (i = 0; i < NCH(n); i += 2) {
5083 c = CHILD(n, i);
5084 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5085 ext = 1;
5086 break;
5087 }
5088 if (TYPE(c) == test) {
5089 continue;
5090 }
5091 if (TYPE(CHILD(c, 0)) == NAME)
5092 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
5093 else {
5094 char nbuf[10];
5095 sprintf(nbuf, ".%d", i);
5096 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005097 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005098 }
5099 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005100 if (ext) {
5101 c = CHILD(n, i);
5102 if (TYPE(c) == STAR) {
5103 i++;
5104 symtable_add_def(st, STR(CHILD(n, i)),
5105 DEF_PARAM | DEF_STAR);
5106 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00005107 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005108 c = NULL;
5109 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005110 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005111 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005112 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005113 i++;
5114 symtable_add_def(st, STR(CHILD(n, i)),
5115 DEF_PARAM | DEF_DOUBLESTAR);
5116 }
5117 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005118 if (complex >= 0) {
5119 int j;
5120 for (j = 0; j <= complex; j++) {
5121 c = CHILD(n, j);
5122 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005123 c = CHILD(n, ++j);
5124 else if (TYPE(c) == EQUAL)
5125 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005126 if (TYPE(CHILD(c, 0)) == LPAR)
5127 symtable_params_fplist(st, CHILD(c, 1));
5128 }
5129 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005130}
5131
5132static void
5133symtable_params_fplist(struct symtable *st, node *n)
5134{
5135 int i;
5136 node *c;
5137
5138 REQ(n, fplist);
5139 for (i = 0; i < NCH(n); i += 2) {
5140 c = CHILD(n, i);
5141 REQ(c, fpdef);
5142 if (NCH(c) == 1)
5143 symtable_add_def(st, STR(CHILD(c, 0)),
5144 DEF_PARAM | DEF_INTUPLE);
5145 else
5146 symtable_params_fplist(st, CHILD(c, 1));
5147 }
5148
5149}
5150
5151static void
5152symtable_global(struct symtable *st, node *n)
5153{
5154 int i;
5155
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005156 /* XXX It might be helpful to warn about module-level global
5157 statements, but it's hard to tell the difference between
5158 module-level and a string passed to exec.
5159 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00005160
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005161 for (i = 1; i < NCH(n); i += 2) {
5162 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005163 int flags;
5164
5165 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005166 if (flags < 0)
5167 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005168 if (flags && flags != DEF_GLOBAL) {
5169 char buf[500];
5170 if (flags & DEF_PARAM) {
5171 PyErr_Format(PyExc_SyntaxError,
5172 "name '%.400s' is local and global",
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005173 name);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005174 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005175 st->st_cur->ste_lineno);
5176 st->st_errors++;
5177 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005178 }
5179 else {
5180 if (flags & DEF_LOCAL)
5181 sprintf(buf, GLOBAL_AFTER_ASSIGN,
5182 name);
5183 else
5184 sprintf(buf, GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005185 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005186 }
5187 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005188 symtable_add_def(st, name, DEF_GLOBAL);
5189 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005190}
5191
5192static void
5193symtable_list_comprehension(struct symtable *st, node *n)
5194{
5195 char tmpname[12];
5196
Jeremy Hylton23b42272001-03-19 20:38:06 +00005197 sprintf(tmpname, "_[%d]", st->st_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005198 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005199 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005200 symtable_node(st, CHILD(n, 3));
5201 if (NCH(n) == 5)
5202 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005203}
5204
5205static void
5206symtable_import(struct symtable *st, node *n)
5207{
5208 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005209 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005210 | 'from' dotted_name 'import'
5211 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00005212 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005213 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005214 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005215 node *dotname = CHILD(n, 1);
5216 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
5217 /* check for bogus imports */
5218 if (n->n_lineno >= st->st_future->ff_last_lineno) {
5219 PyErr_SetString(PyExc_SyntaxError,
5220 LATE_FUTURE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005221 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005222 n->n_lineno);
5223 st->st_errors++;
5224 return;
5225 }
5226 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005227 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005228 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005229 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005230 } else {
5231 for (i = 3; i < NCH(n); i += 2) {
5232 node *c = CHILD(n, i);
5233 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005234 symtable_assign(st, CHILD(c, 2),
5235 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005236 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005237 symtable_assign(st, CHILD(c, 0),
5238 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005239 }
5240 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005241 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005242 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005243 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005244 }
5245 }
5246}
5247
5248static void
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005249symtable_assign(struct symtable *st, node *n, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005250{
5251 node *tmp;
5252 int i;
5253
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005254 loop:
5255 switch (TYPE(n)) {
5256 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005257 /* invalid assignment, e.g. lambda x:x=2. The next
5258 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005259 return;
5260 case power:
5261 if (NCH(n) > 2) {
5262 for (i = 2; i < NCH(n); ++i)
5263 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
5264 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005265 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005266 if (NCH(n) > 1) {
5267 symtable_node(st, CHILD(n, 0));
5268 symtable_node(st, CHILD(n, 1));
5269 } else {
5270 n = CHILD(n, 0);
5271 goto loop;
5272 }
5273 return;
5274 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00005275 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
5276 /* XXX This is an error, but the next pass
5277 will catch it. */
5278 return;
5279 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005280 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005281 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005282 }
5283 return;
5284 case exprlist:
5285 case testlist:
5286 if (NCH(n) == 1) {
5287 n = CHILD(n, 0);
5288 goto loop;
5289 }
5290 else {
5291 int i;
5292 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005293 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005294 return;
5295 }
5296 goto loop;
5297 case atom:
5298 tmp = CHILD(n, 0);
5299 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
5300 n = CHILD(n, 1);
5301 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00005302 } else if (TYPE(tmp) == NAME) {
Jeremy Hyltona830b382001-04-09 16:07:59 +00005303 if (strcmp(STR(tmp), "__debug__") == 0)
5304 symtable_warn(st, ASSIGN_DEBUG);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005305 symtable_add_def(st, STR(tmp), DEF_LOCAL | flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00005306 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005307 return;
5308 case dotted_as_name:
5309 if (NCH(n) == 3)
5310 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005311 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005312 else
5313 symtable_add_def(st,
5314 STR(CHILD(CHILD(n,
5315 0), 0)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005316 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005317 return;
5318 case dotted_name:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005319 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005320 return;
5321 case NAME:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005322 symtable_add_def(st, STR(n), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005323 return;
5324 default:
5325 if (NCH(n) == 0)
5326 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00005327 if (NCH(n) == 1) {
5328 n = CHILD(n, 0);
5329 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005330 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00005331 /* Should only occur for errors like x + 1 = 1,
5332 which will be caught in the next pass. */
5333 for (i = 0; i < NCH(n); ++i)
5334 if (TYPE(CHILD(n, i)) >= single_input)
5335 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005336 }
5337}