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