blob: acad6673eabc8b798c20813081a2d16ad44482ef [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{
196 static char ok_name_char[256];
Tim Peters7f3e4ad2001-01-20 05:15:26 +0000197 static unsigned char *name_chars = (unsigned char *)NAME_CHARS;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000198
199 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;
209}
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 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000356 int c_nested; /* Is block nested funcdef or lamdef? */
357 int c_closure; /* Is nested w/freevars? */
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000358 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
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000374com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000375{
Fred Drakedcf08e02000-08-15 15:49:44 +0000376 PyObject *v, *tb, *tmp;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000377 if (c == NULL) {
378 /* Error occurred via symtable call to
379 is_constant_false */
380 PyErr_SetString(exc, msg);
381 return;
382 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000383 c->c_errors++;
Guido van Rossum452a9831996-09-17 14:32:04 +0000384 if (c->c_lineno <= 1) {
385 /* Unknown line number or single interactive command */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000386 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000387 return;
388 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000389 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000390 if (v == NULL)
391 return; /* MemoryError, too bad */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000392 PyErr_SetObject(exc, v);
393 Py_DECREF(v);
Fred Drakedcf08e02000-08-15 15:49:44 +0000394
395 /* add attributes for the line number and filename for the error */
396 PyErr_Fetch(&exc, &v, &tb);
397 PyErr_NormalizeException(&exc, &v, &tb);
398 tmp = PyInt_FromLong(c->c_lineno);
399 if (tmp == NULL)
400 PyErr_Clear();
401 else {
402 if (PyObject_SetAttrString(v, "lineno", tmp))
403 PyErr_Clear();
404 Py_DECREF(tmp);
405 }
406 if (c->c_filename != NULL) {
407 tmp = PyString_FromString(c->c_filename);
408 if (tmp == NULL)
409 PyErr_Clear();
410 else {
411 if (PyObject_SetAttrString(v, "filename", tmp))
412 PyErr_Clear();
413 Py_DECREF(tmp);
414 }
415 }
416 PyErr_Restore(exc, v, tb);
Guido van Rossum452a9831996-09-17 14:32:04 +0000417}
418
419
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000420/* Interface to the block stack */
421
422static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000423block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000424{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000425 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000426 com_error(c, PyExc_SystemError,
427 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000428 }
429 else {
430 c->c_block[c->c_nblocks++] = type;
431 }
432}
433
434static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000435block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000436{
437 if (c->c_nblocks > 0)
438 c->c_nblocks--;
439 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000440 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000441 }
442}
443
444
Guido van Rossum681d79a1995-07-18 14:51:37 +0000445/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000446
Tim Petersdbd9ba62000-07-09 03:09:57 +0000447static int com_init(struct compiling *, char *);
448static void com_free(struct compiling *);
449static void com_push(struct compiling *, int);
450static void com_pop(struct compiling *, int);
451static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000452static void com_node(struct compiling *, node *);
453static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000454static void com_addbyte(struct compiling *, int);
455static void com_addint(struct compiling *, int);
456static void com_addoparg(struct compiling *, int, int);
457static void com_addfwref(struct compiling *, int, int *);
458static void com_backpatch(struct compiling *, int);
459static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
460static int com_addconst(struct compiling *, PyObject *);
461static int com_addname(struct compiling *, PyObject *);
462static void com_addopname(struct compiling *, int, node *);
463static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000464static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000465static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000466static void com_assign(struct compiling *, node *, int, node *);
467static void com_assign_name(struct compiling *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000468static PyCodeObject *icompile(node *, struct compiling *);
469static PyCodeObject *jcompile(node *, char *, struct compiling *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000470static PyObject *parsestrplus(node *);
471static PyObject *parsestr(char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000472static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000473
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000474static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000475
476/* symtable operations */
477static int symtable_build(struct compiling *, node *);
478static int symtable_load_symbols(struct compiling *);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000479static struct symtable *symtable_init(int);
480static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000481static int symtable_exit_scope(struct symtable *);
482static int symtable_update_cur(struct symtable *);
483static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000484static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000485
486static void symtable_node(struct symtable *, node *);
487static void symtable_funcdef(struct symtable *, node *);
488static void symtable_default_args(struct symtable *, node *);
489static void symtable_params(struct symtable *, node *);
490static void symtable_params_fplist(struct symtable *, node *n);
491static void symtable_global(struct symtable *, node *);
492static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000493static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000494static void symtable_list_comprehension(struct symtable *, node *);
495
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000496static int symtable_update_free_vars(struct symtable *);
497static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
498static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
499
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000500/* helper */
501static void
502do_pad(int pad)
503{
504 int i;
505 for (i = 0; i < pad; ++i)
506 fprintf(stderr, " ");
507}
508
509static void
510dump(node *n, int pad, int depth)
511{
512 int i;
513 if (depth == 0)
514 return;
515 do_pad(pad);
516 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
517 if (depth > 0)
518 depth--;
519 for (i = 0; i < NCH(n); ++i)
520 dump(CHILD(n, i), pad + 1, depth);
521}
522
523#define DUMP(N) dump(N, 0, -1)
524
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000525static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000526com_init(struct compiling *c, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000527{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000528 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000529 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
530 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000531 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000532 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000533 goto fail;
534 if ((c->c_const_dict = PyDict_New()) == NULL)
535 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000536 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000537 goto fail;
538 if ((c->c_name_dict = PyDict_New()) == NULL)
539 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000540 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000541 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000542 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
543 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000544 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000545 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000546 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000547 c->c_freevars = NULL;
548 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000549 c->c_nlocals = 0;
550 c->c_argcount = 0;
551 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000552 c->c_nexti = 0;
553 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000554 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000555 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000556 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000557 c->c_begin = 0;
558 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000559 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000560 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000561 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000562 c->c_stacklevel = 0;
563 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000564 c->c_firstlineno = 0;
565 c->c_last_addr = 0;
566 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000567 c->c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000568 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000569 c->c_nested = 0;
570 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000571 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000572 return 1;
573
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000574 fail:
575 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000576 return 0;
577}
578
579static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000580com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000581{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000582 Py_XDECREF(c->c_code);
583 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000584 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000585 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000586 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000587 Py_XDECREF(c->c_globals);
588 Py_XDECREF(c->c_locals);
589 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000590 Py_XDECREF(c->c_freevars);
591 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000592 Py_XDECREF(c->c_lnotab);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000593}
594
595static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000596com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000597{
598 c->c_stacklevel += n;
599 if (c->c_stacklevel > c->c_maxstacklevel)
600 c->c_maxstacklevel = c->c_stacklevel;
601}
602
603static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000604com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000605{
606 if (c->c_stacklevel < n) {
Guido van Rossum90f827c1998-08-25 18:22:17 +0000607 /* fprintf(stderr,
Guido van Rossum8b993a91997-01-17 21:04:03 +0000608 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
609 c->c_filename, c->c_lineno,
Guido van Rossum90f827c1998-08-25 18:22:17 +0000610 c->c_nexti, c->c_stacklevel, n); */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000611 c->c_stacklevel = 0;
612 }
613 else
614 c->c_stacklevel -= n;
615}
616
617static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000618com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000619{
620 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000621 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000622 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000623 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000624}
625
626static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000627com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000628{
629 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000630 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000631 assert(byte >= 0 && byte <= 255);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000632 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000633 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000634 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000635 fatal("com_addbyte: byte out of range");
Guido van Rossum01cfd441991-10-20 20:12:38 +0000636 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000637 com_error(c, PyExc_SystemError,
638 "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000639 }
640 if (c->c_code == NULL)
641 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000642 len = PyString_Size(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000643 if (c->c_nexti >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000644 if (_PyString_Resize(&c->c_code, len+1000) != 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000645 c->c_errors++;
646 return;
647 }
648 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000649 PyString_AsString(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000650}
651
652static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000653com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000654{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000655 com_addbyte(c, x & 0xff);
656 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000657}
658
659static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000660com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000661{
662 int size;
663 char *p;
664 if (c->c_lnotab == NULL)
665 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000666 size = PyString_Size(c->c_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000667 if (c->c_lnotab_next+2 > size) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000668 if (_PyString_Resize(&c->c_lnotab, size + 1000) < 0) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000669 c->c_errors++;
670 return;
671 }
672 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000673 p = PyString_AsString(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000674 *p++ = addr;
675 *p++ = line;
676 c->c_lnotab_next += 2;
677}
678
679static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000680com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000681{
682 c->c_lineno = lineno;
683 if (c->c_firstlineno == 0) {
684 c->c_firstlineno = c->c_last_line = lineno;
685 }
686 else {
687 int incr_addr = c->c_nexti - c->c_last_addr;
688 int incr_line = lineno - c->c_last_line;
689 while (incr_addr > 0 || incr_line > 0) {
690 int trunc_addr = incr_addr;
691 int trunc_line = incr_line;
692 if (trunc_addr > 255)
693 trunc_addr = 255;
694 if (trunc_line > 255)
695 trunc_line = 255;
696 com_add_lnotab(c, trunc_addr, trunc_line);
697 incr_addr -= trunc_addr;
698 incr_line -= trunc_line;
699 }
700 c->c_last_addr = c->c_nexti;
701 c->c_last_line = lineno;
702 }
703}
704
705static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000706com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000707{
Fred Drakeef8ace32000-08-24 00:32:09 +0000708 int extended_arg = arg >> 16;
Guido van Rossum8e793d91997-03-03 19:13:14 +0000709 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000710 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000711 if (Py_OptimizeFlag)
712 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000713 }
Fred Drakeef8ace32000-08-24 00:32:09 +0000714 if (extended_arg){
715 com_addbyte(c, EXTENDED_ARG);
716 com_addint(c, extended_arg);
717 arg &= 0xffff;
718 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000719 com_addbyte(c, op);
720 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000721}
722
723static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000724com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000725{
726 /* Compile a forward reference for backpatching */
727 int here;
728 int anchor;
729 com_addbyte(c, op);
730 here = c->c_nexti;
731 anchor = *p_anchor;
732 *p_anchor = here;
733 com_addint(c, anchor == 0 ? 0 : here - anchor);
734}
735
736static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000737com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000738{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000739 unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000740 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000741 int dist;
742 int prev;
743 for (;;) {
744 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000745 prev = code[anchor] + (code[anchor+1] << 8);
746 dist = target - (anchor+2);
747 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +0000748 dist >>= 8;
749 code[anchor+1] = dist;
750 dist >>= 8;
751 if (dist) {
752 com_error(c, PyExc_SystemError,
753 "com_backpatch: offset too large");
754 break;
755 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000756 if (!prev)
757 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000758 anchor -= prev;
759 }
760}
761
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000762/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000763
764static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000765com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000766{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000767 PyObject *w, *t, *np=NULL;
768 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000769
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000770 t = Py_BuildValue("(OO)", v, v->ob_type);
771 if (t == NULL)
772 goto fail;
773 w = PyDict_GetItem(dict, t);
774 if (w != NULL) {
775 n = PyInt_AsLong(w);
776 } else {
777 n = PyList_Size(list);
778 np = PyInt_FromLong(n);
779 if (np == NULL)
780 goto fail;
781 if (PyList_Append(list, v) != 0)
782 goto fail;
783 if (PyDict_SetItem(dict, t, np) != 0)
784 goto fail;
785 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000786 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000787 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000788 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000789 fail:
790 Py_XDECREF(np);
791 Py_XDECREF(t);
792 c->c_errors++;
793 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000794}
795
796static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000797com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000798{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000799 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000800}
801
802static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000803com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000804{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000805 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000806}
807
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000808static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000809mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000810{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000811 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000812 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +0000813 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000814 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
815 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000816 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000817 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000818 return 0; /* Don't mangle __extremely_long_names */
819 if (name[nlen-1] == '_' && name[nlen-2] == '_')
820 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000821 /* Strip leading underscores from class name */
822 while (*p == '_')
823 p++;
824 if (*p == '\0')
825 return 0; /* Don't mangle if class is just underscores */
826 plen = strlen(p);
827 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000828 plen = maxlen-nlen-2; /* Truncate class name if too long */
829 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000830 buffer[0] = '_';
831 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000832 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000833 /* fprintf(stderr, "mangle %s -> %s\n", name, buffer); */
834 return 1;
835}
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000836
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000837static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000838com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000839{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000840 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000841 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000842 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000843
844 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000845 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000846 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000847 c->c_errors++;
848 i = 255;
849 }
850 else {
851 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000852 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000853 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000854 com_addoparg(c, op, i);
855}
856
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000857#define NAME_LOCAL 0
858#define NAME_GLOBAL 1
859#define NAME_DEFAULT 2
860#define NAME_CLOSURE 3
861
862static int
863com_lookup_arg(PyObject *dict, PyObject *name)
864{
865 PyObject *v = PyDict_GetItem(dict, name);
866 if (v == NULL)
867 return -1;
868 else
869 return PyInt_AS_LONG(v);
870}
871
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000872static void
873com_addop_varname(struct compiling *c, int kind, char *name)
874{
875 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000876 int i, reftype;
877 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000878 int op = STOP_CODE;
879 char buffer[MANGLE_LEN];
880
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000881 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000882 name = buffer;
883 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
884 c->c_errors++;
885 i = 255;
886 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000887 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000888
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000889 reftype = get_ref_type(c, name);
890 switch (reftype) {
891 case LOCAL:
892 if (c->c_symtable->st_cur_type == TYPE_FUNCTION)
893 scope = NAME_LOCAL;
894 break;
895 case GLOBAL_EXPLICIT:
896 scope = NAME_GLOBAL;
897 break;
898 case GLOBAL_IMPLICIT:
899 if (c->c_flags & CO_OPTIMIZED)
900 scope = NAME_GLOBAL;
901 break;
902 case FREE:
903 case CELL:
904 scope = NAME_CLOSURE;
905 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000906 }
907
908 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000909 if (scope == NAME_LOCAL)
910 i = com_lookup_arg(c->c_locals, v);
911 else if (reftype == FREE)
912 i = com_lookup_arg(c->c_freevars, v);
913 else if (reftype == CELL)
914 i = com_lookup_arg(c->c_cellvars, v);
915 if (i == -1) {
916 c->c_errors++; /* XXX no exception set */
917 i = 255;
918 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000919 }
920 Py_DECREF(v);
921
922 switch (kind) {
923 case VAR_LOAD:
924 switch (scope) {
925 case NAME_LOCAL:
926 op = LOAD_FAST;
927 break;
928 case NAME_GLOBAL:
929 op = LOAD_GLOBAL;
930 break;
931 case NAME_DEFAULT:
932 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000933 break;
934 case NAME_CLOSURE:
935 op = LOAD_DEREF;
936 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000937 }
938 break;
939 case VAR_STORE:
940 switch (scope) {
941 case NAME_LOCAL:
942 op = STORE_FAST;
943 break;
944 case NAME_GLOBAL:
945 op = STORE_GLOBAL;
946 break;
947 case NAME_DEFAULT:
948 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000949 break;
950 case NAME_CLOSURE:
951 op = STORE_DEREF;
952 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000953 }
954 break;
955 case VAR_DELETE:
956 switch (scope) {
957 case NAME_LOCAL:
958 op = DELETE_FAST;
959 break;
960 case NAME_GLOBAL:
961 op = DELETE_GLOBAL;
962 break;
963 case NAME_DEFAULT:
964 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000965 break;
966 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000967 char buf[500];
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000968 sprintf(buf, DEL_CLOSURE_ERROR, name);
969 com_error(c, PyExc_SyntaxError, buf);
970 i = 255;
971 break;
972 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000973 }
974 break;
975 }
976done:
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000977/* fprintf(stderr, " addoparg(op=%d, arg=%d)\n", op, i);*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000978 com_addoparg(c, op, i);
979}
980
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000981static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000982com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000983{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000984 char *name;
985 char buffer[1000];
986 /* XXX it is possible to write this code without the 1000
987 chars on the total length of dotted names, I just can't be
988 bothered right now */
989 if (TYPE(n) == STAR)
990 name = "*";
991 else if (TYPE(n) == dotted_name) {
992 char *p = buffer;
993 int i;
994 name = buffer;
995 for (i = 0; i < NCH(n); i += 2) {
996 char *s = STR(CHILD(n, i));
997 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000998 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +0000999 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001000 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001001 break;
1002 }
1003 if (p != buffer)
1004 *p++ = '.';
1005 strcpy(p, s);
1006 p = strchr(p, '\0');
1007 }
1008 }
1009 else {
1010 REQ(n, NAME);
1011 name = STR(n);
1012 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001013 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001014}
1015
Guido van Rossum79f25d91997-04-29 20:08:16 +00001016static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001017parsenumber(struct compiling *co, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001018{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001019 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001020 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001021 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001022#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +00001023 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +00001024 int imflag;
1025#endif
1026
Guido van Rossum282914b1991-04-04 10:42:56 +00001027 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001028 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001029#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001030 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001031#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001032 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001033 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001034 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001035 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001036 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001037 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001038 if (*end == '\0') {
1039 if (errno != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001040 com_error(co, PyExc_OverflowError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001041 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +00001042 return NULL;
1043 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001044 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001045 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001046 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001047#ifndef WITHOUT_COMPLEX
1048 if (imflag) {
1049 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001050 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +00001051 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001052 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001053 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +00001054 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001055 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001056#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001057 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001058 PyFPE_START_PROTECT("atof", return 0)
1059 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001060 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001061 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001062 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001063}
1064
Guido van Rossum79f25d91997-04-29 20:08:16 +00001065static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001066parsestr(char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001067{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001068 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001069 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001070 char *buf;
1071 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001072 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001073 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001074 int first = *s;
1075 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001076 int rawmode = 0;
1077 int unicode = 0;
1078 if (isalpha(quote) || quote == '_') {
1079 if (quote == 'u' || quote == 'U') {
1080 quote = *++s;
1081 unicode = 1;
1082 }
1083 if (quote == 'r' || quote == 'R') {
1084 quote = *++s;
1085 rawmode = 1;
1086 }
1087 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001088 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001089 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001090 return NULL;
1091 }
1092 s++;
1093 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001094 if (len > INT_MAX) {
1095 PyErr_SetString(PyExc_OverflowError, "string to parse is too long");
1096 return NULL;
1097 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001098 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001099 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001100 return NULL;
1101 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001102 if (len >= 4 && s[0] == quote && s[1] == quote) {
1103 s += 2;
1104 len -= 2;
1105 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001106 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001107 return NULL;
1108 }
1109 }
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001110 if (unicode || Py_UnicodeFlag) {
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001111 if (rawmode)
1112 return PyUnicode_DecodeRawUnicodeEscape(
1113 s, len, NULL);
1114 else
1115 return PyUnicode_DecodeUnicodeEscape(
1116 s, len, NULL);
1117 }
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001118 if (rawmode || strchr(s, '\\') == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001119 return PyString_FromStringAndSize(s, len);
1120 v = PyString_FromStringAndSize((char *)NULL, len);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001121 if (v == NULL)
1122 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001123 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001124 end = s + len;
1125 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001126 if (*s != '\\') {
1127 *p++ = *s++;
1128 continue;
1129 }
1130 s++;
1131 switch (*s++) {
1132 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001133 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001134 case '\\': *p++ = '\\'; break;
1135 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +00001136 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001137 case 'b': *p++ = '\b'; break;
1138 case 'f': *p++ = '\014'; break; /* FF */
1139 case 't': *p++ = '\t'; break;
1140 case 'n': *p++ = '\n'; break;
1141 case 'r': *p++ = '\r'; break;
1142 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001143 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
1144 case '0': case '1': case '2': case '3':
1145 case '4': case '5': case '6': case '7':
1146 c = s[-1] - '0';
1147 if ('0' <= *s && *s <= '7') {
1148 c = (c<<3) + *s++ - '0';
1149 if ('0' <= *s && *s <= '7')
1150 c = (c<<3) + *s++ - '0';
1151 }
1152 *p++ = c;
1153 break;
1154 case 'x':
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001155 if (isxdigit(Py_CHARMASK(s[0])) && isxdigit(Py_CHARMASK(s[1]))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +00001156 unsigned int x = 0;
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001157 c = Py_CHARMASK(*s);
1158 s++;
1159 if (isdigit(c))
1160 x = c - '0';
1161 else if (islower(c))
1162 x = 10 + c - 'a';
1163 else
1164 x = 10 + c - 'A';
1165 x = x << 4;
1166 c = Py_CHARMASK(*s);
1167 s++;
1168 if (isdigit(c))
1169 x += c - '0';
1170 else if (islower(c))
1171 x += 10 + c - 'a';
1172 else
1173 x += 10 + c - 'A';
Guido van Rossumed1100f1997-10-20 23:24:07 +00001174 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001175 break;
1176 }
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001177 PyErr_SetString(PyExc_ValueError, "invalid \\x escape");
1178 Py_DECREF(v);
1179 return NULL;
1180 default:
1181 *p++ = '\\';
1182 *p++ = s[-1];
1183 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001184 }
1185 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001186 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001187 return v;
1188}
1189
Guido van Rossum79f25d91997-04-29 20:08:16 +00001190static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001191parsestrplus(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001192{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001193 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001194 int i;
1195 REQ(CHILD(n, 0), STRING);
1196 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
1197 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001198 for (i = 1; i < NCH(n); i++) {
1199 PyObject *s;
1200 s = parsestr(STR(CHILD(n, i)));
1201 if (s == NULL)
1202 goto onError;
1203 if (PyString_Check(v) && PyString_Check(s)) {
1204 PyString_ConcatAndDel(&v, s);
1205 if (v == NULL)
1206 goto onError;
1207 }
1208 else {
1209 PyObject *temp;
1210 temp = PyUnicode_Concat(v, s);
1211 Py_DECREF(s);
1212 if (temp == NULL)
1213 goto onError;
1214 Py_DECREF(v);
1215 v = temp;
1216 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001217 }
1218 }
1219 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001220
1221 onError:
1222 Py_XDECREF(v);
1223 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001224}
1225
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001226static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001227com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001228{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001229 PyObject *v;
1230 int anchor = 0;
1231 int save_begin = c->c_begin;
1232
1233 /* list_iter: for v in expr [list_iter] */
1234 com_node(c, CHILD(n, 3)); /* expr */
1235 v = PyInt_FromLong(0L);
1236 if (v == NULL)
1237 c->c_errors++;
1238 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
1239 com_push(c, 1);
1240 Py_XDECREF(v);
1241 c->c_begin = c->c_nexti;
1242 com_addoparg(c, SET_LINENO, n->n_lineno);
1243 com_addfwref(c, FOR_LOOP, &anchor);
1244 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001245 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001246 c->c_loops++;
1247 com_list_iter(c, n, e, t);
1248 c->c_loops--;
1249 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1250 c->c_begin = save_begin;
1251 com_backpatch(c, anchor);
1252 com_pop(c, 2); /* FOR_LOOP has popped these */
1253}
1254
1255static void
1256com_list_if(struct compiling *c, node *n, node *e, char *t)
1257{
1258 int anchor = 0;
1259 int a = 0;
1260 /* list_iter: 'if' test [list_iter] */
1261 com_addoparg(c, SET_LINENO, n->n_lineno);
1262 com_node(c, CHILD(n, 1));
1263 com_addfwref(c, JUMP_IF_FALSE, &a);
1264 com_addbyte(c, POP_TOP);
1265 com_pop(c, 1);
1266 com_list_iter(c, n, e, t);
1267 com_addfwref(c, JUMP_FORWARD, &anchor);
1268 com_backpatch(c, a);
1269 /* We jump here with an extra entry which we now pop */
1270 com_addbyte(c, POP_TOP);
1271 com_backpatch(c, anchor);
1272}
1273
1274static void
1275com_list_iter(struct compiling *c,
1276 node *p, /* parent of list_iter node */
1277 node *e, /* element expression node */
1278 char *t /* name of result list temp local */)
1279{
1280 /* list_iter is the last child in a listmaker, list_for, or list_if */
1281 node *n = CHILD(p, NCH(p)-1);
1282 if (TYPE(n) == list_iter) {
1283 n = CHILD(n, 0);
1284 switch (TYPE(n)) {
1285 case list_for:
1286 com_list_for(c, n, e, t);
1287 break;
1288 case list_if:
1289 com_list_if(c, n, e, t);
1290 break;
1291 default:
1292 com_error(c, PyExc_SystemError,
1293 "invalid list_iter node type");
1294 }
1295 }
1296 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001297 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001298 com_push(c, 1);
1299 com_node(c, e);
1300 com_addoparg(c, CALL_FUNCTION, 1);
1301 com_addbyte(c, POP_TOP);
1302 com_pop(c, 2);
1303 }
1304}
1305
1306static void
1307com_list_comprehension(struct compiling *c, node *n)
1308{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001309 /* listmaker: test list_for */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001310 char tmpname[12];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001311 sprintf(tmpname, "[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001312 com_addoparg(c, BUILD_LIST, 0);
1313 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1314 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001315 com_addop_name(c, LOAD_ATTR, "append");
1316 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001317 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001318 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001319 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001320 --c->c_tmpname;
1321}
1322
1323static void
1324com_listmaker(struct compiling *c, node *n)
1325{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001326 /* listmaker: test ( list_for | (',' test)* [','] ) */
1327 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001328 com_list_comprehension(c, n);
1329 else {
1330 int len = 0;
1331 int i;
1332 for (i = 0; i < NCH(n); i += 2, len++)
1333 com_node(c, CHILD(n, i));
1334 com_addoparg(c, BUILD_LIST, len);
1335 com_pop(c, len-1);
1336 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001337}
1338
1339static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001340com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001341{
1342 int i;
1343 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1344 for (i = 0; i+2 < NCH(n); i += 4) {
1345 /* We must arrange things just right for STORE_SUBSCR.
1346 It wants the stack to look like (value) (dict) (key) */
1347 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001348 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001349 com_node(c, CHILD(n, i+2)); /* value */
1350 com_addbyte(c, ROT_TWO);
1351 com_node(c, CHILD(n, i)); /* key */
1352 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001353 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001354 }
1355}
1356
1357static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001358com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001359{
1360 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001361 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001362 int i;
1363 REQ(n, atom);
1364 ch = CHILD(n, 0);
1365 switch (TYPE(ch)) {
1366 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001367 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001368 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001369 com_push(c, 1);
1370 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001371 else
1372 com_node(c, CHILD(n, 1));
1373 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001374 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001375 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001376 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001377 com_push(c, 1);
1378 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001379 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001380 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001381 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001382 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001383 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001384 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001385 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001386 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001387 break;
1388 case BACKQUOTE:
1389 com_node(c, CHILD(n, 1));
1390 com_addbyte(c, UNARY_CONVERT);
1391 break;
1392 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001393 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001394 i = 255;
1395 }
1396 else {
1397 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001398 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001399 }
1400 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001401 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001402 break;
1403 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001404 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001405 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001406 c->c_errors++;
1407 i = 255;
1408 }
1409 else {
1410 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001411 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001412 }
1413 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001414 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001415 break;
1416 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001417 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001418 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001419 break;
1420 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001421 /* XXX fprintf(stderr, "node type %d\n", TYPE(ch)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001422 com_error(c, PyExc_SystemError,
1423 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001424 }
1425}
1426
1427static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001428com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001429{
1430 if (NCH(n) == 1) {
1431 com_addbyte(c, op);
1432 }
1433 else if (NCH(n) == 2) {
1434 if (TYPE(CHILD(n, 0)) != COLON) {
1435 com_node(c, CHILD(n, 0));
1436 com_addbyte(c, op+1);
1437 }
1438 else {
1439 com_node(c, CHILD(n, 1));
1440 com_addbyte(c, op+2);
1441 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001442 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001443 }
1444 else {
1445 com_node(c, CHILD(n, 0));
1446 com_node(c, CHILD(n, 2));
1447 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001448 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001449 }
1450}
1451
Guido van Rossum635abd21997-01-06 22:56:52 +00001452static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001453com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1454{
1455 if (NCH(n) == 1) {
1456 com_addbyte(c, DUP_TOP);
1457 com_push(c, 1);
1458 com_addbyte(c, SLICE);
1459 com_node(c, augn);
1460 com_addbyte(c, opcode);
1461 com_pop(c, 1);
1462 com_addbyte(c, ROT_TWO);
1463 com_addbyte(c, STORE_SLICE);
1464 com_pop(c, 2);
1465 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1466 com_node(c, CHILD(n, 0));
1467 com_addoparg(c, DUP_TOPX, 2);
1468 com_push(c, 2);
1469 com_addbyte(c, SLICE+1);
1470 com_pop(c, 1);
1471 com_node(c, augn);
1472 com_addbyte(c, opcode);
1473 com_pop(c, 1);
1474 com_addbyte(c, ROT_THREE);
1475 com_addbyte(c, STORE_SLICE+1);
1476 com_pop(c, 3);
1477 } else if (NCH(n) == 2) {
1478 com_node(c, CHILD(n, 1));
1479 com_addoparg(c, DUP_TOPX, 2);
1480 com_push(c, 2);
1481 com_addbyte(c, SLICE+2);
1482 com_pop(c, 1);
1483 com_node(c, augn);
1484 com_addbyte(c, opcode);
1485 com_pop(c, 1);
1486 com_addbyte(c, ROT_THREE);
1487 com_addbyte(c, STORE_SLICE+2);
1488 com_pop(c, 3);
1489 } else {
1490 com_node(c, CHILD(n, 0));
1491 com_node(c, CHILD(n, 2));
1492 com_addoparg(c, DUP_TOPX, 3);
1493 com_push(c, 3);
1494 com_addbyte(c, SLICE+3);
1495 com_pop(c, 2);
1496 com_node(c, augn);
1497 com_addbyte(c, opcode);
1498 com_pop(c, 1);
1499 com_addbyte(c, ROT_FOUR);
1500 com_addbyte(c, STORE_SLICE+3);
1501 com_pop(c, 4);
1502 }
1503}
1504
1505static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001506com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001507{
1508 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001509 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001510 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001511 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001512 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001513 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001514 }
1515 else {
1516 com_node(c, CHILD(n, 0));
1517 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001518 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001519 }
1520 m = n;
1521 do {
1522 m = CHILD(m, 0);
1523 } while (NCH(m) == 1);
1524 if (TYPE(m) != NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001525 com_error(c, PyExc_SyntaxError,
1526 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001527 }
1528 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001529 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001530 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001531 *pkeywords = PyDict_New();
Guido van Rossum635abd21997-01-06 22:56:52 +00001532 if (v == NULL || *pkeywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001533 c->c_errors++;
1534 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001535 if (PyDict_GetItem(*pkeywords, v) != NULL)
1536 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001537 "duplicate keyword argument");
1538 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001539 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001540 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001541 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001542 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001543 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001544 }
1545 }
1546 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001547}
1548
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001549static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001550com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001551{
1552 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001553 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001554 }
1555 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001556 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001557 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001558 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001559 int star_flag = 0;
1560 int starstar_flag = 0;
1561 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001562 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001563 na = 0;
1564 nk = 0;
1565 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001566 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001567 if (TYPE(ch) == STAR ||
1568 TYPE(ch) == DOUBLESTAR)
1569 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001570 if (ch->n_lineno != lineno) {
1571 lineno = ch->n_lineno;
1572 com_addoparg(c, SET_LINENO, lineno);
1573 }
1574 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001575 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001576 na++;
1577 else
1578 nk++;
1579 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001580 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001581 while (i < NCH(n)) {
1582 node *tok = CHILD(n, i);
1583 node *ch = CHILD(n, i+1);
1584 i += 3;
1585 switch (TYPE(tok)) {
1586 case STAR: star_flag = 1; break;
1587 case DOUBLESTAR: starstar_flag = 1; break;
1588 }
1589 com_node(c, ch);
1590 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001591 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001592 com_error(c, PyExc_SyntaxError,
1593 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001594 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001595 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001596 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001597 star_flag + (starstar_flag << 1);
1598 else
1599 opcode = CALL_FUNCTION;
1600 com_addoparg(c, opcode, na | (nk << 8));
1601 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001602 }
1603}
1604
1605static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001606com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001607{
1608 com_addopname(c, LOAD_ATTR, n);
1609}
1610
1611static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001612com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001613{
1614 int i=0;
1615 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001616 node *ch;
1617
1618 /* first argument */
1619 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001620 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001621 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001622 i++;
1623 }
1624 else {
1625 com_node(c, CHILD(n,i));
1626 i++;
1627 REQ(CHILD(n,i),COLON);
1628 i++;
1629 }
1630 /* second argument */
1631 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1632 com_node(c, CHILD(n,i));
1633 i++;
1634 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001635 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001636 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001637 com_push(c, 1);
1638 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001639 /* remaining arguments */
1640 for (; i < NCH(n); i++) {
1641 ns++;
1642 ch=CHILD(n,i);
1643 REQ(ch, sliceop);
1644 if (NCH(ch) == 1) {
1645 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001646 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001647 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001648 }
1649 else
1650 com_node(c, CHILD(ch,1));
1651 }
1652 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001653 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001654}
1655
1656static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001657com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001658{
1659 node *ch;
1660 REQ(n, subscript);
1661 ch = CHILD(n,0);
1662 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001663 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001664 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001665 com_push(c, 1);
1666 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001667 else {
1668 /* check for slice */
1669 if ((TYPE(ch) == COLON || NCH(n) > 1))
1670 com_sliceobj(c, n);
1671 else {
1672 REQ(ch, test);
1673 com_node(c, ch);
1674 }
1675 }
1676}
1677
1678static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001679com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001680{
1681 int i, op;
1682 REQ(n, subscriptlist);
1683 /* Check to make backward compatible slice behavior for '[i:j]' */
1684 if (NCH(n) == 1) {
1685 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001686 /* 'Basic' slice, should have exactly one colon. */
1687 if ((TYPE(CHILD(sub, 0)) == COLON
1688 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1689 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1690 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001691 switch (assigning) {
1692 case OP_DELETE:
1693 op = DELETE_SLICE;
1694 break;
1695 case OP_ASSIGN:
1696 op = STORE_SLICE;
1697 break;
1698 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001699 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001700 break;
1701 default:
1702 com_augassign_slice(c, sub, assigning, augn);
1703 return;
1704 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001705 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001706 if (op == STORE_SLICE)
1707 com_pop(c, 2);
1708 else if (op == DELETE_SLICE)
1709 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001710 return;
1711 }
1712 }
1713 /* Else normal subscriptlist. Compile each subscript. */
1714 for (i = 0; i < NCH(n); i += 2)
1715 com_subscript(c, CHILD(n, i));
1716 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001717 if (NCH(n) > 1) {
1718 i = (NCH(n)+1) / 2;
1719 com_addoparg(c, BUILD_TUPLE, i);
1720 com_pop(c, i-1);
1721 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001722 switch (assigning) {
1723 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001724 op = DELETE_SUBSCR;
1725 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00001726 break;
1727 default:
1728 case OP_ASSIGN:
1729 op = STORE_SUBSCR;
1730 i = 3;
1731 break;
1732 case OP_APPLY:
1733 op = BINARY_SUBSCR;
1734 i = 1;
1735 break;
1736 }
1737 if (assigning > OP_APPLY) {
1738 com_addoparg(c, DUP_TOPX, 2);
1739 com_push(c, 2);
1740 com_addbyte(c, BINARY_SUBSCR);
1741 com_pop(c, 1);
1742 com_node(c, augn);
1743 com_addbyte(c, assigning);
1744 com_pop(c, 1);
1745 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001746 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001747 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001748 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001749}
1750
1751static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001752com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001753{
1754 REQ(n, trailer);
1755 switch (TYPE(CHILD(n, 0))) {
1756 case LPAR:
1757 com_call_function(c, CHILD(n, 1));
1758 break;
1759 case DOT:
1760 com_select_member(c, CHILD(n, 1));
1761 break;
1762 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00001763 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001764 break;
1765 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001766 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001767 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001768 }
1769}
1770
1771static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001772com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001773{
1774 int i;
1775 REQ(n, power);
1776 com_atom(c, CHILD(n, 0));
1777 for (i = 1; i < NCH(n); i++) {
1778 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1779 com_factor(c, CHILD(n, i+1));
1780 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001781 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001782 break;
1783 }
1784 else
1785 com_apply_trailer(c, CHILD(n, i));
1786 }
1787}
1788
1789static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001790com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001791{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001792 REQ(n, factor);
1793 if (TYPE(CHILD(n, 0)) == PLUS) {
1794 com_factor(c, CHILD(n, 1));
1795 com_addbyte(c, UNARY_POSITIVE);
1796 }
1797 else if (TYPE(CHILD(n, 0)) == MINUS) {
1798 com_factor(c, CHILD(n, 1));
1799 com_addbyte(c, UNARY_NEGATIVE);
1800 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001801 else if (TYPE(CHILD(n, 0)) == TILDE) {
1802 com_factor(c, CHILD(n, 1));
1803 com_addbyte(c, UNARY_INVERT);
1804 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001805 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001806 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001807 }
1808}
1809
1810static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001811com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001812{
1813 int i;
1814 int op;
1815 REQ(n, term);
1816 com_factor(c, CHILD(n, 0));
1817 for (i = 2; i < NCH(n); i += 2) {
1818 com_factor(c, CHILD(n, i));
1819 switch (TYPE(CHILD(n, i-1))) {
1820 case STAR:
1821 op = BINARY_MULTIPLY;
1822 break;
1823 case SLASH:
1824 op = BINARY_DIVIDE;
1825 break;
1826 case PERCENT:
1827 op = BINARY_MODULO;
1828 break;
1829 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001830 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001831 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001832 op = 255;
1833 }
1834 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001835 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001836 }
1837}
1838
1839static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001840com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001841{
1842 int i;
1843 int op;
1844 REQ(n, arith_expr);
1845 com_term(c, CHILD(n, 0));
1846 for (i = 2; i < NCH(n); i += 2) {
1847 com_term(c, CHILD(n, i));
1848 switch (TYPE(CHILD(n, i-1))) {
1849 case PLUS:
1850 op = BINARY_ADD;
1851 break;
1852 case MINUS:
1853 op = BINARY_SUBTRACT;
1854 break;
1855 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001856 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001857 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001858 op = 255;
1859 }
1860 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001861 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001862 }
1863}
1864
1865static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001866com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001867{
1868 int i;
1869 int op;
1870 REQ(n, shift_expr);
1871 com_arith_expr(c, CHILD(n, 0));
1872 for (i = 2; i < NCH(n); i += 2) {
1873 com_arith_expr(c, CHILD(n, i));
1874 switch (TYPE(CHILD(n, i-1))) {
1875 case LEFTSHIFT:
1876 op = BINARY_LSHIFT;
1877 break;
1878 case RIGHTSHIFT:
1879 op = BINARY_RSHIFT;
1880 break;
1881 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001882 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001883 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001884 op = 255;
1885 }
1886 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001887 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001888 }
1889}
1890
1891static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001892com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001893{
1894 int i;
1895 int op;
1896 REQ(n, and_expr);
1897 com_shift_expr(c, CHILD(n, 0));
1898 for (i = 2; i < NCH(n); i += 2) {
1899 com_shift_expr(c, CHILD(n, i));
1900 if (TYPE(CHILD(n, i-1)) == AMPER) {
1901 op = BINARY_AND;
1902 }
1903 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001904 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001905 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001906 op = 255;
1907 }
1908 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001909 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001910 }
1911}
1912
1913static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001914com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001915{
1916 int i;
1917 int op;
1918 REQ(n, xor_expr);
1919 com_and_expr(c, CHILD(n, 0));
1920 for (i = 2; i < NCH(n); i += 2) {
1921 com_and_expr(c, CHILD(n, i));
1922 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1923 op = BINARY_XOR;
1924 }
1925 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001926 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001927 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001928 op = 255;
1929 }
1930 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001931 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001932 }
1933}
1934
1935static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001936com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001937{
1938 int i;
1939 int op;
1940 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001941 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001942 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001943 com_xor_expr(c, CHILD(n, i));
1944 if (TYPE(CHILD(n, i-1)) == VBAR) {
1945 op = BINARY_OR;
1946 }
1947 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001948 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001949 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001950 op = 255;
1951 }
1952 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001953 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001954 }
1955}
1956
1957static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001958cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001959{
1960 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001961 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001962 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1963 if (NCH(n) == 1) {
1964 n = CHILD(n, 0);
1965 switch (TYPE(n)) {
1966 case LESS: return LT;
1967 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001968 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001969 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001970 case LESSEQUAL: return LE;
1971 case GREATEREQUAL: return GE;
1972 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001973 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1974 if (strcmp(STR(n), "is") == 0) return IS;
1975 }
1976 }
1977 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001978 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001979 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1980 return NOT_IN;
1981 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1982 return IS_NOT;
1983 }
1984 }
1985 return BAD;
1986}
1987
1988static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001989com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001990{
1991 int i;
1992 enum cmp_op op;
1993 int anchor;
1994 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
1995 com_expr(c, CHILD(n, 0));
1996 if (NCH(n) == 1)
1997 return;
1998
1999 /****************************************************************
2000 The following code is generated for all but the last
2001 comparison in a chain:
2002
2003 label: on stack: opcode: jump to:
2004
2005 a <code to load b>
2006 a, b DUP_TOP
2007 a, b, b ROT_THREE
2008 b, a, b COMPARE_OP
2009 b, 0-or-1 JUMP_IF_FALSE L1
2010 b, 1 POP_TOP
2011 b
2012
2013 We are now ready to repeat this sequence for the next
2014 comparison in the chain.
2015
2016 For the last we generate:
2017
2018 b <code to load c>
2019 b, c COMPARE_OP
2020 0-or-1
2021
2022 If there were any jumps to L1 (i.e., there was more than one
2023 comparison), we generate:
2024
2025 0-or-1 JUMP_FORWARD L2
2026 L1: b, 0 ROT_TWO
2027 0, b POP_TOP
2028 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002029 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002030 ****************************************************************/
2031
2032 anchor = 0;
2033
2034 for (i = 2; i < NCH(n); i += 2) {
2035 com_expr(c, CHILD(n, i));
2036 if (i+2 < NCH(n)) {
2037 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002038 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002039 com_addbyte(c, ROT_THREE);
2040 }
2041 op = cmp_type(CHILD(n, i-1));
2042 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002043 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002044 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002045 }
2046 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002047 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002048 if (i+2 < NCH(n)) {
2049 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2050 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002051 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002052 }
2053 }
2054
2055 if (anchor) {
2056 int anchor2 = 0;
2057 com_addfwref(c, JUMP_FORWARD, &anchor2);
2058 com_backpatch(c, anchor);
2059 com_addbyte(c, ROT_TWO);
2060 com_addbyte(c, POP_TOP);
2061 com_backpatch(c, anchor2);
2062 }
2063}
2064
2065static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002066com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002067{
2068 REQ(n, not_test); /* 'not' not_test | comparison */
2069 if (NCH(n) == 1) {
2070 com_comparison(c, CHILD(n, 0));
2071 }
2072 else {
2073 com_not_test(c, CHILD(n, 1));
2074 com_addbyte(c, UNARY_NOT);
2075 }
2076}
2077
2078static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002079com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002080{
2081 int i;
2082 int anchor;
2083 REQ(n, and_test); /* not_test ('and' not_test)* */
2084 anchor = 0;
2085 i = 0;
2086 for (;;) {
2087 com_not_test(c, CHILD(n, i));
2088 if ((i += 2) >= NCH(n))
2089 break;
2090 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2091 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002092 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002093 }
2094 if (anchor)
2095 com_backpatch(c, anchor);
2096}
2097
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002098static int
2099com_make_closure(struct compiling *c, PyCodeObject *co)
2100{
2101 int i, free = PyTuple_GET_SIZE(co->co_freevars);
2102 if (free == 0)
2103 return 0;
2104 for (i = 0; i < free; ++i) {
2105 /* Bypass com_addop_varname because it will generate
2106 LOAD_DEREF but LOAD_CLOSURE is needed.
2107 */
2108 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2109 int arg, reftype;
2110
2111 /* Special case: If a class contains a method with a
2112 free variable that has the same name as a method,
2113 the name will be considered free *and* local in the
2114 class. It should be handled by the closure, as
2115 well as by the normal name loookup logic.
2116 */
2117 reftype = get_ref_type(c, PyString_AS_STRING(name));
2118 if (reftype == CELL)
2119 arg = com_lookup_arg(c->c_cellvars, name);
2120 else /* (reftype == FREE) */
2121 arg = com_lookup_arg(c->c_freevars, name);
2122 if (arg == -1) {
2123 fprintf(stderr, "lookup %s in %s %d %d\n",
Jeremy Hylton483638c2001-02-01 20:20:45 +00002124 PyObject_REPR(name), c->c_name, reftype, arg);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002125 Py_FatalError("com_make_closure()");
2126 }
2127 com_addoparg(c, LOAD_CLOSURE, arg);
2128
2129 }
2130 com_push(c, free);
2131 return 1;
2132}
2133
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002134static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002135com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002136{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002137 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002138 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002139 PyObject *co;
2140 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002141 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002142 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2143 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002144 co = (PyObject *) icompile(CHILD(n, 0), c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002145 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002146 if (co == NULL) {
Guido van Rossum57531fe1993-11-30 14:57:42 +00002147 c->c_errors++;
2148 i = 255;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002149 closure = 0;
2150 } else {
2151 i = com_addconst(c, co);
2152 Py_DECREF(co);
2153 closure = com_make_closure(c, (PyCodeObject *)co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002154 }
2155 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002156 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002157 if (closure)
2158 com_addoparg(c, MAKE_CLOSURE, ndefs);
2159 else
2160 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002161 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002162 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002163 else {
2164 int anchor = 0;
2165 int i = 0;
2166 for (;;) {
2167 com_and_test(c, CHILD(n, i));
2168 if ((i += 2) >= NCH(n))
2169 break;
2170 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2171 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002172 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002173 }
2174 if (anchor)
2175 com_backpatch(c, anchor);
2176 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002177}
2178
2179static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002180com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002181{
2182 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002183 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002184 com_node(c, CHILD(n, 0));
2185 }
2186 else {
2187 int i;
2188 int len;
2189 len = (NCH(n) + 1) / 2;
2190 for (i = 0; i < NCH(n); i += 2)
2191 com_node(c, CHILD(n, i));
2192 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002193 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002194 }
2195}
2196
2197
2198/* Begin of assignment compilation */
2199
Thomas Wouters434d0822000-08-24 20:11:32 +00002200
2201static void
2202com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2203{
2204 com_addbyte(c, DUP_TOP);
2205 com_push(c, 1);
2206 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002207 com_node(c, augn);
2208 com_addbyte(c, opcode);
2209 com_pop(c, 1);
2210 com_addbyte(c, ROT_TWO);
2211 com_addopname(c, STORE_ATTR, n);
2212 com_pop(c, 2);
2213}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002214
2215static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002216com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002217{
2218 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002219 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002220}
2221
2222static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002223com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002224{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002225 REQ(n, trailer);
2226 switch (TYPE(CHILD(n, 0))) {
2227 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002228 com_error(c, PyExc_SyntaxError,
2229 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002230 break;
2231 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002232 if (assigning > OP_APPLY)
2233 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2234 else
2235 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002236 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002237 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002238 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002239 break;
2240 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002241 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002242 }
2243}
2244
2245static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002246com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002247{
2248 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002249 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002250 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002251 if (assigning) {
2252 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002253 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002254 com_push(c, i-1);
2255 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002256 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002257 com_assign(c, CHILD(n, i), assigning, NULL);
2258}
2259
2260static void
2261com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2262{
2263 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002264 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002265 com_push(c, 1);
2266 com_node(c, augn);
2267 com_addbyte(c, opcode);
2268 com_pop(c, 1);
2269 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002270}
2271
2272static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002273com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002274{
2275 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002276 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002277 if (assigning)
2278 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002279}
2280
2281static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002282com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002283{
2284 /* Loop to avoid trivial recursion */
2285 for (;;) {
2286 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002287
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002288 case exprlist:
2289 case testlist:
2290 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002291 if (assigning > OP_APPLY) {
2292 com_error(c, PyExc_SyntaxError,
2293 "augmented assign to tuple not possible");
2294 return;
2295 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002296 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002297 return;
2298 }
2299 n = CHILD(n, 0);
2300 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002301
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002302 case test:
2303 case and_test:
2304 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002305 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002306 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002307 case xor_expr:
2308 case and_expr:
2309 case shift_expr:
2310 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002311 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002312 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002313 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002314 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002315 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002316 return;
2317 }
2318 n = CHILD(n, 0);
2319 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002320
Guido van Rossum50564e81996-01-12 01:13:16 +00002321 case power: /* atom trailer* ('**' power)* */
2322/* ('+'|'-'|'~') factor | atom trailer* */
2323 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002324 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002325 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002326 return;
2327 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002328 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002329 int i;
2330 com_node(c, CHILD(n, 0));
2331 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002332 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002333 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002334 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002335 return;
2336 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002337 com_apply_trailer(c, CHILD(n, i));
2338 } /* NB i is still alive */
2339 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002340 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002341 return;
2342 }
2343 n = CHILD(n, 0);
2344 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002345
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002346 case atom:
2347 switch (TYPE(CHILD(n, 0))) {
2348 case LPAR:
2349 n = CHILD(n, 1);
2350 if (TYPE(n) == RPAR) {
2351 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002352 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002353 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002354 return;
2355 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002356 if (assigning > OP_APPLY) {
2357 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002358 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002359 return;
2360 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002361 break;
2362 case LSQB:
2363 n = CHILD(n, 1);
2364 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002365 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002366 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002367 return;
2368 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002369 if (assigning > OP_APPLY) {
2370 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002371 "augmented assign to list not possible");
2372 return;
2373 }
2374 if (NCH(n) > 1
2375 && TYPE(CHILD(n, 1)) == list_for) {
2376 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002377 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002378 return;
2379 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002380 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002381 return;
2382 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002383 if (assigning > OP_APPLY)
2384 com_augassign_name(c, CHILD(n, 0),
2385 assigning, augn);
2386 else
2387 com_assign_name(c, CHILD(n, 0),
2388 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002389 return;
2390 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002391 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002392 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002393 return;
2394 }
2395 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002396
2397 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002398 com_error(c, PyExc_SyntaxError,
2399 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002400 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002401
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002402 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002403 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002404 com_error(c, PyExc_SystemError,
2405 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002406 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002407
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002408 }
2409 }
2410}
Guido van Rossum7c531111997-03-11 18:42:21 +00002411
Thomas Wouters434d0822000-08-24 20:11:32 +00002412static void
2413com_augassign(struct compiling *c, node *n)
2414{
2415 int opcode;
2416
2417 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2418 case '+': opcode = INPLACE_ADD; break;
2419 case '-': opcode = INPLACE_SUBTRACT; break;
2420 case '/': opcode = INPLACE_DIVIDE; break;
2421 case '%': opcode = INPLACE_MODULO; break;
2422 case '<': opcode = INPLACE_LSHIFT; break;
2423 case '>': opcode = INPLACE_RSHIFT; break;
2424 case '&': opcode = INPLACE_AND; break;
2425 case '^': opcode = INPLACE_XOR; break;
2426 case '|': opcode = INPLACE_OR; break;
2427 case '*':
2428 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2429 opcode = INPLACE_POWER;
2430 else
2431 opcode = INPLACE_MULTIPLY;
2432 break;
2433 default:
2434 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2435 return;
2436 }
2437 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2438}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002439
2440static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002441com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002442{
Thomas Wouters434d0822000-08-24 20:11:32 +00002443 REQ(n, expr_stmt);
2444 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002445 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002446 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002447 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002448 if (NCH(n) == 1) {
2449 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002450 if (c->c_interactive)
2451 com_addbyte(c, PRINT_EXPR);
2452 else
2453 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002454 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002455 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002456 else if (TYPE(CHILD(n,1)) == augassign)
2457 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002458 else {
2459 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002460 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002461 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002462 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002463 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002464 com_push(c, 1);
2465 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002466 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002467 }
2468 }
2469}
2470
2471static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002472com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002473{
2474 int a = 0, b = 0;
2475 int i;
2476 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2477 /* Generate code like for
2478
2479 if __debug__:
2480 if not <test>:
2481 raise AssertionError [, <message>]
2482
2483 where <message> is the second test, if present.
2484 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002485
2486 /* XXX should __debug__ and AssertionError get inserted into
2487 the symbol table? they don't follow the normal rules
2488 because they are always loaded as globals */
2489
Guido van Rossum228d7f31997-04-02 05:24:36 +00002490 if (Py_OptimizeFlag)
2491 return;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002492 com_addop_name(c, LOAD_GLOBAL, "__debug__");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002493 com_push(c, 1);
2494 com_addfwref(c, JUMP_IF_FALSE, &a);
2495 com_addbyte(c, POP_TOP);
2496 com_pop(c, 1);
2497 com_node(c, CHILD(n, 1));
2498 com_addfwref(c, JUMP_IF_TRUE, &b);
2499 com_addbyte(c, POP_TOP);
2500 com_pop(c, 1);
2501 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002502 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002503 com_push(c, 1);
2504 i = NCH(n)/2; /* Either 2 or 4 */
2505 if (i > 1)
2506 com_node(c, CHILD(n, 3));
2507 com_addoparg(c, RAISE_VARARGS, i);
2508 com_pop(c, i);
2509 /* The interpreter does not fall through */
2510 /* All jumps converge here */
2511 com_backpatch(c, a);
2512 com_backpatch(c, b);
2513 com_addbyte(c, POP_TOP);
2514}
2515
2516static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002517com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002518{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002519 int i = 1;
2520 node* stream = NULL;
2521
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002522 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002523
2524 /* are we using the extended print form? */
2525 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2526 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002527 com_node(c, stream);
2528 /* stack: [...] => [... stream] */
2529 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002530 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2531 i = 4;
2532 else
2533 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002534 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002535 for (; i < NCH(n); i += 2) {
2536 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002537 com_addbyte(c, DUP_TOP);
2538 /* stack: [stream] => [stream stream] */
2539 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002540 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002541 /* stack: [stream stream] => [stream stream obj] */
2542 com_addbyte(c, ROT_TWO);
2543 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002544 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002545 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002546 com_pop(c, 2);
2547 }
2548 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002549 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002550 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002551 com_addbyte(c, PRINT_ITEM);
2552 com_pop(c, 1);
2553 }
2554 }
2555 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002556 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002557 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002558 /* must pop the extra stream object off the stack */
2559 com_addbyte(c, POP_TOP);
2560 /* stack: [... stream] => [...] */
2561 com_pop(c, 1);
2562 }
2563 }
2564 else {
2565 if (stream != NULL) {
2566 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002567 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002568 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002569 com_pop(c, 1);
2570 }
2571 else
2572 com_addbyte(c, PRINT_NEWLINE);
2573 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002574}
2575
2576static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002577com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002578{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002579 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002580 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002581 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002582 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002583 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002584 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002585 com_push(c, 1);
2586 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002587 else
2588 com_node(c, CHILD(n, 1));
2589 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002590 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002591}
2592
2593static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002594com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002595{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002596 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002597 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2598 if (NCH(n) > 1) {
2599 com_node(c, CHILD(n, 1));
2600 if (NCH(n) > 3) {
2601 com_node(c, CHILD(n, 3));
2602 if (NCH(n) > 5)
2603 com_node(c, CHILD(n, 5));
2604 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002605 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002606 i = NCH(n)/2;
2607 com_addoparg(c, RAISE_VARARGS, i);
2608 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002609}
2610
2611static void
Thomas Wouters52152252000-08-17 22:55:00 +00002612com_from_import(struct compiling *c, node *n)
2613{
2614 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2615 com_push(c, 1);
2616 if (NCH(n) > 1) {
2617 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2618 com_error(c, PyExc_SyntaxError, "invalid syntax");
2619 return;
2620 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002621 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002622 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002623 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00002624 com_pop(c, 1);
2625}
2626
2627static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002628com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002629{
2630 int i;
2631 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002632 /* 'import' dotted_name (',' dotted_name)* |
2633 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002634 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00002635 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002636 /* 'from' dotted_name 'import' ... */
2637 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002638
2639 if (TYPE(CHILD(n, 3)) == STAR) {
2640 tup = Py_BuildValue("(s)", "*");
2641 } else {
2642 tup = PyTuple_New((NCH(n) - 2)/2);
2643 for (i = 3; i < NCH(n); i += 2) {
2644 PyTuple_SET_ITEM(tup, (i-3)/2,
2645 PyString_FromString(STR(
2646 CHILD(CHILD(n, i), 0))));
2647 }
2648 }
2649 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00002650 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002651 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002652 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00002653 if (TYPE(CHILD(n, 3)) == STAR)
2654 com_addbyte(c, IMPORT_STAR);
2655 else {
2656 for (i = 3; i < NCH(n); i += 2)
2657 com_from_import(c, CHILD(n, i));
2658 com_addbyte(c, POP_TOP);
2659 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002660 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002661 }
2662 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002663 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002664 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00002665 node *subn = CHILD(n, i);
2666 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002667 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002668 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002669 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00002670 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00002671 int j;
2672 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00002673 com_error(c, PyExc_SyntaxError,
2674 "invalid syntax");
2675 return;
2676 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00002677 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
2678 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002679 CHILD(CHILD(subn, 0),
2680 j));
2681 com_addop_varname(c, VAR_STORE,
2682 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002683 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002684 com_addop_varname(c, VAR_STORE,
2685 STR(CHILD(CHILD(subn, 0),
2686 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002687 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002688 }
2689 }
2690}
2691
2692static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002693com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002694{
2695 REQ(n, exec_stmt);
2696 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2697 com_node(c, CHILD(n, 1));
2698 if (NCH(n) >= 4)
2699 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002700 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002701 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002702 com_push(c, 1);
2703 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002704 if (NCH(n) >= 6)
2705 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002706 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002707 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002708 com_push(c, 1);
2709 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002710 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002711 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002712}
2713
Guido van Rossum7c531111997-03-11 18:42:21 +00002714static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002715is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002716{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002717 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002718 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002719 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00002720
2721 /* Label to avoid tail recursion */
2722 next:
2723 switch (TYPE(n)) {
2724
2725 case suite:
2726 if (NCH(n) == 1) {
2727 n = CHILD(n, 0);
2728 goto next;
2729 }
2730 /* Fall through */
2731 case file_input:
2732 for (i = 0; i < NCH(n); i++) {
2733 node *ch = CHILD(n, i);
2734 if (TYPE(ch) == stmt) {
2735 n = ch;
2736 goto next;
2737 }
2738 }
2739 break;
2740
2741 case stmt:
2742 case simple_stmt:
2743 case small_stmt:
2744 n = CHILD(n, 0);
2745 goto next;
2746
2747 case expr_stmt:
2748 case testlist:
2749 case test:
2750 case and_test:
2751 case not_test:
2752 case comparison:
2753 case expr:
2754 case xor_expr:
2755 case and_expr:
2756 case shift_expr:
2757 case arith_expr:
2758 case term:
2759 case factor:
2760 case power:
2761 case atom:
2762 if (NCH(n) == 1) {
2763 n = CHILD(n, 0);
2764 goto next;
2765 }
2766 break;
2767
2768 case NAME:
2769 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2770 return 1;
2771 break;
2772
2773 case NUMBER:
2774 v = parsenumber(c, STR(n));
2775 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002776 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002777 break;
2778 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002779 i = PyObject_IsTrue(v);
2780 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002781 return i == 0;
2782
2783 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002784 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002785 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002786 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002787 break;
2788 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002789 i = PyObject_IsTrue(v);
2790 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002791 return i == 0;
2792
2793 }
2794 return 0;
2795}
2796
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002797static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002798com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002799{
2800 int i;
2801 int anchor = 0;
2802 REQ(n, if_stmt);
2803 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2804 for (i = 0; i+3 < NCH(n); i+=4) {
2805 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002806 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002807 if (is_constant_false(c, ch))
2808 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002809 if (i > 0)
2810 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002811 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002812 com_addfwref(c, JUMP_IF_FALSE, &a);
2813 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002814 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002815 com_node(c, CHILD(n, i+3));
2816 com_addfwref(c, JUMP_FORWARD, &anchor);
2817 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002818 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002819 com_addbyte(c, POP_TOP);
2820 }
2821 if (i+2 < NCH(n))
2822 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002823 if (anchor)
2824 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002825}
2826
2827static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002828com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002829{
2830 int break_anchor = 0;
2831 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002832 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002833 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2834 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002835 block_push(c, SETUP_LOOP);
2836 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002837 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002838 com_node(c, CHILD(n, 1));
2839 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2840 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002841 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002842 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002843 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002844 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002845 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2846 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002847 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002848 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002849 com_addbyte(c, POP_TOP);
2850 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002851 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002852 if (NCH(n) > 4)
2853 com_node(c, CHILD(n, 6));
2854 com_backpatch(c, break_anchor);
2855}
2856
2857static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002858com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002859{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002860 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002861 int break_anchor = 0;
2862 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002863 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002864 REQ(n, for_stmt);
2865 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2866 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002867 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002868 com_node(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002869 v = PyInt_FromLong(0L);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002870 if (v == NULL)
2871 c->c_errors++;
2872 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002873 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002874 Py_XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002875 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002876 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002877 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002878 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00002879 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002880 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002881 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002882 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002883 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2884 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002885 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002886 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002887 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002888 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002889 if (NCH(n) > 8)
2890 com_node(c, CHILD(n, 8));
2891 com_backpatch(c, break_anchor);
2892}
2893
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002894/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002895
2896 SETUP_FINALLY L
2897 <code for S>
2898 POP_BLOCK
2899 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002900 L: <code for Sf>
2901 END_FINALLY
2902
2903 The special instructions use the block stack. Each block
2904 stack entry contains the instruction that created it (here
2905 SETUP_FINALLY), the level of the value stack at the time the
2906 block stack entry was created, and a label (here L).
2907
2908 SETUP_FINALLY:
2909 Pushes the current value stack level and the label
2910 onto the block stack.
2911 POP_BLOCK:
2912 Pops en entry from the block stack, and pops the value
2913 stack until its level is the same as indicated on the
2914 block stack. (The label is ignored.)
2915 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002916 Pops a variable number of entries from the *value* stack
2917 and re-raises the exception they specify. The number of
2918 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002919
2920 The block stack is unwound when an exception is raised:
2921 when a SETUP_FINALLY entry is found, the exception is pushed
2922 onto the value stack (and the exception condition is cleared),
2923 and the interpreter jumps to the label gotten from the block
2924 stack.
2925
2926 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002927 (The contents of the value stack is shown in [], with the top
2928 at the right; 'tb' is trace-back info, 'val' the exception's
2929 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002930
2931 Value stack Label Instruction Argument
2932 [] SETUP_EXCEPT L1
2933 [] <code for S>
2934 [] POP_BLOCK
2935 [] JUMP_FORWARD L0
2936
Guido van Rossum3f5da241990-12-20 15:06:42 +00002937 [tb, val, exc] L1: DUP )
2938 [tb, val, exc, exc] <evaluate E1> )
2939 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2940 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2941 [tb, val, exc, 1] POP )
2942 [tb, val, exc] POP
2943 [tb, val] <assign to V1> (or POP if no V1)
2944 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002945 [] <code for S1>
2946 JUMP_FORWARD L0
2947
Guido van Rossum3f5da241990-12-20 15:06:42 +00002948 [tb, val, exc, 0] L2: POP
2949 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002950 .............................etc.......................
2951
Guido van Rossum3f5da241990-12-20 15:06:42 +00002952 [tb, val, exc, 0] Ln+1: POP
2953 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002954
2955 [] L0: <next statement>
2956
2957 Of course, parts are not generated if Vi or Ei is not present.
2958*/
2959
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002960static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002961com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002962{
2963 int except_anchor = 0;
2964 int end_anchor = 0;
2965 int else_anchor = 0;
2966 int i;
2967 node *ch;
2968
2969 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2970 block_push(c, SETUP_EXCEPT);
2971 com_node(c, CHILD(n, 2));
2972 com_addbyte(c, POP_BLOCK);
2973 block_pop(c, SETUP_EXCEPT);
2974 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2975 com_backpatch(c, except_anchor);
2976 for (i = 3;
2977 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2978 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002979 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002980 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002981 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002982 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002983 break;
2984 }
2985 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002986 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002987 com_addoparg(c, SET_LINENO, ch->n_lineno);
2988 if (NCH(ch) > 1) {
2989 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002990 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002991 com_node(c, CHILD(ch, 1));
2992 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002993 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002994 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
2995 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002996 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002997 }
2998 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002999 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003000 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003001 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003002 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003003 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003004 com_pop(c, 1);
3005 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003006 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 com_node(c, CHILD(n, i+2));
3009 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3010 if (except_anchor) {
3011 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003012 /* We come in with [tb, val, exc, 0] on the
3013 stack; one pop and it's the same as
3014 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003015 com_addbyte(c, POP_TOP);
3016 }
3017 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003018 /* We actually come in here with [tb, val, exc] but the
3019 END_FINALLY will zap those and jump around.
3020 The c_stacklevel does not reflect them so we need not pop
3021 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003022 com_addbyte(c, END_FINALLY);
3023 com_backpatch(c, else_anchor);
3024 if (i < NCH(n))
3025 com_node(c, CHILD(n, i+2));
3026 com_backpatch(c, end_anchor);
3027}
3028
3029static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003030com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003031{
3032 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003033 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003034
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003035 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3036 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003037 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003038 com_addbyte(c, POP_BLOCK);
3039 block_pop(c, SETUP_FINALLY);
3040 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003041 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003042 /* While the generated code pushes only one item,
3043 the try-finally handling can enter here with
3044 up to three items. OK, here are the details:
3045 3 for an exception, 2 for RETURN, 1 for BREAK. */
3046 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003047 com_backpatch(c, finally_anchor);
3048 ch = CHILD(n, NCH(n)-1);
3049 com_addoparg(c, SET_LINENO, ch->n_lineno);
3050 com_node(c, ch);
3051 com_addbyte(c, END_FINALLY);
3052 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003053 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003054}
3055
3056static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003057com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003058{
3059 REQ(n, try_stmt);
3060 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3061 | 'try' ':' suite 'finally' ':' suite */
3062 if (TYPE(CHILD(n, 3)) != except_clause)
3063 com_try_finally(c, n);
3064 else
3065 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003066}
3067
Guido van Rossum8b993a91997-01-17 21:04:03 +00003068static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003069get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003070{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003071 int i;
3072
Guido van Rossum8b993a91997-01-17 21:04:03 +00003073 /* Label to avoid tail recursion */
3074 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003075 switch (TYPE(n)) {
3076
3077 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003078 if (NCH(n) == 1) {
3079 n = CHILD(n, 0);
3080 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003081 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003082 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003083 case file_input:
3084 for (i = 0; i < NCH(n); i++) {
3085 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003086 if (TYPE(ch) == stmt) {
3087 n = ch;
3088 goto next;
3089 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003090 }
3091 break;
3092
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003093 case stmt:
3094 case simple_stmt:
3095 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003096 n = CHILD(n, 0);
3097 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003098
3099 case expr_stmt:
3100 case testlist:
3101 case test:
3102 case and_test:
3103 case not_test:
3104 case comparison:
3105 case expr:
3106 case xor_expr:
3107 case and_expr:
3108 case shift_expr:
3109 case arith_expr:
3110 case term:
3111 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003112 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003113 if (NCH(n) == 1) {
3114 n = CHILD(n, 0);
3115 goto next;
3116 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003117 break;
3118
3119 case atom:
3120 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003121 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003122 break;
3123
3124 }
3125 return NULL;
3126}
3127
Guido van Rossum79f25d91997-04-29 20:08:16 +00003128static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003129get_docstring(node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003130{
Guido van Rossum541563e1999-01-28 15:08:09 +00003131 /* Don't generate doc-strings if run with -OO */
3132 if (Py_OptimizeFlag > 1)
3133 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003134 n = get_rawdocstring(n);
3135 if (n == NULL)
3136 return NULL;
3137 return parsestrplus(n);
3138}
3139
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003140static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003141com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003142{
3143 REQ(n, suite);
3144 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3145 if (NCH(n) == 1) {
3146 com_node(c, CHILD(n, 0));
3147 }
3148 else {
3149 int i;
3150 for (i = 0; i < NCH(n); i++) {
3151 node *ch = CHILD(n, i);
3152 if (TYPE(ch) == stmt)
3153 com_node(c, ch);
3154 }
3155 }
3156}
3157
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003158/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003159static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003160com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003161{
3162 int i = c->c_nblocks;
3163 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3164 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3165 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003166 else if (i <= 0) {
3167 /* at the outer level */
3168 com_error(c, PyExc_SyntaxError,
3169 "'continue' not properly in loop");
3170 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003171 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003172 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003173 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003174 if (c->c_block[j] == SETUP_LOOP)
3175 break;
3176 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003177 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003178 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003179 for (; i > j; --i) {
3180 if (c->c_block[i] == SETUP_EXCEPT ||
3181 c->c_block[i] == SETUP_FINALLY) {
3182 com_addoparg(c, CONTINUE_LOOP,
3183 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003184 return;
3185 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003186 if (c->c_block[i] == END_FINALLY) {
3187 com_error(c, PyExc_SyntaxError,
3188 "'continue' not supported inside 'finally' clause");
3189 return;
3190 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003191 }
3192 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003193 com_error(c, PyExc_SyntaxError,
3194 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003195 }
3196 /* XXX Could allow it inside a 'finally' clause
3197 XXX if we could pop the exception still on the stack */
3198}
3199
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003200static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003201com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003202{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003203 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003204 if (TYPE(n) == lambdef) {
3205 /* lambdef: 'lambda' [varargslist] ':' test */
3206 n = CHILD(n, 1);
3207 }
3208 else {
3209 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3210 n = CHILD(n, 2);
3211 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3212 n = CHILD(n, 1);
3213 }
3214 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003215 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003216 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003217 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003218 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3219 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003220 nargs = 0;
3221 ndefs = 0;
3222 for (i = 0; i < nch; i++) {
3223 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003224 if (TYPE(CHILD(n, i)) == STAR ||
3225 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003226 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003227 nargs++;
3228 i++;
3229 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003230 t = RPAR; /* Anything except EQUAL or COMMA */
3231 else
3232 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003233 if (t == EQUAL) {
3234 i++;
3235 ndefs++;
3236 com_node(c, CHILD(n, i));
3237 i++;
3238 if (i >= nch)
3239 break;
3240 t = TYPE(CHILD(n, i));
3241 }
3242 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003243 /* Treat "(a=1, b)" as an error */
3244 if (ndefs)
3245 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003246 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003247 }
3248 if (t != COMMA)
3249 break;
3250 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003251 return ndefs;
3252}
3253
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003254static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003255com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003256{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003257 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003258 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003259 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003260 ndefs = com_argdefs(c, n);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003261 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3262 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003263 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003264 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003265 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003266 c->c_errors++;
3267 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003268 int closure = com_make_closure(c, (PyCodeObject *)co);
3269 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003270 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003271 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003272 if (closure)
3273 com_addoparg(c, MAKE_CLOSURE, ndefs);
3274 else
3275 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003276 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003277 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003278 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003279 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003280 }
3281}
3282
3283static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003284com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003285{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003286 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003287 REQ(n, testlist);
3288 /* testlist: test (',' test)* [','] */
3289 for (i = 0; i < NCH(n); i += 2)
3290 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003291 i = (NCH(n)+1) / 2;
3292 com_addoparg(c, BUILD_TUPLE, i);
3293 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003294}
3295
3296static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003297com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003298{
Guido van Rossum25831651993-05-19 14:50:45 +00003299 int i;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003300 PyObject *co, *v;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003301 char *name;
3302
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003303 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003304 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003305 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003306 c->c_errors++;
3307 return;
3308 }
3309 /* Push the class name on the stack */
3310 i = com_addconst(c, v);
3311 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003312 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003313 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003314 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003315 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003316 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003317 com_push(c, 1);
3318 }
Guido van Rossum25831651993-05-19 14:50:45 +00003319 else
3320 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003321 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003322 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003323 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003324 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003325 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003326 c->c_errors++;
3327 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003328 int closure = com_make_closure(c, (PyCodeObject *)co);
3329 i = com_addconst(c, co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003330 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003331 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003332 if (closure)
3333 com_addoparg(c, MAKE_CLOSURE, 0);
3334 else
3335 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003336 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003337 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003338 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003339 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003340 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003341 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003342}
3343
3344static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003345com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003346{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003347 loop:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003348 switch (TYPE(n)) {
3349
3350 /* Definition nodes */
3351
3352 case funcdef:
3353 com_funcdef(c, n);
3354 break;
3355 case classdef:
3356 com_classdef(c, n);
3357 break;
3358
3359 /* Trivial parse tree nodes */
3360
3361 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003362 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003363 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003364 n = CHILD(n, 0);
3365 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003366
3367 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003368 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
3369 com_addoparg(c, SET_LINENO, n->n_lineno);
3370 {
3371 int i;
3372 for (i = 0; i < NCH(n)-1; i += 2)
3373 com_node(c, CHILD(n, i));
3374 }
3375 break;
3376
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003377 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003378 com_addoparg(c, SET_LINENO, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003379 n = CHILD(n, 0);
3380 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003381
3382 /* Statement nodes */
3383
3384 case expr_stmt:
3385 com_expr_stmt(c, n);
3386 break;
3387 case print_stmt:
3388 com_print_stmt(c, n);
3389 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003390 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003391 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003392 break;
3393 case pass_stmt:
3394 break;
3395 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003396 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003397 com_error(c, PyExc_SyntaxError,
3398 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003399 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003400 com_addbyte(c, BREAK_LOOP);
3401 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003402 case continue_stmt:
3403 com_continue_stmt(c, n);
3404 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003405 case return_stmt:
3406 com_return_stmt(c, n);
3407 break;
3408 case raise_stmt:
3409 com_raise_stmt(c, n);
3410 break;
3411 case import_stmt:
3412 com_import_stmt(c, n);
3413 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003414 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003415 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003416 case exec_stmt:
3417 com_exec_stmt(c, n);
3418 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003419 case assert_stmt:
3420 com_assert_stmt(c, n);
3421 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003422 case if_stmt:
3423 com_if_stmt(c, n);
3424 break;
3425 case while_stmt:
3426 com_while_stmt(c, n);
3427 break;
3428 case for_stmt:
3429 com_for_stmt(c, n);
3430 break;
3431 case try_stmt:
3432 com_try_stmt(c, n);
3433 break;
3434 case suite:
3435 com_suite(c, n);
3436 break;
3437
3438 /* Expression nodes */
3439
3440 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003441 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003442 break;
3443 case test:
3444 com_test(c, n);
3445 break;
3446 case and_test:
3447 com_and_test(c, n);
3448 break;
3449 case not_test:
3450 com_not_test(c, n);
3451 break;
3452 case comparison:
3453 com_comparison(c, n);
3454 break;
3455 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003456 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003457 break;
3458 case expr:
3459 com_expr(c, n);
3460 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003461 case xor_expr:
3462 com_xor_expr(c, n);
3463 break;
3464 case and_expr:
3465 com_and_expr(c, n);
3466 break;
3467 case shift_expr:
3468 com_shift_expr(c, n);
3469 break;
3470 case arith_expr:
3471 com_arith_expr(c, n);
3472 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003473 case term:
3474 com_term(c, n);
3475 break;
3476 case factor:
3477 com_factor(c, n);
3478 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003479 case power:
3480 com_power(c, n);
3481 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003482 case atom:
3483 com_atom(c, n);
3484 break;
3485
3486 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003487 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003488 com_error(c, PyExc_SystemError,
3489 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003490 }
3491}
3492
Tim Petersdbd9ba62000-07-09 03:09:57 +00003493static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003494
3495static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003496com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003497{
3498 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3499 if (TYPE(CHILD(n, 0)) == LPAR)
3500 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003501 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003502 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003503 com_pop(c, 1);
3504 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003505}
3506
3507static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003508com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003509{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003510 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003511 if (NCH(n) == 1) {
3512 com_fpdef(c, CHILD(n, 0));
3513 }
3514 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003515 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003516 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003517 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003518 for (i = 0; i < NCH(n); i += 2)
3519 com_fpdef(c, CHILD(n, i));
3520 }
3521}
3522
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003523/* XXX This function could probably be made simpler, because it
3524 doesn't do anything except generate code for complex arguments.
3525*/
3526
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003527static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003528com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003529{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003530 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003531 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003532 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003533 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003534 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003535 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003536 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003537 /* Enter all arguments in table of locals */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003538 for (i = 0, narg = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003539 node *ch = CHILD(n, i);
3540 node *fp;
3541 char *name;
Guido van Rossum50564e81996-01-12 01:13:16 +00003542 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003543 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003544 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3545 fp = CHILD(ch, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003546 if (TYPE(fp) == NAME) {
3547 PyObject *v;
3548 name = STR(fp);
3549 v = PyDict_GetItemString(c->c_cellvars, name);
3550 if (v) {
3551 com_addoparg(c, LOAD_FAST, narg);
3552 com_addoparg(c, STORE_DEREF,
3553 PyInt_AS_LONG(v));
3554 }
3555 } else {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003556 name = nbuf;
3557 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003558 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003559 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003560 narg++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003561 /* all name updates handled by symtable */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003562 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003563 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003564 ch = CHILD(n, i);
3565 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003566 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003567 else
3568 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003569 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003570 /* Handle *arguments */
3571 if (i < nch) {
3572 node *ch;
3573 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003574 if (TYPE(ch) != DOUBLESTAR) {
3575 REQ(ch, STAR);
3576 ch = CHILD(n, i+1);
3577 if (TYPE(ch) == NAME) {
Guido van Rossum50564e81996-01-12 01:13:16 +00003578 i += 3;
Guido van Rossum50564e81996-01-12 01:13:16 +00003579 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003580 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003581 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003582 /* Handle **keywords */
3583 if (i < nch) {
3584 node *ch;
3585 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003586 if (TYPE(ch) != DOUBLESTAR) {
3587 REQ(ch, STAR);
3588 ch = CHILD(n, i+1);
3589 REQ(ch, STAR);
3590 ch = CHILD(n, i+2);
3591 }
3592 else
3593 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003594 REQ(ch, NAME);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003595 }
3596 if (complex) {
3597 /* Generate code for complex arguments only after
3598 having counted the simple arguments */
3599 int ilocal = 0;
3600 for (i = 0; i < nch; i++) {
3601 node *ch = CHILD(n, i);
3602 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003603 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003604 break;
3605 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3606 fp = CHILD(ch, 0);
3607 if (TYPE(fp) != NAME) {
3608 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003609 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003610 com_fpdef(c, ch);
3611 }
3612 ilocal++;
3613 if (++i >= nch)
3614 break;
3615 ch = CHILD(n, i);
3616 if (TYPE(ch) == EQUAL)
3617 i += 2;
3618 else
3619 REQ(ch, COMMA);
3620 }
3621 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003622}
3623
3624static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003625com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003626{
3627 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003628 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003629 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003630 doc = get_docstring(n);
3631 if (doc != NULL) {
3632 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003633 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003634 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003635 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003636 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003637 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003638 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003639 for (i = 0; i < NCH(n); i++) {
3640 node *ch = CHILD(n, i);
3641 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3642 com_node(c, ch);
3643 }
3644}
3645
3646/* Top-level compile-node interface */
3647
3648static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003649compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003650{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003651 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003652 node *ch;
3653 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003654 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003655 doc = get_docstring(CHILD(n, 4));
3656 if (doc != NULL) {
3657 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003658 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003659 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003660 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003661 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003662 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3663 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003664 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003665 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003666 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003667 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003668 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003669 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003670 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003671 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003672 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003673}
3674
3675static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003676compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003677{
Guido van Rossum590baa41993-11-30 13:40:46 +00003678 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003679 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003680 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003681
3682 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003683 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003684 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003685 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003686 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003687 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003688 else
3689 ch = CHILD(n, 2);
3690 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003691 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003692 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003693}
3694
3695static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003696compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003697{
3698 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003699 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003700 REQ(n, classdef);
3701 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3702 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003703 c->c_private = c->c_name;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003704 ch = CHILD(n, NCH(n)-1); /* The suite */
3705 doc = get_docstring(ch);
3706 if (doc != NULL) {
3707 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003708 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003709 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003710 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003711 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003712 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003713 }
3714 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003715 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003716 com_node(c, ch);
3717 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003718 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003719 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003720 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003721}
3722
3723static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003724compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003725{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003726 com_addoparg(c, SET_LINENO, n->n_lineno);
3727
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003728 switch (TYPE(n)) {
3729
Guido van Rossum4c417781991-01-21 16:09:22 +00003730 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003731 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003732 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003733 n = CHILD(n, 0);
3734 if (TYPE(n) != NEWLINE)
3735 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003736 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003737 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003738 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003739 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003740 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003741 break;
3742
Guido van Rossum4c417781991-01-21 16:09:22 +00003743 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003744 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003745 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003746 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003747 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003748 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003749 break;
3750
Guido van Rossum590baa41993-11-30 13:40:46 +00003751 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003752 com_node(c, CHILD(n, 0));
3753 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003754 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003755 break;
3756
Guido van Rossum590baa41993-11-30 13:40:46 +00003757 case lambdef: /* anonymous function definition */
3758 compile_lambdef(c, n);
3759 break;
3760
Guido van Rossum4c417781991-01-21 16:09:22 +00003761 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003762 compile_funcdef(c, n);
3763 break;
3764
Guido van Rossum4c417781991-01-21 16:09:22 +00003765 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003766 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003767 break;
3768
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003769 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003770 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003771 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003772 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003773 }
3774}
3775
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003776static PyObject *
3777dict_keys_inorder(PyObject *dict, int offset)
3778{
3779 PyObject *tuple, *k, *v;
3780 int i, pos = 0, size = PyDict_Size(dict);
3781
3782 tuple = PyTuple_New(size);
3783 if (tuple == NULL)
3784 return NULL;
3785 while (PyDict_Next(dict, &pos, &k, &v)) {
3786 i = PyInt_AS_LONG(v);
3787 Py_INCREF(k);
3788 PyTuple_SET_ITEM(tuple, i - offset, k);
3789 }
3790 return tuple;
3791}
3792
Guido van Rossum79f25d91997-04-29 20:08:16 +00003793PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003794PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003795{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003796 return jcompile(n, filename, NULL);
3797}
3798
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003799struct symtable *
3800PyNode_CompileSymtable(node *n, char *filename)
3801{
3802 struct symtable *st;
3803
3804 st = symtable_init(1);
3805 if (st == NULL)
3806 return NULL;
3807 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
3808 if (st->st_errors > 0) {
3809 PySymtable_Free(st);
3810 return NULL;
3811 }
3812 symtable_node(st, n);
3813 if (st->st_errors > 0) {
3814 PySymtable_Free(st);
3815 return NULL;
3816 }
3817 return st;
3818}
3819
Guido van Rossum79f25d91997-04-29 20:08:16 +00003820static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003821icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003822{
3823 return jcompile(n, base->c_filename, base);
3824}
3825
Guido van Rossum79f25d91997-04-29 20:08:16 +00003826static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003827jcompile(node *n, char *filename, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003828{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003829 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003830 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003831 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003832 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003833 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003834 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003835 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003836 /* c_symtable still points to parent's symbols */
3837 if (base->c_nested
3838 || (sc.c_symtable->st_cur_type == TYPE_FUNCTION))
3839 sc.c_nested = 1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003840 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003841 sc.c_private = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003842 if (symtable_build(&sc, n) < 0) {
3843 com_free(&sc);
3844 return NULL;
3845 }
3846 }
3847 co = NULL;
3848 if (symtable_load_symbols(&sc) < 0)
3849 goto exit;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003850 compile_node(&sc, n);
3851 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00003852 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003853 PyObject *consts, *names, *varnames, *filename, *name,
3854 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003855 consts = PyList_AsTuple(sc.c_consts);
3856 names = PyList_AsTuple(sc.c_names);
3857 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003858 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
3859 freevars = dict_keys_inorder(sc.c_freevars,
3860 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003861 filename = PyString_InternFromString(sc.c_filename);
3862 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003863 if (!PyErr_Occurred())
3864 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003865 sc.c_nlocals,
3866 sc.c_maxstacklevel,
3867 sc.c_flags,
3868 sc.c_code,
3869 consts,
3870 names,
3871 varnames,
3872 freevars,
3873 cellvars,
3874 filename,
3875 name,
3876 sc.c_firstlineno,
3877 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003878 Py_XDECREF(consts);
3879 Py_XDECREF(names);
3880 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003881 Py_XDECREF(freevars);
3882 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003883 Py_XDECREF(filename);
3884 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003885 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00003886 else if (!PyErr_Occurred()) {
3887 /* This could happen if someone called PyErr_Clear() after an
3888 error was reported above. That's not supposed to happen,
3889 but I just plugged one case and I'm not sure there can't be
3890 others. In that case, raise SystemError so that at least
3891 it gets reported instead dumping core. */
3892 PyErr_SetString(PyExc_SystemError, "lost syntax error");
3893 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003894 exit:
3895 if (base == NULL)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003896 PySymtable_Free(sc.c_symtable);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003897 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003898 return co;
3899}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003900
3901int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003902PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003903{
3904 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003905 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003906 int line = co->co_firstlineno;
3907 int addr = 0;
3908 while (--size >= 0) {
3909 addr += *p++;
3910 if (addr > addrq)
3911 break;
3912 line += *p++;
3913 }
3914 return line;
3915}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003916
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003917/* The test for LOCAL must come before the test for FREE in order to
3918 handle classes where name is both local and free. The local var is
3919 a method and the free var is a free var referenced within a method.
3920*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003921
3922static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003923get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003924{
3925 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003926 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
3927 return CELL;
3928 if (PyDict_GetItemString(c->c_locals, name) != NULL)
3929 return LOCAL;
3930 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
3931 return FREE;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003932 v = PyDict_GetItemString(c->c_globals, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003933 if (v) {
3934 if (v == Py_None)
3935 return GLOBAL_EXPLICIT;
3936 else {
3937 return GLOBAL_IMPLICIT;
3938 }
3939 }
3940 {
3941 char buf[250];
3942 sprintf(buf, "unknown scope for %.100s in %.100s (%s)",
Jeremy Hylton483638c2001-02-01 20:20:45 +00003943 name, c->c_name,
3944 PyObject_REPR(c->c_symtable->st_cur_id));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003945 Py_FatalError(buf);
3946 }
3947 return -1; /* can't get here */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003948}
3949
3950static int
3951symtable_build(struct compiling *c, node *n)
3952{
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003953 if ((c->c_symtable = symtable_init(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003954 return -1;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003955 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
3956 if (c->c_symtable->st_errors > 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003957 return -1;
3958 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00003959 if (c->c_symtable->st_errors > 0)
3960 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003961 /* reset for second pass */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003962 c->c_symtable->st_nscopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003963 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003964 return 0;
3965}
3966
3967static int
3968symtable_load_symbols(struct compiling *c)
3969{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003970 static PyObject *implicit = NULL;
3971 PyObject *name, *varnames, *v;
3972 int i, info, pos;
3973 int nlocals, nfrees, ncells;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003974 struct symtable *st = c->c_symtable;
3975
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003976 if (implicit == NULL) {
3977 implicit = PyInt_FromLong(1);
3978 if (implicit == NULL)
3979 return -1;
3980 }
3981 v = NULL;
3982
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003983 varnames = PyDict_GetItem(st->st_varnames, st->st_cur_id);
3984 if (varnames == NULL) {
3985 varnames = PyList_New(0);
3986 if (varnames == NULL)
3987 return -1;
3988 } else
3989 Py_INCREF(varnames);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003990 c->c_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003991
3992 c->c_globals = PyDict_New();
3993 if (c->c_globals == NULL)
3994 goto fail;
3995 c->c_freevars = PyDict_New();
3996 if (c->c_freevars == NULL)
3997 goto fail;
3998 c->c_cellvars = PyDict_New();
3999 if (c->c_cellvars == NULL)
4000 goto fail;
4001
4002 nlocals = PyList_GET_SIZE(varnames);
4003 c->c_argcount = nlocals;
4004 nfrees = 0;
4005 ncells = 0;
4006 for (i = 0; i < nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004007 v = PyInt_FromLong(i);
4008 if (PyDict_SetItem(c->c_locals,
4009 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004010 goto fail;
4011 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004012 }
4013
4014 /* XXX The cases below define the rules for whether a name is
4015 local or global. The logic could probably be clearer. */
4016 pos = 0;
4017 while (PyDict_Next(st->st_cur, &pos, &name, &v)) {
4018 info = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004019
4020 if (info & DEF_FREE_GLOBAL)
4021 /* undo the original DEF_FREE */
4022 info &= ~(DEF_FREE | DEF_FREE_CLASS);
4023
4024
4025 /* Seperate logic for DEF_FREE. If it occurs in a
4026 function, it indicates a local that we must
4027 allocate storage for (a cell var). If it occurs in
4028 a class, then the class has a method and a free
4029 variable with the same name.
4030 */
4031
4032 if ((info & (DEF_FREE | DEF_FREE_CLASS))
4033 && (info & (DEF_LOCAL | DEF_PARAM))) {
4034 PyObject *dict;
4035 if (st->st_cur_type == TYPE_FUNCTION) {
4036 v = PyInt_FromLong(ncells++);
4037 dict = c->c_cellvars;
4038 } else {
4039 v = PyInt_FromLong(nfrees++);
4040 dict = c->c_freevars;
4041 }
4042 if (v == NULL)
4043 return -1;
4044 if (PyDict_SetItem(dict, name, v) < 0)
4045 goto fail;
4046 Py_DECREF(v);
4047 }
4048
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004049 if (info & DEF_STAR) {
4050 c->c_argcount--;
4051 c->c_flags |= CO_VARARGS;
4052 } else if (info & DEF_DOUBLESTAR) {
4053 c->c_argcount--;
4054 c->c_flags |= CO_VARKEYWORDS;
4055 } else if (info & DEF_INTUPLE)
4056 c->c_argcount--;
4057 else if (info & DEF_GLOBAL) {
4058 if ((info & DEF_PARAM)
4059 && (PyString_AS_STRING(name)[0] != '.')){
4060 char buf[500];
4061 sprintf(buf,
4062 "name '%.400s' is local and global",
4063 PyString_AS_STRING(name));
4064 com_error(c, PyExc_SyntaxError, buf);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004065 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004066 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004067 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4068 goto fail;
4069 } else if (info & DEF_FREE_GLOBAL) {
4070 if (PyDict_SetItem(c->c_globals, name, implicit) < 0)
4071 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004072 } else if ((info & DEF_LOCAL) && !(info & DEF_PARAM)) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004073 v = PyInt_FromLong(nlocals++);
4074 if (v == NULL)
4075 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004076 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004077 goto fail;
4078 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004079 if (st->st_cur_type != TYPE_CLASS)
4080 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004081 goto fail;
4082 } else if (is_free(info)) {
4083 if (st->st_nested) {
4084 v = PyInt_FromLong(nfrees++);
4085 if (v == NULL)
4086 goto fail;
4087 if (PyDict_SetItem(c->c_freevars,
4088 name, v) < 0)
4089 goto fail;
4090 Py_DECREF(v);
4091 } else {
4092 if (PyDict_SetItem(c->c_globals, name,
4093 implicit) < 0)
4094 goto fail;
4095 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004096 }
4097 }
4098
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004099 /* The cell vars are the first elements of the closure,
4100 followed by the free vars. Update the offsets in
4101 c_freevars to account for number of cellvars. */
4102 pos = 0;
4103 while (PyDict_Next(c->c_freevars, &pos, &name, &v)) {
4104 int i = PyInt_AS_LONG(v) + ncells;
4105 PyObject *o = PyInt_FromLong(i);
4106 if (PyDict_SetItem(c->c_freevars, name, o) < 0) {
4107 Py_DECREF(o);
4108 return -1;
4109 }
4110 Py_DECREF(o);
4111 }
4112
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004113 if (st->st_cur_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004114 c->c_nlocals = nlocals;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004115
4116 if (st->st_cur_type != TYPE_MODULE)
4117 c->c_flags |= CO_NEWLOCALS;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004118 if (st->st_cur_type == TYPE_FUNCTION) {
4119 if (PyDict_GetItemString(st->st_cur, NOOPT) == NULL)
4120 c->c_flags |= CO_OPTIMIZED;
4121 else if (ncells || nfrees) {
4122 char buf[256];
4123 /* XXX need better error message */
4124 sprintf(buf,
4125 "function %.100s: may not use lexical scoping"
4126 " and 'import *' or exec in same function",
4127 PyString_AS_STRING(st->st_cur_name));
4128 com_error(c, PyExc_SyntaxError, buf);
4129 return -1;
4130 }
4131 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004132 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004133
4134 fail:
4135 /* is this always the right thing to do? */
4136 Py_XDECREF(v);
4137 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004138}
4139
4140static struct symtable *
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004141symtable_init(int keep)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004142{
4143 struct symtable *st;
4144 PyObject *d;
4145
4146 st = (struct symtable *)PyMem_Malloc(sizeof(struct symtable));
4147 if (st == NULL)
4148 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004149 st->st_pass = 1;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004150 st->st_keep = keep;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004151 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004152 goto fail;
4153 if ((st->st_symbols = PyDict_New()) == NULL)
4154 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004155 if ((st->st_children = PyDict_New()) == NULL)
4156 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004157 if ((st->st_varnames = PyDict_New()) == NULL)
4158 goto fail;
4159 if ((d = PyDict_New()) == NULL)
4160 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004161 if (PyDict_SetItemString(st->st_symbols, TOP, d) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004162 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004163 Py_DECREF(d);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004164 if (keep) {
4165 if ((d = PyDict_New()) == NULL)
4166 goto fail;
4167 st->st_scopes = d;
4168 } else
4169 st->st_scopes = NULL;
4170 st->st_global = d; /* use ref borrowed from st->st_symbols */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004171 st->st_cur = NULL;
4172 st->st_cur_id = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004173 st->st_cur_name = NULL;
4174 st->st_cur_children = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004175 st->st_cur_type = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004176 st->st_nested = 0;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004177 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004178 st->st_errors = 0;
4179 st->st_tmpname = 0;
4180 st->st_private = NULL;
4181 return st;
4182 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004183 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004184 return NULL;
4185}
4186
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004187void
4188PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004189{
4190 Py_XDECREF(st->st_symbols);
4191 Py_XDECREF(st->st_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004192 Py_XDECREF(st->st_children);
4193 Py_XDECREF(st->st_stack);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004194 Py_XDECREF(st->st_scopes);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004195 Py_XDECREF(st->st_cur_id);
Jeremy Hylton2fdfadf2001-01-29 22:42:28 +00004196 Py_XDECREF(st->st_cur_name);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004197 PyMem_Free((void *)st);
4198}
4199
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004200static PyObject *
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004201make_scope_info(PyObject *id, PyObject *name, int nested, int type,
4202 int lineno)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004203{
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004204 PyObject *t, *i1 = NULL, *i2 = NULL, *i3 = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004205
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004206 t = PyTuple_New(5);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004207 if (t == NULL)
4208 return NULL;
4209 i1 = PyInt_FromLong(nested);
4210 if (i1 == NULL)
4211 goto fail;
4212 i2 = PyInt_FromLong(type);
4213 if (i2 == NULL)
4214 goto fail;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004215 i3 = PyInt_FromLong(lineno);
4216 if (i3 == NULL)
4217 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004218
4219 Py_INCREF(name);
4220 Py_INCREF(id);
4221 PyTuple_SET_ITEM(t, 0, name);
4222 PyTuple_SET_ITEM(t, 1, id);
4223 /* i1 & i2 alloced here; don't need incref */
4224 PyTuple_SET_ITEM(t, 2, i1);
4225 PyTuple_SET_ITEM(t, 3, i2);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004226 PyTuple_SET_ITEM(t, 4, i3);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004227 return t;
4228 fail:
4229 Py_XDECREF(t);
4230 Py_XDECREF(i1);
4231 Py_XDECREF(i2);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004232 Py_XDECREF(i3);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004233 return NULL;
4234}
4235
4236/* When the compiler exits a scope, it must should update the scope's
4237 free variable information with the list of free variables in its
4238 children.
4239
4240 Variables that are free in children and defined in the current
4241 scope are cellvars.
4242
4243 If the scope being exited is defined at the top-level (st_nested is
4244 false), free variables in children that are not defined here are
4245 implicit globals.
4246
4247*/
4248
4249static int
4250symtable_update_free_vars(struct symtable *st)
4251{
4252 PyObject *dict, *o, *child, *name;
4253 int i, def;
4254
4255 if (st->st_cur_type == TYPE_CLASS)
4256 def = DEF_FREE_CLASS;
4257 else
4258 def = DEF_FREE;
4259 for (i = 0; i < PyList_GET_SIZE(st->st_cur_children); ++i) {
4260 int pos = 0;
4261
4262 child = PyList_GET_ITEM(st->st_cur_children, i);
4263 dict = PyDict_GetItem(st->st_symbols, child);
4264 if (dict == NULL)
4265 return -1;
4266 while (PyDict_Next(dict, &pos, &name, &o)) {
4267 int v = PyInt_AS_LONG(o);
4268 if (!(is_free(v)))
4269 continue; /* avoids indentation */
4270 if (st->st_nested) {
4271 if (symtable_add_def_o(st, st->st_cur,
4272 name, def) < 0)
4273 return -1;
4274 } else {
4275 if (symtable_check_global(st, child,
4276 name) < 0)
4277 return -1;
4278 }
4279 }
4280 }
4281
4282 return 0;
4283}
4284
4285/* If the current scope is a non-nested class or if name is not
4286 defined in the current, non-nested scope, then it is an implicit
4287 global in all nested scopes.
4288*/
4289
4290static int
4291symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
4292{
4293 PyObject *o;
4294 int v;
4295
4296 if (st->st_cur_type == TYPE_CLASS)
4297 return symtable_undo_free(st, child, name);
4298 o = PyDict_GetItem(st->st_cur, name);
4299 if (o == NULL)
4300 return symtable_undo_free(st, child, name);
4301 v = PyInt_AS_LONG(o);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004302 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004303 return symtable_undo_free(st, child, name);
4304 else
4305 return symtable_add_def_o(st, st->st_cur, name, DEF_FREE);
4306}
4307
4308static int
4309symtable_undo_free(struct symtable *st, PyObject *id,
4310 PyObject *name)
4311{
4312 int i, v, x;
4313 PyObject *dict, *children, *info;
4314
4315 dict = PyDict_GetItem(st->st_symbols, id);
4316 if (dict == NULL)
4317 return -1;
4318 info = PyDict_GetItem(dict, name);
4319 if (info == NULL)
4320 return 0;
4321 v = PyInt_AS_LONG(info);
4322 if (is_free(v)) {
4323 if (symtable_add_def_o(st, dict, name,
4324 DEF_FREE_GLOBAL) < 0)
4325 return -1;
4326 } else
4327 /* If the name is defined here or declared global,
4328 then the recursion stops. */
4329 return 0;
4330
4331 children = PyDict_GetItem(st->st_children, id);
4332 for (i = 0; i < PyList_GET_SIZE(children); ++i) {
4333 x = symtable_undo_free(st, PyList_GET_ITEM(children, i),
4334 name);
4335 if (x < 0)
4336 return x;
4337 }
4338 return 0;
4339}
4340
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004341static int
4342symtable_exit_scope(struct symtable *st)
4343{
4344 PyObject *o;
4345 int end;
4346
4347 if (st->st_pass == 1)
4348 symtable_update_free_vars(st);
4349 if (st->st_cur_name) {
4350 Py_XDECREF(st->st_cur_name);
4351 Py_XDECREF(st->st_cur_id);
4352 }
4353 end = PyList_GET_SIZE(st->st_stack) - 1;
4354 o = PyList_GET_ITEM(st->st_stack, end);
4355 st->st_cur_name = PyTuple_GET_ITEM(o, 0);
4356 st->st_cur_id = PyTuple_GET_ITEM(o, 1);
4357 st->st_nested = PyInt_AS_LONG(PyTuple_GET_ITEM(o, 2));
4358 st->st_cur_type = PyInt_AS_LONG(PyTuple_GET_ITEM(o, 3));
4359 if (PySequence_DelItem(st->st_stack, end) < 0)
4360 return -1;
4361 return symtable_update_cur(st);
4362}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004363
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004364static void
4365symtable_enter_scope(struct symtable *st, char *name, int type,
4366 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004367{
4368 PyObject *o;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004369
4370 if (st->st_cur) {
4371 /* push current scope info on stack */
4372 o = make_scope_info(st->st_cur_id, st->st_cur_name,
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004373 st->st_nested, st->st_cur_type,
4374 st->st_cur_lineno);
4375 if (o == NULL) {
4376 st->st_errors++;
4377 return;
4378 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004379 if (PyList_Append(st->st_stack, o) < 0) {
4380 Py_DECREF(o);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004381 st->st_errors++;
4382 return;
4383 }
4384 if (st->st_keep) {
4385 if (PyDict_SetItem(st->st_scopes,
4386 st->st_cur_id, o) < 0) {
4387 Py_DECREF(o);
4388 st->st_errors++;
4389 return;
4390 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004391 }
4392 Py_DECREF(o);
4393 }
4394 st->st_cur_name = PyString_FromString(name);
4395 if (st->st_nested || st->st_cur_type == TYPE_FUNCTION)
4396 st->st_nested = 1;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004397 st->st_cur_lineno = lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004398 switch (type) {
4399 case funcdef:
4400 case lambdef:
4401 st->st_cur_type = TYPE_FUNCTION;
4402 break;
4403 case classdef:
4404 st->st_cur_type = TYPE_CLASS;
4405 break;
4406 case single_input:
4407 case eval_input:
4408 case file_input:
4409 st->st_cur_type = TYPE_MODULE;
4410 break;
4411 default:
4412 fprintf(stderr, "invalid symtable scope: %d\n", type);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004413 st->st_errors++;
4414 return;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004415 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004416 /* update st_cur_id and parent's st_cur_children */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004417 o = PyInt_FromLong(st->st_nscopes++);
4418 if (o == NULL) {
4419 st->st_errors++;
4420 return;
4421 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004422 if (st->st_cur_children) {
4423 if (PyList_Append(st->st_cur_children, o) < 0) {
4424 Py_DECREF(o);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004425 st->st_errors++;
4426 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004427 }
4428 }
4429 st->st_cur_id = o;
4430 /* create st_cur_children list */
4431 o = PyList_New(0);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004432 if (o == NULL) {
4433 st->st_errors++;
4434 return;
4435 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004436 if (PyDict_SetItem(st->st_children, st->st_cur_id, o) < 0) {
4437 Py_DECREF(o);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004438 st->st_errors++;
4439 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004440 }
4441 Py_DECREF(o);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004442
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004443 symtable_update_cur(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004444}
4445
4446static int
4447symtable_update_cur(struct symtable *st)
4448{
4449 PyObject *s, *d, *l;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004450
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004451 s = st->st_cur_id;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004452 d = PyDict_GetItem(st->st_symbols, s);
4453 if (d == NULL) {
4454 if ((d = PyDict_New()) == NULL)
4455 return -1;
4456 if (PyObject_SetItem(st->st_symbols, s, d) < 0) {
4457 Py_DECREF(d);
4458 return -1;
4459 }
Jeremy Hyltonbbf10b52001-02-02 02:58:48 +00004460 Py_DECREF(d);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004461 if (st->st_cur_type == TYPE_FUNCTION) {
4462 if ((l = PyList_New(0)) == NULL)
4463 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004464 if (PyDict_SetItem(st->st_varnames, s, l) < 0) {
4465 Py_DECREF(l);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004466 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004467 }
4468 Py_DECREF(l);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004469 }
4470 }
4471
4472 st->st_cur = d;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004473
4474 d = PyDict_GetItem(st->st_children, s);
4475 if (d == NULL)
4476 return -1;
4477 st->st_cur_children = d;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004478 return 0;
4479}
4480
4481static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004482symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004483{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004484 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004485 char buffer[MANGLE_LEN];
4486
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004487 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004488 name = buffer;
4489 if ((s = PyString_InternFromString(name)) == NULL)
4490 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004491 return symtable_add_def_o(st, st->st_cur, s, flag);
4492}
4493
4494/* Must only be called with mangled names */
4495
4496static int
4497symtable_add_def_o(struct symtable *st, PyObject *dict,
4498 PyObject *name, int flag)
4499{
4500 PyObject *o;
4501 int val;
4502
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004503 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004504 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004505 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004506 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00004507 PyString_AsString(name));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004508 return -1;
4509 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004510 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004511 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004512 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004513 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004514 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004515 Py_DECREF(o);
4516 return -1;
4517 }
4518 Py_DECREF(o);
4519
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004520 if (flag & DEF_PARAM) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004521 PyObject *l = PyDict_GetItem(st->st_varnames,
4522 st->st_cur_id);
4523 if (l == NULL)
4524 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004525 if (PyList_Append(l, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004526 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004527 } else if (flag & DEF_GLOBAL) {
4528 /* XXX need to update DEF_GLOBAL for other flags too;
4529 perhaps only DEF_FREE_GLOBAL */
4530 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004531 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004532 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004533 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004534 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004535 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004536 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004537 Py_DECREF(o);
4538 return -1;
4539 }
4540 Py_DECREF(o);
4541 }
4542 return 0;
4543}
4544
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004545#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004546
4547static void
4548symtable_node(struct symtable *st, node *n)
4549{
4550 int i, start = 0;
4551
4552 loop:
4553 switch (TYPE(n)) {
4554 case funcdef: {
4555 char *func_name = STR(CHILD(n, 1));
4556 symtable_add_def(st, func_name, DEF_LOCAL);
4557 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004558 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004559 symtable_funcdef(st, n);
4560 symtable_exit_scope(st);
4561 break;
4562 }
4563 case lambdef:
4564 if (NCH(n) == 4)
4565 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004566 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004567 symtable_funcdef(st, n);
4568 symtable_exit_scope(st);
4569 break;
4570 case classdef: {
4571 char *tmp, *class_name = STR(CHILD(n, 1));
4572 symtable_add_def(st, class_name, DEF_LOCAL);
4573 if (TYPE(CHILD(n, 2)) == LPAR) {
4574 node *bases = CHILD(n, 3);
4575 int i;
4576 for (i = 0; i < NCH(bases); i += 2) {
4577 symtable_node(st, CHILD(bases, i));
4578 }
4579 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004580 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004581 tmp = st->st_private;
4582 st->st_private = class_name;
4583 symtable_node(st, CHILD(n, NCH(n) - 1));
4584 st->st_private = tmp;
4585 symtable_exit_scope(st);
4586 break;
4587 }
4588 case if_stmt:
4589 for (i = 0; i + 3 < NCH(n); i += 4) {
4590 if (is_constant_false(NULL, (CHILD(n, i + 1))))
4591 continue;
4592 symtable_node(st, CHILD(n, i + 1));
4593 symtable_node(st, CHILD(n, i + 3));
4594 }
4595 if (i + 2 < NCH(n))
4596 symtable_node(st, CHILD(n, i + 2));
4597 break;
4598 case global_stmt:
4599 symtable_global(st, n);
4600 break;
4601 case import_stmt:
4602 symtable_import(st, n);
4603 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004604 case exec_stmt: {
4605 PyObject *zero = PyInt_FromLong(0);
4606 if (zero == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004607 st->st_errors++;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004608 else {
4609 if (PyDict_SetItemString(st->st_cur, NOOPT,
4610 zero) < 0)
4611 st->st_errors++;
4612 Py_DECREF(zero);
4613 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004614 symtable_node(st, CHILD(n, 1));
4615 if (NCH(n) > 2)
4616 symtable_node(st, CHILD(n, 3));
4617 if (NCH(n) > 4)
4618 symtable_node(st, CHILD(n, 5));
4619 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004620
4621 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004622 case except_clause:
4623 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004624 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004625 if (NCH(n) > 1) {
4626 n = CHILD(n, 1);
4627 goto loop;
4628 }
4629 break;
4630 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004631 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004632 break;
4633 case expr_stmt:
4634 if (NCH(n) == 1)
4635 n = CHILD(n, 0);
4636 else {
4637 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004638 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004639 symtable_node(st, CHILD(n, 2));
4640 break;
4641 } else {
4642 int i;
4643 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004644 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004645 n = CHILD(n, NCH(n) - 1);
4646 }
4647 }
4648 goto loop;
4649 /* watchout for fall-through logic below */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004650 case argument:
4651 if (NCH(n) == 3) {
4652 n = CHILD(n, 2);
4653 goto loop;
4654 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004655 case listmaker:
4656 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
4657 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton5f827f42001-01-23 01:26:20 +00004658 n = CHILD(n, 0);
4659 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004660 }
4661 case atom:
4662 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
4663 symtable_add_use(st, STR(CHILD(n, 0)));
4664 break;
4665 }
4666 case for_stmt:
4667 if (TYPE(n) == for_stmt) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004668 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004669 start = 3;
4670 }
4671 default:
4672 if (NCH(n) == 1) {
4673 n = CHILD(n, 0);
4674 goto loop;
4675 }
4676 for (i = start; i < NCH(n); ++i)
4677 if (TYPE(CHILD(n, i)) >= single_input)
4678 symtable_node(st, CHILD(n, i));
4679 }
4680}
4681
4682static void
4683symtable_funcdef(struct symtable *st, node *n)
4684{
4685 node *body;
4686
4687 if (TYPE(n) == lambdef) {
4688 if (NCH(n) == 4)
4689 symtable_params(st, CHILD(n, 1));
4690 } else
4691 symtable_params(st, CHILD(n, 2));
4692 body = CHILD(n, NCH(n) - 1);
4693 symtable_node(st, body);
4694}
4695
4696/* The next two functions parse the argument tuple.
4697 symtable_default_arg() checks for names in the default arguments,
4698 which are references in the defining scope. symtable_params()
4699 parses the parameter names, which are defined in the function's
4700 body.
4701
4702 varargslist:
4703 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
4704 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
4705*/
4706
4707static void
4708symtable_default_args(struct symtable *st, node *n)
4709{
4710 node *c;
4711 int i;
4712
4713 if (TYPE(n) == parameters) {
4714 n = CHILD(n, 1);
4715 if (TYPE(n) == RPAR)
4716 return;
4717 }
4718 REQ(n, varargslist);
4719 for (i = 0; i < NCH(n); i += 2) {
4720 c = CHILD(n, i);
4721 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
4722 break;
4723 }
4724 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
4725 symtable_node(st, CHILD(n, i));
4726 }
4727}
4728
4729static void
4730symtable_params(struct symtable *st, node *n)
4731{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004732 int i, complex = -1, ext = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004733 node *c = NULL;
4734
4735 if (TYPE(n) == parameters) {
4736 n = CHILD(n, 1);
4737 if (TYPE(n) == RPAR)
4738 return;
4739 }
4740 REQ(n, varargslist);
4741 for (i = 0; i < NCH(n); i += 2) {
4742 c = CHILD(n, i);
4743 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
4744 ext = 1;
4745 break;
4746 }
4747 if (TYPE(c) == test) {
4748 continue;
4749 }
4750 if (TYPE(CHILD(c, 0)) == NAME)
4751 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
4752 else {
4753 char nbuf[10];
4754 sprintf(nbuf, ".%d", i);
4755 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004756 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004757 }
4758 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004759 if (ext) {
4760 c = CHILD(n, i);
4761 if (TYPE(c) == STAR) {
4762 i++;
4763 symtable_add_def(st, STR(CHILD(n, i)),
4764 DEF_PARAM | DEF_STAR);
4765 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00004766 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004767 c = NULL;
4768 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004769 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004770 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004771 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004772 i++;
4773 symtable_add_def(st, STR(CHILD(n, i)),
4774 DEF_PARAM | DEF_DOUBLESTAR);
4775 }
4776 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004777 if (complex >= 0) {
4778 int j;
4779 for (j = 0; j <= complex; j++) {
4780 c = CHILD(n, j);
4781 if (TYPE(c) == COMMA)
4782 c = CHILD(n, ++j);
4783 if (TYPE(CHILD(c, 0)) == LPAR)
4784 symtable_params_fplist(st, CHILD(c, 1));
4785 }
4786 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004787}
4788
4789static void
4790symtable_params_fplist(struct symtable *st, node *n)
4791{
4792 int i;
4793 node *c;
4794
4795 REQ(n, fplist);
4796 for (i = 0; i < NCH(n); i += 2) {
4797 c = CHILD(n, i);
4798 REQ(c, fpdef);
4799 if (NCH(c) == 1)
4800 symtable_add_def(st, STR(CHILD(c, 0)),
4801 DEF_PARAM | DEF_INTUPLE);
4802 else
4803 symtable_params_fplist(st, CHILD(c, 1));
4804 }
4805
4806}
4807
4808static void
4809symtable_global(struct symtable *st, node *n)
4810{
4811 int i;
4812
4813 for (i = 1; i < NCH(n); i += 2)
4814 symtable_add_def(st, STR(CHILD(n, i)), DEF_GLOBAL);
4815}
4816
4817static void
4818symtable_list_comprehension(struct symtable *st, node *n)
4819{
4820 char tmpname[12];
4821
4822 sprintf(tmpname, "[%d]", ++st->st_tmpname);
4823 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004824 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004825 symtable_node(st, CHILD(n, 3));
4826 if (NCH(n) == 5)
4827 symtable_node(st, CHILD(n, 4));
4828 --st->st_tmpname;
4829}
4830
4831static void
4832symtable_import(struct symtable *st, node *n)
4833{
4834 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004835 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004836 | 'from' dotted_name 'import'
4837 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00004838 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004839 */
4840
4841 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
4842 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton483638c2001-02-01 20:20:45 +00004843 PyObject *zero = PyInt_FromLong(0);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004844 if (st->st_cur_type != TYPE_MODULE) {
4845 PyErr_SetString(PyExc_SyntaxError,
4846 ILLEGAL_IMPORT_STAR);
4847 st->st_errors++;
4848 return;
4849 }
Jeremy Hylton483638c2001-02-01 20:20:45 +00004850 if (zero == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004851 st->st_errors++;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004852 else {
4853 if (PyDict_SetItemString(st->st_cur, NOOPT,
4854 zero) < 0)
4855 st->st_errors++;
4856 Py_DECREF(zero);
4857 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004858 } else {
4859 for (i = 3; i < NCH(n); i += 2) {
4860 node *c = CHILD(n, i);
4861 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004862 symtable_assign(st, CHILD(c, 2),
4863 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004864 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004865 symtable_assign(st, CHILD(c, 0),
4866 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004867 }
4868 }
4869 } else {
4870 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004871 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004872 }
4873 }
4874}
4875
4876static void
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004877symtable_assign(struct symtable *st, node *n, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004878{
4879 node *tmp;
4880 int i;
4881
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004882 loop:
4883 switch (TYPE(n)) {
4884 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004885 /* invalid assignment, e.g. lambda x:x=2. The next
4886 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004887 return;
4888 case power:
4889 if (NCH(n) > 2) {
4890 for (i = 2; i < NCH(n); ++i)
4891 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
4892 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004893 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004894 if (NCH(n) > 1) {
4895 symtable_node(st, CHILD(n, 0));
4896 symtable_node(st, CHILD(n, 1));
4897 } else {
4898 n = CHILD(n, 0);
4899 goto loop;
4900 }
4901 return;
4902 case listmaker:
4903 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
4904 symtable_list_comprehension(st, CHILD(n, 1));
4905 else {
4906 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004907 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004908 }
4909 return;
4910 case exprlist:
4911 case testlist:
4912 if (NCH(n) == 1) {
4913 n = CHILD(n, 0);
4914 goto loop;
4915 }
4916 else {
4917 int i;
4918 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004919 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004920 return;
4921 }
4922 goto loop;
4923 case atom:
4924 tmp = CHILD(n, 0);
4925 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
4926 n = CHILD(n, 1);
4927 goto loop;
4928 } else if (TYPE(tmp) == NAME)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004929 symtable_add_def(st, STR(tmp), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004930 return;
4931 case dotted_as_name:
4932 if (NCH(n) == 3)
4933 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004934 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004935 else
4936 symtable_add_def(st,
4937 STR(CHILD(CHILD(n,
4938 0), 0)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004939 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004940 return;
4941 case dotted_name:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004942 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004943 return;
4944 case NAME:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004945 symtable_add_def(st, STR(n), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004946 return;
4947 default:
4948 if (NCH(n) == 0)
4949 return;
4950 if (NCH(n) != 1) {
4951 DUMP(n);
4952 Py_FatalError("too many children in default case\n");
4953 }
4954 n = CHILD(n, 0);
4955 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004956 }
4957}