blob: 916c4a687d2ffcd455beacc3f138d79030d4f21e [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
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000055#define ILLEGAL_DYNAMIC_SCOPE \
56"%.100s: exec or 'import *' makes names ambiguous in nested scope"
Jeremy Hyltoneab156f2001-01-30 01:24:43 +000057
Jeremy Hyltone36f7782001-01-19 03:21:30 +000058#define MANGLE_LEN 256
59
Guido van Rossum79f25d91997-04-29 20:08:16 +000060#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000061
62static struct memberlist code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000063 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
64 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000065 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000066 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000067 {"co_code", T_OBJECT, OFF(co_code), READONLY},
68 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
69 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000070 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Jeremy Hylton64949cb2001-01-25 20:06:59 +000071 {"co_freevars", T_OBJECT, OFF(co_freevars), READONLY},
72 {"co_cellvars", T_OBJECT, OFF(co_cellvars), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000073 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000074 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000075 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
76 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000077 {NULL} /* Sentinel */
78};
79
Guido van Rossum79f25d91997-04-29 20:08:16 +000080static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000081code_getattr(PyCodeObject *co, char *name)
Guido van Rossum3f5da241990-12-20 15:06:42 +000082{
Guido van Rossum79f25d91997-04-29 20:08:16 +000083 return PyMember_Get((char *)co, code_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +000084}
Guido van Rossum10dc2e81990-11-18 17:27:39 +000085
86static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000087code_dealloc(PyCodeObject *co)
Guido van Rossum10dc2e81990-11-18 17:27:39 +000088{
Guido van Rossum79f25d91997-04-29 20:08:16 +000089 Py_XDECREF(co->co_code);
90 Py_XDECREF(co->co_consts);
91 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +000092 Py_XDECREF(co->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +000093 Py_XDECREF(co->co_freevars);
94 Py_XDECREF(co->co_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +000095 Py_XDECREF(co->co_filename);
96 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +000097 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +000098 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +000099}
100
Guido van Rossum79f25d91997-04-29 20:08:16 +0000101static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000102code_repr(PyCodeObject *co)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000103{
104 char buf[500];
105 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000106 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000107 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000108
Guido van Rossuma396a882000-04-07 01:21:36 +0000109 if (co->co_firstlineno != 0)
110 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000111 if (co->co_filename && PyString_Check(co->co_filename))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000112 filename = PyString_AS_STRING(co->co_filename);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000113 if (co->co_name && PyString_Check(co->co_name))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000114 name = PyString_AS_STRING(co->co_name);
Fred Drake615ae552000-06-30 16:20:13 +0000115 sprintf(buf, "<code object %.100s at %p, file \"%.300s\", line %d>",
116 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000117 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000118}
119
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000120static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000121code_compare(PyCodeObject *co, PyCodeObject *cp)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000122{
123 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000124 cmp = PyObject_Compare(co->co_name, cp->co_name);
125 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000126 cmp = co->co_argcount - cp->co_argcount;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000127 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000128 cmp = co->co_nlocals - cp->co_nlocals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000129 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000130 cmp = co->co_flags - cp->co_flags;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000131 if (cmp) return cmp;
Guido van Rossumd076c731998-10-07 19:42:25 +0000132 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000133 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000134 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000135 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000136 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000137 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000138 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000139 if (cmp) return cmp;
140 cmp = PyObject_Compare(co->co_freevars, cp->co_freevars);
141 if (cmp) return cmp;
142 cmp = PyObject_Compare(co->co_cellvars, cp->co_cellvars);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000143 return cmp;
144}
145
146static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000147code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000148{
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000149 long h, h0, h1, h2, h3, h4, h5, h6;
Guido van Rossum44679592000-04-10 16:20:31 +0000150 h0 = PyObject_Hash(co->co_name);
151 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000152 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000153 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000154 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000155 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000156 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000157 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000158 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000159 if (h4 == -1) return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000160 h5 = PyObject_Hash(co->co_freevars);
161 if (h5 == -1) return -1;
162 h6 = PyObject_Hash(co->co_cellvars);
163 if (h6 == -1) return -1;
164 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^ h5 ^ h6 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000165 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000166 if (h == -1) h = -2;
167 return h;
168}
169
Guido van Rossum79f25d91997-04-29 20:08:16 +0000170PyTypeObject PyCode_Type = {
171 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000172 0,
173 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000174 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000175 0,
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000176 (destructor)code_dealloc, /*tp_dealloc*/
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000177 0, /*tp_print*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000178 (getattrfunc)code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000179 0, /*tp_setattr*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000180 (cmpfunc)code_compare, /*tp_compare*/
181 (reprfunc)code_repr, /*tp_repr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000182 0, /*tp_as_number*/
183 0, /*tp_as_sequence*/
184 0, /*tp_as_mapping*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000185 (hashfunc)code_hash, /*tp_hash*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000186};
187
Guido van Rossum644a12b1997-04-09 19:24:53 +0000188#define NAME_CHARS \
189 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
190
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000191/* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
192
193static int
194all_name_chars(unsigned char *s)
195{
Guido van Rossumcd90c202001-02-09 15:06:42 +0000196 static char ok_name_char[256];
197 static unsigned char *name_chars = (unsigned char *)NAME_CHARS;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000198
Guido van Rossumcd90c202001-02-09 15:06:42 +0000199 if (ok_name_char[*name_chars] == 0) {
200 unsigned char *p;
201 for (p = name_chars; *p; p++)
202 ok_name_char[*p] = 1;
203 }
204 while (*s) {
205 if (ok_name_char[*s++] == 0)
206 return 0;
207 }
208 return 1;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000209}
210
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000211static int
212intern_strings(PyObject *tuple)
213{
214 int i;
215
216 for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) {
217 PyObject *v = PyTuple_GET_ITEM(tuple, i);
218 if (v == NULL || !PyString_Check(v)) {
219 Py_FatalError("non-string found in code slot");
220 PyErr_BadInternalCall();
221 return -1;
222 }
223 PyString_InternInPlace(&PyTuple_GET_ITEM(tuple, i));
224 }
225 return 0;
226}
227
Guido van Rossum79f25d91997-04-29 20:08:16 +0000228PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000229PyCode_New(int argcount, int nlocals, int stacksize, int flags,
230 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000231 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
232 PyObject *filename, PyObject *name, int firstlineno,
233 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000234{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000235 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000236 int i;
Guido van Rossumd076c731998-10-07 19:42:25 +0000237 PyBufferProcs *pb;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000238 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000239 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000240 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000241 consts == NULL || !PyTuple_Check(consts) ||
242 names == NULL || !PyTuple_Check(names) ||
243 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000244 freevars == NULL || !PyTuple_Check(freevars) ||
245 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000246 name == NULL || !PyString_Check(name) ||
247 filename == NULL || !PyString_Check(filename) ||
248 lnotab == NULL || !PyString_Check(lnotab)) {
249 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000250 return NULL;
251 }
Guido van Rossumd076c731998-10-07 19:42:25 +0000252 pb = code->ob_type->tp_as_buffer;
253 if (pb == NULL ||
254 pb->bf_getreadbuffer == NULL ||
255 pb->bf_getsegcount == NULL ||
256 (*pb->bf_getsegcount)(code, NULL) != 1)
257 {
258 PyErr_BadInternalCall();
259 return NULL;
260 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000261 intern_strings(names);
262 intern_strings(varnames);
263 if (freevars == NULL)
264 freevars = PyTuple_New(0);
265 intern_strings(freevars);
266 if (cellvars == NULL)
267 cellvars = PyTuple_New(0);
268 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000269 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000270 for (i = PyTuple_Size(consts); --i >= 0; ) {
271 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000272 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000273 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000274 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000275 continue;
276 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000277 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000278 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000279 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000280 co->co_argcount = argcount;
281 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000282 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000283 co->co_flags = flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000284 Py_INCREF(code);
Guido van Rossumd076c731998-10-07 19:42:25 +0000285 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000286 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000287 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000288 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000289 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000290 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000291 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000292 Py_INCREF(freevars);
293 co->co_freevars = freevars;
294 Py_INCREF(cellvars);
295 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000296 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000297 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000298 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000299 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000300 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000301 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000302 co->co_lnotab = lnotab;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000303/* PyObject_Print((PyObject *)co, stderr, 0); */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000304 }
305 return co;
306}
307
308
309/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000310
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000311/* The compiler uses two passes to generate bytecodes. The first pass
312 builds the symbol table. The second pass generates the bytecode.
313
314 The first pass uses a single symtable struct. The second pass uses
315 a compiling struct for each code block. The compiling structs
316 share a reference to the symtable.
317
318 The two passes communicate via symtable_load_symbols() and via
319 is_local() and is_global(). The former initializes several slots
320 in the compiling struct: c_varnames, c_locals, c_nlocals,
321 c_argcount, c_globals, and c_flags.
322*/
323
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000324struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000325 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000326 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000327 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000328 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000329 PyObject *c_name_dict; /* inverse of c_names */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000330 PyObject *c_globals; /* dictionary (value=None) */
331 PyObject *c_locals; /* dictionary (value=localID) */
332 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000333 PyObject *c_freevars; /* dictionary (value=None) */
334 PyObject *c_cellvars; /* list */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000335 int c_nlocals; /* index of next local */
336 int c_argcount; /* number of top-level arguments */
337 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000338 int c_nexti; /* index into c_code */
339 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000340 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000341 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000342 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000343 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000344 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000345 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000346 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000347 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000348 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000349 int c_stacklevel; /* Current stack level */
350 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000351 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000352 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000353 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000354 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000355 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000356 int c_nested; /* Is block nested funcdef or lamdef? */
357 int c_closure; /* Is nested w/freevars? */
358 struct symtable *c_symtable; /* pointer to module symbol table */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000359};
360
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000361int is_free(int v)
362{
363 if ((v & (USE | DEF_FREE))
364 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
365 return 1;
366 if (v & DEF_FREE_CLASS)
367 return 1;
368 return 0;
369}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000370
Guido van Rossum452a9831996-09-17 14:32:04 +0000371/* Error message including line number */
372
373static void
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000374set_error_location(char *filename, int lineno)
375{
376 PyObject *exc, *v, *tb, *tmp;
377
378 /* add attributes for the line number and filename for the error */
379 PyErr_Fetch(&exc, &v, &tb);
380 PyErr_NormalizeException(&exc, &v, &tb);
381 tmp = PyInt_FromLong(lineno);
382 if (tmp == NULL)
383 PyErr_Clear();
384 else {
385 if (PyObject_SetAttrString(v, "lineno", tmp))
386 PyErr_Clear();
387 Py_DECREF(tmp);
388 }
389 if (filename != NULL) {
390 tmp = PyString_FromString(filename);
391 if (tmp == NULL)
392 PyErr_Clear();
393 else {
394 if (PyObject_SetAttrString(v, "filename", tmp))
395 PyErr_Clear();
396 Py_DECREF(tmp);
397 }
398 }
399 PyErr_Restore(exc, v, tb);
400}
401
402static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000403com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000404{
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000405 PyObject *v;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000406 if (c == NULL) {
407 /* Error occurred via symtable call to
408 is_constant_false */
409 PyErr_SetString(exc, msg);
410 return;
411 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000412 c->c_errors++;
Guido van Rossum452a9831996-09-17 14:32:04 +0000413 if (c->c_lineno <= 1) {
414 /* Unknown line number or single interactive command */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000415 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000416 return;
417 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000418 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000419 if (v == NULL)
420 return; /* MemoryError, too bad */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000421 PyErr_SetObject(exc, v);
422 Py_DECREF(v);
Fred Drakedcf08e02000-08-15 15:49:44 +0000423
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000424 set_error_location(c->c_filename, c->c_lineno);
Guido van Rossum452a9831996-09-17 14:32:04 +0000425}
426
427
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000428/* Interface to the block stack */
429
430static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000431block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000432{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000433 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000434 com_error(c, PyExc_SystemError,
435 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000436 }
437 else {
438 c->c_block[c->c_nblocks++] = type;
439 }
440}
441
442static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000443block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000444{
445 if (c->c_nblocks > 0)
446 c->c_nblocks--;
447 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000448 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000449 }
450}
451
452
Guido van Rossum681d79a1995-07-18 14:51:37 +0000453/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000454
Tim Petersdbd9ba62000-07-09 03:09:57 +0000455static int com_init(struct compiling *, char *);
456static void com_free(struct compiling *);
457static void com_push(struct compiling *, int);
458static void com_pop(struct compiling *, int);
459static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000460static void com_node(struct compiling *, node *);
461static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000462static void com_addbyte(struct compiling *, int);
463static void com_addint(struct compiling *, int);
464static void com_addoparg(struct compiling *, int, int);
465static void com_addfwref(struct compiling *, int, int *);
466static void com_backpatch(struct compiling *, int);
467static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
468static int com_addconst(struct compiling *, PyObject *);
469static int com_addname(struct compiling *, PyObject *);
470static void com_addopname(struct compiling *, int, node *);
471static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000472static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000473static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000474static void com_assign(struct compiling *, node *, int, node *);
475static void com_assign_name(struct compiling *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000476static PyCodeObject *icompile(node *, struct compiling *);
477static PyCodeObject *jcompile(node *, char *, struct compiling *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000478static PyObject *parsestrplus(node *);
479static PyObject *parsestr(char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000480static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000481
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000482static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000483
484/* symtable operations */
485static int symtable_build(struct compiling *, node *);
486static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000487static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000488static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000489static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000490static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000491static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000492
493static void symtable_node(struct symtable *, node *);
494static void symtable_funcdef(struct symtable *, node *);
495static void symtable_default_args(struct symtable *, node *);
496static void symtable_params(struct symtable *, node *);
497static void symtable_params_fplist(struct symtable *, node *n);
498static void symtable_global(struct symtable *, node *);
499static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000500static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000501static void symtable_list_comprehension(struct symtable *, node *);
502
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000503static int symtable_update_free_vars(struct symtable *);
504static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
505static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
506
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000507/* helper */
508static void
509do_pad(int pad)
510{
511 int i;
512 for (i = 0; i < pad; ++i)
513 fprintf(stderr, " ");
514}
515
516static void
517dump(node *n, int pad, int depth)
518{
519 int i;
520 if (depth == 0)
521 return;
522 do_pad(pad);
523 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
524 if (depth > 0)
525 depth--;
526 for (i = 0; i < NCH(n); ++i)
527 dump(CHILD(n, i), pad + 1, depth);
528}
529
530#define DUMP(N) dump(N, 0, -1)
531
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000532static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000533com_init(struct compiling *c, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000534{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000535 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000536 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
537 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000538 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000539 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000540 goto fail;
541 if ((c->c_const_dict = PyDict_New()) == NULL)
542 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000543 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000544 goto fail;
545 if ((c->c_name_dict = PyDict_New()) == NULL)
546 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000547 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000548 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000549 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
550 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000551 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000552 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000553 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000554 c->c_freevars = NULL;
555 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000556 c->c_nlocals = 0;
557 c->c_argcount = 0;
558 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000559 c->c_nexti = 0;
560 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000561 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000562 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000563 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000564 c->c_begin = 0;
565 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000566 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000567 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000568 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000569 c->c_stacklevel = 0;
570 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000571 c->c_firstlineno = 0;
572 c->c_last_addr = 0;
573 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000574 c->c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000575 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000576 c->c_nested = 0;
577 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000578 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000579 return 1;
580
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000581 fail:
582 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000583 return 0;
584}
585
586static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000587com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000588{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000589 Py_XDECREF(c->c_code);
590 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000591 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000592 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000593 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000594 Py_XDECREF(c->c_globals);
595 Py_XDECREF(c->c_locals);
596 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000597 Py_XDECREF(c->c_freevars);
598 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000599 Py_XDECREF(c->c_lnotab);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000600}
601
602static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000603com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000604{
605 c->c_stacklevel += n;
606 if (c->c_stacklevel > c->c_maxstacklevel)
607 c->c_maxstacklevel = c->c_stacklevel;
608}
609
610static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000611com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000612{
613 if (c->c_stacklevel < n) {
Guido van Rossum90f827c1998-08-25 18:22:17 +0000614 /* fprintf(stderr,
Guido van Rossum8b993a91997-01-17 21:04:03 +0000615 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
616 c->c_filename, c->c_lineno,
Guido van Rossum90f827c1998-08-25 18:22:17 +0000617 c->c_nexti, c->c_stacklevel, n); */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000618 c->c_stacklevel = 0;
619 }
620 else
621 c->c_stacklevel -= n;
622}
623
624static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000625com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000626{
627 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000628 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000629 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000630 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000631}
632
633static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000634com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000635{
636 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000637 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000638 assert(byte >= 0 && byte <= 255);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000639 if (byte < 0 || byte > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000640 com_error(c, PyExc_SystemError,
641 "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000642 }
643 if (c->c_code == NULL)
644 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000645 len = PyString_Size(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000646 if (c->c_nexti >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000647 if (_PyString_Resize(&c->c_code, len+1000) != 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000648 c->c_errors++;
649 return;
650 }
651 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000652 PyString_AsString(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000653}
654
655static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000656com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000657{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000658 com_addbyte(c, x & 0xff);
659 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000660}
661
662static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000663com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000664{
665 int size;
666 char *p;
667 if (c->c_lnotab == NULL)
668 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000669 size = PyString_Size(c->c_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000670 if (c->c_lnotab_next+2 > size) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000671 if (_PyString_Resize(&c->c_lnotab, size + 1000) < 0) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000672 c->c_errors++;
673 return;
674 }
675 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000676 p = PyString_AsString(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000677 *p++ = addr;
678 *p++ = line;
679 c->c_lnotab_next += 2;
680}
681
682static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000683com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000684{
685 c->c_lineno = lineno;
686 if (c->c_firstlineno == 0) {
687 c->c_firstlineno = c->c_last_line = lineno;
688 }
689 else {
690 int incr_addr = c->c_nexti - c->c_last_addr;
691 int incr_line = lineno - c->c_last_line;
692 while (incr_addr > 0 || incr_line > 0) {
693 int trunc_addr = incr_addr;
694 int trunc_line = incr_line;
695 if (trunc_addr > 255)
696 trunc_addr = 255;
697 if (trunc_line > 255)
698 trunc_line = 255;
699 com_add_lnotab(c, trunc_addr, trunc_line);
700 incr_addr -= trunc_addr;
701 incr_line -= trunc_line;
702 }
703 c->c_last_addr = c->c_nexti;
704 c->c_last_line = lineno;
705 }
706}
707
708static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000709com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000710{
Fred Drakeef8ace32000-08-24 00:32:09 +0000711 int extended_arg = arg >> 16;
Guido van Rossum8e793d91997-03-03 19:13:14 +0000712 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000713 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000714 if (Py_OptimizeFlag)
715 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000716 }
Fred Drakeef8ace32000-08-24 00:32:09 +0000717 if (extended_arg){
718 com_addbyte(c, EXTENDED_ARG);
719 com_addint(c, extended_arg);
720 arg &= 0xffff;
721 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000722 com_addbyte(c, op);
723 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000724}
725
726static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000727com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000728{
729 /* Compile a forward reference for backpatching */
730 int here;
731 int anchor;
732 com_addbyte(c, op);
733 here = c->c_nexti;
734 anchor = *p_anchor;
735 *p_anchor = here;
736 com_addint(c, anchor == 0 ? 0 : here - anchor);
737}
738
739static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000740com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000741{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000742 unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000743 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000744 int dist;
745 int prev;
746 for (;;) {
747 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000748 prev = code[anchor] + (code[anchor+1] << 8);
749 dist = target - (anchor+2);
750 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +0000751 dist >>= 8;
752 code[anchor+1] = dist;
753 dist >>= 8;
754 if (dist) {
755 com_error(c, PyExc_SystemError,
756 "com_backpatch: offset too large");
757 break;
758 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000759 if (!prev)
760 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000761 anchor -= prev;
762 }
763}
764
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000765/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000766
767static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000768com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000769{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000770 PyObject *w, *t, *np=NULL;
771 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000772
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000773 t = Py_BuildValue("(OO)", v, v->ob_type);
774 if (t == NULL)
775 goto fail;
776 w = PyDict_GetItem(dict, t);
777 if (w != NULL) {
778 n = PyInt_AsLong(w);
779 } else {
780 n = PyList_Size(list);
781 np = PyInt_FromLong(n);
782 if (np == NULL)
783 goto fail;
784 if (PyList_Append(list, v) != 0)
785 goto fail;
786 if (PyDict_SetItem(dict, t, np) != 0)
787 goto fail;
788 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000789 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000790 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000791 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000792 fail:
793 Py_XDECREF(np);
794 Py_XDECREF(t);
795 c->c_errors++;
796 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000797}
798
799static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000800com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000801{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000802 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000803}
804
805static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000806com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000807{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000808 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000809}
810
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000811static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000812mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000813{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000814 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000815 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +0000816 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000817 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
818 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000819 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000820 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000821 return 0; /* Don't mangle __extremely_long_names */
822 if (name[nlen-1] == '_' && name[nlen-2] == '_')
823 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000824 /* Strip leading underscores from class name */
825 while (*p == '_')
826 p++;
827 if (*p == '\0')
828 return 0; /* Don't mangle if class is just underscores */
829 plen = strlen(p);
830 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000831 plen = maxlen-nlen-2; /* Truncate class name if too long */
832 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000833 buffer[0] = '_';
834 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000835 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000836 return 1;
837}
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000838
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000839static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000840com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000841{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000842 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000843 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000844 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000845
846 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000847 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000848 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000849 c->c_errors++;
850 i = 255;
851 }
852 else {
853 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000854 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000855 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000856 com_addoparg(c, op, i);
857}
858
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000859#define NAME_LOCAL 0
860#define NAME_GLOBAL 1
861#define NAME_DEFAULT 2
862#define NAME_CLOSURE 3
863
864static int
865com_lookup_arg(PyObject *dict, PyObject *name)
866{
867 PyObject *v = PyDict_GetItem(dict, name);
868 if (v == NULL)
869 return -1;
870 else
871 return PyInt_AS_LONG(v);
872}
873
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000874static void
875com_addop_varname(struct compiling *c, int kind, char *name)
876{
877 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000878 int i, reftype;
879 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000880 int op = STOP_CODE;
881 char buffer[MANGLE_LEN];
882
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000883 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000884 name = buffer;
885 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
886 c->c_errors++;
887 i = 255;
888 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000889 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000890
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000891 reftype = get_ref_type(c, name);
892 switch (reftype) {
893 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000894 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000895 scope = NAME_LOCAL;
896 break;
897 case GLOBAL_EXPLICIT:
898 scope = NAME_GLOBAL;
899 break;
900 case GLOBAL_IMPLICIT:
901 if (c->c_flags & CO_OPTIMIZED)
902 scope = NAME_GLOBAL;
903 break;
904 case FREE:
905 case CELL:
906 scope = NAME_CLOSURE;
907 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000908 }
909
910 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000911 if (scope == NAME_LOCAL)
912 i = com_lookup_arg(c->c_locals, v);
913 else if (reftype == FREE)
914 i = com_lookup_arg(c->c_freevars, v);
915 else if (reftype == CELL)
916 i = com_lookup_arg(c->c_cellvars, v);
917 if (i == -1) {
918 c->c_errors++; /* XXX no exception set */
919 i = 255;
920 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000921 }
922 Py_DECREF(v);
923
924 switch (kind) {
925 case VAR_LOAD:
926 switch (scope) {
927 case NAME_LOCAL:
928 op = LOAD_FAST;
929 break;
930 case NAME_GLOBAL:
931 op = LOAD_GLOBAL;
932 break;
933 case NAME_DEFAULT:
934 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000935 break;
936 case NAME_CLOSURE:
937 op = LOAD_DEREF;
938 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000939 }
940 break;
941 case VAR_STORE:
942 switch (scope) {
943 case NAME_LOCAL:
944 op = STORE_FAST;
945 break;
946 case NAME_GLOBAL:
947 op = STORE_GLOBAL;
948 break;
949 case NAME_DEFAULT:
950 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000951 break;
952 case NAME_CLOSURE:
953 op = STORE_DEREF;
954 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000955 }
956 break;
957 case VAR_DELETE:
958 switch (scope) {
959 case NAME_LOCAL:
960 op = DELETE_FAST;
961 break;
962 case NAME_GLOBAL:
963 op = DELETE_GLOBAL;
964 break;
965 case NAME_DEFAULT:
966 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000967 break;
968 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000969 char buf[500];
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000970 sprintf(buf, DEL_CLOSURE_ERROR, name);
971 com_error(c, PyExc_SyntaxError, buf);
972 i = 255;
973 break;
974 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000975 }
976 break;
977 }
978done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000979 com_addoparg(c, op, i);
980}
981
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000982static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000983com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000984{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000985 char *name;
986 char buffer[1000];
987 /* XXX it is possible to write this code without the 1000
988 chars on the total length of dotted names, I just can't be
989 bothered right now */
990 if (TYPE(n) == STAR)
991 name = "*";
992 else if (TYPE(n) == dotted_name) {
993 char *p = buffer;
994 int i;
995 name = buffer;
996 for (i = 0; i < NCH(n); i += 2) {
997 char *s = STR(CHILD(n, i));
998 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000999 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001000 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001001 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001002 break;
1003 }
1004 if (p != buffer)
1005 *p++ = '.';
1006 strcpy(p, s);
1007 p = strchr(p, '\0');
1008 }
1009 }
1010 else {
1011 REQ(n, NAME);
1012 name = STR(n);
1013 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001014 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001015}
1016
Guido van Rossum79f25d91997-04-29 20:08:16 +00001017static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001018parsenumber(struct compiling *co, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001019{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001020 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001021 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001022 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001023#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +00001024 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +00001025 int imflag;
1026#endif
1027
Guido van Rossum282914b1991-04-04 10:42:56 +00001028 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001029 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001030#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001031 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001032#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001033 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001034 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001035 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001036 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001037 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001038 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001039 if (*end == '\0') {
1040 if (errno != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001041 com_error(co, PyExc_OverflowError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001042 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +00001043 return NULL;
1044 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001045 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001046 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001047 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001048#ifndef WITHOUT_COMPLEX
1049 if (imflag) {
1050 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001051 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +00001052 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001053 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001054 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +00001055 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001056 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001057#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001058 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001059 PyFPE_START_PROTECT("atof", return 0)
1060 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001061 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001062 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001063 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001064}
1065
Guido van Rossum79f25d91997-04-29 20:08:16 +00001066static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001067parsestr(char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001068{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001069 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001070 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001071 char *buf;
1072 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001073 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001074 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001075 int first = *s;
1076 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001077 int rawmode = 0;
1078 int unicode = 0;
1079 if (isalpha(quote) || quote == '_') {
1080 if (quote == 'u' || quote == 'U') {
1081 quote = *++s;
1082 unicode = 1;
1083 }
1084 if (quote == 'r' || quote == 'R') {
1085 quote = *++s;
1086 rawmode = 1;
1087 }
1088 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001089 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001090 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001091 return NULL;
1092 }
1093 s++;
1094 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001095 if (len > INT_MAX) {
1096 PyErr_SetString(PyExc_OverflowError, "string to parse is too long");
1097 return NULL;
1098 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001099 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001100 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001101 return NULL;
1102 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001103 if (len >= 4 && s[0] == quote && s[1] == quote) {
1104 s += 2;
1105 len -= 2;
1106 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001107 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001108 return NULL;
1109 }
1110 }
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001111 if (unicode || Py_UnicodeFlag) {
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001112 if (rawmode)
1113 return PyUnicode_DecodeRawUnicodeEscape(
1114 s, len, NULL);
1115 else
1116 return PyUnicode_DecodeUnicodeEscape(
1117 s, len, NULL);
1118 }
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001119 if (rawmode || strchr(s, '\\') == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001120 return PyString_FromStringAndSize(s, len);
1121 v = PyString_FromStringAndSize((char *)NULL, len);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001122 if (v == NULL)
1123 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001124 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001125 end = s + len;
1126 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001127 if (*s != '\\') {
1128 *p++ = *s++;
1129 continue;
1130 }
1131 s++;
1132 switch (*s++) {
1133 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001134 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001135 case '\\': *p++ = '\\'; break;
1136 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +00001137 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001138 case 'b': *p++ = '\b'; break;
1139 case 'f': *p++ = '\014'; break; /* FF */
1140 case 't': *p++ = '\t'; break;
1141 case 'n': *p++ = '\n'; break;
1142 case 'r': *p++ = '\r'; break;
1143 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001144 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
1145 case '0': case '1': case '2': case '3':
1146 case '4': case '5': case '6': case '7':
1147 c = s[-1] - '0';
1148 if ('0' <= *s && *s <= '7') {
1149 c = (c<<3) + *s++ - '0';
1150 if ('0' <= *s && *s <= '7')
1151 c = (c<<3) + *s++ - '0';
1152 }
1153 *p++ = c;
1154 break;
1155 case 'x':
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001156 if (isxdigit(Py_CHARMASK(s[0])) && isxdigit(Py_CHARMASK(s[1]))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +00001157 unsigned int x = 0;
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001158 c = Py_CHARMASK(*s);
1159 s++;
1160 if (isdigit(c))
1161 x = c - '0';
1162 else if (islower(c))
1163 x = 10 + c - 'a';
1164 else
1165 x = 10 + c - 'A';
1166 x = x << 4;
1167 c = Py_CHARMASK(*s);
1168 s++;
1169 if (isdigit(c))
1170 x += c - '0';
1171 else if (islower(c))
1172 x += 10 + c - 'a';
1173 else
1174 x += 10 + c - 'A';
Guido van Rossumed1100f1997-10-20 23:24:07 +00001175 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001176 break;
1177 }
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001178 PyErr_SetString(PyExc_ValueError, "invalid \\x escape");
1179 Py_DECREF(v);
1180 return NULL;
1181 default:
1182 *p++ = '\\';
1183 *p++ = s[-1];
1184 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001185 }
1186 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001187 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001188 return v;
1189}
1190
Guido van Rossum79f25d91997-04-29 20:08:16 +00001191static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001192parsestrplus(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001193{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001194 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001195 int i;
1196 REQ(CHILD(n, 0), STRING);
1197 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
1198 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001199 for (i = 1; i < NCH(n); i++) {
1200 PyObject *s;
1201 s = parsestr(STR(CHILD(n, i)));
1202 if (s == NULL)
1203 goto onError;
1204 if (PyString_Check(v) && PyString_Check(s)) {
1205 PyString_ConcatAndDel(&v, s);
1206 if (v == NULL)
1207 goto onError;
1208 }
1209 else {
1210 PyObject *temp;
1211 temp = PyUnicode_Concat(v, s);
1212 Py_DECREF(s);
1213 if (temp == NULL)
1214 goto onError;
1215 Py_DECREF(v);
1216 v = temp;
1217 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001218 }
1219 }
1220 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001221
1222 onError:
1223 Py_XDECREF(v);
1224 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001225}
1226
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001227static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001228com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001229{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001230 PyObject *v;
1231 int anchor = 0;
1232 int save_begin = c->c_begin;
1233
1234 /* list_iter: for v in expr [list_iter] */
1235 com_node(c, CHILD(n, 3)); /* expr */
1236 v = PyInt_FromLong(0L);
1237 if (v == NULL)
1238 c->c_errors++;
1239 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
1240 com_push(c, 1);
1241 Py_XDECREF(v);
1242 c->c_begin = c->c_nexti;
1243 com_addoparg(c, SET_LINENO, n->n_lineno);
1244 com_addfwref(c, FOR_LOOP, &anchor);
1245 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001246 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001247 c->c_loops++;
1248 com_list_iter(c, n, e, t);
1249 c->c_loops--;
1250 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1251 c->c_begin = save_begin;
1252 com_backpatch(c, anchor);
1253 com_pop(c, 2); /* FOR_LOOP has popped these */
1254}
1255
1256static void
1257com_list_if(struct compiling *c, node *n, node *e, char *t)
1258{
1259 int anchor = 0;
1260 int a = 0;
1261 /* list_iter: 'if' test [list_iter] */
1262 com_addoparg(c, SET_LINENO, n->n_lineno);
1263 com_node(c, CHILD(n, 1));
1264 com_addfwref(c, JUMP_IF_FALSE, &a);
1265 com_addbyte(c, POP_TOP);
1266 com_pop(c, 1);
1267 com_list_iter(c, n, e, t);
1268 com_addfwref(c, JUMP_FORWARD, &anchor);
1269 com_backpatch(c, a);
1270 /* We jump here with an extra entry which we now pop */
1271 com_addbyte(c, POP_TOP);
1272 com_backpatch(c, anchor);
1273}
1274
1275static void
1276com_list_iter(struct compiling *c,
1277 node *p, /* parent of list_iter node */
1278 node *e, /* element expression node */
1279 char *t /* name of result list temp local */)
1280{
1281 /* list_iter is the last child in a listmaker, list_for, or list_if */
1282 node *n = CHILD(p, NCH(p)-1);
1283 if (TYPE(n) == list_iter) {
1284 n = CHILD(n, 0);
1285 switch (TYPE(n)) {
1286 case list_for:
1287 com_list_for(c, n, e, t);
1288 break;
1289 case list_if:
1290 com_list_if(c, n, e, t);
1291 break;
1292 default:
1293 com_error(c, PyExc_SystemError,
1294 "invalid list_iter node type");
1295 }
1296 }
1297 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001298 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001299 com_push(c, 1);
1300 com_node(c, e);
1301 com_addoparg(c, CALL_FUNCTION, 1);
1302 com_addbyte(c, POP_TOP);
1303 com_pop(c, 2);
1304 }
1305}
1306
1307static void
1308com_list_comprehension(struct compiling *c, node *n)
1309{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001310 /* listmaker: test list_for */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001311 char tmpname[12];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001312 sprintf(tmpname, "[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001313 com_addoparg(c, BUILD_LIST, 0);
1314 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1315 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001316 com_addop_name(c, LOAD_ATTR, "append");
1317 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001318 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001319 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001320 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001321 --c->c_tmpname;
1322}
1323
1324static void
1325com_listmaker(struct compiling *c, node *n)
1326{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001327 /* listmaker: test ( list_for | (',' test)* [','] ) */
1328 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001329 com_list_comprehension(c, n);
1330 else {
1331 int len = 0;
1332 int i;
1333 for (i = 0; i < NCH(n); i += 2, len++)
1334 com_node(c, CHILD(n, i));
1335 com_addoparg(c, BUILD_LIST, len);
1336 com_pop(c, len-1);
1337 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001338}
1339
1340static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001341com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001342{
1343 int i;
1344 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1345 for (i = 0; i+2 < NCH(n); i += 4) {
1346 /* We must arrange things just right for STORE_SUBSCR.
1347 It wants the stack to look like (value) (dict) (key) */
1348 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001349 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001350 com_node(c, CHILD(n, i+2)); /* value */
1351 com_addbyte(c, ROT_TWO);
1352 com_node(c, CHILD(n, i)); /* key */
1353 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001354 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001355 }
1356}
1357
1358static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001359com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001360{
1361 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001362 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001363 int i;
1364 REQ(n, atom);
1365 ch = CHILD(n, 0);
1366 switch (TYPE(ch)) {
1367 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001368 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001369 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001370 com_push(c, 1);
1371 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001372 else
1373 com_node(c, CHILD(n, 1));
1374 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001375 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001376 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001377 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001378 com_push(c, 1);
1379 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001380 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001381 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001382 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001383 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001384 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001385 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001386 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001387 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001388 break;
1389 case BACKQUOTE:
1390 com_node(c, CHILD(n, 1));
1391 com_addbyte(c, UNARY_CONVERT);
1392 break;
1393 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001394 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001395 i = 255;
1396 }
1397 else {
1398 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001399 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001400 }
1401 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001402 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001403 break;
1404 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001405 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001406 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001407 c->c_errors++;
1408 i = 255;
1409 }
1410 else {
1411 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001412 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001413 }
1414 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001415 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001416 break;
1417 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001418 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001419 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001420 break;
1421 default:
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 Hyltoncb17ae82001-02-09 22:22:18 +00002145 if (co == NULL) {
2146 c->c_errors++;
2147 return;
2148 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002149 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002150 if (co == NULL) {
Guido van Rossum57531fe1993-11-30 14:57:42 +00002151 c->c_errors++;
2152 i = 255;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002153 closure = 0;
2154 } else {
2155 i = com_addconst(c, co);
2156 Py_DECREF(co);
2157 closure = com_make_closure(c, (PyCodeObject *)co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002158 }
2159 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002160 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002161 if (closure)
2162 com_addoparg(c, MAKE_CLOSURE, ndefs);
2163 else
2164 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002165 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002166 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002167 else {
2168 int anchor = 0;
2169 int i = 0;
2170 for (;;) {
2171 com_and_test(c, CHILD(n, i));
2172 if ((i += 2) >= NCH(n))
2173 break;
2174 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2175 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002176 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002177 }
2178 if (anchor)
2179 com_backpatch(c, anchor);
2180 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002181}
2182
2183static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002184com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002185{
2186 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002187 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002188 com_node(c, CHILD(n, 0));
2189 }
2190 else {
2191 int i;
2192 int len;
2193 len = (NCH(n) + 1) / 2;
2194 for (i = 0; i < NCH(n); i += 2)
2195 com_node(c, CHILD(n, i));
2196 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002197 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002198 }
2199}
2200
2201
2202/* Begin of assignment compilation */
2203
Thomas Wouters434d0822000-08-24 20:11:32 +00002204
2205static void
2206com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2207{
2208 com_addbyte(c, DUP_TOP);
2209 com_push(c, 1);
2210 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002211 com_node(c, augn);
2212 com_addbyte(c, opcode);
2213 com_pop(c, 1);
2214 com_addbyte(c, ROT_TWO);
2215 com_addopname(c, STORE_ATTR, n);
2216 com_pop(c, 2);
2217}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002218
2219static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002220com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002221{
2222 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002223 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002224}
2225
2226static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002227com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002228{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002229 REQ(n, trailer);
2230 switch (TYPE(CHILD(n, 0))) {
2231 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002232 com_error(c, PyExc_SyntaxError,
2233 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002234 break;
2235 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002236 if (assigning > OP_APPLY)
2237 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2238 else
2239 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002240 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002241 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002242 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002243 break;
2244 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002245 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002246 }
2247}
2248
2249static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002250com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002251{
2252 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002253 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002254 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002255 if (assigning) {
2256 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002257 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002258 com_push(c, i-1);
2259 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002260 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002261 com_assign(c, CHILD(n, i), assigning, NULL);
2262}
2263
2264static void
2265com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2266{
2267 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002268 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002269 com_push(c, 1);
2270 com_node(c, augn);
2271 com_addbyte(c, opcode);
2272 com_pop(c, 1);
2273 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002274}
2275
2276static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002277com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002278{
2279 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002280 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002281 if (assigning)
2282 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002283}
2284
2285static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002286com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002287{
2288 /* Loop to avoid trivial recursion */
2289 for (;;) {
2290 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002291
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002292 case exprlist:
2293 case testlist:
2294 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002295 if (assigning > OP_APPLY) {
2296 com_error(c, PyExc_SyntaxError,
2297 "augmented assign to tuple not possible");
2298 return;
2299 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002300 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002301 return;
2302 }
2303 n = CHILD(n, 0);
2304 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002305
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002306 case test:
2307 case and_test:
2308 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002309 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002310 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002311 case xor_expr:
2312 case and_expr:
2313 case shift_expr:
2314 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002315 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002316 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002317 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002318 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002319 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002320 return;
2321 }
2322 n = CHILD(n, 0);
2323 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002324
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002325 case power: /* atom trailer* ('**' power)*
2326 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002327 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002328 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002329 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002330 return;
2331 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002332 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002333 int i;
2334 com_node(c, CHILD(n, 0));
2335 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002336 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002337 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002338 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002339 return;
2340 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002341 com_apply_trailer(c, CHILD(n, i));
2342 } /* NB i is still alive */
2343 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002344 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002345 return;
2346 }
2347 n = CHILD(n, 0);
2348 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002349
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002350 case atom:
2351 switch (TYPE(CHILD(n, 0))) {
2352 case LPAR:
2353 n = CHILD(n, 1);
2354 if (TYPE(n) == RPAR) {
2355 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002356 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002357 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002358 return;
2359 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002360 if (assigning > OP_APPLY) {
2361 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002362 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002363 return;
2364 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002365 break;
2366 case LSQB:
2367 n = CHILD(n, 1);
2368 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002369 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002370 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002371 return;
2372 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002373 if (assigning > OP_APPLY) {
2374 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002375 "augmented assign to list not possible");
2376 return;
2377 }
2378 if (NCH(n) > 1
2379 && TYPE(CHILD(n, 1)) == list_for) {
2380 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002381 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002382 return;
2383 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002384 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002385 return;
2386 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002387 if (assigning > OP_APPLY)
2388 com_augassign_name(c, CHILD(n, 0),
2389 assigning, augn);
2390 else
2391 com_assign_name(c, CHILD(n, 0),
2392 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002393 return;
2394 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002395 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002396 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002397 return;
2398 }
2399 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002400
2401 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002402 com_error(c, PyExc_SyntaxError,
2403 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002404 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002405
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002406 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002407 com_error(c, PyExc_SystemError,
2408 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002409 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002410
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002411 }
2412 }
2413}
Guido van Rossum7c531111997-03-11 18:42:21 +00002414
Thomas Wouters434d0822000-08-24 20:11:32 +00002415static void
2416com_augassign(struct compiling *c, node *n)
2417{
2418 int opcode;
2419
2420 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2421 case '+': opcode = INPLACE_ADD; break;
2422 case '-': opcode = INPLACE_SUBTRACT; break;
2423 case '/': opcode = INPLACE_DIVIDE; break;
2424 case '%': opcode = INPLACE_MODULO; break;
2425 case '<': opcode = INPLACE_LSHIFT; break;
2426 case '>': opcode = INPLACE_RSHIFT; break;
2427 case '&': opcode = INPLACE_AND; break;
2428 case '^': opcode = INPLACE_XOR; break;
2429 case '|': opcode = INPLACE_OR; break;
2430 case '*':
2431 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2432 opcode = INPLACE_POWER;
2433 else
2434 opcode = INPLACE_MULTIPLY;
2435 break;
2436 default:
2437 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2438 return;
2439 }
2440 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2441}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002442
2443static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002444com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002445{
Thomas Wouters434d0822000-08-24 20:11:32 +00002446 REQ(n, expr_stmt);
2447 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002448 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002449 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002450 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002451 if (NCH(n) == 1) {
2452 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002453 if (c->c_interactive)
2454 com_addbyte(c, PRINT_EXPR);
2455 else
2456 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002457 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002458 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002459 else if (TYPE(CHILD(n,1)) == augassign)
2460 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002461 else {
2462 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002463 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002464 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002465 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002466 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002467 com_push(c, 1);
2468 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002469 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002470 }
2471 }
2472}
2473
2474static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002475com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002476{
2477 int a = 0, b = 0;
2478 int i;
2479 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2480 /* Generate code like for
2481
2482 if __debug__:
2483 if not <test>:
2484 raise AssertionError [, <message>]
2485
2486 where <message> is the second test, if present.
2487 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002488
Guido van Rossum228d7f31997-04-02 05:24:36 +00002489 if (Py_OptimizeFlag)
2490 return;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002491 com_addop_name(c, LOAD_GLOBAL, "__debug__");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002492 com_push(c, 1);
2493 com_addfwref(c, JUMP_IF_FALSE, &a);
2494 com_addbyte(c, POP_TOP);
2495 com_pop(c, 1);
2496 com_node(c, CHILD(n, 1));
2497 com_addfwref(c, JUMP_IF_TRUE, &b);
2498 com_addbyte(c, POP_TOP);
2499 com_pop(c, 1);
2500 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002501 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002502 com_push(c, 1);
2503 i = NCH(n)/2; /* Either 2 or 4 */
2504 if (i > 1)
2505 com_node(c, CHILD(n, 3));
2506 com_addoparg(c, RAISE_VARARGS, i);
2507 com_pop(c, i);
2508 /* The interpreter does not fall through */
2509 /* All jumps converge here */
2510 com_backpatch(c, a);
2511 com_backpatch(c, b);
2512 com_addbyte(c, POP_TOP);
2513}
2514
2515static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002516com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002517{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002518 int i = 1;
2519 node* stream = NULL;
2520
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002521 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002522
2523 /* are we using the extended print form? */
2524 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2525 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002526 com_node(c, stream);
2527 /* stack: [...] => [... stream] */
2528 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002529 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2530 i = 4;
2531 else
2532 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002533 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002534 for (; i < NCH(n); i += 2) {
2535 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002536 com_addbyte(c, DUP_TOP);
2537 /* stack: [stream] => [stream stream] */
2538 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002539 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002540 /* stack: [stream stream] => [stream stream obj] */
2541 com_addbyte(c, ROT_TWO);
2542 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002543 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002544 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002545 com_pop(c, 2);
2546 }
2547 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002548 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002549 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002550 com_addbyte(c, PRINT_ITEM);
2551 com_pop(c, 1);
2552 }
2553 }
2554 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002555 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002556 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002557 /* must pop the extra stream object off the stack */
2558 com_addbyte(c, POP_TOP);
2559 /* stack: [... stream] => [...] */
2560 com_pop(c, 1);
2561 }
2562 }
2563 else {
2564 if (stream != NULL) {
2565 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002566 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002567 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002568 com_pop(c, 1);
2569 }
2570 else
2571 com_addbyte(c, PRINT_NEWLINE);
2572 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002573}
2574
2575static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002576com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002577{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002578 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002579 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002580 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002581 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002582 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002583 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002584 com_push(c, 1);
2585 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002586 else
2587 com_node(c, CHILD(n, 1));
2588 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002589 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002590}
2591
2592static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002593com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002594{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002595 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002596 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2597 if (NCH(n) > 1) {
2598 com_node(c, CHILD(n, 1));
2599 if (NCH(n) > 3) {
2600 com_node(c, CHILD(n, 3));
2601 if (NCH(n) > 5)
2602 com_node(c, CHILD(n, 5));
2603 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002604 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002605 i = NCH(n)/2;
2606 com_addoparg(c, RAISE_VARARGS, i);
2607 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002608}
2609
2610static void
Thomas Wouters52152252000-08-17 22:55:00 +00002611com_from_import(struct compiling *c, node *n)
2612{
2613 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2614 com_push(c, 1);
2615 if (NCH(n) > 1) {
2616 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2617 com_error(c, PyExc_SyntaxError, "invalid syntax");
2618 return;
2619 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002620 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002621 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002622 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00002623 com_pop(c, 1);
2624}
2625
2626static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002627com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002628{
2629 int i;
2630 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002631 /* 'import' dotted_name (',' dotted_name)* |
2632 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002633 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00002634 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002635 /* 'from' dotted_name 'import' ... */
2636 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002637
2638 if (TYPE(CHILD(n, 3)) == STAR) {
2639 tup = Py_BuildValue("(s)", "*");
2640 } else {
2641 tup = PyTuple_New((NCH(n) - 2)/2);
2642 for (i = 3; i < NCH(n); i += 2) {
2643 PyTuple_SET_ITEM(tup, (i-3)/2,
2644 PyString_FromString(STR(
2645 CHILD(CHILD(n, i), 0))));
2646 }
2647 }
2648 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00002649 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002650 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002651 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00002652 if (TYPE(CHILD(n, 3)) == STAR)
2653 com_addbyte(c, IMPORT_STAR);
2654 else {
2655 for (i = 3; i < NCH(n); i += 2)
2656 com_from_import(c, CHILD(n, i));
2657 com_addbyte(c, POP_TOP);
2658 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002659 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002660 }
2661 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002662 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002663 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00002664 node *subn = CHILD(n, i);
2665 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002666 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002667 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002668 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00002669 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00002670 int j;
2671 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00002672 com_error(c, PyExc_SyntaxError,
2673 "invalid syntax");
2674 return;
2675 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00002676 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
2677 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002678 CHILD(CHILD(subn, 0),
2679 j));
2680 com_addop_varname(c, VAR_STORE,
2681 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002682 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002683 com_addop_varname(c, VAR_STORE,
2684 STR(CHILD(CHILD(subn, 0),
2685 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002686 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002687 }
2688 }
2689}
2690
2691static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002692com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002693{
2694 REQ(n, exec_stmt);
2695 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2696 com_node(c, CHILD(n, 1));
2697 if (NCH(n) >= 4)
2698 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002699 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002700 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002701 com_push(c, 1);
2702 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002703 if (NCH(n) >= 6)
2704 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002705 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002706 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002707 com_push(c, 1);
2708 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002709 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002710 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002711}
2712
Guido van Rossum7c531111997-03-11 18:42:21 +00002713static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002714is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002715{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002716 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002717 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002718 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00002719
2720 /* Label to avoid tail recursion */
2721 next:
2722 switch (TYPE(n)) {
2723
2724 case suite:
2725 if (NCH(n) == 1) {
2726 n = CHILD(n, 0);
2727 goto next;
2728 }
2729 /* Fall through */
2730 case file_input:
2731 for (i = 0; i < NCH(n); i++) {
2732 node *ch = CHILD(n, i);
2733 if (TYPE(ch) == stmt) {
2734 n = ch;
2735 goto next;
2736 }
2737 }
2738 break;
2739
2740 case stmt:
2741 case simple_stmt:
2742 case small_stmt:
2743 n = CHILD(n, 0);
2744 goto next;
2745
2746 case expr_stmt:
2747 case testlist:
2748 case test:
2749 case and_test:
2750 case not_test:
2751 case comparison:
2752 case expr:
2753 case xor_expr:
2754 case and_expr:
2755 case shift_expr:
2756 case arith_expr:
2757 case term:
2758 case factor:
2759 case power:
2760 case atom:
2761 if (NCH(n) == 1) {
2762 n = CHILD(n, 0);
2763 goto next;
2764 }
2765 break;
2766
2767 case NAME:
2768 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2769 return 1;
2770 break;
2771
2772 case NUMBER:
2773 v = parsenumber(c, STR(n));
2774 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002775 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002776 break;
2777 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002778 i = PyObject_IsTrue(v);
2779 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002780 return i == 0;
2781
2782 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002783 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002784 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002785 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002786 break;
2787 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002788 i = PyObject_IsTrue(v);
2789 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002790 return i == 0;
2791
2792 }
2793 return 0;
2794}
2795
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002796static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002797com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002798{
2799 int i;
2800 int anchor = 0;
2801 REQ(n, if_stmt);
2802 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2803 for (i = 0; i+3 < NCH(n); i+=4) {
2804 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002805 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002806 if (is_constant_false(c, ch))
2807 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002808 if (i > 0)
2809 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002810 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002811 com_addfwref(c, JUMP_IF_FALSE, &a);
2812 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002813 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002814 com_node(c, CHILD(n, i+3));
2815 com_addfwref(c, JUMP_FORWARD, &anchor);
2816 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002817 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002818 com_addbyte(c, POP_TOP);
2819 }
2820 if (i+2 < NCH(n))
2821 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002822 if (anchor)
2823 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002824}
2825
2826static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002827com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002828{
2829 int break_anchor = 0;
2830 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002831 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002832 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2833 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002834 block_push(c, SETUP_LOOP);
2835 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002836 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002837 com_node(c, CHILD(n, 1));
2838 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2839 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002840 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002841 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002842 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002843 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002844 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2845 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002846 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002847 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002848 com_addbyte(c, POP_TOP);
2849 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002850 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002851 if (NCH(n) > 4)
2852 com_node(c, CHILD(n, 6));
2853 com_backpatch(c, break_anchor);
2854}
2855
2856static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002857com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002858{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002859 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002860 int break_anchor = 0;
2861 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002862 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002863 REQ(n, for_stmt);
2864 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2865 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002866 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002867 com_node(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002868 v = PyInt_FromLong(0L);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002869 if (v == NULL)
2870 c->c_errors++;
2871 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002872 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002873 Py_XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002874 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002875 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002876 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002877 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00002878 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002879 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002880 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002881 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002882 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2883 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002884 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002885 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002886 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002887 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002888 if (NCH(n) > 8)
2889 com_node(c, CHILD(n, 8));
2890 com_backpatch(c, break_anchor);
2891}
2892
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002893/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002894
2895 SETUP_FINALLY L
2896 <code for S>
2897 POP_BLOCK
2898 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002899 L: <code for Sf>
2900 END_FINALLY
2901
2902 The special instructions use the block stack. Each block
2903 stack entry contains the instruction that created it (here
2904 SETUP_FINALLY), the level of the value stack at the time the
2905 block stack entry was created, and a label (here L).
2906
2907 SETUP_FINALLY:
2908 Pushes the current value stack level and the label
2909 onto the block stack.
2910 POP_BLOCK:
2911 Pops en entry from the block stack, and pops the value
2912 stack until its level is the same as indicated on the
2913 block stack. (The label is ignored.)
2914 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002915 Pops a variable number of entries from the *value* stack
2916 and re-raises the exception they specify. The number of
2917 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002918
2919 The block stack is unwound when an exception is raised:
2920 when a SETUP_FINALLY entry is found, the exception is pushed
2921 onto the value stack (and the exception condition is cleared),
2922 and the interpreter jumps to the label gotten from the block
2923 stack.
2924
2925 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002926 (The contents of the value stack is shown in [], with the top
2927 at the right; 'tb' is trace-back info, 'val' the exception's
2928 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002929
2930 Value stack Label Instruction Argument
2931 [] SETUP_EXCEPT L1
2932 [] <code for S>
2933 [] POP_BLOCK
2934 [] JUMP_FORWARD L0
2935
Guido van Rossum3f5da241990-12-20 15:06:42 +00002936 [tb, val, exc] L1: DUP )
2937 [tb, val, exc, exc] <evaluate E1> )
2938 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2939 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2940 [tb, val, exc, 1] POP )
2941 [tb, val, exc] POP
2942 [tb, val] <assign to V1> (or POP if no V1)
2943 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002944 [] <code for S1>
2945 JUMP_FORWARD L0
2946
Guido van Rossum3f5da241990-12-20 15:06:42 +00002947 [tb, val, exc, 0] L2: POP
2948 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002949 .............................etc.......................
2950
Guido van Rossum3f5da241990-12-20 15:06:42 +00002951 [tb, val, exc, 0] Ln+1: POP
2952 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002953
2954 [] L0: <next statement>
2955
2956 Of course, parts are not generated if Vi or Ei is not present.
2957*/
2958
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002959static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002960com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002961{
2962 int except_anchor = 0;
2963 int end_anchor = 0;
2964 int else_anchor = 0;
2965 int i;
2966 node *ch;
2967
2968 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2969 block_push(c, SETUP_EXCEPT);
2970 com_node(c, CHILD(n, 2));
2971 com_addbyte(c, POP_BLOCK);
2972 block_pop(c, SETUP_EXCEPT);
2973 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2974 com_backpatch(c, except_anchor);
2975 for (i = 3;
2976 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2977 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002978 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002979 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002980 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002981 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002982 break;
2983 }
2984 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002985 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002986 com_addoparg(c, SET_LINENO, ch->n_lineno);
2987 if (NCH(ch) > 1) {
2988 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002989 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002990 com_node(c, CHILD(ch, 1));
2991 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002992 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002993 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
2994 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002995 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002996 }
2997 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002998 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002999 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003000 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003001 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003002 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003003 com_pop(c, 1);
3004 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003005 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003006 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003007 com_node(c, CHILD(n, i+2));
3008 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3009 if (except_anchor) {
3010 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003011 /* We come in with [tb, val, exc, 0] on the
3012 stack; one pop and it's the same as
3013 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003014 com_addbyte(c, POP_TOP);
3015 }
3016 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003017 /* We actually come in here with [tb, val, exc] but the
3018 END_FINALLY will zap those and jump around.
3019 The c_stacklevel does not reflect them so we need not pop
3020 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003021 com_addbyte(c, END_FINALLY);
3022 com_backpatch(c, else_anchor);
3023 if (i < NCH(n))
3024 com_node(c, CHILD(n, i+2));
3025 com_backpatch(c, end_anchor);
3026}
3027
3028static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003029com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003030{
3031 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003032 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003033
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003034 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3035 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003036 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003037 com_addbyte(c, POP_BLOCK);
3038 block_pop(c, SETUP_FINALLY);
3039 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003040 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003041 /* While the generated code pushes only one item,
3042 the try-finally handling can enter here with
3043 up to three items. OK, here are the details:
3044 3 for an exception, 2 for RETURN, 1 for BREAK. */
3045 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003046 com_backpatch(c, finally_anchor);
3047 ch = CHILD(n, NCH(n)-1);
3048 com_addoparg(c, SET_LINENO, ch->n_lineno);
3049 com_node(c, ch);
3050 com_addbyte(c, END_FINALLY);
3051 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003052 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003053}
3054
3055static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003056com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003057{
3058 REQ(n, try_stmt);
3059 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3060 | 'try' ':' suite 'finally' ':' suite */
3061 if (TYPE(CHILD(n, 3)) != except_clause)
3062 com_try_finally(c, n);
3063 else
3064 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003065}
3066
Guido van Rossum8b993a91997-01-17 21:04:03 +00003067static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003068get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003069{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003070 int i;
3071
Guido van Rossum8b993a91997-01-17 21:04:03 +00003072 /* Label to avoid tail recursion */
3073 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003074 switch (TYPE(n)) {
3075
3076 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003077 if (NCH(n) == 1) {
3078 n = CHILD(n, 0);
3079 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003080 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003081 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003082 case file_input:
3083 for (i = 0; i < NCH(n); i++) {
3084 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003085 if (TYPE(ch) == stmt) {
3086 n = ch;
3087 goto next;
3088 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003089 }
3090 break;
3091
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003092 case stmt:
3093 case simple_stmt:
3094 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003095 n = CHILD(n, 0);
3096 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003097
3098 case expr_stmt:
3099 case testlist:
3100 case test:
3101 case and_test:
3102 case not_test:
3103 case comparison:
3104 case expr:
3105 case xor_expr:
3106 case and_expr:
3107 case shift_expr:
3108 case arith_expr:
3109 case term:
3110 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003111 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003112 if (NCH(n) == 1) {
3113 n = CHILD(n, 0);
3114 goto next;
3115 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003116 break;
3117
3118 case atom:
3119 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003120 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003121 break;
3122
3123 }
3124 return NULL;
3125}
3126
Guido van Rossum79f25d91997-04-29 20:08:16 +00003127static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003128get_docstring(node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003129{
Guido van Rossum541563e1999-01-28 15:08:09 +00003130 /* Don't generate doc-strings if run with -OO */
3131 if (Py_OptimizeFlag > 1)
3132 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003133 n = get_rawdocstring(n);
3134 if (n == NULL)
3135 return NULL;
3136 return parsestrplus(n);
3137}
3138
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003139static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003140com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003141{
3142 REQ(n, suite);
3143 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3144 if (NCH(n) == 1) {
3145 com_node(c, CHILD(n, 0));
3146 }
3147 else {
3148 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003149 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003150 node *ch = CHILD(n, i);
3151 if (TYPE(ch) == stmt)
3152 com_node(c, ch);
3153 }
3154 }
3155}
3156
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003157/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003158static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003159com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003160{
3161 int i = c->c_nblocks;
3162 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3163 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3164 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003165 else if (i <= 0) {
3166 /* at the outer level */
3167 com_error(c, PyExc_SyntaxError,
3168 "'continue' not properly in loop");
3169 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003170 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003171 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003172 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003173 if (c->c_block[j] == SETUP_LOOP)
3174 break;
3175 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003176 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003177 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003178 for (; i > j; --i) {
3179 if (c->c_block[i] == SETUP_EXCEPT ||
3180 c->c_block[i] == SETUP_FINALLY) {
3181 com_addoparg(c, CONTINUE_LOOP,
3182 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003183 return;
3184 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003185 if (c->c_block[i] == END_FINALLY) {
3186 com_error(c, PyExc_SyntaxError,
3187 "'continue' not supported inside 'finally' clause");
3188 return;
3189 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003190 }
3191 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003192 com_error(c, PyExc_SyntaxError,
3193 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003194 }
3195 /* XXX Could allow it inside a 'finally' clause
3196 XXX if we could pop the exception still on the stack */
3197}
3198
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003199static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003200com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003201{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003202 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003203 if (TYPE(n) == lambdef) {
3204 /* lambdef: 'lambda' [varargslist] ':' test */
3205 n = CHILD(n, 1);
3206 }
3207 else {
3208 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3209 n = CHILD(n, 2);
3210 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3211 n = CHILD(n, 1);
3212 }
3213 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003214 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003215 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003216 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003217 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3218 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003219 nargs = 0;
3220 ndefs = 0;
3221 for (i = 0; i < nch; i++) {
3222 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003223 if (TYPE(CHILD(n, i)) == STAR ||
3224 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003225 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003226 nargs++;
3227 i++;
3228 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003229 t = RPAR; /* Anything except EQUAL or COMMA */
3230 else
3231 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003232 if (t == EQUAL) {
3233 i++;
3234 ndefs++;
3235 com_node(c, CHILD(n, i));
3236 i++;
3237 if (i >= nch)
3238 break;
3239 t = TYPE(CHILD(n, i));
3240 }
3241 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003242 /* Treat "(a=1, b)" as an error */
3243 if (ndefs)
3244 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003245 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003246 }
3247 if (t != COMMA)
3248 break;
3249 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003250 return ndefs;
3251}
3252
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003253static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003254com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003255{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003256 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003257 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003258 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003259 ndefs = com_argdefs(c, n);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003260 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3261 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003262 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003263 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003264 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003265 c->c_errors++;
3266 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003267 int closure = com_make_closure(c, (PyCodeObject *)co);
3268 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003269 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003270 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003271 if (closure)
3272 com_addoparg(c, MAKE_CLOSURE, ndefs);
3273 else
3274 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003275 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003276 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003277 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003278 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003279 }
3280}
3281
3282static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003283com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003284{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003285 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003286 REQ(n, testlist);
3287 /* testlist: test (',' test)* [','] */
3288 for (i = 0; i < NCH(n); i += 2)
3289 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003290 i = (NCH(n)+1) / 2;
3291 com_addoparg(c, BUILD_TUPLE, i);
3292 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003293}
3294
3295static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003296com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003297{
Guido van Rossum25831651993-05-19 14:50:45 +00003298 int i;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003299 PyObject *co, *v;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003300 char *name;
3301
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003302 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003303 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003304 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003305 c->c_errors++;
3306 return;
3307 }
3308 /* Push the class name on the stack */
3309 i = com_addconst(c, v);
3310 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003311 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003312 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003313 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003314 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003315 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003316 com_push(c, 1);
3317 }
Guido van Rossum25831651993-05-19 14:50:45 +00003318 else
3319 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003320 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003321 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003322 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003323 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003324 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003325 c->c_errors++;
3326 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003327 int closure = com_make_closure(c, (PyCodeObject *)co);
3328 i = com_addconst(c, co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003329 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003330 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003331 if (closure)
3332 com_addoparg(c, MAKE_CLOSURE, 0);
3333 else
3334 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003335 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003336 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003337 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003338 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003339 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003340 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003341}
3342
3343static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003344com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003345{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003346 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003347 if (c->c_errors)
3348 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003349 switch (TYPE(n)) {
3350
3351 /* Definition nodes */
3352
3353 case funcdef:
3354 com_funcdef(c, n);
3355 break;
3356 case classdef:
3357 com_classdef(c, n);
3358 break;
3359
3360 /* Trivial parse tree nodes */
3361
3362 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003363 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003364 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003365 n = CHILD(n, 0);
3366 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003367
3368 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003369 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
3370 com_addoparg(c, SET_LINENO, n->n_lineno);
3371 {
3372 int i;
3373 for (i = 0; i < NCH(n)-1; i += 2)
3374 com_node(c, CHILD(n, i));
3375 }
3376 break;
3377
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003378 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003379 com_addoparg(c, SET_LINENO, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003380 n = CHILD(n, 0);
3381 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003382
3383 /* Statement nodes */
3384
3385 case expr_stmt:
3386 com_expr_stmt(c, n);
3387 break;
3388 case print_stmt:
3389 com_print_stmt(c, n);
3390 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003391 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003392 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003393 break;
3394 case pass_stmt:
3395 break;
3396 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003397 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003398 com_error(c, PyExc_SyntaxError,
3399 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003400 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003401 com_addbyte(c, BREAK_LOOP);
3402 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003403 case continue_stmt:
3404 com_continue_stmt(c, n);
3405 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003406 case return_stmt:
3407 com_return_stmt(c, n);
3408 break;
3409 case raise_stmt:
3410 com_raise_stmt(c, n);
3411 break;
3412 case import_stmt:
3413 com_import_stmt(c, n);
3414 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003415 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003416 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003417 case exec_stmt:
3418 com_exec_stmt(c, n);
3419 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003420 case assert_stmt:
3421 com_assert_stmt(c, n);
3422 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003423 case if_stmt:
3424 com_if_stmt(c, n);
3425 break;
3426 case while_stmt:
3427 com_while_stmt(c, n);
3428 break;
3429 case for_stmt:
3430 com_for_stmt(c, n);
3431 break;
3432 case try_stmt:
3433 com_try_stmt(c, n);
3434 break;
3435 case suite:
3436 com_suite(c, n);
3437 break;
3438
3439 /* Expression nodes */
3440
3441 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003442 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003443 break;
3444 case test:
3445 com_test(c, n);
3446 break;
3447 case and_test:
3448 com_and_test(c, n);
3449 break;
3450 case not_test:
3451 com_not_test(c, n);
3452 break;
3453 case comparison:
3454 com_comparison(c, n);
3455 break;
3456 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003457 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003458 break;
3459 case expr:
3460 com_expr(c, n);
3461 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003462 case xor_expr:
3463 com_xor_expr(c, n);
3464 break;
3465 case and_expr:
3466 com_and_expr(c, n);
3467 break;
3468 case shift_expr:
3469 com_shift_expr(c, n);
3470 break;
3471 case arith_expr:
3472 com_arith_expr(c, n);
3473 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003474 case term:
3475 com_term(c, n);
3476 break;
3477 case factor:
3478 com_factor(c, n);
3479 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003480 case power:
3481 com_power(c, n);
3482 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003483 case atom:
3484 com_atom(c, n);
3485 break;
3486
3487 default:
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
3523static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003524com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003525{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003526 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003527 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003528 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003529 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003530 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003531 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003532 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003533 /* Enter all arguments in table of locals */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003534 for (i = 0, narg = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003535 node *ch = CHILD(n, i);
3536 node *fp;
3537 char *name;
Guido van Rossum50564e81996-01-12 01:13:16 +00003538 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003539 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003540 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3541 fp = CHILD(ch, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003542 if (TYPE(fp) == NAME) {
3543 PyObject *v;
3544 name = STR(fp);
3545 v = PyDict_GetItemString(c->c_cellvars, name);
3546 if (v) {
3547 com_addoparg(c, LOAD_FAST, narg);
3548 com_addoparg(c, STORE_DEREF,
3549 PyInt_AS_LONG(v));
3550 }
3551 } else {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003552 name = nbuf;
3553 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003554 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003555 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003556 narg++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003557 /* all name updates handled by symtable */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003558 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003559 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003560 ch = CHILD(n, i);
3561 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003562 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003563 else
3564 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003565 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003566 /* Handle *arguments */
3567 if (i < nch) {
3568 node *ch;
3569 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003570 if (TYPE(ch) != DOUBLESTAR) {
3571 REQ(ch, STAR);
3572 ch = CHILD(n, i+1);
3573 if (TYPE(ch) == NAME) {
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003574 PyObject *v;
Guido van Rossum50564e81996-01-12 01:13:16 +00003575 i += 3;
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003576 v = PyDict_GetItemString(c->c_cellvars,
3577 STR(ch));
3578 if (v) {
3579 com_addoparg(c, LOAD_FAST, narg);
3580 com_addoparg(c, STORE_DEREF,
3581 PyInt_AS_LONG(v));
Guido van Rossum50564e81996-01-12 01:13:16 +00003582 }
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003583 narg++;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003584 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003585 }
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003586 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003587 /* Handle **keywords */
3588 if (i < nch) {
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003589 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003590 node *ch;
3591 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003592 if (TYPE(ch) != DOUBLESTAR) {
3593 REQ(ch, STAR);
3594 ch = CHILD(n, i+1);
3595 REQ(ch, STAR);
3596 ch = CHILD(n, i+2);
3597 }
3598 else
3599 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003600 REQ(ch, NAME);
Jeremy Hylton6492bf72001-02-09 22:55:26 +00003601 v = PyDict_GetItemString(c->c_cellvars, STR(ch));
3602 if (v) {
3603 com_addoparg(c, LOAD_FAST, narg);
3604 com_addoparg(c, STORE_DEREF, PyInt_AS_LONG(v));
3605 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003606 }
3607 if (complex) {
3608 /* Generate code for complex arguments only after
3609 having counted the simple arguments */
3610 int ilocal = 0;
3611 for (i = 0; i < nch; i++) {
3612 node *ch = CHILD(n, i);
3613 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003614 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003615 break;
3616 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3617 fp = CHILD(ch, 0);
3618 if (TYPE(fp) != NAME) {
3619 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003620 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003621 com_fpdef(c, ch);
3622 }
3623 ilocal++;
3624 if (++i >= nch)
3625 break;
3626 ch = CHILD(n, i);
3627 if (TYPE(ch) == EQUAL)
3628 i += 2;
3629 else
3630 REQ(ch, COMMA);
3631 }
3632 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003633}
3634
3635static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003636com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003637{
3638 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003639 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003640 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003641 doc = get_docstring(n);
3642 if (doc != NULL) {
3643 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003644 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003645 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003646 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003647 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003648 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003649 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003650 for (i = 0; i < NCH(n); i++) {
3651 node *ch = CHILD(n, i);
3652 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3653 com_node(c, ch);
3654 }
3655}
3656
3657/* Top-level compile-node interface */
3658
3659static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003660compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003661{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003662 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003663 node *ch;
3664 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003665 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003666 doc = get_docstring(CHILD(n, 4));
3667 if (doc != NULL) {
3668 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003669 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003670 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003671 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003672 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003673 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3674 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003675 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003676 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003677 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003678 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003679 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003680 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003681 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003682 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003683 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003684}
3685
3686static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003687compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003688{
Guido van Rossum590baa41993-11-30 13:40:46 +00003689 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003690 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003691 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003692
3693 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003694 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003695 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003696 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003697 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003698 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003699 else
3700 ch = CHILD(n, 2);
3701 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003702 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003703 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003704}
3705
3706static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003707compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003708{
3709 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003710 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003711 REQ(n, classdef);
3712 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3713 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003714 c->c_private = c->c_name;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003715 ch = CHILD(n, NCH(n)-1); /* The suite */
3716 doc = get_docstring(ch);
3717 if (doc != NULL) {
3718 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003719 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003720 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003721 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003722 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003723 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003724 }
3725 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003726 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003727 com_node(c, ch);
3728 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003729 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003730 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003731 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003732}
3733
3734static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003735compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003736{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003737 com_addoparg(c, SET_LINENO, n->n_lineno);
3738
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003739 switch (TYPE(n)) {
3740
Guido van Rossum4c417781991-01-21 16:09:22 +00003741 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003742 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003743 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003744 n = CHILD(n, 0);
3745 if (TYPE(n) != NEWLINE)
3746 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003747 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003748 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003749 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003750 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003751 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003752 break;
3753
Guido van Rossum4c417781991-01-21 16:09:22 +00003754 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003755 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003756 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003757 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003758 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003759 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003760 break;
3761
Guido van Rossum590baa41993-11-30 13:40:46 +00003762 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003763 com_node(c, CHILD(n, 0));
3764 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003765 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003766 break;
3767
Guido van Rossum590baa41993-11-30 13:40:46 +00003768 case lambdef: /* anonymous function definition */
3769 compile_lambdef(c, n);
3770 break;
3771
Guido van Rossum4c417781991-01-21 16:09:22 +00003772 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003773 compile_funcdef(c, n);
3774 break;
3775
Guido van Rossum4c417781991-01-21 16:09:22 +00003776 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003777 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003778 break;
3779
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003780 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003781 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003782 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003783 }
3784}
3785
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003786static PyObject *
3787dict_keys_inorder(PyObject *dict, int offset)
3788{
3789 PyObject *tuple, *k, *v;
3790 int i, pos = 0, size = PyDict_Size(dict);
3791
3792 tuple = PyTuple_New(size);
3793 if (tuple == NULL)
3794 return NULL;
3795 while (PyDict_Next(dict, &pos, &k, &v)) {
3796 i = PyInt_AS_LONG(v);
3797 Py_INCREF(k);
3798 PyTuple_SET_ITEM(tuple, i - offset, k);
3799 }
3800 return tuple;
3801}
3802
Guido van Rossum79f25d91997-04-29 20:08:16 +00003803PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003804PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003805{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003806 return jcompile(n, filename, NULL);
3807}
3808
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003809struct symtable *
3810PyNode_CompileSymtable(node *n, char *filename)
3811{
3812 struct symtable *st;
3813
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003814 st = symtable_init();
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003815 if (st == NULL)
3816 return NULL;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00003817 assert(st->st_symbols != NULL);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003818 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
3819 if (st->st_errors > 0) {
3820 PySymtable_Free(st);
3821 return NULL;
3822 }
3823 symtable_node(st, n);
3824 if (st->st_errors > 0) {
3825 PySymtable_Free(st);
3826 return NULL;
3827 }
3828 return st;
3829}
3830
Guido van Rossum79f25d91997-04-29 20:08:16 +00003831static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003832icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003833{
3834 return jcompile(n, base->c_filename, base);
3835}
3836
Guido van Rossum79f25d91997-04-29 20:08:16 +00003837static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003838jcompile(node *n, char *filename, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003839{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003840 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003841 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003842 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003843 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003844 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003845 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003846 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003847 /* c_symtable still points to parent's symbols */
3848 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003849 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003850 sc.c_nested = 1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003851 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003852 sc.c_private = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003853 if (symtable_build(&sc, n) < 0) {
3854 com_free(&sc);
3855 return NULL;
3856 }
3857 }
3858 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003859 if (symtable_load_symbols(&sc) < 0) {
3860 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003861 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003862 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003863 compile_node(&sc, n);
3864 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00003865 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003866 PyObject *consts, *names, *varnames, *filename, *name,
3867 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003868 consts = PyList_AsTuple(sc.c_consts);
3869 names = PyList_AsTuple(sc.c_names);
3870 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003871 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
3872 freevars = dict_keys_inorder(sc.c_freevars,
3873 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003874 filename = PyString_InternFromString(sc.c_filename);
3875 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003876 if (!PyErr_Occurred())
3877 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003878 sc.c_nlocals,
3879 sc.c_maxstacklevel,
3880 sc.c_flags,
3881 sc.c_code,
3882 consts,
3883 names,
3884 varnames,
3885 freevars,
3886 cellvars,
3887 filename,
3888 name,
3889 sc.c_firstlineno,
3890 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003891 Py_XDECREF(consts);
3892 Py_XDECREF(names);
3893 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003894 Py_XDECREF(freevars);
3895 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003896 Py_XDECREF(filename);
3897 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003898 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00003899 else if (!PyErr_Occurred()) {
3900 /* This could happen if someone called PyErr_Clear() after an
3901 error was reported above. That's not supposed to happen,
3902 but I just plugged one case and I'm not sure there can't be
3903 others. In that case, raise SystemError so that at least
3904 it gets reported instead dumping core. */
3905 PyErr_SetString(PyExc_SystemError, "lost syntax error");
3906 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003907 exit:
3908 if (base == NULL)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003909 PySymtable_Free(sc.c_symtable);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003910 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003911 return co;
3912}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003913
3914int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003915PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003916{
3917 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003918 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003919 int line = co->co_firstlineno;
3920 int addr = 0;
3921 while (--size >= 0) {
3922 addr += *p++;
3923 if (addr > addrq)
3924 break;
3925 line += *p++;
3926 }
3927 return line;
3928}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003929
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003930/* The test for LOCAL must come before the test for FREE in order to
3931 handle classes where name is both local and free. The local var is
3932 a method and the free var is a free var referenced within a method.
3933*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003934
3935static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003936get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003937{
3938 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003939 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
3940 return CELL;
3941 if (PyDict_GetItemString(c->c_locals, name) != NULL)
3942 return LOCAL;
3943 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
3944 return FREE;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003945 v = PyDict_GetItemString(c->c_globals, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003946 if (v) {
3947 if (v == Py_None)
3948 return GLOBAL_EXPLICIT;
3949 else {
3950 return GLOBAL_IMPLICIT;
3951 }
3952 }
3953 {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003954 char buf[350];
3955 sprintf(buf,
3956 "unknown scope for %.100s in %.100s(%s) in %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00003957 name, c->c_name,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003958 PyObject_REPR(c->c_symtable->st_cur->ste_id),
3959 c->c_filename);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003960 Py_FatalError(buf);
3961 }
3962 return -1; /* can't get here */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003963}
3964
3965static int
3966symtable_build(struct compiling *c, node *n)
3967{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003968 if ((c->c_symtable = symtable_init()) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003969 return -1;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00003970 c->c_symtable->st_filename = c->c_filename;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003971 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
3972 if (c->c_symtable->st_errors > 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003973 return -1;
3974 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00003975 if (c->c_symtable->st_errors > 0)
3976 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003977 /* reset for second pass */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003978 c->c_symtable->st_nscopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003979 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003980 return 0;
3981}
3982
3983static int
3984symtable_load_symbols(struct compiling *c)
3985{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003986 static PyObject *implicit = NULL;
3987 PyObject *name, *varnames, *v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003988 int i, flags, pos;
3989 int nlocals, nfrees, ncells, nimplicit;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003990 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003991 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003992
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003993 if (implicit == NULL) {
3994 implicit = PyInt_FromLong(1);
3995 if (implicit == NULL)
3996 return -1;
3997 }
3998 v = NULL;
3999
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004000 varnames = st->st_cur->ste_varnames;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004001 if (varnames == NULL) {
4002 varnames = PyList_New(0);
4003 if (varnames == NULL)
4004 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004005 ste->ste_varnames = varnames;
4006 Py_INCREF(varnames);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004007 } else
4008 Py_INCREF(varnames);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004009 c->c_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004010
4011 c->c_globals = PyDict_New();
4012 if (c->c_globals == NULL)
4013 goto fail;
4014 c->c_freevars = PyDict_New();
4015 if (c->c_freevars == NULL)
4016 goto fail;
4017 c->c_cellvars = PyDict_New();
4018 if (c->c_cellvars == NULL)
4019 goto fail;
4020
4021 nlocals = PyList_GET_SIZE(varnames);
4022 c->c_argcount = nlocals;
4023 nfrees = 0;
4024 ncells = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004025 nimplicit = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004026 for (i = 0; i < nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004027 v = PyInt_FromLong(i);
4028 if (PyDict_SetItem(c->c_locals,
4029 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004030 goto fail;
4031 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004032 }
4033
4034 /* XXX The cases below define the rules for whether a name is
4035 local or global. The logic could probably be clearer. */
4036 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004037 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4038 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004039
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004040 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004041 /* undo the original DEF_FREE */
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004042 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004043
4044 /* Seperate logic for DEF_FREE. If it occurs in a
4045 function, it indicates a local that we must
4046 allocate storage for (a cell var). If it occurs in
4047 a class, then the class has a method and a free
4048 variable with the same name.
4049 */
4050
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004051 if ((flags & (DEF_FREE | DEF_FREE_CLASS))
4052 && (flags & (DEF_LOCAL | DEF_PARAM))) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004053 PyObject *dict;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004054 if (ste->ste_type == TYPE_FUNCTION) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004055 v = PyInt_FromLong(ncells++);
4056 dict = c->c_cellvars;
4057 } else {
4058 v = PyInt_FromLong(nfrees++);
4059 dict = c->c_freevars;
4060 }
4061 if (v == NULL)
4062 return -1;
4063 if (PyDict_SetItem(dict, name, v) < 0)
4064 goto fail;
4065 Py_DECREF(v);
4066 }
4067
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004068 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004069 c->c_argcount--;
4070 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004071 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004072 c->c_argcount--;
4073 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004074 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004075 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004076 else if (flags & DEF_GLOBAL) {
4077 if ((flags & DEF_PARAM)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004078 && (PyString_AS_STRING(name)[0] != '.')){
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004079 PyErr_Format(PyExc_SyntaxError,
4080 "name '%.400s' is local and global",
4081 PyString_AS_STRING(name));
4082 set_error_location(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004083 ste->ste_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004084 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004085 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004086 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4087 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004088 } else if (flags & DEF_FREE_GLOBAL) {
4089 nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004090 if (PyDict_SetItem(c->c_globals, name, implicit) < 0)
4091 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004092 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004093 v = PyInt_FromLong(nlocals++);
4094 if (v == NULL)
4095 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004096 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004097 goto fail;
4098 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004099 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004100 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004101 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004102 } else if (is_free(flags)) {
4103 if (ste->ste_nested) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004104 v = PyInt_FromLong(nfrees++);
4105 if (v == NULL)
4106 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004107 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004108 goto fail;
4109 Py_DECREF(v);
4110 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004111 nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004112 if (PyDict_SetItem(c->c_globals, name,
4113 implicit) < 0)
4114 goto fail;
4115 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004116 }
4117 }
4118
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004119 /* The cell vars are the first elements of the closure,
4120 followed by the free vars. Update the offsets in
4121 c_freevars to account for number of cellvars. */
4122 pos = 0;
4123 while (PyDict_Next(c->c_freevars, &pos, &name, &v)) {
4124 int i = PyInt_AS_LONG(v) + ncells;
4125 PyObject *o = PyInt_FromLong(i);
4126 if (PyDict_SetItem(c->c_freevars, name, o) < 0) {
4127 Py_DECREF(o);
4128 return -1;
4129 }
4130 Py_DECREF(o);
4131 }
4132
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004133 if (ste->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004134 c->c_nlocals = nlocals;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004135
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004136 if (ste->ste_type != TYPE_MODULE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004137 c->c_flags |= CO_NEWLOCALS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004138 if (ste->ste_type == TYPE_FUNCTION) {
4139 if (ste->ste_optimized)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004140 c->c_flags |= CO_OPTIMIZED;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004141 else if (ncells || nfrees
4142 || (ste->ste_nested && nimplicit)
4143 || ste->ste_child_free) {
4144 PyErr_Format(PyExc_SyntaxError, ILLEGAL_DYNAMIC_SCOPE,
4145 PyString_AS_STRING(ste->ste_name));
4146 set_error_location(st->st_filename, ste->ste_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004147 return -1;
4148 }
4149 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004150
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004151 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004152
4153 fail:
4154 /* is this always the right thing to do? */
4155 Py_XDECREF(v);
4156 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004157}
4158
4159static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004160symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004161{
4162 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004163
4164 st = (struct symtable *)PyMem_Malloc(sizeof(struct symtable));
4165 if (st == NULL)
4166 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004167 st->st_pass = 1;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004168 st->st_filename = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004169 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004170 goto fail;
4171 if ((st->st_symbols = PyDict_New()) == NULL)
4172 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004173 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004174 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004175 st->st_errors = 0;
4176 st->st_tmpname = 0;
4177 st->st_private = NULL;
4178 return st;
4179 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004180 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004181 return NULL;
4182}
4183
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004184void
4185PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004186{
4187 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004188 Py_XDECREF(st->st_stack);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004189 PyMem_Free((void *)st);
4190}
4191
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004192/* When the compiler exits a scope, it must should update the scope's
4193 free variable information with the list of free variables in its
4194 children.
4195
4196 Variables that are free in children and defined in the current
4197 scope are cellvars.
4198
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004199 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004200 false), free variables in children that are not defined here are
4201 implicit globals.
4202
4203*/
4204
4205static int
4206symtable_update_free_vars(struct symtable *st)
4207{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004208 int i, j, def;
4209 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004210 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004211
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004212 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004213 def = DEF_FREE_CLASS;
4214 else
4215 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004216 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004217 int pos = 0;
4218
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004219 if (list)
4220 PyList_SetSlice(list, 0,
4221 ((PyVarObject*)list)->ob_size, 0);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004222 child = (PySymtableEntryObject *)\
4223 PyList_GET_ITEM(ste->ste_children, i);
4224 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004225 int v = PyInt_AS_LONG(o);
4226 if (!(is_free(v)))
4227 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004228 if (list == NULL) {
4229 list = PyList_New(0);
4230 if (list == NULL)
4231 return -1;
4232 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004233 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004234 if (PyList_Append(list, name) < 0) {
4235 Py_DECREF(list);
4236 return -1;
4237 }
4238 }
4239 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
4240 name = PyList_GET_ITEM(list, j);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004241 if (ste->ste_nested) {
4242 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004243 name, def) < 0) {
4244 Py_DECREF(list);
4245 return -1;
4246 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004247 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004248 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004249 name) < 0) {
4250 Py_DECREF(list);
4251 return -1;
4252 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004253 }
4254 }
4255 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004256
4257 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004258 return 0;
4259}
4260
4261/* If the current scope is a non-nested class or if name is not
4262 defined in the current, non-nested scope, then it is an implicit
4263 global in all nested scopes.
4264*/
4265
4266static int
4267symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
4268{
4269 PyObject *o;
4270 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004271 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004272
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004273 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004274 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004275 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004276 if (o == NULL)
4277 return symtable_undo_free(st, child, name);
4278 v = PyInt_AS_LONG(o);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004279 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004280 return symtable_undo_free(st, child, name);
4281 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004282 return symtable_add_def_o(st, ste->ste_symbols,
4283 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004284}
4285
4286static int
4287symtable_undo_free(struct symtable *st, PyObject *id,
4288 PyObject *name)
4289{
4290 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004291 PyObject *info;
4292 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004293
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004294 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
4295 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004296 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004297 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004298 if (info == NULL)
4299 return 0;
4300 v = PyInt_AS_LONG(info);
4301 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004302 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004303 DEF_FREE_GLOBAL) < 0)
4304 return -1;
4305 } else
4306 /* If the name is defined here or declared global,
4307 then the recursion stops. */
4308 return 0;
4309
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004310 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
4311 PySymtableEntryObject *child;
4312 child = (PySymtableEntryObject *) \
4313 PyList_GET_ITEM(ste->ste_children, i);
4314 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004315 if (x < 0)
4316 return x;
4317 }
4318 return 0;
4319}
4320
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004321static int
4322symtable_exit_scope(struct symtable *st)
4323{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004324 int end;
4325
4326 if (st->st_pass == 1)
4327 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004328 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004329 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004330 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
4331 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004332 if (PySequence_DelItem(st->st_stack, end) < 0)
4333 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004334 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004335}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004336
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004337static void
4338symtable_enter_scope(struct symtable *st, char *name, int type,
4339 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004340{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004341 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004342
4343 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004344 prev = st->st_cur;
4345 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
4346 Py_DECREF(st->st_cur);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004347 st->st_errors++;
4348 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004349 }
4350 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004351 st->st_cur = (PySymtableEntryObject *)\
4352 PySymtableEntry_New(st, name, type, lineno);
4353 if (strcmp(name, TOP) == 0)
4354 st->st_global = st->st_cur->ste_symbols;
4355 if (prev)
4356 if (PyList_Append(prev->ste_children,
4357 (PyObject *)st->st_cur) < 0)
4358 st->st_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004359}
4360
4361static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004362symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004363{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004364 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004365 char buffer[MANGLE_LEN];
4366
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004367 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004368 name = buffer;
4369 if ((s = PyString_InternFromString(name)) == NULL)
4370 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004371 return symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004372}
4373
4374/* Must only be called with mangled names */
4375
4376static int
4377symtable_add_def_o(struct symtable *st, PyObject *dict,
4378 PyObject *name, int flag)
4379{
4380 PyObject *o;
4381 int val;
4382
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004383 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004384 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004385 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004386 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00004387 PyString_AsString(name));
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004388 set_error_location(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004389 st->st_cur->ste_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004390 return -1;
4391 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004392 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004393 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004394 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004395 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004396 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004397 Py_DECREF(o);
4398 return -1;
4399 }
4400 Py_DECREF(o);
4401
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004402 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004403 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004404 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004405 } else if (flag & DEF_GLOBAL) {
4406 /* XXX need to update DEF_GLOBAL for other flags too;
4407 perhaps only DEF_FREE_GLOBAL */
4408 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004409 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004410 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004411 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004412 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004413 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004414 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004415 Py_DECREF(o);
4416 return -1;
4417 }
4418 Py_DECREF(o);
4419 }
4420 return 0;
4421}
4422
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004423#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004424
4425static void
4426symtable_node(struct symtable *st, node *n)
4427{
4428 int i, start = 0;
4429
4430 loop:
4431 switch (TYPE(n)) {
4432 case funcdef: {
4433 char *func_name = STR(CHILD(n, 1));
4434 symtable_add_def(st, func_name, DEF_LOCAL);
4435 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004436 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004437 symtable_funcdef(st, n);
4438 symtable_exit_scope(st);
4439 break;
4440 }
4441 case lambdef:
4442 if (NCH(n) == 4)
4443 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004444 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004445 symtable_funcdef(st, n);
4446 symtable_exit_scope(st);
4447 break;
4448 case classdef: {
4449 char *tmp, *class_name = STR(CHILD(n, 1));
4450 symtable_add_def(st, class_name, DEF_LOCAL);
4451 if (TYPE(CHILD(n, 2)) == LPAR) {
4452 node *bases = CHILD(n, 3);
4453 int i;
4454 for (i = 0; i < NCH(bases); i += 2) {
4455 symtable_node(st, CHILD(bases, i));
4456 }
4457 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004458 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004459 tmp = st->st_private;
4460 st->st_private = class_name;
4461 symtable_node(st, CHILD(n, NCH(n) - 1));
4462 st->st_private = tmp;
4463 symtable_exit_scope(st);
4464 break;
4465 }
4466 case if_stmt:
4467 for (i = 0; i + 3 < NCH(n); i += 4) {
4468 if (is_constant_false(NULL, (CHILD(n, i + 1))))
4469 continue;
4470 symtable_node(st, CHILD(n, i + 1));
4471 symtable_node(st, CHILD(n, i + 3));
4472 }
4473 if (i + 2 < NCH(n))
4474 symtable_node(st, CHILD(n, i + 2));
4475 break;
4476 case global_stmt:
4477 symtable_global(st, n);
4478 break;
4479 case import_stmt:
4480 symtable_import(st, n);
4481 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004482 case exec_stmt: {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004483 st->st_cur->ste_optimized = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004484 symtable_node(st, CHILD(n, 1));
4485 if (NCH(n) > 2)
4486 symtable_node(st, CHILD(n, 3));
4487 if (NCH(n) > 4)
4488 symtable_node(st, CHILD(n, 5));
4489 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004490
4491 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004492 case except_clause:
4493 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004494 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004495 if (NCH(n) > 1) {
4496 n = CHILD(n, 1);
4497 goto loop;
4498 }
4499 break;
4500 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004501 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004502 break;
4503 case expr_stmt:
4504 if (NCH(n) == 1)
4505 n = CHILD(n, 0);
4506 else {
4507 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004508 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004509 symtable_node(st, CHILD(n, 2));
4510 break;
4511 } else {
4512 int i;
4513 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004514 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004515 n = CHILD(n, NCH(n) - 1);
4516 }
4517 }
4518 goto loop;
4519 /* watchout for fall-through logic below */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004520 case argument:
4521 if (NCH(n) == 3) {
4522 n = CHILD(n, 2);
4523 goto loop;
4524 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004525 case listmaker:
4526 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
4527 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton5f827f42001-01-23 01:26:20 +00004528 n = CHILD(n, 0);
4529 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004530 }
4531 case atom:
4532 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
4533 symtable_add_use(st, STR(CHILD(n, 0)));
4534 break;
4535 }
4536 case for_stmt:
4537 if (TYPE(n) == for_stmt) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004538 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004539 start = 3;
4540 }
4541 default:
4542 if (NCH(n) == 1) {
4543 n = CHILD(n, 0);
4544 goto loop;
4545 }
4546 for (i = start; i < NCH(n); ++i)
4547 if (TYPE(CHILD(n, i)) >= single_input)
4548 symtable_node(st, CHILD(n, i));
4549 }
4550}
4551
4552static void
4553symtable_funcdef(struct symtable *st, node *n)
4554{
4555 node *body;
4556
4557 if (TYPE(n) == lambdef) {
4558 if (NCH(n) == 4)
4559 symtable_params(st, CHILD(n, 1));
4560 } else
4561 symtable_params(st, CHILD(n, 2));
4562 body = CHILD(n, NCH(n) - 1);
4563 symtable_node(st, body);
4564}
4565
4566/* The next two functions parse the argument tuple.
4567 symtable_default_arg() checks for names in the default arguments,
4568 which are references in the defining scope. symtable_params()
4569 parses the parameter names, which are defined in the function's
4570 body.
4571
4572 varargslist:
4573 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
4574 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
4575*/
4576
4577static void
4578symtable_default_args(struct symtable *st, node *n)
4579{
4580 node *c;
4581 int i;
4582
4583 if (TYPE(n) == parameters) {
4584 n = CHILD(n, 1);
4585 if (TYPE(n) == RPAR)
4586 return;
4587 }
4588 REQ(n, varargslist);
4589 for (i = 0; i < NCH(n); i += 2) {
4590 c = CHILD(n, i);
4591 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
4592 break;
4593 }
4594 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
4595 symtable_node(st, CHILD(n, i));
4596 }
4597}
4598
4599static void
4600symtable_params(struct symtable *st, node *n)
4601{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004602 int i, complex = -1, ext = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004603 node *c = NULL;
4604
4605 if (TYPE(n) == parameters) {
4606 n = CHILD(n, 1);
4607 if (TYPE(n) == RPAR)
4608 return;
4609 }
4610 REQ(n, varargslist);
4611 for (i = 0; i < NCH(n); i += 2) {
4612 c = CHILD(n, i);
4613 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
4614 ext = 1;
4615 break;
4616 }
4617 if (TYPE(c) == test) {
4618 continue;
4619 }
4620 if (TYPE(CHILD(c, 0)) == NAME)
4621 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
4622 else {
4623 char nbuf[10];
4624 sprintf(nbuf, ".%d", i);
4625 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004626 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004627 }
4628 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004629 if (ext) {
4630 c = CHILD(n, i);
4631 if (TYPE(c) == STAR) {
4632 i++;
4633 symtable_add_def(st, STR(CHILD(n, i)),
4634 DEF_PARAM | DEF_STAR);
4635 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00004636 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004637 c = NULL;
4638 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004639 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004640 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004641 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004642 i++;
4643 symtable_add_def(st, STR(CHILD(n, i)),
4644 DEF_PARAM | DEF_DOUBLESTAR);
4645 }
4646 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004647 if (complex >= 0) {
4648 int j;
4649 for (j = 0; j <= complex; j++) {
4650 c = CHILD(n, j);
4651 if (TYPE(c) == COMMA)
4652 c = CHILD(n, ++j);
4653 if (TYPE(CHILD(c, 0)) == LPAR)
4654 symtable_params_fplist(st, CHILD(c, 1));
4655 }
4656 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004657}
4658
4659static void
4660symtable_params_fplist(struct symtable *st, node *n)
4661{
4662 int i;
4663 node *c;
4664
4665 REQ(n, fplist);
4666 for (i = 0; i < NCH(n); i += 2) {
4667 c = CHILD(n, i);
4668 REQ(c, fpdef);
4669 if (NCH(c) == 1)
4670 symtable_add_def(st, STR(CHILD(c, 0)),
4671 DEF_PARAM | DEF_INTUPLE);
4672 else
4673 symtable_params_fplist(st, CHILD(c, 1));
4674 }
4675
4676}
4677
4678static void
4679symtable_global(struct symtable *st, node *n)
4680{
4681 int i;
4682
4683 for (i = 1; i < NCH(n); i += 2)
4684 symtable_add_def(st, STR(CHILD(n, i)), DEF_GLOBAL);
4685}
4686
4687static void
4688symtable_list_comprehension(struct symtable *st, node *n)
4689{
4690 char tmpname[12];
4691
4692 sprintf(tmpname, "[%d]", ++st->st_tmpname);
4693 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004694 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004695 symtable_node(st, CHILD(n, 3));
4696 if (NCH(n) == 5)
4697 symtable_node(st, CHILD(n, 4));
4698 --st->st_tmpname;
4699}
4700
4701static void
4702symtable_import(struct symtable *st, node *n)
4703{
4704 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004705 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004706 | 'from' dotted_name 'import'
4707 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00004708 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004709 */
4710
4711 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
4712 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004713 st->st_cur->ste_optimized = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004714 } else {
4715 for (i = 3; i < NCH(n); i += 2) {
4716 node *c = CHILD(n, i);
4717 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004718 symtable_assign(st, CHILD(c, 2),
4719 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004720 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004721 symtable_assign(st, CHILD(c, 0),
4722 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004723 }
4724 }
4725 } else {
4726 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004727 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004728 }
4729 }
4730}
4731
4732static void
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004733symtable_assign(struct symtable *st, node *n, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004734{
4735 node *tmp;
4736 int i;
4737
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004738 loop:
4739 switch (TYPE(n)) {
4740 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004741 /* invalid assignment, e.g. lambda x:x=2. The next
4742 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004743 return;
4744 case power:
4745 if (NCH(n) > 2) {
4746 for (i = 2; i < NCH(n); ++i)
4747 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
4748 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004749 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004750 if (NCH(n) > 1) {
4751 symtable_node(st, CHILD(n, 0));
4752 symtable_node(st, CHILD(n, 1));
4753 } else {
4754 n = CHILD(n, 0);
4755 goto loop;
4756 }
4757 return;
4758 case listmaker:
4759 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
4760 symtable_list_comprehension(st, CHILD(n, 1));
4761 else {
4762 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004763 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004764 }
4765 return;
4766 case exprlist:
4767 case testlist:
4768 if (NCH(n) == 1) {
4769 n = CHILD(n, 0);
4770 goto loop;
4771 }
4772 else {
4773 int i;
4774 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004775 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004776 return;
4777 }
4778 goto loop;
4779 case atom:
4780 tmp = CHILD(n, 0);
4781 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
4782 n = CHILD(n, 1);
4783 goto loop;
4784 } else if (TYPE(tmp) == NAME)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004785 symtable_add_def(st, STR(tmp), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004786 return;
4787 case dotted_as_name:
4788 if (NCH(n) == 3)
4789 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004790 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004791 else
4792 symtable_add_def(st,
4793 STR(CHILD(CHILD(n,
4794 0), 0)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004795 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004796 return;
4797 case dotted_name:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004798 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004799 return;
4800 case NAME:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004801 symtable_add_def(st, STR(n), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004802 return;
4803 default:
4804 if (NCH(n) == 0)
4805 return;
4806 if (NCH(n) != 1) {
4807 DUMP(n);
4808 Py_FatalError("too many children in default case\n");
4809 }
4810 n = CHILD(n, 0);
4811 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004812 }
4813}