blob: 2a93a57cd2c79880fc624fdaf7755c8e50946372 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002/* Compile an expression node to intermediate code */
3
Guido van Rossum3f5da241990-12-20 15:06:42 +00004/* XXX TO DO:
Guido van Rossum8b993a91997-01-17 21:04:03 +00005 XXX add __doc__ attribute == co_doc to code object attributes?
6 XXX (it's currently the first item of the co_const tuple)
Guido van Rossum3f5da241990-12-20 15:06:42 +00007 XXX Generate simple jump for break/return outside 'try...finally'
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00008 XXX Allow 'continue' inside finally clause of try-finally
Guido van Rossum8b993a91997-01-17 21:04:03 +00009 XXX New opcode for loading the initial index for a for loop
Guido van Rossum681d79a1995-07-18 14:51:37 +000010 XXX other JAR tricks?
Guido van Rossum3f5da241990-12-20 15:06:42 +000011*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +000012
Guido van Rossum79f25d91997-04-29 20:08:16 +000013#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000014
Guido van Rossum10dc2e81990-11-18 17:27:39 +000015#include "node.h"
16#include "token.h"
17#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000018#include "compile.h"
Jeremy Hylton4b38da62001-02-02 18:19:15 +000019#include "symtable.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000020#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000021#include "structmember.h"
22
23#include <ctype.h>
Guido van Rossum282914b1991-04-04 10:42:56 +000024
Guido van Rossumb05a5c71997-05-07 17:46:13 +000025/* Three symbols from graminit.h are also defined in Python.h, with
26 Py_ prefixes to their names. Python.h can't include graminit.h
27 (which defines too many confusing symbols), but we can check here
28 that they haven't changed (which is very unlikely, but possible). */
29#if Py_single_input != single_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000030 #error "single_input has changed -- update Py_single_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000031#endif
32#if Py_file_input != file_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000033 #error "file_input has changed -- update Py_file_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000034#endif
35#if Py_eval_input != eval_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000036 #error "eval_input has changed -- update Py_eval_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000037#endif
38
Guido van Rossum8e793d91997-03-03 19:13:14 +000039int Py_OptimizeFlag = 0;
40
Guido van Rossum8861b741996-07-30 16:49:37 +000041#define OP_DELETE 0
42#define OP_ASSIGN 1
43#define OP_APPLY 2
44
Jeremy Hyltone36f7782001-01-19 03:21:30 +000045#define VAR_LOAD 0
46#define VAR_STORE 1
47#define VAR_DELETE 2
48
Jeremy Hylton64949cb2001-01-25 20:06:59 +000049#define DEL_CLOSURE_ERROR \
Jeremy Hyltoneab156f2001-01-30 01:24:43 +000050"can not delete variable '%.400s' referenced in nested scope"
51
52#define DUPLICATE_ARGUMENT \
53"duplicate argument '%s' in function definition"
54
55#define ILLEGAL_IMPORT_STAR \
56"'from ... import *' may only occur in a module scope"
57
Jeremy Hyltone36f7782001-01-19 03:21:30 +000058#define MANGLE_LEN 256
59
Guido van Rossum79f25d91997-04-29 20:08:16 +000060#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000061
62static struct memberlist code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000063 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
64 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000065 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000066 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000067 {"co_code", T_OBJECT, OFF(co_code), READONLY},
68 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
69 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000070 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Jeremy Hylton64949cb2001-01-25 20:06:59 +000071 {"co_freevars", T_OBJECT, OFF(co_freevars), READONLY},
72 {"co_cellvars", T_OBJECT, OFF(co_cellvars), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000073 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000074 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000075 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
76 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000077 {NULL} /* Sentinel */
78};
79
Guido van Rossum79f25d91997-04-29 20:08:16 +000080static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000081code_getattr(PyCodeObject *co, char *name)
Guido van Rossum3f5da241990-12-20 15:06:42 +000082{
Guido van Rossum79f25d91997-04-29 20:08:16 +000083 return PyMember_Get((char *)co, code_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +000084}
Guido van Rossum10dc2e81990-11-18 17:27:39 +000085
86static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000087code_dealloc(PyCodeObject *co)
Guido van Rossum10dc2e81990-11-18 17:27:39 +000088{
Guido van Rossum79f25d91997-04-29 20:08:16 +000089 Py_XDECREF(co->co_code);
90 Py_XDECREF(co->co_consts);
91 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +000092 Py_XDECREF(co->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +000093 Py_XDECREF(co->co_freevars);
94 Py_XDECREF(co->co_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +000095 Py_XDECREF(co->co_filename);
96 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +000097 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +000098 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +000099}
100
Guido van Rossum79f25d91997-04-29 20:08:16 +0000101static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000102code_repr(PyCodeObject *co)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000103{
104 char buf[500];
105 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000106 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000107 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000108
Guido van Rossuma396a882000-04-07 01:21:36 +0000109 if (co->co_firstlineno != 0)
110 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000111 if (co->co_filename && PyString_Check(co->co_filename))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000112 filename = PyString_AS_STRING(co->co_filename);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000113 if (co->co_name && PyString_Check(co->co_name))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000114 name = PyString_AS_STRING(co->co_name);
Fred Drake615ae552000-06-30 16:20:13 +0000115 sprintf(buf, "<code object %.100s at %p, file \"%.300s\", line %d>",
116 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000117 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000118}
119
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000120static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000121code_compare(PyCodeObject *co, PyCodeObject *cp)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000122{
123 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000124 cmp = PyObject_Compare(co->co_name, cp->co_name);
125 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000126 cmp = co->co_argcount - cp->co_argcount;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000127 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000128 cmp = co->co_nlocals - cp->co_nlocals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000129 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000130 cmp = co->co_flags - cp->co_flags;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000131 if (cmp) return cmp;
Guido van Rossumd076c731998-10-07 19:42:25 +0000132 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000133 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000134 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000135 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000136 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000137 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000138 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000139 if (cmp) return cmp;
140 cmp = PyObject_Compare(co->co_freevars, cp->co_freevars);
141 if (cmp) return cmp;
142 cmp = PyObject_Compare(co->co_cellvars, cp->co_cellvars);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000143 return cmp;
144}
145
146static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000147code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000148{
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000149 long h, h0, h1, h2, h3, h4, h5, h6;
Guido van Rossum44679592000-04-10 16:20:31 +0000150 h0 = PyObject_Hash(co->co_name);
151 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000152 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000153 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000154 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000155 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000156 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000157 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000158 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000159 if (h4 == -1) return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000160 h5 = PyObject_Hash(co->co_freevars);
161 if (h5 == -1) return -1;
162 h6 = PyObject_Hash(co->co_cellvars);
163 if (h6 == -1) return -1;
164 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^ h5 ^ h6 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000165 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000166 if (h == -1) h = -2;
167 return h;
168}
169
Guido van Rossum79f25d91997-04-29 20:08:16 +0000170PyTypeObject PyCode_Type = {
171 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000172 0,
173 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000174 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000175 0,
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000176 (destructor)code_dealloc, /*tp_dealloc*/
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000177 0, /*tp_print*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000178 (getattrfunc)code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000179 0, /*tp_setattr*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000180 (cmpfunc)code_compare, /*tp_compare*/
181 (reprfunc)code_repr, /*tp_repr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000182 0, /*tp_as_number*/
183 0, /*tp_as_sequence*/
184 0, /*tp_as_mapping*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000185 (hashfunc)code_hash, /*tp_hash*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000186};
187
Guido van Rossum644a12b1997-04-09 19:24:53 +0000188#define NAME_CHARS \
189 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
190
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000191/* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
192
193static int
194all_name_chars(unsigned char *s)
195{
Guido van Rossumcd90c202001-02-09 15:06:42 +0000196 static char ok_name_char[256];
197 static unsigned char *name_chars = (unsigned char *)NAME_CHARS;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000198
Guido van Rossumcd90c202001-02-09 15:06:42 +0000199 if (ok_name_char[*name_chars] == 0) {
200 unsigned char *p;
201 for (p = name_chars; *p; p++)
202 ok_name_char[*p] = 1;
203 }
204 while (*s) {
205 if (ok_name_char[*s++] == 0)
206 return 0;
207 }
208 return 1;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000209}
210
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000211static int
212intern_strings(PyObject *tuple)
213{
214 int i;
215
216 for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) {
217 PyObject *v = PyTuple_GET_ITEM(tuple, i);
218 if (v == NULL || !PyString_Check(v)) {
219 Py_FatalError("non-string found in code slot");
220 PyErr_BadInternalCall();
221 return -1;
222 }
223 PyString_InternInPlace(&PyTuple_GET_ITEM(tuple, i));
224 }
225 return 0;
226}
227
Guido van Rossum79f25d91997-04-29 20:08:16 +0000228PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000229PyCode_New(int argcount, int nlocals, int stacksize, int flags,
230 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000231 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
232 PyObject *filename, PyObject *name, int firstlineno,
233 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000234{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000235 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000236 int i;
Guido van Rossumd076c731998-10-07 19:42:25 +0000237 PyBufferProcs *pb;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000238 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000239 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000240 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000241 consts == NULL || !PyTuple_Check(consts) ||
242 names == NULL || !PyTuple_Check(names) ||
243 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000244 freevars == NULL || !PyTuple_Check(freevars) ||
245 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000246 name == NULL || !PyString_Check(name) ||
247 filename == NULL || !PyString_Check(filename) ||
248 lnotab == NULL || !PyString_Check(lnotab)) {
249 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000250 return NULL;
251 }
Guido van Rossumd076c731998-10-07 19:42:25 +0000252 pb = code->ob_type->tp_as_buffer;
253 if (pb == NULL ||
254 pb->bf_getreadbuffer == NULL ||
255 pb->bf_getsegcount == NULL ||
256 (*pb->bf_getsegcount)(code, NULL) != 1)
257 {
258 PyErr_BadInternalCall();
259 return NULL;
260 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000261 intern_strings(names);
262 intern_strings(varnames);
263 if (freevars == NULL)
264 freevars = PyTuple_New(0);
265 intern_strings(freevars);
266 if (cellvars == NULL)
267 cellvars = PyTuple_New(0);
268 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000269 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000270 for (i = PyTuple_Size(consts); --i >= 0; ) {
271 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000272 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000273 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000274 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000275 continue;
276 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000277 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000278 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000279 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000280 co->co_argcount = argcount;
281 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000282 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000283 co->co_flags = flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000284 Py_INCREF(code);
Guido van Rossumd076c731998-10-07 19:42:25 +0000285 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000286 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000287 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000288 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000289 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000290 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000291 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000292 Py_INCREF(freevars);
293 co->co_freevars = freevars;
294 Py_INCREF(cellvars);
295 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000296 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000297 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000298 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000299 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000300 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000301 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000302 co->co_lnotab = lnotab;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000303/* PyObject_Print((PyObject *)co, stderr, 0); */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000304 }
305 return co;
306}
307
308
309/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000310
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000311/* The compiler uses two passes to generate bytecodes. The first pass
312 builds the symbol table. The second pass generates the bytecode.
313
314 The first pass uses a single symtable struct. The second pass uses
315 a compiling struct for each code block. The compiling structs
316 share a reference to the symtable.
317
318 The two passes communicate via symtable_load_symbols() and via
319 is_local() and is_global(). The former initializes several slots
320 in the compiling struct: c_varnames, c_locals, c_nlocals,
321 c_argcount, c_globals, and c_flags.
322*/
323
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000324struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000325 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000326 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000327 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000328 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000329 PyObject *c_name_dict; /* inverse of c_names */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000330 PyObject *c_globals; /* dictionary (value=None) */
331 PyObject *c_locals; /* dictionary (value=localID) */
332 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000333 PyObject *c_freevars; /* dictionary (value=None) */
334 PyObject *c_cellvars; /* list */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000335 int c_nlocals; /* index of next local */
336 int c_argcount; /* number of top-level arguments */
337 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000338 int c_nexti; /* index into c_code */
339 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000340 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000341 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000342 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000343 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000344 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000345 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000346 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000347 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000348 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000349 int c_stacklevel; /* Current stack level */
350 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000351 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000352 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000353 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000354 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000355 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000356 int c_nested; /* Is block nested funcdef or lamdef? */
357 int c_closure; /* Is nested w/freevars? */
358 struct symtable *c_symtable; /* pointer to module symbol table */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000359};
360
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000361int is_free(int v)
362{
363 if ((v & (USE | DEF_FREE))
364 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
365 return 1;
366 if (v & DEF_FREE_CLASS)
367 return 1;
368 return 0;
369}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000370
Guido van Rossum452a9831996-09-17 14:32:04 +0000371/* Error message including line number */
372
373static void
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000374set_error_location(char *filename, int lineno)
375{
376 PyObject *exc, *v, *tb, *tmp;
377
378 /* add attributes for the line number and filename for the error */
379 PyErr_Fetch(&exc, &v, &tb);
380 PyErr_NormalizeException(&exc, &v, &tb);
381 tmp = PyInt_FromLong(lineno);
382 if (tmp == NULL)
383 PyErr_Clear();
384 else {
385 if (PyObject_SetAttrString(v, "lineno", tmp))
386 PyErr_Clear();
387 Py_DECREF(tmp);
388 }
389 if (filename != NULL) {
390 tmp = PyString_FromString(filename);
391 if (tmp == NULL)
392 PyErr_Clear();
393 else {
394 if (PyObject_SetAttrString(v, "filename", tmp))
395 PyErr_Clear();
396 Py_DECREF(tmp);
397 }
398 }
399 PyErr_Restore(exc, v, tb);
400}
401
402static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000403com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000404{
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000405 PyObject *v;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000406 if (c == NULL) {
407 /* Error occurred via symtable call to
408 is_constant_false */
409 PyErr_SetString(exc, msg);
410 return;
411 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000412 c->c_errors++;
Guido van Rossum452a9831996-09-17 14:32:04 +0000413 if (c->c_lineno <= 1) {
414 /* Unknown line number or single interactive command */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000415 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000416 return;
417 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000418 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000419 if (v == NULL)
420 return; /* MemoryError, too bad */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000421 PyErr_SetObject(exc, v);
422 Py_DECREF(v);
Fred Drakedcf08e02000-08-15 15:49:44 +0000423
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000424 set_error_location(c->c_filename, c->c_lineno);
Guido van Rossum452a9831996-09-17 14:32:04 +0000425}
426
427
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000428/* Interface to the block stack */
429
430static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000431block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000432{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000433 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000434 com_error(c, PyExc_SystemError,
435 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000436 }
437 else {
438 c->c_block[c->c_nblocks++] = type;
439 }
440}
441
442static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000443block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000444{
445 if (c->c_nblocks > 0)
446 c->c_nblocks--;
447 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000448 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000449 }
450}
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 *);
477static PyCodeObject *jcompile(node *, char *, struct compiling *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000478static PyObject *parsestrplus(node *);
479static PyObject *parsestr(char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000480static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000481
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000482static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000483
484/* symtable operations */
485static int symtable_build(struct compiling *, node *);
486static int symtable_load_symbols(struct compiling *);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000487static struct symtable *symtable_init(int);
488static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000489static int symtable_exit_scope(struct symtable *);
490static int symtable_update_cur(struct symtable *);
491static 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);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000601}
602
603static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000604com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000605{
606 c->c_stacklevel += n;
607 if (c->c_stacklevel > c->c_maxstacklevel)
608 c->c_maxstacklevel = c->c_stacklevel;
609}
610
611static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000612com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000613{
614 if (c->c_stacklevel < n) {
Guido van Rossum90f827c1998-08-25 18:22:17 +0000615 /* fprintf(stderr,
Guido van Rossum8b993a91997-01-17 21:04:03 +0000616 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
617 c->c_filename, c->c_lineno,
Guido van Rossum90f827c1998-08-25 18:22:17 +0000618 c->c_nexti, c->c_stacklevel, n); */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000619 c->c_stacklevel = 0;
620 }
621 else
622 c->c_stacklevel -= n;
623}
624
625static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000626com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000627{
628 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000629 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000630 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000631 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000632}
633
634static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000635com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000636{
637 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000638 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000639 assert(byte >= 0 && byte <= 255);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000640 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000641 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000642 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000643 fatal("com_addbyte: byte out of range");
Guido van Rossum01cfd441991-10-20 20:12:38 +0000644 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000645 com_error(c, PyExc_SystemError,
646 "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000647 }
648 if (c->c_code == NULL)
649 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000650 len = PyString_Size(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000651 if (c->c_nexti >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000652 if (_PyString_Resize(&c->c_code, len+1000) != 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000653 c->c_errors++;
654 return;
655 }
656 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000657 PyString_AsString(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000658}
659
660static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000661com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000662{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000663 com_addbyte(c, x & 0xff);
664 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000665}
666
667static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000668com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000669{
670 int size;
671 char *p;
672 if (c->c_lnotab == NULL)
673 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000674 size = PyString_Size(c->c_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000675 if (c->c_lnotab_next+2 > size) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000676 if (_PyString_Resize(&c->c_lnotab, size + 1000) < 0) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000677 c->c_errors++;
678 return;
679 }
680 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000681 p = PyString_AsString(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000682 *p++ = addr;
683 *p++ = line;
684 c->c_lnotab_next += 2;
685}
686
687static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000688com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000689{
690 c->c_lineno = lineno;
691 if (c->c_firstlineno == 0) {
692 c->c_firstlineno = c->c_last_line = lineno;
693 }
694 else {
695 int incr_addr = c->c_nexti - c->c_last_addr;
696 int incr_line = lineno - c->c_last_line;
697 while (incr_addr > 0 || incr_line > 0) {
698 int trunc_addr = incr_addr;
699 int trunc_line = incr_line;
700 if (trunc_addr > 255)
701 trunc_addr = 255;
702 if (trunc_line > 255)
703 trunc_line = 255;
704 com_add_lnotab(c, trunc_addr, trunc_line);
705 incr_addr -= trunc_addr;
706 incr_line -= trunc_line;
707 }
708 c->c_last_addr = c->c_nexti;
709 c->c_last_line = lineno;
710 }
711}
712
713static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000714com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000715{
Fred Drakeef8ace32000-08-24 00:32:09 +0000716 int extended_arg = arg >> 16;
Guido van Rossum8e793d91997-03-03 19:13:14 +0000717 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000718 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000719 if (Py_OptimizeFlag)
720 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000721 }
Fred Drakeef8ace32000-08-24 00:32:09 +0000722 if (extended_arg){
723 com_addbyte(c, EXTENDED_ARG);
724 com_addint(c, extended_arg);
725 arg &= 0xffff;
726 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000727 com_addbyte(c, op);
728 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000729}
730
731static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000732com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000733{
734 /* Compile a forward reference for backpatching */
735 int here;
736 int anchor;
737 com_addbyte(c, op);
738 here = c->c_nexti;
739 anchor = *p_anchor;
740 *p_anchor = here;
741 com_addint(c, anchor == 0 ? 0 : here - anchor);
742}
743
744static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000745com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000746{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000747 unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000748 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000749 int dist;
750 int prev;
751 for (;;) {
752 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000753 prev = code[anchor] + (code[anchor+1] << 8);
754 dist = target - (anchor+2);
755 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +0000756 dist >>= 8;
757 code[anchor+1] = dist;
758 dist >>= 8;
759 if (dist) {
760 com_error(c, PyExc_SystemError,
761 "com_backpatch: offset too large");
762 break;
763 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000764 if (!prev)
765 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000766 anchor -= prev;
767 }
768}
769
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000770/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000771
772static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000773com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000774{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000775 PyObject *w, *t, *np=NULL;
776 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000777
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000778 t = Py_BuildValue("(OO)", v, v->ob_type);
779 if (t == NULL)
780 goto fail;
781 w = PyDict_GetItem(dict, t);
782 if (w != NULL) {
783 n = PyInt_AsLong(w);
784 } else {
785 n = PyList_Size(list);
786 np = PyInt_FromLong(n);
787 if (np == NULL)
788 goto fail;
789 if (PyList_Append(list, v) != 0)
790 goto fail;
791 if (PyDict_SetItem(dict, t, np) != 0)
792 goto fail;
793 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000794 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000795 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000796 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000797 fail:
798 Py_XDECREF(np);
799 Py_XDECREF(t);
800 c->c_errors++;
801 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000802}
803
804static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000805com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000806{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000807 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000808}
809
810static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000811com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000812{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000813 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000814}
815
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000816static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000817mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000818{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000819 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000820 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +0000821 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000822 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
823 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000824 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000825 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000826 return 0; /* Don't mangle __extremely_long_names */
827 if (name[nlen-1] == '_' && name[nlen-2] == '_')
828 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000829 /* Strip leading underscores from class name */
830 while (*p == '_')
831 p++;
832 if (*p == '\0')
833 return 0; /* Don't mangle if class is just underscores */
834 plen = strlen(p);
835 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000836 plen = maxlen-nlen-2; /* Truncate class name if too long */
837 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000838 buffer[0] = '_';
839 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000840 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000841 /* fprintf(stderr, "mangle %s -> %s\n", name, buffer); */
842 return 1;
843}
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000844
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000845static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000846com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000847{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000848 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000849 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000850 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000851
852 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000853 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000854 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000855 c->c_errors++;
856 i = 255;
857 }
858 else {
859 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000860 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000861 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000862 com_addoparg(c, op, i);
863}
864
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000865#define NAME_LOCAL 0
866#define NAME_GLOBAL 1
867#define NAME_DEFAULT 2
868#define NAME_CLOSURE 3
869
870static int
871com_lookup_arg(PyObject *dict, PyObject *name)
872{
873 PyObject *v = PyDict_GetItem(dict, name);
874 if (v == NULL)
875 return -1;
876 else
877 return PyInt_AS_LONG(v);
878}
879
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000880static void
881com_addop_varname(struct compiling *c, int kind, char *name)
882{
883 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000884 int i, reftype;
885 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000886 int op = STOP_CODE;
887 char buffer[MANGLE_LEN];
888
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000889 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000890 name = buffer;
891 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
892 c->c_errors++;
893 i = 255;
894 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000895 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000896
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000897 reftype = get_ref_type(c, name);
898 switch (reftype) {
899 case LOCAL:
900 if (c->c_symtable->st_cur_type == TYPE_FUNCTION)
901 scope = NAME_LOCAL;
902 break;
903 case GLOBAL_EXPLICIT:
904 scope = NAME_GLOBAL;
905 break;
906 case GLOBAL_IMPLICIT:
907 if (c->c_flags & CO_OPTIMIZED)
908 scope = NAME_GLOBAL;
909 break;
910 case FREE:
911 case CELL:
912 scope = NAME_CLOSURE;
913 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000914 }
915
916 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000917 if (scope == NAME_LOCAL)
918 i = com_lookup_arg(c->c_locals, v);
919 else if (reftype == FREE)
920 i = com_lookup_arg(c->c_freevars, v);
921 else if (reftype == CELL)
922 i = com_lookup_arg(c->c_cellvars, v);
923 if (i == -1) {
924 c->c_errors++; /* XXX no exception set */
925 i = 255;
926 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000927 }
928 Py_DECREF(v);
929
930 switch (kind) {
931 case VAR_LOAD:
932 switch (scope) {
933 case NAME_LOCAL:
934 op = LOAD_FAST;
935 break;
936 case NAME_GLOBAL:
937 op = LOAD_GLOBAL;
938 break;
939 case NAME_DEFAULT:
940 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000941 break;
942 case NAME_CLOSURE:
943 op = LOAD_DEREF;
944 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000945 }
946 break;
947 case VAR_STORE:
948 switch (scope) {
949 case NAME_LOCAL:
950 op = STORE_FAST;
951 break;
952 case NAME_GLOBAL:
953 op = STORE_GLOBAL;
954 break;
955 case NAME_DEFAULT:
956 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000957 break;
958 case NAME_CLOSURE:
959 op = STORE_DEREF;
960 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000961 }
962 break;
963 case VAR_DELETE:
964 switch (scope) {
965 case NAME_LOCAL:
966 op = DELETE_FAST;
967 break;
968 case NAME_GLOBAL:
969 op = DELETE_GLOBAL;
970 break;
971 case NAME_DEFAULT:
972 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000973 break;
974 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000975 char buf[500];
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000976 sprintf(buf, DEL_CLOSURE_ERROR, name);
977 com_error(c, PyExc_SyntaxError, buf);
978 i = 255;
979 break;
980 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000981 }
982 break;
983 }
984done:
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000985/* fprintf(stderr, " addoparg(op=%d, arg=%d)\n", op, i);*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000986 com_addoparg(c, op, i);
987}
988
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000989static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000990com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000991{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000992 char *name;
993 char buffer[1000];
994 /* XXX it is possible to write this code without the 1000
995 chars on the total length of dotted names, I just can't be
996 bothered right now */
997 if (TYPE(n) == STAR)
998 name = "*";
999 else if (TYPE(n) == dotted_name) {
1000 char *p = buffer;
1001 int i;
1002 name = buffer;
1003 for (i = 0; i < NCH(n); i += 2) {
1004 char *s = STR(CHILD(n, i));
1005 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001006 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001007 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001008 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001009 break;
1010 }
1011 if (p != buffer)
1012 *p++ = '.';
1013 strcpy(p, s);
1014 p = strchr(p, '\0');
1015 }
1016 }
1017 else {
1018 REQ(n, NAME);
1019 name = STR(n);
1020 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001021 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001022}
1023
Guido van Rossum79f25d91997-04-29 20:08:16 +00001024static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001025parsenumber(struct compiling *co, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001026{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001027 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001028 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001029 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001030#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +00001031 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +00001032 int imflag;
1033#endif
1034
Guido van Rossum282914b1991-04-04 10:42:56 +00001035 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001036 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001037#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001038 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001039#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001040 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001041 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001042 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001043 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001044 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001045 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001046 if (*end == '\0') {
1047 if (errno != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001048 com_error(co, PyExc_OverflowError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001049 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +00001050 return NULL;
1051 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001052 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001053 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001054 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001055#ifndef WITHOUT_COMPLEX
1056 if (imflag) {
1057 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001058 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +00001059 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001060 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001061 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +00001062 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001063 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001064#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001065 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001066 PyFPE_START_PROTECT("atof", return 0)
1067 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001068 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001069 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001070 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001071}
1072
Guido van Rossum79f25d91997-04-29 20:08:16 +00001073static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001074parsestr(char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001075{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001076 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001077 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001078 char *buf;
1079 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001080 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001081 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001082 int first = *s;
1083 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001084 int rawmode = 0;
1085 int unicode = 0;
1086 if (isalpha(quote) || quote == '_') {
1087 if (quote == 'u' || quote == 'U') {
1088 quote = *++s;
1089 unicode = 1;
1090 }
1091 if (quote == 'r' || quote == 'R') {
1092 quote = *++s;
1093 rawmode = 1;
1094 }
1095 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001096 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001097 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001098 return NULL;
1099 }
1100 s++;
1101 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001102 if (len > INT_MAX) {
1103 PyErr_SetString(PyExc_OverflowError, "string to parse is too long");
1104 return NULL;
1105 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001106 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001107 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001108 return NULL;
1109 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001110 if (len >= 4 && s[0] == quote && s[1] == quote) {
1111 s += 2;
1112 len -= 2;
1113 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001114 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001115 return NULL;
1116 }
1117 }
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001118 if (unicode || Py_UnicodeFlag) {
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001119 if (rawmode)
1120 return PyUnicode_DecodeRawUnicodeEscape(
1121 s, len, NULL);
1122 else
1123 return PyUnicode_DecodeUnicodeEscape(
1124 s, len, NULL);
1125 }
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001126 if (rawmode || strchr(s, '\\') == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001127 return PyString_FromStringAndSize(s, len);
1128 v = PyString_FromStringAndSize((char *)NULL, len);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001129 if (v == NULL)
1130 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001131 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001132 end = s + len;
1133 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001134 if (*s != '\\') {
1135 *p++ = *s++;
1136 continue;
1137 }
1138 s++;
1139 switch (*s++) {
1140 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001141 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001142 case '\\': *p++ = '\\'; break;
1143 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +00001144 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001145 case 'b': *p++ = '\b'; break;
1146 case 'f': *p++ = '\014'; break; /* FF */
1147 case 't': *p++ = '\t'; break;
1148 case 'n': *p++ = '\n'; break;
1149 case 'r': *p++ = '\r'; break;
1150 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001151 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
1152 case '0': case '1': case '2': case '3':
1153 case '4': case '5': case '6': case '7':
1154 c = s[-1] - '0';
1155 if ('0' <= *s && *s <= '7') {
1156 c = (c<<3) + *s++ - '0';
1157 if ('0' <= *s && *s <= '7')
1158 c = (c<<3) + *s++ - '0';
1159 }
1160 *p++ = c;
1161 break;
1162 case 'x':
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001163 if (isxdigit(Py_CHARMASK(s[0])) && isxdigit(Py_CHARMASK(s[1]))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +00001164 unsigned int x = 0;
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001165 c = Py_CHARMASK(*s);
1166 s++;
1167 if (isdigit(c))
1168 x = c - '0';
1169 else if (islower(c))
1170 x = 10 + c - 'a';
1171 else
1172 x = 10 + c - 'A';
1173 x = x << 4;
1174 c = Py_CHARMASK(*s);
1175 s++;
1176 if (isdigit(c))
1177 x += c - '0';
1178 else if (islower(c))
1179 x += 10 + c - 'a';
1180 else
1181 x += 10 + c - 'A';
Guido van Rossumed1100f1997-10-20 23:24:07 +00001182 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001183 break;
1184 }
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001185 PyErr_SetString(PyExc_ValueError, "invalid \\x escape");
1186 Py_DECREF(v);
1187 return NULL;
1188 default:
1189 *p++ = '\\';
1190 *p++ = s[-1];
1191 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001192 }
1193 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001194 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001195 return v;
1196}
1197
Guido van Rossum79f25d91997-04-29 20:08:16 +00001198static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001199parsestrplus(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001200{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001201 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001202 int i;
1203 REQ(CHILD(n, 0), STRING);
1204 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
1205 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001206 for (i = 1; i < NCH(n); i++) {
1207 PyObject *s;
1208 s = parsestr(STR(CHILD(n, i)));
1209 if (s == NULL)
1210 goto onError;
1211 if (PyString_Check(v) && PyString_Check(s)) {
1212 PyString_ConcatAndDel(&v, s);
1213 if (v == NULL)
1214 goto onError;
1215 }
1216 else {
1217 PyObject *temp;
1218 temp = PyUnicode_Concat(v, s);
1219 Py_DECREF(s);
1220 if (temp == NULL)
1221 goto onError;
1222 Py_DECREF(v);
1223 v = temp;
1224 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001225 }
1226 }
1227 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001228
1229 onError:
1230 Py_XDECREF(v);
1231 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001232}
1233
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001234static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001235com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001236{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001237 PyObject *v;
1238 int anchor = 0;
1239 int save_begin = c->c_begin;
1240
1241 /* list_iter: for v in expr [list_iter] */
1242 com_node(c, CHILD(n, 3)); /* expr */
1243 v = PyInt_FromLong(0L);
1244 if (v == NULL)
1245 c->c_errors++;
1246 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
1247 com_push(c, 1);
1248 Py_XDECREF(v);
1249 c->c_begin = c->c_nexti;
1250 com_addoparg(c, SET_LINENO, n->n_lineno);
1251 com_addfwref(c, FOR_LOOP, &anchor);
1252 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001253 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001254 c->c_loops++;
1255 com_list_iter(c, n, e, t);
1256 c->c_loops--;
1257 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1258 c->c_begin = save_begin;
1259 com_backpatch(c, anchor);
1260 com_pop(c, 2); /* FOR_LOOP has popped these */
1261}
1262
1263static void
1264com_list_if(struct compiling *c, node *n, node *e, char *t)
1265{
1266 int anchor = 0;
1267 int a = 0;
1268 /* list_iter: 'if' test [list_iter] */
1269 com_addoparg(c, SET_LINENO, n->n_lineno);
1270 com_node(c, CHILD(n, 1));
1271 com_addfwref(c, JUMP_IF_FALSE, &a);
1272 com_addbyte(c, POP_TOP);
1273 com_pop(c, 1);
1274 com_list_iter(c, n, e, t);
1275 com_addfwref(c, JUMP_FORWARD, &anchor);
1276 com_backpatch(c, a);
1277 /* We jump here with an extra entry which we now pop */
1278 com_addbyte(c, POP_TOP);
1279 com_backpatch(c, anchor);
1280}
1281
1282static void
1283com_list_iter(struct compiling *c,
1284 node *p, /* parent of list_iter node */
1285 node *e, /* element expression node */
1286 char *t /* name of result list temp local */)
1287{
1288 /* list_iter is the last child in a listmaker, list_for, or list_if */
1289 node *n = CHILD(p, NCH(p)-1);
1290 if (TYPE(n) == list_iter) {
1291 n = CHILD(n, 0);
1292 switch (TYPE(n)) {
1293 case list_for:
1294 com_list_for(c, n, e, t);
1295 break;
1296 case list_if:
1297 com_list_if(c, n, e, t);
1298 break;
1299 default:
1300 com_error(c, PyExc_SystemError,
1301 "invalid list_iter node type");
1302 }
1303 }
1304 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001305 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001306 com_push(c, 1);
1307 com_node(c, e);
1308 com_addoparg(c, CALL_FUNCTION, 1);
1309 com_addbyte(c, POP_TOP);
1310 com_pop(c, 2);
1311 }
1312}
1313
1314static void
1315com_list_comprehension(struct compiling *c, node *n)
1316{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001317 /* listmaker: test list_for */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001318 char tmpname[12];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001319 sprintf(tmpname, "[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001320 com_addoparg(c, BUILD_LIST, 0);
1321 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1322 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001323 com_addop_name(c, LOAD_ATTR, "append");
1324 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001325 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001326 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001327 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001328 --c->c_tmpname;
1329}
1330
1331static void
1332com_listmaker(struct compiling *c, node *n)
1333{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001334 /* listmaker: test ( list_for | (',' test)* [','] ) */
1335 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001336 com_list_comprehension(c, n);
1337 else {
1338 int len = 0;
1339 int i;
1340 for (i = 0; i < NCH(n); i += 2, len++)
1341 com_node(c, CHILD(n, i));
1342 com_addoparg(c, BUILD_LIST, len);
1343 com_pop(c, len-1);
1344 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001345}
1346
1347static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001348com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001349{
1350 int i;
1351 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1352 for (i = 0; i+2 < NCH(n); i += 4) {
1353 /* We must arrange things just right for STORE_SUBSCR.
1354 It wants the stack to look like (value) (dict) (key) */
1355 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001356 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001357 com_node(c, CHILD(n, i+2)); /* value */
1358 com_addbyte(c, ROT_TWO);
1359 com_node(c, CHILD(n, i)); /* key */
1360 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001361 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001362 }
1363}
1364
1365static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001366com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001367{
1368 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001369 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001370 int i;
1371 REQ(n, atom);
1372 ch = CHILD(n, 0);
1373 switch (TYPE(ch)) {
1374 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001375 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001376 com_addoparg(c, BUILD_TUPLE, 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
1380 com_node(c, CHILD(n, 1));
1381 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001382 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001383 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001384 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001385 com_push(c, 1);
1386 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001387 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001388 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001389 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001390 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001391 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001392 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001393 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001394 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001395 break;
1396 case BACKQUOTE:
1397 com_node(c, CHILD(n, 1));
1398 com_addbyte(c, UNARY_CONVERT);
1399 break;
1400 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001401 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001402 i = 255;
1403 }
1404 else {
1405 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001406 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001407 }
1408 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001409 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001410 break;
1411 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001412 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001413 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001414 c->c_errors++;
1415 i = 255;
1416 }
1417 else {
1418 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001419 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001420 }
1421 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001422 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001423 break;
1424 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001425 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001426 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001427 break;
1428 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001429 /* XXX fprintf(stderr, "node type %d\n", TYPE(ch)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001430 com_error(c, PyExc_SystemError,
1431 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001432 }
1433}
1434
1435static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001436com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001437{
1438 if (NCH(n) == 1) {
1439 com_addbyte(c, op);
1440 }
1441 else if (NCH(n) == 2) {
1442 if (TYPE(CHILD(n, 0)) != COLON) {
1443 com_node(c, CHILD(n, 0));
1444 com_addbyte(c, op+1);
1445 }
1446 else {
1447 com_node(c, CHILD(n, 1));
1448 com_addbyte(c, op+2);
1449 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001450 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001451 }
1452 else {
1453 com_node(c, CHILD(n, 0));
1454 com_node(c, CHILD(n, 2));
1455 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001456 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001457 }
1458}
1459
Guido van Rossum635abd21997-01-06 22:56:52 +00001460static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001461com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1462{
1463 if (NCH(n) == 1) {
1464 com_addbyte(c, DUP_TOP);
1465 com_push(c, 1);
1466 com_addbyte(c, SLICE);
1467 com_node(c, augn);
1468 com_addbyte(c, opcode);
1469 com_pop(c, 1);
1470 com_addbyte(c, ROT_TWO);
1471 com_addbyte(c, STORE_SLICE);
1472 com_pop(c, 2);
1473 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1474 com_node(c, CHILD(n, 0));
1475 com_addoparg(c, DUP_TOPX, 2);
1476 com_push(c, 2);
1477 com_addbyte(c, SLICE+1);
1478 com_pop(c, 1);
1479 com_node(c, augn);
1480 com_addbyte(c, opcode);
1481 com_pop(c, 1);
1482 com_addbyte(c, ROT_THREE);
1483 com_addbyte(c, STORE_SLICE+1);
1484 com_pop(c, 3);
1485 } else if (NCH(n) == 2) {
1486 com_node(c, CHILD(n, 1));
1487 com_addoparg(c, DUP_TOPX, 2);
1488 com_push(c, 2);
1489 com_addbyte(c, SLICE+2);
1490 com_pop(c, 1);
1491 com_node(c, augn);
1492 com_addbyte(c, opcode);
1493 com_pop(c, 1);
1494 com_addbyte(c, ROT_THREE);
1495 com_addbyte(c, STORE_SLICE+2);
1496 com_pop(c, 3);
1497 } else {
1498 com_node(c, CHILD(n, 0));
1499 com_node(c, CHILD(n, 2));
1500 com_addoparg(c, DUP_TOPX, 3);
1501 com_push(c, 3);
1502 com_addbyte(c, SLICE+3);
1503 com_pop(c, 2);
1504 com_node(c, augn);
1505 com_addbyte(c, opcode);
1506 com_pop(c, 1);
1507 com_addbyte(c, ROT_FOUR);
1508 com_addbyte(c, STORE_SLICE+3);
1509 com_pop(c, 4);
1510 }
1511}
1512
1513static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001514com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001515{
1516 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001517 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001518 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001519 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001520 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001521 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001522 }
1523 else {
1524 com_node(c, CHILD(n, 0));
1525 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001526 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001527 }
1528 m = n;
1529 do {
1530 m = CHILD(m, 0);
1531 } while (NCH(m) == 1);
1532 if (TYPE(m) != NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001533 com_error(c, PyExc_SyntaxError,
1534 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001535 }
1536 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001537 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001538 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001539 *pkeywords = PyDict_New();
Guido van Rossum635abd21997-01-06 22:56:52 +00001540 if (v == NULL || *pkeywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001541 c->c_errors++;
1542 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001543 if (PyDict_GetItem(*pkeywords, v) != NULL)
1544 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001545 "duplicate keyword argument");
1546 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001547 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001548 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001549 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001550 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001551 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001552 }
1553 }
1554 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001555}
1556
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001557static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001558com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001559{
1560 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001561 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001562 }
1563 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001564 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001565 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001566 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001567 int star_flag = 0;
1568 int starstar_flag = 0;
1569 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001570 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001571 na = 0;
1572 nk = 0;
1573 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001574 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001575 if (TYPE(ch) == STAR ||
1576 TYPE(ch) == DOUBLESTAR)
1577 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001578 if (ch->n_lineno != lineno) {
1579 lineno = ch->n_lineno;
1580 com_addoparg(c, SET_LINENO, lineno);
1581 }
1582 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001583 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001584 na++;
1585 else
1586 nk++;
1587 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001588 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001589 while (i < NCH(n)) {
1590 node *tok = CHILD(n, i);
1591 node *ch = CHILD(n, i+1);
1592 i += 3;
1593 switch (TYPE(tok)) {
1594 case STAR: star_flag = 1; break;
1595 case DOUBLESTAR: starstar_flag = 1; break;
1596 }
1597 com_node(c, ch);
1598 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001599 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001600 com_error(c, PyExc_SyntaxError,
1601 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001602 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001603 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001604 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001605 star_flag + (starstar_flag << 1);
1606 else
1607 opcode = CALL_FUNCTION;
1608 com_addoparg(c, opcode, na | (nk << 8));
1609 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001610 }
1611}
1612
1613static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001614com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001615{
1616 com_addopname(c, LOAD_ATTR, n);
1617}
1618
1619static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001620com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001621{
1622 int i=0;
1623 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001624 node *ch;
1625
1626 /* first argument */
1627 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001628 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001629 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001630 i++;
1631 }
1632 else {
1633 com_node(c, CHILD(n,i));
1634 i++;
1635 REQ(CHILD(n,i),COLON);
1636 i++;
1637 }
1638 /* second argument */
1639 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1640 com_node(c, CHILD(n,i));
1641 i++;
1642 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001643 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001644 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001645 com_push(c, 1);
1646 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001647 /* remaining arguments */
1648 for (; i < NCH(n); i++) {
1649 ns++;
1650 ch=CHILD(n,i);
1651 REQ(ch, sliceop);
1652 if (NCH(ch) == 1) {
1653 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001654 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001655 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001656 }
1657 else
1658 com_node(c, CHILD(ch,1));
1659 }
1660 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001661 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001662}
1663
1664static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001665com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001666{
1667 node *ch;
1668 REQ(n, subscript);
1669 ch = CHILD(n,0);
1670 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001671 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001672 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001673 com_push(c, 1);
1674 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001675 else {
1676 /* check for slice */
1677 if ((TYPE(ch) == COLON || NCH(n) > 1))
1678 com_sliceobj(c, n);
1679 else {
1680 REQ(ch, test);
1681 com_node(c, ch);
1682 }
1683 }
1684}
1685
1686static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001687com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001688{
1689 int i, op;
1690 REQ(n, subscriptlist);
1691 /* Check to make backward compatible slice behavior for '[i:j]' */
1692 if (NCH(n) == 1) {
1693 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001694 /* 'Basic' slice, should have exactly one colon. */
1695 if ((TYPE(CHILD(sub, 0)) == COLON
1696 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1697 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1698 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001699 switch (assigning) {
1700 case OP_DELETE:
1701 op = DELETE_SLICE;
1702 break;
1703 case OP_ASSIGN:
1704 op = STORE_SLICE;
1705 break;
1706 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001707 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001708 break;
1709 default:
1710 com_augassign_slice(c, sub, assigning, augn);
1711 return;
1712 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001713 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001714 if (op == STORE_SLICE)
1715 com_pop(c, 2);
1716 else if (op == DELETE_SLICE)
1717 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001718 return;
1719 }
1720 }
1721 /* Else normal subscriptlist. Compile each subscript. */
1722 for (i = 0; i < NCH(n); i += 2)
1723 com_subscript(c, CHILD(n, i));
1724 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001725 if (NCH(n) > 1) {
1726 i = (NCH(n)+1) / 2;
1727 com_addoparg(c, BUILD_TUPLE, i);
1728 com_pop(c, i-1);
1729 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001730 switch (assigning) {
1731 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001732 op = DELETE_SUBSCR;
1733 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00001734 break;
1735 default:
1736 case OP_ASSIGN:
1737 op = STORE_SUBSCR;
1738 i = 3;
1739 break;
1740 case OP_APPLY:
1741 op = BINARY_SUBSCR;
1742 i = 1;
1743 break;
1744 }
1745 if (assigning > OP_APPLY) {
1746 com_addoparg(c, DUP_TOPX, 2);
1747 com_push(c, 2);
1748 com_addbyte(c, BINARY_SUBSCR);
1749 com_pop(c, 1);
1750 com_node(c, augn);
1751 com_addbyte(c, assigning);
1752 com_pop(c, 1);
1753 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001754 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001755 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001756 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001757}
1758
1759static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001760com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001761{
1762 REQ(n, trailer);
1763 switch (TYPE(CHILD(n, 0))) {
1764 case LPAR:
1765 com_call_function(c, CHILD(n, 1));
1766 break;
1767 case DOT:
1768 com_select_member(c, CHILD(n, 1));
1769 break;
1770 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00001771 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001772 break;
1773 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001774 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001775 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001776 }
1777}
1778
1779static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001780com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001781{
1782 int i;
1783 REQ(n, power);
1784 com_atom(c, CHILD(n, 0));
1785 for (i = 1; i < NCH(n); i++) {
1786 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1787 com_factor(c, CHILD(n, i+1));
1788 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001789 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001790 break;
1791 }
1792 else
1793 com_apply_trailer(c, CHILD(n, i));
1794 }
1795}
1796
1797static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001798com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001799{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001800 REQ(n, factor);
1801 if (TYPE(CHILD(n, 0)) == PLUS) {
1802 com_factor(c, CHILD(n, 1));
1803 com_addbyte(c, UNARY_POSITIVE);
1804 }
1805 else if (TYPE(CHILD(n, 0)) == MINUS) {
1806 com_factor(c, CHILD(n, 1));
1807 com_addbyte(c, UNARY_NEGATIVE);
1808 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001809 else if (TYPE(CHILD(n, 0)) == TILDE) {
1810 com_factor(c, CHILD(n, 1));
1811 com_addbyte(c, UNARY_INVERT);
1812 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001813 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001814 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001815 }
1816}
1817
1818static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001819com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001820{
1821 int i;
1822 int op;
1823 REQ(n, term);
1824 com_factor(c, CHILD(n, 0));
1825 for (i = 2; i < NCH(n); i += 2) {
1826 com_factor(c, CHILD(n, i));
1827 switch (TYPE(CHILD(n, i-1))) {
1828 case STAR:
1829 op = BINARY_MULTIPLY;
1830 break;
1831 case SLASH:
1832 op = BINARY_DIVIDE;
1833 break;
1834 case PERCENT:
1835 op = BINARY_MODULO;
1836 break;
1837 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001838 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001839 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001840 op = 255;
1841 }
1842 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001843 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001844 }
1845}
1846
1847static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001848com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001849{
1850 int i;
1851 int op;
1852 REQ(n, arith_expr);
1853 com_term(c, CHILD(n, 0));
1854 for (i = 2; i < NCH(n); i += 2) {
1855 com_term(c, CHILD(n, i));
1856 switch (TYPE(CHILD(n, i-1))) {
1857 case PLUS:
1858 op = BINARY_ADD;
1859 break;
1860 case MINUS:
1861 op = BINARY_SUBTRACT;
1862 break;
1863 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001864 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001865 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001866 op = 255;
1867 }
1868 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001869 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001870 }
1871}
1872
1873static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001874com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001875{
1876 int i;
1877 int op;
1878 REQ(n, shift_expr);
1879 com_arith_expr(c, CHILD(n, 0));
1880 for (i = 2; i < NCH(n); i += 2) {
1881 com_arith_expr(c, CHILD(n, i));
1882 switch (TYPE(CHILD(n, i-1))) {
1883 case LEFTSHIFT:
1884 op = BINARY_LSHIFT;
1885 break;
1886 case RIGHTSHIFT:
1887 op = BINARY_RSHIFT;
1888 break;
1889 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001890 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001891 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001892 op = 255;
1893 }
1894 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001895 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001896 }
1897}
1898
1899static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001900com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001901{
1902 int i;
1903 int op;
1904 REQ(n, and_expr);
1905 com_shift_expr(c, CHILD(n, 0));
1906 for (i = 2; i < NCH(n); i += 2) {
1907 com_shift_expr(c, CHILD(n, i));
1908 if (TYPE(CHILD(n, i-1)) == AMPER) {
1909 op = BINARY_AND;
1910 }
1911 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001912 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001913 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001914 op = 255;
1915 }
1916 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001917 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001918 }
1919}
1920
1921static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001922com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001923{
1924 int i;
1925 int op;
1926 REQ(n, xor_expr);
1927 com_and_expr(c, CHILD(n, 0));
1928 for (i = 2; i < NCH(n); i += 2) {
1929 com_and_expr(c, CHILD(n, i));
1930 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1931 op = BINARY_XOR;
1932 }
1933 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001934 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001935 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001936 op = 255;
1937 }
1938 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001939 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001940 }
1941}
1942
1943static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001944com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001945{
1946 int i;
1947 int op;
1948 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001949 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001950 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001951 com_xor_expr(c, CHILD(n, i));
1952 if (TYPE(CHILD(n, i-1)) == VBAR) {
1953 op = BINARY_OR;
1954 }
1955 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001956 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001957 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001958 op = 255;
1959 }
1960 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001961 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001962 }
1963}
1964
1965static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001966cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001967{
1968 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001969 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001970 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1971 if (NCH(n) == 1) {
1972 n = CHILD(n, 0);
1973 switch (TYPE(n)) {
1974 case LESS: return LT;
1975 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001976 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001977 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001978 case LESSEQUAL: return LE;
1979 case GREATEREQUAL: return GE;
1980 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001981 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1982 if (strcmp(STR(n), "is") == 0) return IS;
1983 }
1984 }
1985 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001986 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001987 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1988 return NOT_IN;
1989 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1990 return IS_NOT;
1991 }
1992 }
1993 return BAD;
1994}
1995
1996static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001997com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001998{
1999 int i;
2000 enum cmp_op op;
2001 int anchor;
2002 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2003 com_expr(c, CHILD(n, 0));
2004 if (NCH(n) == 1)
2005 return;
2006
2007 /****************************************************************
2008 The following code is generated for all but the last
2009 comparison in a chain:
2010
2011 label: on stack: opcode: jump to:
2012
2013 a <code to load b>
2014 a, b DUP_TOP
2015 a, b, b ROT_THREE
2016 b, a, b COMPARE_OP
2017 b, 0-or-1 JUMP_IF_FALSE L1
2018 b, 1 POP_TOP
2019 b
2020
2021 We are now ready to repeat this sequence for the next
2022 comparison in the chain.
2023
2024 For the last we generate:
2025
2026 b <code to load c>
2027 b, c COMPARE_OP
2028 0-or-1
2029
2030 If there were any jumps to L1 (i.e., there was more than one
2031 comparison), we generate:
2032
2033 0-or-1 JUMP_FORWARD L2
2034 L1: b, 0 ROT_TWO
2035 0, b POP_TOP
2036 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002037 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002038 ****************************************************************/
2039
2040 anchor = 0;
2041
2042 for (i = 2; i < NCH(n); i += 2) {
2043 com_expr(c, CHILD(n, i));
2044 if (i+2 < NCH(n)) {
2045 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002046 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002047 com_addbyte(c, ROT_THREE);
2048 }
2049 op = cmp_type(CHILD(n, i-1));
2050 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002051 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002052 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002053 }
2054 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002055 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002056 if (i+2 < NCH(n)) {
2057 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2058 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002059 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002060 }
2061 }
2062
2063 if (anchor) {
2064 int anchor2 = 0;
2065 com_addfwref(c, JUMP_FORWARD, &anchor2);
2066 com_backpatch(c, anchor);
2067 com_addbyte(c, ROT_TWO);
2068 com_addbyte(c, POP_TOP);
2069 com_backpatch(c, anchor2);
2070 }
2071}
2072
2073static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002074com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002075{
2076 REQ(n, not_test); /* 'not' not_test | comparison */
2077 if (NCH(n) == 1) {
2078 com_comparison(c, CHILD(n, 0));
2079 }
2080 else {
2081 com_not_test(c, CHILD(n, 1));
2082 com_addbyte(c, UNARY_NOT);
2083 }
2084}
2085
2086static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002087com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002088{
2089 int i;
2090 int anchor;
2091 REQ(n, and_test); /* not_test ('and' not_test)* */
2092 anchor = 0;
2093 i = 0;
2094 for (;;) {
2095 com_not_test(c, CHILD(n, i));
2096 if ((i += 2) >= NCH(n))
2097 break;
2098 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2099 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002100 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002101 }
2102 if (anchor)
2103 com_backpatch(c, anchor);
2104}
2105
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002106static int
2107com_make_closure(struct compiling *c, PyCodeObject *co)
2108{
2109 int i, free = PyTuple_GET_SIZE(co->co_freevars);
2110 if (free == 0)
2111 return 0;
2112 for (i = 0; i < free; ++i) {
2113 /* Bypass com_addop_varname because it will generate
2114 LOAD_DEREF but LOAD_CLOSURE is needed.
2115 */
2116 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2117 int arg, reftype;
2118
2119 /* Special case: If a class contains a method with a
2120 free variable that has the same name as a method,
2121 the name will be considered free *and* local in the
2122 class. It should be handled by the closure, as
2123 well as by the normal name loookup logic.
2124 */
2125 reftype = get_ref_type(c, PyString_AS_STRING(name));
2126 if (reftype == CELL)
2127 arg = com_lookup_arg(c->c_cellvars, name);
2128 else /* (reftype == FREE) */
2129 arg = com_lookup_arg(c->c_freevars, name);
2130 if (arg == -1) {
2131 fprintf(stderr, "lookup %s in %s %d %d\n",
Jeremy Hylton483638c2001-02-01 20:20:45 +00002132 PyObject_REPR(name), c->c_name, reftype, arg);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002133 Py_FatalError("com_make_closure()");
2134 }
2135 com_addoparg(c, LOAD_CLOSURE, arg);
2136
2137 }
2138 com_push(c, free);
2139 return 1;
2140}
2141
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002142static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002143com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002144{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002145 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002146 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002147 PyObject *co;
2148 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002149 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002150 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2151 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002152 co = (PyObject *) icompile(CHILD(n, 0), c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002153 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002154 if (co == NULL) {
Guido van Rossum57531fe1993-11-30 14:57:42 +00002155 c->c_errors++;
2156 i = 255;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002157 closure = 0;
2158 } else {
2159 i = com_addconst(c, co);
2160 Py_DECREF(co);
2161 closure = com_make_closure(c, (PyCodeObject *)co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002162 }
2163 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002164 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002165 if (closure)
2166 com_addoparg(c, MAKE_CLOSURE, ndefs);
2167 else
2168 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002169 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002170 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002171 else {
2172 int anchor = 0;
2173 int i = 0;
2174 for (;;) {
2175 com_and_test(c, CHILD(n, i));
2176 if ((i += 2) >= NCH(n))
2177 break;
2178 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2179 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002180 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002181 }
2182 if (anchor)
2183 com_backpatch(c, anchor);
2184 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002185}
2186
2187static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002188com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002189{
2190 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002191 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002192 com_node(c, CHILD(n, 0));
2193 }
2194 else {
2195 int i;
2196 int len;
2197 len = (NCH(n) + 1) / 2;
2198 for (i = 0; i < NCH(n); i += 2)
2199 com_node(c, CHILD(n, i));
2200 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002201 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002202 }
2203}
2204
2205
2206/* Begin of assignment compilation */
2207
Thomas Wouters434d0822000-08-24 20:11:32 +00002208
2209static void
2210com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2211{
2212 com_addbyte(c, DUP_TOP);
2213 com_push(c, 1);
2214 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002215 com_node(c, augn);
2216 com_addbyte(c, opcode);
2217 com_pop(c, 1);
2218 com_addbyte(c, ROT_TWO);
2219 com_addopname(c, STORE_ATTR, n);
2220 com_pop(c, 2);
2221}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002222
2223static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002224com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002225{
2226 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002227 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002228}
2229
2230static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002231com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002232{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002233 REQ(n, trailer);
2234 switch (TYPE(CHILD(n, 0))) {
2235 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002236 com_error(c, PyExc_SyntaxError,
2237 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002238 break;
2239 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002240 if (assigning > OP_APPLY)
2241 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2242 else
2243 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002244 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002245 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002246 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002247 break;
2248 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002249 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002250 }
2251}
2252
2253static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002254com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002255{
2256 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002257 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002258 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002259 if (assigning) {
2260 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002261 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002262 com_push(c, i-1);
2263 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002264 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002265 com_assign(c, CHILD(n, i), assigning, NULL);
2266}
2267
2268static void
2269com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2270{
2271 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002272 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002273 com_push(c, 1);
2274 com_node(c, augn);
2275 com_addbyte(c, opcode);
2276 com_pop(c, 1);
2277 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002278}
2279
2280static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002281com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002282{
2283 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002284 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002285 if (assigning)
2286 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002287}
2288
2289static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002290com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002291{
2292 /* Loop to avoid trivial recursion */
2293 for (;;) {
2294 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002295
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002296 case exprlist:
2297 case testlist:
2298 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002299 if (assigning > OP_APPLY) {
2300 com_error(c, PyExc_SyntaxError,
2301 "augmented assign to tuple not possible");
2302 return;
2303 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002304 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002305 return;
2306 }
2307 n = CHILD(n, 0);
2308 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002309
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002310 case test:
2311 case and_test:
2312 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002313 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002314 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002315 case xor_expr:
2316 case and_expr:
2317 case shift_expr:
2318 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002319 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002320 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002321 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002322 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002323 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002324 return;
2325 }
2326 n = CHILD(n, 0);
2327 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002328
Guido van Rossum50564e81996-01-12 01:13:16 +00002329 case power: /* atom trailer* ('**' power)* */
2330/* ('+'|'-'|'~') factor | atom trailer* */
2331 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002332 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002333 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002334 return;
2335 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002336 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002337 int i;
2338 com_node(c, CHILD(n, 0));
2339 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002340 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002341 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002342 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002343 return;
2344 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002345 com_apply_trailer(c, CHILD(n, i));
2346 } /* NB i is still alive */
2347 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002348 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002349 return;
2350 }
2351 n = CHILD(n, 0);
2352 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002353
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002354 case atom:
2355 switch (TYPE(CHILD(n, 0))) {
2356 case LPAR:
2357 n = CHILD(n, 1);
2358 if (TYPE(n) == RPAR) {
2359 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002360 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002361 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002362 return;
2363 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002364 if (assigning > OP_APPLY) {
2365 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002366 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002367 return;
2368 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002369 break;
2370 case LSQB:
2371 n = CHILD(n, 1);
2372 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002373 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002374 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002375 return;
2376 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002377 if (assigning > OP_APPLY) {
2378 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002379 "augmented assign to list not possible");
2380 return;
2381 }
2382 if (NCH(n) > 1
2383 && TYPE(CHILD(n, 1)) == list_for) {
2384 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002385 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002386 return;
2387 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002388 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002389 return;
2390 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002391 if (assigning > OP_APPLY)
2392 com_augassign_name(c, CHILD(n, 0),
2393 assigning, augn);
2394 else
2395 com_assign_name(c, CHILD(n, 0),
2396 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002397 return;
2398 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002399 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002400 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002401 return;
2402 }
2403 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002404
2405 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002406 com_error(c, PyExc_SyntaxError,
2407 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002408 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002409
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002410 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002411 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002412 com_error(c, PyExc_SystemError,
2413 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002414 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002415
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002416 }
2417 }
2418}
Guido van Rossum7c531111997-03-11 18:42:21 +00002419
Thomas Wouters434d0822000-08-24 20:11:32 +00002420static void
2421com_augassign(struct compiling *c, node *n)
2422{
2423 int opcode;
2424
2425 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2426 case '+': opcode = INPLACE_ADD; break;
2427 case '-': opcode = INPLACE_SUBTRACT; break;
2428 case '/': opcode = INPLACE_DIVIDE; break;
2429 case '%': opcode = INPLACE_MODULO; break;
2430 case '<': opcode = INPLACE_LSHIFT; break;
2431 case '>': opcode = INPLACE_RSHIFT; break;
2432 case '&': opcode = INPLACE_AND; break;
2433 case '^': opcode = INPLACE_XOR; break;
2434 case '|': opcode = INPLACE_OR; break;
2435 case '*':
2436 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2437 opcode = INPLACE_POWER;
2438 else
2439 opcode = INPLACE_MULTIPLY;
2440 break;
2441 default:
2442 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2443 return;
2444 }
2445 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2446}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002447
2448static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002449com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002450{
Thomas Wouters434d0822000-08-24 20:11:32 +00002451 REQ(n, expr_stmt);
2452 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002453 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002454 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002455 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002456 if (NCH(n) == 1) {
2457 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002458 if (c->c_interactive)
2459 com_addbyte(c, PRINT_EXPR);
2460 else
2461 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002462 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002463 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002464 else if (TYPE(CHILD(n,1)) == augassign)
2465 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002466 else {
2467 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002468 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002469 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002470 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002471 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002472 com_push(c, 1);
2473 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002474 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002475 }
2476 }
2477}
2478
2479static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002480com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002481{
2482 int a = 0, b = 0;
2483 int i;
2484 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2485 /* Generate code like for
2486
2487 if __debug__:
2488 if not <test>:
2489 raise AssertionError [, <message>]
2490
2491 where <message> is the second test, if present.
2492 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002493
2494 /* XXX should __debug__ and AssertionError get inserted into
2495 the symbol table? they don't follow the normal rules
2496 because they are always loaded as globals */
2497
Guido van Rossum228d7f31997-04-02 05:24:36 +00002498 if (Py_OptimizeFlag)
2499 return;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002500 com_addop_name(c, LOAD_GLOBAL, "__debug__");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002501 com_push(c, 1);
2502 com_addfwref(c, JUMP_IF_FALSE, &a);
2503 com_addbyte(c, POP_TOP);
2504 com_pop(c, 1);
2505 com_node(c, CHILD(n, 1));
2506 com_addfwref(c, JUMP_IF_TRUE, &b);
2507 com_addbyte(c, POP_TOP);
2508 com_pop(c, 1);
2509 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002510 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002511 com_push(c, 1);
2512 i = NCH(n)/2; /* Either 2 or 4 */
2513 if (i > 1)
2514 com_node(c, CHILD(n, 3));
2515 com_addoparg(c, RAISE_VARARGS, i);
2516 com_pop(c, i);
2517 /* The interpreter does not fall through */
2518 /* All jumps converge here */
2519 com_backpatch(c, a);
2520 com_backpatch(c, b);
2521 com_addbyte(c, POP_TOP);
2522}
2523
2524static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002525com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002526{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002527 int i = 1;
2528 node* stream = NULL;
2529
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002530 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002531
2532 /* are we using the extended print form? */
2533 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2534 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002535 com_node(c, stream);
2536 /* stack: [...] => [... stream] */
2537 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002538 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2539 i = 4;
2540 else
2541 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002542 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002543 for (; i < NCH(n); i += 2) {
2544 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002545 com_addbyte(c, DUP_TOP);
2546 /* stack: [stream] => [stream stream] */
2547 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002548 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002549 /* stack: [stream stream] => [stream stream obj] */
2550 com_addbyte(c, ROT_TWO);
2551 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002552 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002553 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002554 com_pop(c, 2);
2555 }
2556 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002557 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002558 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002559 com_addbyte(c, PRINT_ITEM);
2560 com_pop(c, 1);
2561 }
2562 }
2563 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002564 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002565 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002566 /* must pop the extra stream object off the stack */
2567 com_addbyte(c, POP_TOP);
2568 /* stack: [... stream] => [...] */
2569 com_pop(c, 1);
2570 }
2571 }
2572 else {
2573 if (stream != NULL) {
2574 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002575 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002576 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002577 com_pop(c, 1);
2578 }
2579 else
2580 com_addbyte(c, PRINT_NEWLINE);
2581 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002582}
2583
2584static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002585com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002586{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002587 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002588 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002589 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002590 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002591 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002592 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002593 com_push(c, 1);
2594 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002595 else
2596 com_node(c, CHILD(n, 1));
2597 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002598 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002599}
2600
2601static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002602com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002603{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002604 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002605 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2606 if (NCH(n) > 1) {
2607 com_node(c, CHILD(n, 1));
2608 if (NCH(n) > 3) {
2609 com_node(c, CHILD(n, 3));
2610 if (NCH(n) > 5)
2611 com_node(c, CHILD(n, 5));
2612 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002613 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002614 i = NCH(n)/2;
2615 com_addoparg(c, RAISE_VARARGS, i);
2616 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002617}
2618
2619static void
Thomas Wouters52152252000-08-17 22:55:00 +00002620com_from_import(struct compiling *c, node *n)
2621{
2622 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2623 com_push(c, 1);
2624 if (NCH(n) > 1) {
2625 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2626 com_error(c, PyExc_SyntaxError, "invalid syntax");
2627 return;
2628 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002629 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002630 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002631 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00002632 com_pop(c, 1);
2633}
2634
2635static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002636com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002637{
2638 int i;
2639 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002640 /* 'import' dotted_name (',' dotted_name)* |
2641 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002642 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00002643 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002644 /* 'from' dotted_name 'import' ... */
2645 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002646
2647 if (TYPE(CHILD(n, 3)) == STAR) {
2648 tup = Py_BuildValue("(s)", "*");
2649 } else {
2650 tup = PyTuple_New((NCH(n) - 2)/2);
2651 for (i = 3; i < NCH(n); i += 2) {
2652 PyTuple_SET_ITEM(tup, (i-3)/2,
2653 PyString_FromString(STR(
2654 CHILD(CHILD(n, i), 0))));
2655 }
2656 }
2657 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00002658 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002659 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002660 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00002661 if (TYPE(CHILD(n, 3)) == STAR)
2662 com_addbyte(c, IMPORT_STAR);
2663 else {
2664 for (i = 3; i < NCH(n); i += 2)
2665 com_from_import(c, CHILD(n, i));
2666 com_addbyte(c, POP_TOP);
2667 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002668 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002669 }
2670 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002671 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002672 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00002673 node *subn = CHILD(n, i);
2674 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002675 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002676 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002677 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00002678 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00002679 int j;
2680 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00002681 com_error(c, PyExc_SyntaxError,
2682 "invalid syntax");
2683 return;
2684 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00002685 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
2686 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002687 CHILD(CHILD(subn, 0),
2688 j));
2689 com_addop_varname(c, VAR_STORE,
2690 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002691 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002692 com_addop_varname(c, VAR_STORE,
2693 STR(CHILD(CHILD(subn, 0),
2694 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002695 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002696 }
2697 }
2698}
2699
2700static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002701com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002702{
2703 REQ(n, exec_stmt);
2704 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2705 com_node(c, CHILD(n, 1));
2706 if (NCH(n) >= 4)
2707 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002708 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002709 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002710 com_push(c, 1);
2711 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002712 if (NCH(n) >= 6)
2713 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002714 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002715 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002716 com_push(c, 1);
2717 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002718 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002719 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002720}
2721
Guido van Rossum7c531111997-03-11 18:42:21 +00002722static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002723is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002724{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002725 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002726 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002727 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00002728
2729 /* Label to avoid tail recursion */
2730 next:
2731 switch (TYPE(n)) {
2732
2733 case suite:
2734 if (NCH(n) == 1) {
2735 n = CHILD(n, 0);
2736 goto next;
2737 }
2738 /* Fall through */
2739 case file_input:
2740 for (i = 0; i < NCH(n); i++) {
2741 node *ch = CHILD(n, i);
2742 if (TYPE(ch) == stmt) {
2743 n = ch;
2744 goto next;
2745 }
2746 }
2747 break;
2748
2749 case stmt:
2750 case simple_stmt:
2751 case small_stmt:
2752 n = CHILD(n, 0);
2753 goto next;
2754
2755 case expr_stmt:
2756 case testlist:
2757 case test:
2758 case and_test:
2759 case not_test:
2760 case comparison:
2761 case expr:
2762 case xor_expr:
2763 case and_expr:
2764 case shift_expr:
2765 case arith_expr:
2766 case term:
2767 case factor:
2768 case power:
2769 case atom:
2770 if (NCH(n) == 1) {
2771 n = CHILD(n, 0);
2772 goto next;
2773 }
2774 break;
2775
2776 case NAME:
2777 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2778 return 1;
2779 break;
2780
2781 case NUMBER:
2782 v = parsenumber(c, STR(n));
2783 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002784 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002785 break;
2786 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002787 i = PyObject_IsTrue(v);
2788 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002789 return i == 0;
2790
2791 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002792 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002793 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002794 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002795 break;
2796 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002797 i = PyObject_IsTrue(v);
2798 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002799 return i == 0;
2800
2801 }
2802 return 0;
2803}
2804
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002805static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002806com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002807{
2808 int i;
2809 int anchor = 0;
2810 REQ(n, if_stmt);
2811 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2812 for (i = 0; i+3 < NCH(n); i+=4) {
2813 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002814 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002815 if (is_constant_false(c, ch))
2816 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002817 if (i > 0)
2818 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002819 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002820 com_addfwref(c, JUMP_IF_FALSE, &a);
2821 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002822 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002823 com_node(c, CHILD(n, i+3));
2824 com_addfwref(c, JUMP_FORWARD, &anchor);
2825 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002826 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002827 com_addbyte(c, POP_TOP);
2828 }
2829 if (i+2 < NCH(n))
2830 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002831 if (anchor)
2832 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002833}
2834
2835static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002836com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002837{
2838 int break_anchor = 0;
2839 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002840 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002841 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2842 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002843 block_push(c, SETUP_LOOP);
2844 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002845 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002846 com_node(c, CHILD(n, 1));
2847 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2848 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002849 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002850 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002851 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002852 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002853 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2854 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002855 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002856 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002857 com_addbyte(c, POP_TOP);
2858 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002859 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002860 if (NCH(n) > 4)
2861 com_node(c, CHILD(n, 6));
2862 com_backpatch(c, break_anchor);
2863}
2864
2865static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002866com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002867{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002868 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002869 int break_anchor = 0;
2870 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002871 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002872 REQ(n, for_stmt);
2873 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2874 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002875 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002876 com_node(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002877 v = PyInt_FromLong(0L);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002878 if (v == NULL)
2879 c->c_errors++;
2880 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002881 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002882 Py_XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002883 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002884 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002885 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002886 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00002887 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002888 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002889 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002890 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002891 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2892 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002893 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002894 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002895 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002896 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002897 if (NCH(n) > 8)
2898 com_node(c, CHILD(n, 8));
2899 com_backpatch(c, break_anchor);
2900}
2901
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002902/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002903
2904 SETUP_FINALLY L
2905 <code for S>
2906 POP_BLOCK
2907 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002908 L: <code for Sf>
2909 END_FINALLY
2910
2911 The special instructions use the block stack. Each block
2912 stack entry contains the instruction that created it (here
2913 SETUP_FINALLY), the level of the value stack at the time the
2914 block stack entry was created, and a label (here L).
2915
2916 SETUP_FINALLY:
2917 Pushes the current value stack level and the label
2918 onto the block stack.
2919 POP_BLOCK:
2920 Pops en entry from the block stack, and pops the value
2921 stack until its level is the same as indicated on the
2922 block stack. (The label is ignored.)
2923 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002924 Pops a variable number of entries from the *value* stack
2925 and re-raises the exception they specify. The number of
2926 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002927
2928 The block stack is unwound when an exception is raised:
2929 when a SETUP_FINALLY entry is found, the exception is pushed
2930 onto the value stack (and the exception condition is cleared),
2931 and the interpreter jumps to the label gotten from the block
2932 stack.
2933
2934 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002935 (The contents of the value stack is shown in [], with the top
2936 at the right; 'tb' is trace-back info, 'val' the exception's
2937 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002938
2939 Value stack Label Instruction Argument
2940 [] SETUP_EXCEPT L1
2941 [] <code for S>
2942 [] POP_BLOCK
2943 [] JUMP_FORWARD L0
2944
Guido van Rossum3f5da241990-12-20 15:06:42 +00002945 [tb, val, exc] L1: DUP )
2946 [tb, val, exc, exc] <evaluate E1> )
2947 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2948 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2949 [tb, val, exc, 1] POP )
2950 [tb, val, exc] POP
2951 [tb, val] <assign to V1> (or POP if no V1)
2952 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002953 [] <code for S1>
2954 JUMP_FORWARD L0
2955
Guido van Rossum3f5da241990-12-20 15:06:42 +00002956 [tb, val, exc, 0] L2: POP
2957 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002958 .............................etc.......................
2959
Guido van Rossum3f5da241990-12-20 15:06:42 +00002960 [tb, val, exc, 0] Ln+1: POP
2961 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002962
2963 [] L0: <next statement>
2964
2965 Of course, parts are not generated if Vi or Ei is not present.
2966*/
2967
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002968static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002969com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002970{
2971 int except_anchor = 0;
2972 int end_anchor = 0;
2973 int else_anchor = 0;
2974 int i;
2975 node *ch;
2976
2977 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2978 block_push(c, SETUP_EXCEPT);
2979 com_node(c, CHILD(n, 2));
2980 com_addbyte(c, POP_BLOCK);
2981 block_pop(c, SETUP_EXCEPT);
2982 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2983 com_backpatch(c, except_anchor);
2984 for (i = 3;
2985 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2986 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002987 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002988 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002989 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002990 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002991 break;
2992 }
2993 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002994 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002995 com_addoparg(c, SET_LINENO, ch->n_lineno);
2996 if (NCH(ch) > 1) {
2997 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002998 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002999 com_node(c, CHILD(ch, 1));
3000 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003001 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003002 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3003 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003004 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003005 }
3006 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003007 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003008 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003009 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003010 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003011 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003012 com_pop(c, 1);
3013 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003014 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003015 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003016 com_node(c, CHILD(n, i+2));
3017 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3018 if (except_anchor) {
3019 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003020 /* We come in with [tb, val, exc, 0] on the
3021 stack; one pop and it's the same as
3022 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003023 com_addbyte(c, POP_TOP);
3024 }
3025 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003026 /* We actually come in here with [tb, val, exc] but the
3027 END_FINALLY will zap those and jump around.
3028 The c_stacklevel does not reflect them so we need not pop
3029 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003030 com_addbyte(c, END_FINALLY);
3031 com_backpatch(c, else_anchor);
3032 if (i < NCH(n))
3033 com_node(c, CHILD(n, i+2));
3034 com_backpatch(c, end_anchor);
3035}
3036
3037static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003038com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003039{
3040 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003041 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003042
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003043 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3044 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003045 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003046 com_addbyte(c, POP_BLOCK);
3047 block_pop(c, SETUP_FINALLY);
3048 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003049 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003050 /* While the generated code pushes only one item,
3051 the try-finally handling can enter here with
3052 up to three items. OK, here are the details:
3053 3 for an exception, 2 for RETURN, 1 for BREAK. */
3054 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003055 com_backpatch(c, finally_anchor);
3056 ch = CHILD(n, NCH(n)-1);
3057 com_addoparg(c, SET_LINENO, ch->n_lineno);
3058 com_node(c, ch);
3059 com_addbyte(c, END_FINALLY);
3060 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003061 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003062}
3063
3064static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003065com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003066{
3067 REQ(n, try_stmt);
3068 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3069 | 'try' ':' suite 'finally' ':' suite */
3070 if (TYPE(CHILD(n, 3)) != except_clause)
3071 com_try_finally(c, n);
3072 else
3073 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003074}
3075
Guido van Rossum8b993a91997-01-17 21:04:03 +00003076static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003077get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003078{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003079 int i;
3080
Guido van Rossum8b993a91997-01-17 21:04:03 +00003081 /* Label to avoid tail recursion */
3082 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003083 switch (TYPE(n)) {
3084
3085 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003086 if (NCH(n) == 1) {
3087 n = CHILD(n, 0);
3088 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003089 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003090 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003091 case file_input:
3092 for (i = 0; i < NCH(n); i++) {
3093 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003094 if (TYPE(ch) == stmt) {
3095 n = ch;
3096 goto next;
3097 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003098 }
3099 break;
3100
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003101 case stmt:
3102 case simple_stmt:
3103 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003104 n = CHILD(n, 0);
3105 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003106
3107 case expr_stmt:
3108 case testlist:
3109 case test:
3110 case and_test:
3111 case not_test:
3112 case comparison:
3113 case expr:
3114 case xor_expr:
3115 case and_expr:
3116 case shift_expr:
3117 case arith_expr:
3118 case term:
3119 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003120 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003121 if (NCH(n) == 1) {
3122 n = CHILD(n, 0);
3123 goto next;
3124 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003125 break;
3126
3127 case atom:
3128 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003129 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003130 break;
3131
3132 }
3133 return NULL;
3134}
3135
Guido van Rossum79f25d91997-04-29 20:08:16 +00003136static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003137get_docstring(node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003138{
Guido van Rossum541563e1999-01-28 15:08:09 +00003139 /* Don't generate doc-strings if run with -OO */
3140 if (Py_OptimizeFlag > 1)
3141 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003142 n = get_rawdocstring(n);
3143 if (n == NULL)
3144 return NULL;
3145 return parsestrplus(n);
3146}
3147
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003148static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003149com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003150{
3151 REQ(n, suite);
3152 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3153 if (NCH(n) == 1) {
3154 com_node(c, CHILD(n, 0));
3155 }
3156 else {
3157 int i;
3158 for (i = 0; i < NCH(n); i++) {
3159 node *ch = CHILD(n, i);
3160 if (TYPE(ch) == stmt)
3161 com_node(c, ch);
3162 }
3163 }
3164}
3165
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003166/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003167static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003168com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003169{
3170 int i = c->c_nblocks;
3171 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3172 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3173 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003174 else if (i <= 0) {
3175 /* at the outer level */
3176 com_error(c, PyExc_SyntaxError,
3177 "'continue' not properly in loop");
3178 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003179 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003180 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003181 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003182 if (c->c_block[j] == SETUP_LOOP)
3183 break;
3184 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003185 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003186 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003187 for (; i > j; --i) {
3188 if (c->c_block[i] == SETUP_EXCEPT ||
3189 c->c_block[i] == SETUP_FINALLY) {
3190 com_addoparg(c, CONTINUE_LOOP,
3191 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003192 return;
3193 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003194 if (c->c_block[i] == END_FINALLY) {
3195 com_error(c, PyExc_SyntaxError,
3196 "'continue' not supported inside 'finally' clause");
3197 return;
3198 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003199 }
3200 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003201 com_error(c, PyExc_SyntaxError,
3202 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003203 }
3204 /* XXX Could allow it inside a 'finally' clause
3205 XXX if we could pop the exception still on the stack */
3206}
3207
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003208static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003209com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003210{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003211 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003212 if (TYPE(n) == lambdef) {
3213 /* lambdef: 'lambda' [varargslist] ':' test */
3214 n = CHILD(n, 1);
3215 }
3216 else {
3217 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3218 n = CHILD(n, 2);
3219 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3220 n = CHILD(n, 1);
3221 }
3222 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003223 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003224 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003225 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003226 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3227 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003228 nargs = 0;
3229 ndefs = 0;
3230 for (i = 0; i < nch; i++) {
3231 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003232 if (TYPE(CHILD(n, i)) == STAR ||
3233 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003234 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003235 nargs++;
3236 i++;
3237 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003238 t = RPAR; /* Anything except EQUAL or COMMA */
3239 else
3240 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003241 if (t == EQUAL) {
3242 i++;
3243 ndefs++;
3244 com_node(c, CHILD(n, i));
3245 i++;
3246 if (i >= nch)
3247 break;
3248 t = TYPE(CHILD(n, i));
3249 }
3250 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003251 /* Treat "(a=1, b)" as an error */
3252 if (ndefs)
3253 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003254 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003255 }
3256 if (t != COMMA)
3257 break;
3258 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003259 return ndefs;
3260}
3261
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003262static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003263com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003264{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003265 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003266 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003267 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003268 ndefs = com_argdefs(c, n);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003269 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3270 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003271 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003272 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003273 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003274 c->c_errors++;
3275 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003276 int closure = com_make_closure(c, (PyCodeObject *)co);
3277 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003278 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003279 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003280 if (closure)
3281 com_addoparg(c, MAKE_CLOSURE, ndefs);
3282 else
3283 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003284 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003285 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003286 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003287 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003288 }
3289}
3290
3291static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003292com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003293{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003294 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003295 REQ(n, testlist);
3296 /* testlist: test (',' test)* [','] */
3297 for (i = 0; i < NCH(n); i += 2)
3298 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003299 i = (NCH(n)+1) / 2;
3300 com_addoparg(c, BUILD_TUPLE, i);
3301 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003302}
3303
3304static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003305com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003306{
Guido van Rossum25831651993-05-19 14:50:45 +00003307 int i;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003308 PyObject *co, *v;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003309 char *name;
3310
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003311 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003312 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003313 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003314 c->c_errors++;
3315 return;
3316 }
3317 /* Push the class name on the stack */
3318 i = com_addconst(c, v);
3319 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003320 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003321 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003322 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003323 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003324 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003325 com_push(c, 1);
3326 }
Guido van Rossum25831651993-05-19 14:50:45 +00003327 else
3328 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003329 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003330 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003331 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003332 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003333 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003334 c->c_errors++;
3335 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003336 int closure = com_make_closure(c, (PyCodeObject *)co);
3337 i = com_addconst(c, co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003338 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003339 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003340 if (closure)
3341 com_addoparg(c, MAKE_CLOSURE, 0);
3342 else
3343 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003344 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003345 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003346 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003347 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003348 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003349 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003350}
3351
3352static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003353com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003354{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003355 loop:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003356 switch (TYPE(n)) {
3357
3358 /* Definition nodes */
3359
3360 case funcdef:
3361 com_funcdef(c, n);
3362 break;
3363 case classdef:
3364 com_classdef(c, n);
3365 break;
3366
3367 /* Trivial parse tree nodes */
3368
3369 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003370 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003371 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003372 n = CHILD(n, 0);
3373 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003374
3375 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003376 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
3377 com_addoparg(c, SET_LINENO, n->n_lineno);
3378 {
3379 int i;
3380 for (i = 0; i < NCH(n)-1; i += 2)
3381 com_node(c, CHILD(n, i));
3382 }
3383 break;
3384
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003385 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003386 com_addoparg(c, SET_LINENO, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003387 n = CHILD(n, 0);
3388 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003389
3390 /* Statement nodes */
3391
3392 case expr_stmt:
3393 com_expr_stmt(c, n);
3394 break;
3395 case print_stmt:
3396 com_print_stmt(c, n);
3397 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003398 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003399 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003400 break;
3401 case pass_stmt:
3402 break;
3403 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003404 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003405 com_error(c, PyExc_SyntaxError,
3406 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003407 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003408 com_addbyte(c, BREAK_LOOP);
3409 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003410 case continue_stmt:
3411 com_continue_stmt(c, n);
3412 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003413 case return_stmt:
3414 com_return_stmt(c, n);
3415 break;
3416 case raise_stmt:
3417 com_raise_stmt(c, n);
3418 break;
3419 case import_stmt:
3420 com_import_stmt(c, n);
3421 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003422 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003423 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003424 case exec_stmt:
3425 com_exec_stmt(c, n);
3426 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003427 case assert_stmt:
3428 com_assert_stmt(c, n);
3429 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003430 case if_stmt:
3431 com_if_stmt(c, n);
3432 break;
3433 case while_stmt:
3434 com_while_stmt(c, n);
3435 break;
3436 case for_stmt:
3437 com_for_stmt(c, n);
3438 break;
3439 case try_stmt:
3440 com_try_stmt(c, n);
3441 break;
3442 case suite:
3443 com_suite(c, n);
3444 break;
3445
3446 /* Expression nodes */
3447
3448 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003449 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003450 break;
3451 case test:
3452 com_test(c, n);
3453 break;
3454 case and_test:
3455 com_and_test(c, n);
3456 break;
3457 case not_test:
3458 com_not_test(c, n);
3459 break;
3460 case comparison:
3461 com_comparison(c, n);
3462 break;
3463 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003464 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003465 break;
3466 case expr:
3467 com_expr(c, n);
3468 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003469 case xor_expr:
3470 com_xor_expr(c, n);
3471 break;
3472 case and_expr:
3473 com_and_expr(c, n);
3474 break;
3475 case shift_expr:
3476 com_shift_expr(c, n);
3477 break;
3478 case arith_expr:
3479 com_arith_expr(c, n);
3480 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003481 case term:
3482 com_term(c, n);
3483 break;
3484 case factor:
3485 com_factor(c, n);
3486 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003487 case power:
3488 com_power(c, n);
3489 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003490 case atom:
3491 com_atom(c, n);
3492 break;
3493
3494 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003495 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003496 com_error(c, PyExc_SystemError,
3497 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003498 }
3499}
3500
Tim Petersdbd9ba62000-07-09 03:09:57 +00003501static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003502
3503static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003504com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003505{
3506 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3507 if (TYPE(CHILD(n, 0)) == LPAR)
3508 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003509 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003510 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003511 com_pop(c, 1);
3512 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003513}
3514
3515static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003516com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003517{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003518 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003519 if (NCH(n) == 1) {
3520 com_fpdef(c, CHILD(n, 0));
3521 }
3522 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003523 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003524 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003525 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003526 for (i = 0; i < NCH(n); i += 2)
3527 com_fpdef(c, CHILD(n, i));
3528 }
3529}
3530
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003531/* XXX This function could probably be made simpler, because it
3532 doesn't do anything except generate code for complex arguments.
3533*/
3534
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003535static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003536com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003537{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003538 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003539 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003540 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003541 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003542 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003543 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003544 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003545 /* Enter all arguments in table of locals */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003546 for (i = 0, narg = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003547 node *ch = CHILD(n, i);
3548 node *fp;
3549 char *name;
Guido van Rossum50564e81996-01-12 01:13:16 +00003550 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003551 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003552 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3553 fp = CHILD(ch, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003554 if (TYPE(fp) == NAME) {
3555 PyObject *v;
3556 name = STR(fp);
3557 v = PyDict_GetItemString(c->c_cellvars, name);
3558 if (v) {
3559 com_addoparg(c, LOAD_FAST, narg);
3560 com_addoparg(c, STORE_DEREF,
3561 PyInt_AS_LONG(v));
3562 }
3563 } else {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003564 name = nbuf;
3565 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003566 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003567 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003568 narg++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003569 /* all name updates handled by symtable */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003570 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003571 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003572 ch = CHILD(n, i);
3573 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003574 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003575 else
3576 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003577 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003578 /* Handle *arguments */
3579 if (i < nch) {
3580 node *ch;
3581 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003582 if (TYPE(ch) != DOUBLESTAR) {
3583 REQ(ch, STAR);
3584 ch = CHILD(n, i+1);
3585 if (TYPE(ch) == NAME) {
Guido van Rossum50564e81996-01-12 01:13:16 +00003586 i += 3;
Guido van Rossum50564e81996-01-12 01:13:16 +00003587 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003588 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003589 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003590 /* Handle **keywords */
3591 if (i < nch) {
3592 node *ch;
3593 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003594 if (TYPE(ch) != DOUBLESTAR) {
3595 REQ(ch, STAR);
3596 ch = CHILD(n, i+1);
3597 REQ(ch, STAR);
3598 ch = CHILD(n, i+2);
3599 }
3600 else
3601 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003602 REQ(ch, NAME);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003603 }
3604 if (complex) {
3605 /* Generate code for complex arguments only after
3606 having counted the simple arguments */
3607 int ilocal = 0;
3608 for (i = 0; i < nch; i++) {
3609 node *ch = CHILD(n, i);
3610 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003611 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003612 break;
3613 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3614 fp = CHILD(ch, 0);
3615 if (TYPE(fp) != NAME) {
3616 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003617 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003618 com_fpdef(c, ch);
3619 }
3620 ilocal++;
3621 if (++i >= nch)
3622 break;
3623 ch = CHILD(n, i);
3624 if (TYPE(ch) == EQUAL)
3625 i += 2;
3626 else
3627 REQ(ch, COMMA);
3628 }
3629 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003630}
3631
3632static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003633com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003634{
3635 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003636 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003637 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003638 doc = get_docstring(n);
3639 if (doc != NULL) {
3640 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003641 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003642 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003643 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003644 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003645 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003646 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003647 for (i = 0; i < NCH(n); i++) {
3648 node *ch = CHILD(n, i);
3649 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3650 com_node(c, ch);
3651 }
3652}
3653
3654/* Top-level compile-node interface */
3655
3656static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003657compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003658{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003659 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003660 node *ch;
3661 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003662 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003663 doc = get_docstring(CHILD(n, 4));
3664 if (doc != NULL) {
3665 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003666 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003667 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003668 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003669 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003670 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3671 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003672 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003673 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003674 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003675 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003676 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003677 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003678 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003679 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003680 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003681}
3682
3683static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003684compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003685{
Guido van Rossum590baa41993-11-30 13:40:46 +00003686 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003687 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003688 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003689
3690 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003691 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003692 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003693 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003694 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003695 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003696 else
3697 ch = CHILD(n, 2);
3698 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003699 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003700 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003701}
3702
3703static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003704compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003705{
3706 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003707 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003708 REQ(n, classdef);
3709 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3710 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003711 c->c_private = c->c_name;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003712 ch = CHILD(n, NCH(n)-1); /* The suite */
3713 doc = get_docstring(ch);
3714 if (doc != NULL) {
3715 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003716 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003717 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003718 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003719 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003720 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003721 }
3722 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003723 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003724 com_node(c, ch);
3725 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003726 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003727 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003728 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003729}
3730
3731static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003732compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003733{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003734 com_addoparg(c, SET_LINENO, n->n_lineno);
3735
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003736 switch (TYPE(n)) {
3737
Guido van Rossum4c417781991-01-21 16:09:22 +00003738 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003739 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003740 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003741 n = CHILD(n, 0);
3742 if (TYPE(n) != NEWLINE)
3743 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003744 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003745 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003746 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003747 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003748 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003749 break;
3750
Guido van Rossum4c417781991-01-21 16:09:22 +00003751 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003752 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003753 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003754 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003755 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003756 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003757 break;
3758
Guido van Rossum590baa41993-11-30 13:40:46 +00003759 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003760 com_node(c, CHILD(n, 0));
3761 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003762 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003763 break;
3764
Guido van Rossum590baa41993-11-30 13:40:46 +00003765 case lambdef: /* anonymous function definition */
3766 compile_lambdef(c, n);
3767 break;
3768
Guido van Rossum4c417781991-01-21 16:09:22 +00003769 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003770 compile_funcdef(c, n);
3771 break;
3772
Guido van Rossum4c417781991-01-21 16:09:22 +00003773 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003774 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003775 break;
3776
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003777 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003778 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003779 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003780 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003781 }
3782}
3783
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003784static PyObject *
3785dict_keys_inorder(PyObject *dict, int offset)
3786{
3787 PyObject *tuple, *k, *v;
3788 int i, pos = 0, size = PyDict_Size(dict);
3789
3790 tuple = PyTuple_New(size);
3791 if (tuple == NULL)
3792 return NULL;
3793 while (PyDict_Next(dict, &pos, &k, &v)) {
3794 i = PyInt_AS_LONG(v);
3795 Py_INCREF(k);
3796 PyTuple_SET_ITEM(tuple, i - offset, k);
3797 }
3798 return tuple;
3799}
3800
Guido van Rossum79f25d91997-04-29 20:08:16 +00003801PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003802PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003803{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003804 return jcompile(n, filename, NULL);
3805}
3806
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003807struct symtable *
3808PyNode_CompileSymtable(node *n, char *filename)
3809{
3810 struct symtable *st;
3811
3812 st = symtable_init(1);
3813 if (st == NULL)
3814 return NULL;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00003815 assert(st->st_symbols != NULL);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003816 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
3817 if (st->st_errors > 0) {
3818 PySymtable_Free(st);
3819 return NULL;
3820 }
3821 symtable_node(st, n);
3822 if (st->st_errors > 0) {
3823 PySymtable_Free(st);
3824 return NULL;
3825 }
3826 return st;
3827}
3828
Guido van Rossum79f25d91997-04-29 20:08:16 +00003829static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003830icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003831{
3832 return jcompile(n, base->c_filename, base);
3833}
3834
Guido van Rossum79f25d91997-04-29 20:08:16 +00003835static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003836jcompile(node *n, char *filename, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003837{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003838 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003839 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003840 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003841 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003842 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003843 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003844 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003845 /* c_symtable still points to parent's symbols */
3846 if (base->c_nested
3847 || (sc.c_symtable->st_cur_type == TYPE_FUNCTION))
3848 sc.c_nested = 1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003849 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003850 sc.c_private = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003851 if (symtable_build(&sc, n) < 0) {
3852 com_free(&sc);
3853 return NULL;
3854 }
3855 }
3856 co = NULL;
3857 if (symtable_load_symbols(&sc) < 0)
3858 goto exit;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003859 compile_node(&sc, n);
3860 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00003861 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003862 PyObject *consts, *names, *varnames, *filename, *name,
3863 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003864 consts = PyList_AsTuple(sc.c_consts);
3865 names = PyList_AsTuple(sc.c_names);
3866 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003867 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
3868 freevars = dict_keys_inorder(sc.c_freevars,
3869 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003870 filename = PyString_InternFromString(sc.c_filename);
3871 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003872 if (!PyErr_Occurred())
3873 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003874 sc.c_nlocals,
3875 sc.c_maxstacklevel,
3876 sc.c_flags,
3877 sc.c_code,
3878 consts,
3879 names,
3880 varnames,
3881 freevars,
3882 cellvars,
3883 filename,
3884 name,
3885 sc.c_firstlineno,
3886 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003887 Py_XDECREF(consts);
3888 Py_XDECREF(names);
3889 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003890 Py_XDECREF(freevars);
3891 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003892 Py_XDECREF(filename);
3893 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003894 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00003895 else if (!PyErr_Occurred()) {
3896 /* This could happen if someone called PyErr_Clear() after an
3897 error was reported above. That's not supposed to happen,
3898 but I just plugged one case and I'm not sure there can't be
3899 others. In that case, raise SystemError so that at least
3900 it gets reported instead dumping core. */
3901 PyErr_SetString(PyExc_SystemError, "lost syntax error");
3902 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003903 exit:
3904 if (base == NULL)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003905 PySymtable_Free(sc.c_symtable);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003906 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003907 return co;
3908}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003909
3910int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003911PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003912{
3913 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003914 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003915 int line = co->co_firstlineno;
3916 int addr = 0;
3917 while (--size >= 0) {
3918 addr += *p++;
3919 if (addr > addrq)
3920 break;
3921 line += *p++;
3922 }
3923 return line;
3924}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003925
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003926/* The test for LOCAL must come before the test for FREE in order to
3927 handle classes where name is both local and free. The local var is
3928 a method and the free var is a free var referenced within a method.
3929*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003930
3931static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003932get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003933{
3934 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003935 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
3936 return CELL;
3937 if (PyDict_GetItemString(c->c_locals, name) != NULL)
3938 return LOCAL;
3939 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
3940 return FREE;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003941 v = PyDict_GetItemString(c->c_globals, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003942 if (v) {
3943 if (v == Py_None)
3944 return GLOBAL_EXPLICIT;
3945 else {
3946 return GLOBAL_IMPLICIT;
3947 }
3948 }
3949 {
3950 char buf[250];
3951 sprintf(buf, "unknown scope for %.100s in %.100s (%s)",
Jeremy Hylton483638c2001-02-01 20:20:45 +00003952 name, c->c_name,
3953 PyObject_REPR(c->c_symtable->st_cur_id));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003954 Py_FatalError(buf);
3955 }
3956 return -1; /* can't get here */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003957}
3958
3959static int
3960symtable_build(struct compiling *c, node *n)
3961{
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003962 if ((c->c_symtable = symtable_init(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003963 return -1;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00003964 c->c_symtable->st_filename = c->c_filename;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003965 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
3966 if (c->c_symtable->st_errors > 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003967 return -1;
3968 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00003969 if (c->c_symtable->st_errors > 0)
3970 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003971 /* reset for second pass */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003972 c->c_symtable->st_nscopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003973 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003974 return 0;
3975}
3976
3977static int
3978symtable_load_symbols(struct compiling *c)
3979{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003980 static PyObject *implicit = NULL;
3981 PyObject *name, *varnames, *v;
3982 int i, info, pos;
3983 int nlocals, nfrees, ncells;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003984 struct symtable *st = c->c_symtable;
3985
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003986 if (implicit == NULL) {
3987 implicit = PyInt_FromLong(1);
3988 if (implicit == NULL)
3989 return -1;
3990 }
3991 v = NULL;
3992
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003993 varnames = PyDict_GetItem(st->st_varnames, st->st_cur_id);
3994 if (varnames == NULL) {
3995 varnames = PyList_New(0);
3996 if (varnames == NULL)
3997 return -1;
3998 } else
3999 Py_INCREF(varnames);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004000 c->c_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004001
4002 c->c_globals = PyDict_New();
4003 if (c->c_globals == NULL)
4004 goto fail;
4005 c->c_freevars = PyDict_New();
4006 if (c->c_freevars == NULL)
4007 goto fail;
4008 c->c_cellvars = PyDict_New();
4009 if (c->c_cellvars == NULL)
4010 goto fail;
4011
4012 nlocals = PyList_GET_SIZE(varnames);
4013 c->c_argcount = nlocals;
4014 nfrees = 0;
4015 ncells = 0;
4016 for (i = 0; i < nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004017 v = PyInt_FromLong(i);
4018 if (PyDict_SetItem(c->c_locals,
4019 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004020 goto fail;
4021 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004022 }
4023
4024 /* XXX The cases below define the rules for whether a name is
4025 local or global. The logic could probably be clearer. */
4026 pos = 0;
4027 while (PyDict_Next(st->st_cur, &pos, &name, &v)) {
4028 info = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004029
4030 if (info & DEF_FREE_GLOBAL)
4031 /* undo the original DEF_FREE */
4032 info &= ~(DEF_FREE | DEF_FREE_CLASS);
4033
4034
4035 /* Seperate logic for DEF_FREE. If it occurs in a
4036 function, it indicates a local that we must
4037 allocate storage for (a cell var). If it occurs in
4038 a class, then the class has a method and a free
4039 variable with the same name.
4040 */
4041
4042 if ((info & (DEF_FREE | DEF_FREE_CLASS))
4043 && (info & (DEF_LOCAL | DEF_PARAM))) {
4044 PyObject *dict;
4045 if (st->st_cur_type == TYPE_FUNCTION) {
4046 v = PyInt_FromLong(ncells++);
4047 dict = c->c_cellvars;
4048 } else {
4049 v = PyInt_FromLong(nfrees++);
4050 dict = c->c_freevars;
4051 }
4052 if (v == NULL)
4053 return -1;
4054 if (PyDict_SetItem(dict, name, v) < 0)
4055 goto fail;
4056 Py_DECREF(v);
4057 }
4058
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004059 if (info & DEF_STAR) {
4060 c->c_argcount--;
4061 c->c_flags |= CO_VARARGS;
4062 } else if (info & DEF_DOUBLESTAR) {
4063 c->c_argcount--;
4064 c->c_flags |= CO_VARKEYWORDS;
4065 } else if (info & DEF_INTUPLE)
4066 c->c_argcount--;
4067 else if (info & DEF_GLOBAL) {
4068 if ((info & DEF_PARAM)
4069 && (PyString_AS_STRING(name)[0] != '.')){
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004070 PyErr_Format(PyExc_SyntaxError,
4071 "name '%.400s' is local and global",
4072 PyString_AS_STRING(name));
4073 set_error_location(st->st_filename,
4074 st->st_cur_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004075 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004076 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004077 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4078 goto fail;
4079 } else if (info & DEF_FREE_GLOBAL) {
4080 if (PyDict_SetItem(c->c_globals, name, implicit) < 0)
4081 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004082 } else if ((info & DEF_LOCAL) && !(info & DEF_PARAM)) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004083 v = PyInt_FromLong(nlocals++);
4084 if (v == NULL)
4085 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004086 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004087 goto fail;
4088 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004089 if (st->st_cur_type != TYPE_CLASS)
4090 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004091 goto fail;
4092 } else if (is_free(info)) {
4093 if (st->st_nested) {
4094 v = PyInt_FromLong(nfrees++);
4095 if (v == NULL)
4096 goto fail;
4097 if (PyDict_SetItem(c->c_freevars,
4098 name, v) < 0)
4099 goto fail;
4100 Py_DECREF(v);
4101 } else {
4102 if (PyDict_SetItem(c->c_globals, name,
4103 implicit) < 0)
4104 goto fail;
4105 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004106 }
4107 }
4108
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004109 /* The cell vars are the first elements of the closure,
4110 followed by the free vars. Update the offsets in
4111 c_freevars to account for number of cellvars. */
4112 pos = 0;
4113 while (PyDict_Next(c->c_freevars, &pos, &name, &v)) {
4114 int i = PyInt_AS_LONG(v) + ncells;
4115 PyObject *o = PyInt_FromLong(i);
4116 if (PyDict_SetItem(c->c_freevars, name, o) < 0) {
4117 Py_DECREF(o);
4118 return -1;
4119 }
4120 Py_DECREF(o);
4121 }
4122
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004123 if (st->st_cur_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004124 c->c_nlocals = nlocals;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004125
4126 if (st->st_cur_type != TYPE_MODULE)
4127 c->c_flags |= CO_NEWLOCALS;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004128 if (st->st_cur_type == TYPE_FUNCTION) {
4129 if (PyDict_GetItemString(st->st_cur, NOOPT) == NULL)
4130 c->c_flags |= CO_OPTIMIZED;
4131 else if (ncells || nfrees) {
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004132 PyErr_Format(PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004133 "function %.100s: may not use lexical scoping"
4134 " and 'import *' or exec in same function",
4135 PyString_AS_STRING(st->st_cur_name));
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004136 set_error_location(st->st_filename,
4137 st->st_cur_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004138 return -1;
4139 }
4140 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004141 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004142
4143 fail:
4144 /* is this always the right thing to do? */
4145 Py_XDECREF(v);
4146 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004147}
4148
4149static struct symtable *
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004150symtable_init(int keep)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004151{
4152 struct symtable *st;
4153 PyObject *d;
4154
4155 st = (struct symtable *)PyMem_Malloc(sizeof(struct symtable));
4156 if (st == NULL)
4157 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004158 st->st_pass = 1;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004159 st->st_keep = keep;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004160 st->st_filename = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004161 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004162 goto fail;
4163 if ((st->st_symbols = PyDict_New()) == NULL)
4164 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004165 if ((st->st_children = PyDict_New()) == NULL)
4166 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004167 if ((st->st_varnames = PyDict_New()) == NULL)
4168 goto fail;
4169 if ((d = PyDict_New()) == NULL)
4170 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004171 if (PyDict_SetItemString(st->st_symbols, TOP, d) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004172 goto fail;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004173 st->st_global = d;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004174 Py_DECREF(d);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004175 if (keep) {
4176 if ((d = PyDict_New()) == NULL)
4177 goto fail;
4178 st->st_scopes = d;
4179 } else
4180 st->st_scopes = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004181 st->st_cur = NULL;
4182 st->st_cur_id = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004183 st->st_cur_name = NULL;
4184 st->st_cur_children = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004185 st->st_cur_type = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004186 st->st_nested = 0;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004187 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004188 st->st_errors = 0;
4189 st->st_tmpname = 0;
4190 st->st_private = NULL;
4191 return st;
4192 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004193 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004194 return NULL;
4195}
4196
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004197void
4198PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004199{
4200 Py_XDECREF(st->st_symbols);
4201 Py_XDECREF(st->st_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004202 Py_XDECREF(st->st_children);
4203 Py_XDECREF(st->st_stack);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004204 Py_XDECREF(st->st_scopes);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004205 Py_XDECREF(st->st_cur_id);
Jeremy Hylton2fdfadf2001-01-29 22:42:28 +00004206 Py_XDECREF(st->st_cur_name);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004207 PyMem_Free((void *)st);
4208}
4209
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004210static PyObject *
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004211make_scope_info(PyObject *id, PyObject *name, int nested, int type,
4212 int lineno)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004213{
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004214 PyObject *t, *i1 = NULL, *i2 = NULL, *i3 = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004215
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004216 t = PyTuple_New(5);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004217 if (t == NULL)
4218 return NULL;
4219 i1 = PyInt_FromLong(nested);
4220 if (i1 == NULL)
4221 goto fail;
4222 i2 = PyInt_FromLong(type);
4223 if (i2 == NULL)
4224 goto fail;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004225 i3 = PyInt_FromLong(lineno);
4226 if (i3 == NULL)
4227 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004228
4229 Py_INCREF(name);
4230 Py_INCREF(id);
4231 PyTuple_SET_ITEM(t, 0, name);
4232 PyTuple_SET_ITEM(t, 1, id);
4233 /* i1 & i2 alloced here; don't need incref */
4234 PyTuple_SET_ITEM(t, 2, i1);
4235 PyTuple_SET_ITEM(t, 3, i2);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004236 PyTuple_SET_ITEM(t, 4, i3);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004237 return t;
4238 fail:
4239 Py_XDECREF(t);
4240 Py_XDECREF(i1);
4241 Py_XDECREF(i2);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004242 Py_XDECREF(i3);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004243 return NULL;
4244}
4245
4246/* When the compiler exits a scope, it must should update the scope's
4247 free variable information with the list of free variables in its
4248 children.
4249
4250 Variables that are free in children and defined in the current
4251 scope are cellvars.
4252
4253 If the scope being exited is defined at the top-level (st_nested is
4254 false), free variables in children that are not defined here are
4255 implicit globals.
4256
4257*/
4258
4259static int
4260symtable_update_free_vars(struct symtable *st)
4261{
4262 PyObject *dict, *o, *child, *name;
4263 int i, def;
4264
4265 if (st->st_cur_type == TYPE_CLASS)
4266 def = DEF_FREE_CLASS;
4267 else
4268 def = DEF_FREE;
4269 for (i = 0; i < PyList_GET_SIZE(st->st_cur_children); ++i) {
4270 int pos = 0;
4271
4272 child = PyList_GET_ITEM(st->st_cur_children, i);
4273 dict = PyDict_GetItem(st->st_symbols, child);
4274 if (dict == NULL)
4275 return -1;
4276 while (PyDict_Next(dict, &pos, &name, &o)) {
4277 int v = PyInt_AS_LONG(o);
4278 if (!(is_free(v)))
4279 continue; /* avoids indentation */
4280 if (st->st_nested) {
4281 if (symtable_add_def_o(st, st->st_cur,
4282 name, def) < 0)
4283 return -1;
4284 } else {
4285 if (symtable_check_global(st, child,
4286 name) < 0)
4287 return -1;
4288 }
4289 }
4290 }
4291
4292 return 0;
4293}
4294
4295/* If the current scope is a non-nested class or if name is not
4296 defined in the current, non-nested scope, then it is an implicit
4297 global in all nested scopes.
4298*/
4299
4300static int
4301symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
4302{
4303 PyObject *o;
4304 int v;
4305
4306 if (st->st_cur_type == TYPE_CLASS)
4307 return symtable_undo_free(st, child, name);
4308 o = PyDict_GetItem(st->st_cur, name);
4309 if (o == NULL)
4310 return symtable_undo_free(st, child, name);
4311 v = PyInt_AS_LONG(o);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004312 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004313 return symtable_undo_free(st, child, name);
4314 else
4315 return symtable_add_def_o(st, st->st_cur, name, DEF_FREE);
4316}
4317
4318static int
4319symtable_undo_free(struct symtable *st, PyObject *id,
4320 PyObject *name)
4321{
4322 int i, v, x;
4323 PyObject *dict, *children, *info;
4324
4325 dict = PyDict_GetItem(st->st_symbols, id);
4326 if (dict == NULL)
4327 return -1;
4328 info = PyDict_GetItem(dict, name);
4329 if (info == NULL)
4330 return 0;
4331 v = PyInt_AS_LONG(info);
4332 if (is_free(v)) {
4333 if (symtable_add_def_o(st, dict, name,
4334 DEF_FREE_GLOBAL) < 0)
4335 return -1;
4336 } else
4337 /* If the name is defined here or declared global,
4338 then the recursion stops. */
4339 return 0;
4340
4341 children = PyDict_GetItem(st->st_children, id);
4342 for (i = 0; i < PyList_GET_SIZE(children); ++i) {
4343 x = symtable_undo_free(st, PyList_GET_ITEM(children, i),
4344 name);
4345 if (x < 0)
4346 return x;
4347 }
4348 return 0;
4349}
4350
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004351static int
4352symtable_exit_scope(struct symtable *st)
4353{
4354 PyObject *o;
4355 int end;
4356
4357 if (st->st_pass == 1)
4358 symtable_update_free_vars(st);
4359 if (st->st_cur_name) {
4360 Py_XDECREF(st->st_cur_name);
4361 Py_XDECREF(st->st_cur_id);
4362 }
4363 end = PyList_GET_SIZE(st->st_stack) - 1;
4364 o = PyList_GET_ITEM(st->st_stack, end);
4365 st->st_cur_name = PyTuple_GET_ITEM(o, 0);
4366 st->st_cur_id = PyTuple_GET_ITEM(o, 1);
4367 st->st_nested = PyInt_AS_LONG(PyTuple_GET_ITEM(o, 2));
4368 st->st_cur_type = PyInt_AS_LONG(PyTuple_GET_ITEM(o, 3));
4369 if (PySequence_DelItem(st->st_stack, end) < 0)
4370 return -1;
4371 return symtable_update_cur(st);
4372}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004373
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004374static void
4375symtable_enter_scope(struct symtable *st, char *name, int type,
4376 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004377{
4378 PyObject *o;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004379
4380 if (st->st_cur) {
4381 /* push current scope info on stack */
4382 o = make_scope_info(st->st_cur_id, st->st_cur_name,
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004383 st->st_nested, st->st_cur_type,
4384 st->st_cur_lineno);
4385 if (o == NULL) {
4386 st->st_errors++;
4387 return;
4388 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004389 if (PyList_Append(st->st_stack, o) < 0) {
4390 Py_DECREF(o);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004391 st->st_errors++;
4392 return;
4393 }
4394 if (st->st_keep) {
4395 if (PyDict_SetItem(st->st_scopes,
4396 st->st_cur_id, o) < 0) {
4397 Py_DECREF(o);
4398 st->st_errors++;
4399 return;
4400 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004401 }
4402 Py_DECREF(o);
4403 }
4404 st->st_cur_name = PyString_FromString(name);
4405 if (st->st_nested || st->st_cur_type == TYPE_FUNCTION)
4406 st->st_nested = 1;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004407 st->st_cur_lineno = lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004408 switch (type) {
4409 case funcdef:
4410 case lambdef:
4411 st->st_cur_type = TYPE_FUNCTION;
4412 break;
4413 case classdef:
4414 st->st_cur_type = TYPE_CLASS;
4415 break;
4416 case single_input:
4417 case eval_input:
4418 case file_input:
4419 st->st_cur_type = TYPE_MODULE;
4420 break;
4421 default:
4422 fprintf(stderr, "invalid symtable scope: %d\n", type);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004423 st->st_errors++;
4424 return;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004425 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004426 /* update st_cur_id and parent's st_cur_children */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004427 o = PyInt_FromLong(st->st_nscopes++);
4428 if (o == NULL) {
4429 st->st_errors++;
4430 return;
4431 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004432 if (st->st_cur_children) {
4433 if (PyList_Append(st->st_cur_children, o) < 0) {
4434 Py_DECREF(o);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004435 st->st_errors++;
4436 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004437 }
4438 }
4439 st->st_cur_id = o;
4440 /* create st_cur_children list */
4441 o = PyList_New(0);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004442 if (o == NULL) {
4443 st->st_errors++;
4444 return;
4445 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004446 if (PyDict_SetItem(st->st_children, st->st_cur_id, o) < 0) {
4447 Py_DECREF(o);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004448 st->st_errors++;
4449 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004450 }
4451 Py_DECREF(o);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004452
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004453 symtable_update_cur(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004454}
4455
4456static int
4457symtable_update_cur(struct symtable *st)
4458{
4459 PyObject *s, *d, *l;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004460
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004461 s = st->st_cur_id;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004462 d = PyDict_GetItem(st->st_symbols, s);
4463 if (d == NULL) {
4464 if ((d = PyDict_New()) == NULL)
4465 return -1;
4466 if (PyObject_SetItem(st->st_symbols, s, d) < 0) {
4467 Py_DECREF(d);
4468 return -1;
4469 }
Jeremy Hyltonbbf10b52001-02-02 02:58:48 +00004470 Py_DECREF(d);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004471 if (st->st_cur_type == TYPE_FUNCTION) {
4472 if ((l = PyList_New(0)) == NULL)
4473 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004474 if (PyDict_SetItem(st->st_varnames, s, l) < 0) {
4475 Py_DECREF(l);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004476 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004477 }
4478 Py_DECREF(l);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004479 }
4480 }
4481
4482 st->st_cur = d;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004483
4484 d = PyDict_GetItem(st->st_children, s);
4485 if (d == NULL)
4486 return -1;
4487 st->st_cur_children = d;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004488 return 0;
4489}
4490
4491static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004492symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004493{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004494 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004495 char buffer[MANGLE_LEN];
4496
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004497 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004498 name = buffer;
4499 if ((s = PyString_InternFromString(name)) == NULL)
4500 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004501 return symtable_add_def_o(st, st->st_cur, s, flag);
4502}
4503
4504/* Must only be called with mangled names */
4505
4506static int
4507symtable_add_def_o(struct symtable *st, PyObject *dict,
4508 PyObject *name, int flag)
4509{
4510 PyObject *o;
4511 int val;
4512
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004513 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004514 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004515 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004516 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00004517 PyString_AsString(name));
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004518 set_error_location(st->st_filename,
4519 st->st_cur_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004520 return -1;
4521 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004522 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004523 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004524 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004525 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004526 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004527 Py_DECREF(o);
4528 return -1;
4529 }
4530 Py_DECREF(o);
4531
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004532 if (flag & DEF_PARAM) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004533 PyObject *l = PyDict_GetItem(st->st_varnames,
4534 st->st_cur_id);
4535 if (l == NULL)
4536 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004537 if (PyList_Append(l, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004538 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004539 } else if (flag & DEF_GLOBAL) {
4540 /* XXX need to update DEF_GLOBAL for other flags too;
4541 perhaps only DEF_FREE_GLOBAL */
4542 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004543 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004544 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004545 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004546 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004547 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004548 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004549 Py_DECREF(o);
4550 return -1;
4551 }
4552 Py_DECREF(o);
4553 }
4554 return 0;
4555}
4556
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004557#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004558
4559static void
4560symtable_node(struct symtable *st, node *n)
4561{
4562 int i, start = 0;
4563
4564 loop:
4565 switch (TYPE(n)) {
4566 case funcdef: {
4567 char *func_name = STR(CHILD(n, 1));
4568 symtable_add_def(st, func_name, DEF_LOCAL);
4569 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004570 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004571 symtable_funcdef(st, n);
4572 symtable_exit_scope(st);
4573 break;
4574 }
4575 case lambdef:
4576 if (NCH(n) == 4)
4577 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004578 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004579 symtable_funcdef(st, n);
4580 symtable_exit_scope(st);
4581 break;
4582 case classdef: {
4583 char *tmp, *class_name = STR(CHILD(n, 1));
4584 symtable_add_def(st, class_name, DEF_LOCAL);
4585 if (TYPE(CHILD(n, 2)) == LPAR) {
4586 node *bases = CHILD(n, 3);
4587 int i;
4588 for (i = 0; i < NCH(bases); i += 2) {
4589 symtable_node(st, CHILD(bases, i));
4590 }
4591 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004592 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004593 tmp = st->st_private;
4594 st->st_private = class_name;
4595 symtable_node(st, CHILD(n, NCH(n) - 1));
4596 st->st_private = tmp;
4597 symtable_exit_scope(st);
4598 break;
4599 }
4600 case if_stmt:
4601 for (i = 0; i + 3 < NCH(n); i += 4) {
4602 if (is_constant_false(NULL, (CHILD(n, i + 1))))
4603 continue;
4604 symtable_node(st, CHILD(n, i + 1));
4605 symtable_node(st, CHILD(n, i + 3));
4606 }
4607 if (i + 2 < NCH(n))
4608 symtable_node(st, CHILD(n, i + 2));
4609 break;
4610 case global_stmt:
4611 symtable_global(st, n);
4612 break;
4613 case import_stmt:
4614 symtable_import(st, n);
4615 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004616 case exec_stmt: {
4617 PyObject *zero = PyInt_FromLong(0);
4618 if (zero == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004619 st->st_errors++;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004620 else {
4621 if (PyDict_SetItemString(st->st_cur, NOOPT,
4622 zero) < 0)
4623 st->st_errors++;
4624 Py_DECREF(zero);
4625 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004626 symtable_node(st, CHILD(n, 1));
4627 if (NCH(n) > 2)
4628 symtable_node(st, CHILD(n, 3));
4629 if (NCH(n) > 4)
4630 symtable_node(st, CHILD(n, 5));
4631 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004632
4633 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004634 case except_clause:
4635 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004636 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004637 if (NCH(n) > 1) {
4638 n = CHILD(n, 1);
4639 goto loop;
4640 }
4641 break;
4642 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004643 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004644 break;
4645 case expr_stmt:
4646 if (NCH(n) == 1)
4647 n = CHILD(n, 0);
4648 else {
4649 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004650 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004651 symtable_node(st, CHILD(n, 2));
4652 break;
4653 } else {
4654 int i;
4655 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004656 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004657 n = CHILD(n, NCH(n) - 1);
4658 }
4659 }
4660 goto loop;
4661 /* watchout for fall-through logic below */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004662 case argument:
4663 if (NCH(n) == 3) {
4664 n = CHILD(n, 2);
4665 goto loop;
4666 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004667 case listmaker:
4668 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
4669 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton5f827f42001-01-23 01:26:20 +00004670 n = CHILD(n, 0);
4671 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004672 }
4673 case atom:
4674 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
4675 symtable_add_use(st, STR(CHILD(n, 0)));
4676 break;
4677 }
4678 case for_stmt:
4679 if (TYPE(n) == for_stmt) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004680 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004681 start = 3;
4682 }
4683 default:
4684 if (NCH(n) == 1) {
4685 n = CHILD(n, 0);
4686 goto loop;
4687 }
4688 for (i = start; i < NCH(n); ++i)
4689 if (TYPE(CHILD(n, i)) >= single_input)
4690 symtable_node(st, CHILD(n, i));
4691 }
4692}
4693
4694static void
4695symtable_funcdef(struct symtable *st, node *n)
4696{
4697 node *body;
4698
4699 if (TYPE(n) == lambdef) {
4700 if (NCH(n) == 4)
4701 symtable_params(st, CHILD(n, 1));
4702 } else
4703 symtable_params(st, CHILD(n, 2));
4704 body = CHILD(n, NCH(n) - 1);
4705 symtable_node(st, body);
4706}
4707
4708/* The next two functions parse the argument tuple.
4709 symtable_default_arg() checks for names in the default arguments,
4710 which are references in the defining scope. symtable_params()
4711 parses the parameter names, which are defined in the function's
4712 body.
4713
4714 varargslist:
4715 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
4716 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
4717*/
4718
4719static void
4720symtable_default_args(struct symtable *st, node *n)
4721{
4722 node *c;
4723 int i;
4724
4725 if (TYPE(n) == parameters) {
4726 n = CHILD(n, 1);
4727 if (TYPE(n) == RPAR)
4728 return;
4729 }
4730 REQ(n, varargslist);
4731 for (i = 0; i < NCH(n); i += 2) {
4732 c = CHILD(n, i);
4733 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
4734 break;
4735 }
4736 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
4737 symtable_node(st, CHILD(n, i));
4738 }
4739}
4740
4741static void
4742symtable_params(struct symtable *st, node *n)
4743{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004744 int i, complex = -1, ext = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004745 node *c = NULL;
4746
4747 if (TYPE(n) == parameters) {
4748 n = CHILD(n, 1);
4749 if (TYPE(n) == RPAR)
4750 return;
4751 }
4752 REQ(n, varargslist);
4753 for (i = 0; i < NCH(n); i += 2) {
4754 c = CHILD(n, i);
4755 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
4756 ext = 1;
4757 break;
4758 }
4759 if (TYPE(c) == test) {
4760 continue;
4761 }
4762 if (TYPE(CHILD(c, 0)) == NAME)
4763 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
4764 else {
4765 char nbuf[10];
4766 sprintf(nbuf, ".%d", i);
4767 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004768 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004769 }
4770 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004771 if (ext) {
4772 c = CHILD(n, i);
4773 if (TYPE(c) == STAR) {
4774 i++;
4775 symtable_add_def(st, STR(CHILD(n, i)),
4776 DEF_PARAM | DEF_STAR);
4777 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00004778 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004779 c = NULL;
4780 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004781 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004782 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004783 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004784 i++;
4785 symtable_add_def(st, STR(CHILD(n, i)),
4786 DEF_PARAM | DEF_DOUBLESTAR);
4787 }
4788 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004789 if (complex >= 0) {
4790 int j;
4791 for (j = 0; j <= complex; j++) {
4792 c = CHILD(n, j);
4793 if (TYPE(c) == COMMA)
4794 c = CHILD(n, ++j);
4795 if (TYPE(CHILD(c, 0)) == LPAR)
4796 symtable_params_fplist(st, CHILD(c, 1));
4797 }
4798 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004799}
4800
4801static void
4802symtable_params_fplist(struct symtable *st, node *n)
4803{
4804 int i;
4805 node *c;
4806
4807 REQ(n, fplist);
4808 for (i = 0; i < NCH(n); i += 2) {
4809 c = CHILD(n, i);
4810 REQ(c, fpdef);
4811 if (NCH(c) == 1)
4812 symtable_add_def(st, STR(CHILD(c, 0)),
4813 DEF_PARAM | DEF_INTUPLE);
4814 else
4815 symtable_params_fplist(st, CHILD(c, 1));
4816 }
4817
4818}
4819
4820static void
4821symtable_global(struct symtable *st, node *n)
4822{
4823 int i;
4824
4825 for (i = 1; i < NCH(n); i += 2)
4826 symtable_add_def(st, STR(CHILD(n, i)), DEF_GLOBAL);
4827}
4828
4829static void
4830symtable_list_comprehension(struct symtable *st, node *n)
4831{
4832 char tmpname[12];
4833
4834 sprintf(tmpname, "[%d]", ++st->st_tmpname);
4835 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004836 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004837 symtable_node(st, CHILD(n, 3));
4838 if (NCH(n) == 5)
4839 symtable_node(st, CHILD(n, 4));
4840 --st->st_tmpname;
4841}
4842
4843static void
4844symtable_import(struct symtable *st, node *n)
4845{
4846 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004847 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004848 | 'from' dotted_name 'import'
4849 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00004850 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004851 */
4852
4853 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
4854 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton483638c2001-02-01 20:20:45 +00004855 PyObject *zero = PyInt_FromLong(0);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004856 if (st->st_cur_type != TYPE_MODULE) {
4857 PyErr_SetString(PyExc_SyntaxError,
4858 ILLEGAL_IMPORT_STAR);
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004859 set_error_location(st->st_filename,
4860 n->n_lineno);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004861 st->st_errors++;
4862 return;
4863 }
Jeremy Hylton483638c2001-02-01 20:20:45 +00004864 if (zero == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004865 st->st_errors++;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004866 else {
4867 if (PyDict_SetItemString(st->st_cur, NOOPT,
4868 zero) < 0)
4869 st->st_errors++;
4870 Py_DECREF(zero);
4871 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004872 } else {
4873 for (i = 3; i < NCH(n); i += 2) {
4874 node *c = CHILD(n, i);
4875 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004876 symtable_assign(st, CHILD(c, 2),
4877 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004878 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004879 symtable_assign(st, CHILD(c, 0),
4880 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004881 }
4882 }
4883 } else {
4884 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004885 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004886 }
4887 }
4888}
4889
4890static void
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004891symtable_assign(struct symtable *st, node *n, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004892{
4893 node *tmp;
4894 int i;
4895
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004896 loop:
4897 switch (TYPE(n)) {
4898 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004899 /* invalid assignment, e.g. lambda x:x=2. The next
4900 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004901 return;
4902 case power:
4903 if (NCH(n) > 2) {
4904 for (i = 2; i < NCH(n); ++i)
4905 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
4906 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004907 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004908 if (NCH(n) > 1) {
4909 symtable_node(st, CHILD(n, 0));
4910 symtable_node(st, CHILD(n, 1));
4911 } else {
4912 n = CHILD(n, 0);
4913 goto loop;
4914 }
4915 return;
4916 case listmaker:
4917 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
4918 symtable_list_comprehension(st, CHILD(n, 1));
4919 else {
4920 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004921 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004922 }
4923 return;
4924 case exprlist:
4925 case testlist:
4926 if (NCH(n) == 1) {
4927 n = CHILD(n, 0);
4928 goto loop;
4929 }
4930 else {
4931 int i;
4932 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004933 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004934 return;
4935 }
4936 goto loop;
4937 case atom:
4938 tmp = CHILD(n, 0);
4939 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
4940 n = CHILD(n, 1);
4941 goto loop;
4942 } else if (TYPE(tmp) == NAME)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004943 symtable_add_def(st, STR(tmp), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004944 return;
4945 case dotted_as_name:
4946 if (NCH(n) == 3)
4947 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004948 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004949 else
4950 symtable_add_def(st,
4951 STR(CHILD(CHILD(n,
4952 0), 0)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004953 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004954 return;
4955 case dotted_name:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004956 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004957 return;
4958 case NAME:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004959 symtable_add_def(st, STR(n), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004960 return;
4961 default:
4962 if (NCH(n) == 0)
4963 return;
4964 if (NCH(n) != 1) {
4965 DUMP(n);
4966 Py_FatalError("too many children in default case\n");
4967 }
4968 n = CHILD(n, 0);
4969 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004970 }
4971}