blob: 68f9e7f98c16fdf5e1795cc9bb3ec45a1d212124 [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'
Guido van Rossum8b993a91997-01-17 21:04:03 +00008 XXX Allow 'continue' inside 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"
19#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000020#include "structmember.h"
21
22#include <ctype.h>
Guido van Rossum282914b1991-04-04 10:42:56 +000023
Guido van Rossumb05a5c71997-05-07 17:46:13 +000024/* Three symbols from graminit.h are also defined in Python.h, with
25 Py_ prefixes to their names. Python.h can't include graminit.h
26 (which defines too many confusing symbols), but we can check here
27 that they haven't changed (which is very unlikely, but possible). */
28#if Py_single_input != single_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000029 #error "single_input has changed -- update Py_single_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000030#endif
31#if Py_file_input != file_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000032 #error "file_input has changed -- update Py_file_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000033#endif
34#if Py_eval_input != eval_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000035 #error "eval_input has changed -- update Py_eval_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000036#endif
37
Guido van Rossum8e793d91997-03-03 19:13:14 +000038int Py_OptimizeFlag = 0;
39
Guido van Rossum8861b741996-07-30 16:49:37 +000040#define OP_DELETE 0
41#define OP_ASSIGN 1
42#define OP_APPLY 2
43
Jeremy Hyltone36f7782001-01-19 03:21:30 +000044#define VAR_LOAD 0
45#define VAR_STORE 1
46#define VAR_DELETE 2
47
Jeremy Hylton64949cb2001-01-25 20:06:59 +000048#define TYPE_FUNCTION 1
49#define TYPE_CLASS 2
50#define TYPE_MODULE 3
Jeremy Hyltone36f7782001-01-19 03:21:30 +000051
Jeremy Hylton64949cb2001-01-25 20:06:59 +000052#define LOCAL 1
53#define GLOBAL_EXPLICIT 2
54#define GLOBAL_IMPLICIT 3
55#define FREE 4
56#define CELL 5
Jeremy Hyltone36f7782001-01-19 03:21:30 +000057
Jeremy Hylton64949cb2001-01-25 20:06:59 +000058#define DEL_CLOSURE_ERROR \
Jeremy Hyltoneab156f2001-01-30 01:24:43 +000059"can not delete variable '%.400s' referenced in nested scope"
60
61#define DUPLICATE_ARGUMENT \
62"duplicate argument '%s' in function definition"
63
64#define ILLEGAL_IMPORT_STAR \
65"'from ... import *' may only occur in a module scope"
66
Jeremy Hyltone36f7782001-01-19 03:21:30 +000067#define MANGLE_LEN 256
68
Guido van Rossum79f25d91997-04-29 20:08:16 +000069#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000070
71static struct memberlist code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000072 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
73 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000074 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000075 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000076 {"co_code", T_OBJECT, OFF(co_code), READONLY},
77 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
78 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000079 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Jeremy Hylton64949cb2001-01-25 20:06:59 +000080 {"co_freevars", T_OBJECT, OFF(co_freevars), READONLY},
81 {"co_cellvars", T_OBJECT, OFF(co_cellvars), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000082 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000083 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000084 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
85 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000086 {NULL} /* Sentinel */
87};
88
Guido van Rossum79f25d91997-04-29 20:08:16 +000089static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000090code_getattr(PyCodeObject *co, char *name)
Guido van Rossum3f5da241990-12-20 15:06:42 +000091{
Guido van Rossum79f25d91997-04-29 20:08:16 +000092 return PyMember_Get((char *)co, code_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +000093}
Guido van Rossum10dc2e81990-11-18 17:27:39 +000094
95static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000096code_dealloc(PyCodeObject *co)
Guido van Rossum10dc2e81990-11-18 17:27:39 +000097{
Guido van Rossum79f25d91997-04-29 20:08:16 +000098 Py_XDECREF(co->co_code);
99 Py_XDECREF(co->co_consts);
100 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +0000101 Py_XDECREF(co->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000102 Py_XDECREF(co->co_freevars);
103 Py_XDECREF(co->co_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000104 Py_XDECREF(co->co_filename);
105 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +0000106 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000107 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000108}
109
Guido van Rossum79f25d91997-04-29 20:08:16 +0000110static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000111code_repr(PyCodeObject *co)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000112{
113 char buf[500];
114 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000115 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000116 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000117
Guido van Rossuma396a882000-04-07 01:21:36 +0000118 if (co->co_firstlineno != 0)
119 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000120 if (co->co_filename && PyString_Check(co->co_filename))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000121 filename = PyString_AS_STRING(co->co_filename);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000122 if (co->co_name && PyString_Check(co->co_name))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000123 name = PyString_AS_STRING(co->co_name);
Fred Drake615ae552000-06-30 16:20:13 +0000124 sprintf(buf, "<code object %.100s at %p, file \"%.300s\", line %d>",
125 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000126 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000127}
128
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000129static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000130code_compare(PyCodeObject *co, PyCodeObject *cp)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000131{
132 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000133 cmp = PyObject_Compare(co->co_name, cp->co_name);
134 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000135 cmp = co->co_argcount - cp->co_argcount;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000136 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000137 cmp = co->co_nlocals - cp->co_nlocals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000138 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000139 cmp = co->co_flags - cp->co_flags;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000140 if (cmp) return cmp;
Guido van Rossumd076c731998-10-07 19:42:25 +0000141 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000142 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000143 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000144 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000145 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000146 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000147 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000148 if (cmp) return cmp;
149 cmp = PyObject_Compare(co->co_freevars, cp->co_freevars);
150 if (cmp) return cmp;
151 cmp = PyObject_Compare(co->co_cellvars, cp->co_cellvars);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000152 return cmp;
153}
154
155static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000156code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000157{
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000158 long h, h0, h1, h2, h3, h4, h5, h6;
Guido van Rossum44679592000-04-10 16:20:31 +0000159 h0 = PyObject_Hash(co->co_name);
160 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000161 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000162 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000163 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000164 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000165 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000166 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000167 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000168 if (h4 == -1) return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000169 h5 = PyObject_Hash(co->co_freevars);
170 if (h5 == -1) return -1;
171 h6 = PyObject_Hash(co->co_cellvars);
172 if (h6 == -1) return -1;
173 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^ h5 ^ h6 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000174 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000175 if (h == -1) h = -2;
176 return h;
177}
178
Guido van Rossum79f25d91997-04-29 20:08:16 +0000179PyTypeObject PyCode_Type = {
180 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000181 0,
182 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000183 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000184 0,
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000185 (destructor)code_dealloc, /*tp_dealloc*/
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000186 0, /*tp_print*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000187 (getattrfunc)code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000188 0, /*tp_setattr*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000189 (cmpfunc)code_compare, /*tp_compare*/
190 (reprfunc)code_repr, /*tp_repr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000191 0, /*tp_as_number*/
192 0, /*tp_as_sequence*/
193 0, /*tp_as_mapping*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000194 (hashfunc)code_hash, /*tp_hash*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000195};
196
Guido van Rossum644a12b1997-04-09 19:24:53 +0000197#define NAME_CHARS \
198 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
199
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000200/* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
201
202static int
203all_name_chars(unsigned char *s)
204{
205 static char ok_name_char[256];
Tim Peters7f3e4ad2001-01-20 05:15:26 +0000206 static unsigned char *name_chars = (unsigned char *)NAME_CHARS;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000207
208 if (ok_name_char[*name_chars] == 0) {
209 unsigned char *p;
210 for (p = name_chars; *p; p++)
211 ok_name_char[*p] = 1;
212 }
213 while (*s) {
214 if (ok_name_char[*s++] == 0)
215 return 0;
216 }
217 return 1;
218}
219
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000220static int
221intern_strings(PyObject *tuple)
222{
223 int i;
224
225 for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) {
226 PyObject *v = PyTuple_GET_ITEM(tuple, i);
227 if (v == NULL || !PyString_Check(v)) {
228 Py_FatalError("non-string found in code slot");
229 PyErr_BadInternalCall();
230 return -1;
231 }
232 PyString_InternInPlace(&PyTuple_GET_ITEM(tuple, i));
233 }
234 return 0;
235}
236
Guido van Rossum79f25d91997-04-29 20:08:16 +0000237PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000238PyCode_New(int argcount, int nlocals, int stacksize, int flags,
239 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000240 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
241 PyObject *filename, PyObject *name, int firstlineno,
242 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000243{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000244 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000245 int i;
Guido van Rossumd076c731998-10-07 19:42:25 +0000246 PyBufferProcs *pb;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000247 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000248 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000249 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000250 consts == NULL || !PyTuple_Check(consts) ||
251 names == NULL || !PyTuple_Check(names) ||
252 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000253 freevars == NULL || !PyTuple_Check(freevars) ||
254 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000255 name == NULL || !PyString_Check(name) ||
256 filename == NULL || !PyString_Check(filename) ||
257 lnotab == NULL || !PyString_Check(lnotab)) {
258 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000259 return NULL;
260 }
Guido van Rossumd076c731998-10-07 19:42:25 +0000261 pb = code->ob_type->tp_as_buffer;
262 if (pb == NULL ||
263 pb->bf_getreadbuffer == NULL ||
264 pb->bf_getsegcount == NULL ||
265 (*pb->bf_getsegcount)(code, NULL) != 1)
266 {
267 PyErr_BadInternalCall();
268 return NULL;
269 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000270 intern_strings(names);
271 intern_strings(varnames);
272 if (freevars == NULL)
273 freevars = PyTuple_New(0);
274 intern_strings(freevars);
275 if (cellvars == NULL)
276 cellvars = PyTuple_New(0);
277 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000278 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000279 for (i = PyTuple_Size(consts); --i >= 0; ) {
280 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000281 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000282 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000283 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000284 continue;
285 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000286 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000287 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000288 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000289 co->co_argcount = argcount;
290 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000291 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000292 co->co_flags = flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000293 Py_INCREF(code);
Guido van Rossumd076c731998-10-07 19:42:25 +0000294 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000295 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000296 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000297 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000298 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000299 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000300 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000301 Py_INCREF(freevars);
302 co->co_freevars = freevars;
303 Py_INCREF(cellvars);
304 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000305 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000306 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000307 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000308 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000309 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000310 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000311 co->co_lnotab = lnotab;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000312/* PyObject_Print((PyObject *)co, stderr, 0); */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000313 }
314 return co;
315}
316
317
318/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000319
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000320/* The compiler uses two passes to generate bytecodes. The first pass
321 builds the symbol table. The second pass generates the bytecode.
322
323 The first pass uses a single symtable struct. The second pass uses
324 a compiling struct for each code block. The compiling structs
325 share a reference to the symtable.
326
327 The two passes communicate via symtable_load_symbols() and via
328 is_local() and is_global(). The former initializes several slots
329 in the compiling struct: c_varnames, c_locals, c_nlocals,
330 c_argcount, c_globals, and c_flags.
331*/
332
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000333struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000334 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000335 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000336 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000337 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000338 PyObject *c_name_dict; /* inverse of c_names */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000339 PyObject *c_globals; /* dictionary (value=None) */
340 PyObject *c_locals; /* dictionary (value=localID) */
341 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000342 PyObject *c_freevars; /* dictionary (value=None) */
343 PyObject *c_cellvars; /* list */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000344 int c_nlocals; /* index of next local */
345 int c_argcount; /* number of top-level arguments */
346 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000347 int c_nexti; /* index into c_code */
348 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000349 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000350 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000351 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000352 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000353 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000354 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000355 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000356 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000357 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000358 int c_stacklevel; /* Current stack level */
359 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000360 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000361 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000362 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000363 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000364 int c_tmpname; /* temporary local name counter */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000365 int c_nested; /* Is block nested funcdef or lamdef? */
366 int c_closure; /* Is nested w/freevars? */
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000367 struct symtable *c_symtable; /* pointer to module symbol table */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000368};
369
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000370/* A symbol table is constructed each time PyNode_Compile() is
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000371 called. The table walks the entire parse tree and identifies each
372 use or definition of a variable.
373
374 The symbol table contains a dictionary for each code block in a
375 module: The symbol dictionary for the block. They keys of these
376 dictionaries are the name of all variables used or defined in the
377 block; the integer values are used to store several flags,
378 e.g. DEF_PARAM indicates that a variable is a parameter to a
379 function.
380
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000381 The slots st_cur_XXX pointers always refer to the current code
382 block. The st_cur slot is the symbol dictionary. The st_cur_id
383 slot is the id is the key in st_symbols. The st_cur_name slot is
384 the name of the current scope. The st_cur_type slot is one of
385 TYPE_FUNCTION, TYPE_CLASS, or TYPE_MODULE. The st_cur_children is
386 a list of the ids of the current node's children.
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000387
388 The st_symbols slot is a dictionary that maps code block ids to
389 symbol dictionaries. The keys are generated by a counter that is
390 incremented each time a new code block is found. The counter is
391 identifies a specific scope, because both passes walk the parse
392 tree in the same order.
393
394 The st_varnames slot is a dictionary that maps code block ids to
395 parameter lists. The st_global slot always refers to the symbol
396 dictionary for the module.
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000397
398 The st_children slot is a dictionary that maps ids to a list
399 containing the ids of its children.
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000400*/
401
402struct symtable {
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000403 int st_pass; /* pass == 1 or 2 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000404 PyObject *st_symbols; /* dictionary of symbol tables */
405 PyObject *st_varnames; /* dictionary of parameter lists */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000406 PyObject *st_stack; /* stack of namespace info */
407 PyObject *st_children; /* dictionary (id=[ids]) */
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000408 PyObject *st_cur; /* borrowed ref to dict in st_symbols */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000409 PyObject *st_cur_name; /* string, name of current scope */
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000410 PyObject *st_cur_id; /* int id of current code block */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000411 PyObject *st_cur_children; /* ref to current children list */
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000412 int st_cur_type; /* type of current scope */
413 PyObject *st_global; /* borrowed ref to MODULE in st_symbols */
414 int st_scopes; /* number of scopes */
415 int st_errors; /* number of errors */
416 char *st_private; /* name of current class or NULL */
417 int st_tmpname; /* temporary name counter */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000418 int st_nested; /* bool (true if nested scope) */
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000419};
420
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000421#define TOP "global"
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000422#define NOOPT ".noopt"
423
424/* Flags for def-use information */
425
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000426#define DEF_GLOBAL 1 /* global stmt */
427#define DEF_LOCAL 2 /* assignment in code block */
428#define DEF_PARAM 2<<1 /* formal parameter */
429#define USE 2<<2 /* name is used */
430#define DEF_STAR 2<<3 /* parameter is star arg */
431#define DEF_DOUBLESTAR 2<<4 /* parameter is star-star arg */
432#define DEF_INTUPLE 2<<5 /* name defined in tuple in parameters */
433#define DEF_FREE 2<<6 /* name used by not defined in nested scope */
434#define DEF_FREE_GLOBAL 2<<7 /* free variable is actually implicit global */
435#define DEF_FREE_CLASS 2<<8 /* free variable from class's method */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000436#define DEF_IMPORT 2<<9 /* assignment occurred via import */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000437
438int is_free(int v)
439{
440 if ((v & (USE | DEF_FREE))
441 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
442 return 1;
443 if (v & DEF_FREE_CLASS)
444 return 1;
445 return 0;
446}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000447
Guido van Rossum452a9831996-09-17 14:32:04 +0000448/* Error message including line number */
449
450static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000451com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000452{
Fred Drakedcf08e02000-08-15 15:49:44 +0000453 PyObject *v, *tb, *tmp;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000454 if (c == NULL) {
455 /* Error occurred via symtable call to
456 is_constant_false */
457 PyErr_SetString(exc, msg);
458 return;
459 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000460 c->c_errors++;
Guido van Rossum452a9831996-09-17 14:32:04 +0000461 if (c->c_lineno <= 1) {
462 /* Unknown line number or single interactive command */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000463 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000464 return;
465 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000466 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000467 if (v == NULL)
468 return; /* MemoryError, too bad */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000469 PyErr_SetObject(exc, v);
470 Py_DECREF(v);
Fred Drakedcf08e02000-08-15 15:49:44 +0000471
472 /* add attributes for the line number and filename for the error */
473 PyErr_Fetch(&exc, &v, &tb);
474 PyErr_NormalizeException(&exc, &v, &tb);
475 tmp = PyInt_FromLong(c->c_lineno);
476 if (tmp == NULL)
477 PyErr_Clear();
478 else {
479 if (PyObject_SetAttrString(v, "lineno", tmp))
480 PyErr_Clear();
481 Py_DECREF(tmp);
482 }
483 if (c->c_filename != NULL) {
484 tmp = PyString_FromString(c->c_filename);
485 if (tmp == NULL)
486 PyErr_Clear();
487 else {
488 if (PyObject_SetAttrString(v, "filename", tmp))
489 PyErr_Clear();
490 Py_DECREF(tmp);
491 }
492 }
493 PyErr_Restore(exc, v, tb);
Guido van Rossum452a9831996-09-17 14:32:04 +0000494}
495
496
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000497/* Interface to the block stack */
498
499static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000500block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000501{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000502 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000503 com_error(c, PyExc_SystemError,
504 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000505 }
506 else {
507 c->c_block[c->c_nblocks++] = type;
508 }
509}
510
511static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000512block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000513{
514 if (c->c_nblocks > 0)
515 c->c_nblocks--;
516 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000517 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000518 }
519}
520
521
Guido van Rossum681d79a1995-07-18 14:51:37 +0000522/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000523
Tim Petersdbd9ba62000-07-09 03:09:57 +0000524static int com_init(struct compiling *, char *);
525static void com_free(struct compiling *);
526static void com_push(struct compiling *, int);
527static void com_pop(struct compiling *, int);
528static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000529static void com_node(struct compiling *, node *);
530static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000531static void com_addbyte(struct compiling *, int);
532static void com_addint(struct compiling *, int);
533static void com_addoparg(struct compiling *, int, int);
534static void com_addfwref(struct compiling *, int, int *);
535static void com_backpatch(struct compiling *, int);
536static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
537static int com_addconst(struct compiling *, PyObject *);
538static int com_addname(struct compiling *, PyObject *);
539static void com_addopname(struct compiling *, int, node *);
540static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000541static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000542static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000543static void com_assign(struct compiling *, node *, int, node *);
544static void com_assign_name(struct compiling *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000545static PyCodeObject *icompile(node *, struct compiling *);
546static PyCodeObject *jcompile(node *, char *, struct compiling *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000547static PyObject *parsestrplus(node *);
548static PyObject *parsestr(char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000549static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000550
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000551static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000552
553/* symtable operations */
554static int symtable_build(struct compiling *, node *);
555static int symtable_load_symbols(struct compiling *);
556static struct symtable *symtable_init(void);
557static void symtable_free(struct symtable *);
558static int symtable_enter_scope(struct symtable *, char *, int);
559static int symtable_exit_scope(struct symtable *);
560static int symtable_update_cur(struct symtable *);
561static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000562static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000563
564static void symtable_node(struct symtable *, node *);
565static void symtable_funcdef(struct symtable *, node *);
566static void symtable_default_args(struct symtable *, node *);
567static void symtable_params(struct symtable *, node *);
568static void symtable_params_fplist(struct symtable *, node *n);
569static void symtable_global(struct symtable *, node *);
570static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000571static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000572static void symtable_list_comprehension(struct symtable *, node *);
573
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000574static int symtable_update_free_vars(struct symtable *);
575static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
576static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
577
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000578/* helper */
579static void
580do_pad(int pad)
581{
582 int i;
583 for (i = 0; i < pad; ++i)
584 fprintf(stderr, " ");
585}
586
587static void
588dump(node *n, int pad, int depth)
589{
590 int i;
591 if (depth == 0)
592 return;
593 do_pad(pad);
594 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
595 if (depth > 0)
596 depth--;
597 for (i = 0; i < NCH(n); ++i)
598 dump(CHILD(n, i), pad + 1, depth);
599}
600
601#define DUMP(N) dump(N, 0, -1)
602
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000603static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000604com_init(struct compiling *c, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000605{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000606 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000607 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
608 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000609 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000610 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000611 goto fail;
612 if ((c->c_const_dict = PyDict_New()) == NULL)
613 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000614 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000615 goto fail;
616 if ((c->c_name_dict = PyDict_New()) == NULL)
617 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000618 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000619 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000620 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
621 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000622 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000623 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000624 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000625 c->c_freevars = NULL;
626 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000627 c->c_nlocals = 0;
628 c->c_argcount = 0;
629 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000630 c->c_nexti = 0;
631 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000632 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000633 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000634 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000635 c->c_begin = 0;
636 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000637 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000638 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000639 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000640 c->c_stacklevel = 0;
641 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000642 c->c_firstlineno = 0;
643 c->c_last_addr = 0;
644 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000645 c->c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000646 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000647 c->c_nested = 0;
648 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000649 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000650 return 1;
651
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000652 fail:
653 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000654 return 0;
655}
656
657static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000658com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000659{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000660 Py_XDECREF(c->c_code);
661 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000662 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000663 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000664 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000665 Py_XDECREF(c->c_globals);
666 Py_XDECREF(c->c_locals);
667 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000668 Py_XDECREF(c->c_freevars);
669 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000670 Py_XDECREF(c->c_lnotab);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000671}
672
673static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000674com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000675{
676 c->c_stacklevel += n;
677 if (c->c_stacklevel > c->c_maxstacklevel)
678 c->c_maxstacklevel = c->c_stacklevel;
679}
680
681static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000682com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000683{
684 if (c->c_stacklevel < n) {
Guido van Rossum90f827c1998-08-25 18:22:17 +0000685 /* fprintf(stderr,
Guido van Rossum8b993a91997-01-17 21:04:03 +0000686 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
687 c->c_filename, c->c_lineno,
Guido van Rossum90f827c1998-08-25 18:22:17 +0000688 c->c_nexti, c->c_stacklevel, n); */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000689 c->c_stacklevel = 0;
690 }
691 else
692 c->c_stacklevel -= n;
693}
694
695static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000696com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000697{
698 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000699 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000700 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000701 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000702}
703
704static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000705com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000706{
707 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000708 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000709 assert(byte >= 0 && byte <= 255);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000710 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000711 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000712 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000713 fatal("com_addbyte: byte out of range");
Guido van Rossum01cfd441991-10-20 20:12:38 +0000714 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000715 com_error(c, PyExc_SystemError,
716 "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000717 }
718 if (c->c_code == NULL)
719 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000720 len = PyString_Size(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000721 if (c->c_nexti >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000722 if (_PyString_Resize(&c->c_code, len+1000) != 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000723 c->c_errors++;
724 return;
725 }
726 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000727 PyString_AsString(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000728}
729
730static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000731com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000732{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000733 com_addbyte(c, x & 0xff);
734 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000735}
736
737static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000738com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000739{
740 int size;
741 char *p;
742 if (c->c_lnotab == NULL)
743 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000744 size = PyString_Size(c->c_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000745 if (c->c_lnotab_next+2 > size) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000746 if (_PyString_Resize(&c->c_lnotab, size + 1000) < 0) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000747 c->c_errors++;
748 return;
749 }
750 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000751 p = PyString_AsString(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000752 *p++ = addr;
753 *p++ = line;
754 c->c_lnotab_next += 2;
755}
756
757static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000758com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000759{
760 c->c_lineno = lineno;
761 if (c->c_firstlineno == 0) {
762 c->c_firstlineno = c->c_last_line = lineno;
763 }
764 else {
765 int incr_addr = c->c_nexti - c->c_last_addr;
766 int incr_line = lineno - c->c_last_line;
767 while (incr_addr > 0 || incr_line > 0) {
768 int trunc_addr = incr_addr;
769 int trunc_line = incr_line;
770 if (trunc_addr > 255)
771 trunc_addr = 255;
772 if (trunc_line > 255)
773 trunc_line = 255;
774 com_add_lnotab(c, trunc_addr, trunc_line);
775 incr_addr -= trunc_addr;
776 incr_line -= trunc_line;
777 }
778 c->c_last_addr = c->c_nexti;
779 c->c_last_line = lineno;
780 }
781}
782
783static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000784com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000785{
Fred Drakeef8ace32000-08-24 00:32:09 +0000786 int extended_arg = arg >> 16;
Guido van Rossum8e793d91997-03-03 19:13:14 +0000787 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000788 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000789 if (Py_OptimizeFlag)
790 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000791 }
Fred Drakeef8ace32000-08-24 00:32:09 +0000792 if (extended_arg){
793 com_addbyte(c, EXTENDED_ARG);
794 com_addint(c, extended_arg);
795 arg &= 0xffff;
796 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000797 com_addbyte(c, op);
798 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000799}
800
801static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000802com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000803{
804 /* Compile a forward reference for backpatching */
805 int here;
806 int anchor;
807 com_addbyte(c, op);
808 here = c->c_nexti;
809 anchor = *p_anchor;
810 *p_anchor = here;
811 com_addint(c, anchor == 0 ? 0 : here - anchor);
812}
813
814static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000815com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000816{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000817 unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000818 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000819 int dist;
820 int prev;
821 for (;;) {
822 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000823 prev = code[anchor] + (code[anchor+1] << 8);
824 dist = target - (anchor+2);
825 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +0000826 dist >>= 8;
827 code[anchor+1] = dist;
828 dist >>= 8;
829 if (dist) {
830 com_error(c, PyExc_SystemError,
831 "com_backpatch: offset too large");
832 break;
833 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000834 if (!prev)
835 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000836 anchor -= prev;
837 }
838}
839
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000840/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000841
842static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000843com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000844{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000845 PyObject *w, *t, *np=NULL;
846 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000847
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000848 t = Py_BuildValue("(OO)", v, v->ob_type);
849 if (t == NULL)
850 goto fail;
851 w = PyDict_GetItem(dict, t);
852 if (w != NULL) {
853 n = PyInt_AsLong(w);
854 } else {
855 n = PyList_Size(list);
856 np = PyInt_FromLong(n);
857 if (np == NULL)
858 goto fail;
859 if (PyList_Append(list, v) != 0)
860 goto fail;
861 if (PyDict_SetItem(dict, t, np) != 0)
862 goto fail;
863 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000864 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000865 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000866 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000867 fail:
868 Py_XDECREF(np);
869 Py_XDECREF(t);
870 c->c_errors++;
871 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000872}
873
874static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000875com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000876{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000877 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000878}
879
880static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000881com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000882{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000883 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000884}
885
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000886static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000887mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000888{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000889 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000890 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +0000891 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000892 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
893 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000894 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000895 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000896 return 0; /* Don't mangle __extremely_long_names */
897 if (name[nlen-1] == '_' && name[nlen-2] == '_')
898 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000899 /* Strip leading underscores from class name */
900 while (*p == '_')
901 p++;
902 if (*p == '\0')
903 return 0; /* Don't mangle if class is just underscores */
904 plen = strlen(p);
905 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000906 plen = maxlen-nlen-2; /* Truncate class name if too long */
907 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000908 buffer[0] = '_';
909 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000910 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000911 /* fprintf(stderr, "mangle %s -> %s\n", name, buffer); */
912 return 1;
913}
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000914
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000915static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000916com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000917{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000918 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000919 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000920 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000921
922 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000923 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000924 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000925 c->c_errors++;
926 i = 255;
927 }
928 else {
929 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000930 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000931 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000932 com_addoparg(c, op, i);
933}
934
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000935#define NAME_LOCAL 0
936#define NAME_GLOBAL 1
937#define NAME_DEFAULT 2
938#define NAME_CLOSURE 3
939
940static int
941com_lookup_arg(PyObject *dict, PyObject *name)
942{
943 PyObject *v = PyDict_GetItem(dict, name);
944 if (v == NULL)
945 return -1;
946 else
947 return PyInt_AS_LONG(v);
948}
949
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000950static void
951com_addop_varname(struct compiling *c, int kind, char *name)
952{
953 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000954 int i, reftype;
955 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000956 int op = STOP_CODE;
957 char buffer[MANGLE_LEN];
958
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000959 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000960 name = buffer;
961 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
962 c->c_errors++;
963 i = 255;
964 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000965 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000966
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000967 reftype = get_ref_type(c, name);
968 switch (reftype) {
969 case LOCAL:
970 if (c->c_symtable->st_cur_type == TYPE_FUNCTION)
971 scope = NAME_LOCAL;
972 break;
973 case GLOBAL_EXPLICIT:
974 scope = NAME_GLOBAL;
975 break;
976 case GLOBAL_IMPLICIT:
977 if (c->c_flags & CO_OPTIMIZED)
978 scope = NAME_GLOBAL;
979 break;
980 case FREE:
981 case CELL:
982 scope = NAME_CLOSURE;
983 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000984 }
985
986 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000987 if (scope == NAME_LOCAL)
988 i = com_lookup_arg(c->c_locals, v);
989 else if (reftype == FREE)
990 i = com_lookup_arg(c->c_freevars, v);
991 else if (reftype == CELL)
992 i = com_lookup_arg(c->c_cellvars, v);
993 if (i == -1) {
994 c->c_errors++; /* XXX no exception set */
995 i = 255;
996 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000997 }
998 Py_DECREF(v);
999
1000 switch (kind) {
1001 case VAR_LOAD:
1002 switch (scope) {
1003 case NAME_LOCAL:
1004 op = LOAD_FAST;
1005 break;
1006 case NAME_GLOBAL:
1007 op = LOAD_GLOBAL;
1008 break;
1009 case NAME_DEFAULT:
1010 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001011 break;
1012 case NAME_CLOSURE:
1013 op = LOAD_DEREF;
1014 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001015 }
1016 break;
1017 case VAR_STORE:
1018 switch (scope) {
1019 case NAME_LOCAL:
1020 op = STORE_FAST;
1021 break;
1022 case NAME_GLOBAL:
1023 op = STORE_GLOBAL;
1024 break;
1025 case NAME_DEFAULT:
1026 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001027 break;
1028 case NAME_CLOSURE:
1029 op = STORE_DEREF;
1030 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001031 }
1032 break;
1033 case VAR_DELETE:
1034 switch (scope) {
1035 case NAME_LOCAL:
1036 op = DELETE_FAST;
1037 break;
1038 case NAME_GLOBAL:
1039 op = DELETE_GLOBAL;
1040 break;
1041 case NAME_DEFAULT:
1042 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001043 break;
1044 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001045 char buf[500];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001046 sprintf(buf, DEL_CLOSURE_ERROR, name);
1047 com_error(c, PyExc_SyntaxError, buf);
1048 i = 255;
1049 break;
1050 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001051 }
1052 break;
1053 }
1054done:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001055/* fprintf(stderr, " addoparg(op=%d, arg=%d)\n", op, i);*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001056 com_addoparg(c, op, i);
1057}
1058
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001059static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001060com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001061{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001062 char *name;
1063 char buffer[1000];
1064 /* XXX it is possible to write this code without the 1000
1065 chars on the total length of dotted names, I just can't be
1066 bothered right now */
1067 if (TYPE(n) == STAR)
1068 name = "*";
1069 else if (TYPE(n) == dotted_name) {
1070 char *p = buffer;
1071 int i;
1072 name = buffer;
1073 for (i = 0; i < NCH(n); i += 2) {
1074 char *s = STR(CHILD(n, i));
1075 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001076 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001077 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001078 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001079 break;
1080 }
1081 if (p != buffer)
1082 *p++ = '.';
1083 strcpy(p, s);
1084 p = strchr(p, '\0');
1085 }
1086 }
1087 else {
1088 REQ(n, NAME);
1089 name = STR(n);
1090 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001091 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001092}
1093
Guido van Rossum79f25d91997-04-29 20:08:16 +00001094static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001095parsenumber(struct compiling *co, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001096{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001097 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001098 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001099 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001100#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +00001101 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +00001102 int imflag;
1103#endif
1104
Guido van Rossum282914b1991-04-04 10:42:56 +00001105 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001106 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001107#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001108 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001109#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001110 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001111 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001112 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001113 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001114 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001115 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001116 if (*end == '\0') {
1117 if (errno != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001118 com_error(co, PyExc_OverflowError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001119 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +00001120 return NULL;
1121 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001122 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001123 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001124 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001125#ifndef WITHOUT_COMPLEX
1126 if (imflag) {
1127 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001128 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +00001129 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001130 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001131 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +00001132 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001133 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001134#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001135 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001136 PyFPE_START_PROTECT("atof", return 0)
1137 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001138 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001139 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001140 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001141}
1142
Guido van Rossum79f25d91997-04-29 20:08:16 +00001143static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001144parsestr(char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001145{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001146 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001147 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001148 char *buf;
1149 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001150 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001151 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001152 int first = *s;
1153 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001154 int rawmode = 0;
1155 int unicode = 0;
1156 if (isalpha(quote) || quote == '_') {
1157 if (quote == 'u' || quote == 'U') {
1158 quote = *++s;
1159 unicode = 1;
1160 }
1161 if (quote == 'r' || quote == 'R') {
1162 quote = *++s;
1163 rawmode = 1;
1164 }
1165 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001166 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001167 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001168 return NULL;
1169 }
1170 s++;
1171 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001172 if (len > INT_MAX) {
1173 PyErr_SetString(PyExc_OverflowError, "string to parse is too long");
1174 return NULL;
1175 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001176 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001177 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001178 return NULL;
1179 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001180 if (len >= 4 && s[0] == quote && s[1] == quote) {
1181 s += 2;
1182 len -= 2;
1183 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001184 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001185 return NULL;
1186 }
1187 }
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001188 if (unicode || Py_UnicodeFlag) {
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001189 if (rawmode)
1190 return PyUnicode_DecodeRawUnicodeEscape(
1191 s, len, NULL);
1192 else
1193 return PyUnicode_DecodeUnicodeEscape(
1194 s, len, NULL);
1195 }
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001196 if (rawmode || strchr(s, '\\') == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001197 return PyString_FromStringAndSize(s, len);
1198 v = PyString_FromStringAndSize((char *)NULL, len);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001199 if (v == NULL)
1200 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001201 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001202 end = s + len;
1203 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001204 if (*s != '\\') {
1205 *p++ = *s++;
1206 continue;
1207 }
1208 s++;
1209 switch (*s++) {
1210 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001211 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001212 case '\\': *p++ = '\\'; break;
1213 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +00001214 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001215 case 'b': *p++ = '\b'; break;
1216 case 'f': *p++ = '\014'; break; /* FF */
1217 case 't': *p++ = '\t'; break;
1218 case 'n': *p++ = '\n'; break;
1219 case 'r': *p++ = '\r'; break;
1220 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001221 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
1222 case '0': case '1': case '2': case '3':
1223 case '4': case '5': case '6': case '7':
1224 c = s[-1] - '0';
1225 if ('0' <= *s && *s <= '7') {
1226 c = (c<<3) + *s++ - '0';
1227 if ('0' <= *s && *s <= '7')
1228 c = (c<<3) + *s++ - '0';
1229 }
1230 *p++ = c;
1231 break;
1232 case 'x':
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001233 if (isxdigit(Py_CHARMASK(s[0])) && isxdigit(Py_CHARMASK(s[1]))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +00001234 unsigned int x = 0;
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001235 c = Py_CHARMASK(*s);
1236 s++;
1237 if (isdigit(c))
1238 x = c - '0';
1239 else if (islower(c))
1240 x = 10 + c - 'a';
1241 else
1242 x = 10 + c - 'A';
1243 x = x << 4;
1244 c = Py_CHARMASK(*s);
1245 s++;
1246 if (isdigit(c))
1247 x += c - '0';
1248 else if (islower(c))
1249 x += 10 + c - 'a';
1250 else
1251 x += 10 + c - 'A';
Guido van Rossumed1100f1997-10-20 23:24:07 +00001252 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001253 break;
1254 }
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001255 PyErr_SetString(PyExc_ValueError, "invalid \\x escape");
1256 Py_DECREF(v);
1257 return NULL;
1258 default:
1259 *p++ = '\\';
1260 *p++ = s[-1];
1261 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001262 }
1263 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001264 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001265 return v;
1266}
1267
Guido van Rossum79f25d91997-04-29 20:08:16 +00001268static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001269parsestrplus(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001270{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001271 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001272 int i;
1273 REQ(CHILD(n, 0), STRING);
1274 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
1275 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001276 for (i = 1; i < NCH(n); i++) {
1277 PyObject *s;
1278 s = parsestr(STR(CHILD(n, i)));
1279 if (s == NULL)
1280 goto onError;
1281 if (PyString_Check(v) && PyString_Check(s)) {
1282 PyString_ConcatAndDel(&v, s);
1283 if (v == NULL)
1284 goto onError;
1285 }
1286 else {
1287 PyObject *temp;
1288 temp = PyUnicode_Concat(v, s);
1289 Py_DECREF(s);
1290 if (temp == NULL)
1291 goto onError;
1292 Py_DECREF(v);
1293 v = temp;
1294 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001295 }
1296 }
1297 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001298
1299 onError:
1300 Py_XDECREF(v);
1301 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001302}
1303
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001304static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001305com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001306{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001307 PyObject *v;
1308 int anchor = 0;
1309 int save_begin = c->c_begin;
1310
1311 /* list_iter: for v in expr [list_iter] */
1312 com_node(c, CHILD(n, 3)); /* expr */
1313 v = PyInt_FromLong(0L);
1314 if (v == NULL)
1315 c->c_errors++;
1316 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
1317 com_push(c, 1);
1318 Py_XDECREF(v);
1319 c->c_begin = c->c_nexti;
1320 com_addoparg(c, SET_LINENO, n->n_lineno);
1321 com_addfwref(c, FOR_LOOP, &anchor);
1322 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001323 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001324 c->c_loops++;
1325 com_list_iter(c, n, e, t);
1326 c->c_loops--;
1327 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1328 c->c_begin = save_begin;
1329 com_backpatch(c, anchor);
1330 com_pop(c, 2); /* FOR_LOOP has popped these */
1331}
1332
1333static void
1334com_list_if(struct compiling *c, node *n, node *e, char *t)
1335{
1336 int anchor = 0;
1337 int a = 0;
1338 /* list_iter: 'if' test [list_iter] */
1339 com_addoparg(c, SET_LINENO, n->n_lineno);
1340 com_node(c, CHILD(n, 1));
1341 com_addfwref(c, JUMP_IF_FALSE, &a);
1342 com_addbyte(c, POP_TOP);
1343 com_pop(c, 1);
1344 com_list_iter(c, n, e, t);
1345 com_addfwref(c, JUMP_FORWARD, &anchor);
1346 com_backpatch(c, a);
1347 /* We jump here with an extra entry which we now pop */
1348 com_addbyte(c, POP_TOP);
1349 com_backpatch(c, anchor);
1350}
1351
1352static void
1353com_list_iter(struct compiling *c,
1354 node *p, /* parent of list_iter node */
1355 node *e, /* element expression node */
1356 char *t /* name of result list temp local */)
1357{
1358 /* list_iter is the last child in a listmaker, list_for, or list_if */
1359 node *n = CHILD(p, NCH(p)-1);
1360 if (TYPE(n) == list_iter) {
1361 n = CHILD(n, 0);
1362 switch (TYPE(n)) {
1363 case list_for:
1364 com_list_for(c, n, e, t);
1365 break;
1366 case list_if:
1367 com_list_if(c, n, e, t);
1368 break;
1369 default:
1370 com_error(c, PyExc_SystemError,
1371 "invalid list_iter node type");
1372 }
1373 }
1374 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001375 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001376 com_push(c, 1);
1377 com_node(c, e);
1378 com_addoparg(c, CALL_FUNCTION, 1);
1379 com_addbyte(c, POP_TOP);
1380 com_pop(c, 2);
1381 }
1382}
1383
1384static void
1385com_list_comprehension(struct compiling *c, node *n)
1386{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001387 /* listmaker: test list_for */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001388 char tmpname[12];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001389 sprintf(tmpname, "[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001390 com_addoparg(c, BUILD_LIST, 0);
1391 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1392 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001393 com_addop_name(c, LOAD_ATTR, "append");
1394 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001395 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001396 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001397 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001398 --c->c_tmpname;
1399}
1400
1401static void
1402com_listmaker(struct compiling *c, node *n)
1403{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001404 /* listmaker: test ( list_for | (',' test)* [','] ) */
1405 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001406 com_list_comprehension(c, n);
1407 else {
1408 int len = 0;
1409 int i;
1410 for (i = 0; i < NCH(n); i += 2, len++)
1411 com_node(c, CHILD(n, i));
1412 com_addoparg(c, BUILD_LIST, len);
1413 com_pop(c, len-1);
1414 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001415}
1416
1417static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001418com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001419{
1420 int i;
1421 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1422 for (i = 0; i+2 < NCH(n); i += 4) {
1423 /* We must arrange things just right for STORE_SUBSCR.
1424 It wants the stack to look like (value) (dict) (key) */
1425 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001426 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001427 com_node(c, CHILD(n, i+2)); /* value */
1428 com_addbyte(c, ROT_TWO);
1429 com_node(c, CHILD(n, i)); /* key */
1430 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001431 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001432 }
1433}
1434
1435static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001436com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001437{
1438 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001439 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001440 int i;
1441 REQ(n, atom);
1442 ch = CHILD(n, 0);
1443 switch (TYPE(ch)) {
1444 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001445 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001446 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001447 com_push(c, 1);
1448 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001449 else
1450 com_node(c, CHILD(n, 1));
1451 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001452 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001453 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001454 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001455 com_push(c, 1);
1456 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001457 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001458 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001459 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001460 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001461 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001462 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001463 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001464 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001465 break;
1466 case BACKQUOTE:
1467 com_node(c, CHILD(n, 1));
1468 com_addbyte(c, UNARY_CONVERT);
1469 break;
1470 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001471 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001472 i = 255;
1473 }
1474 else {
1475 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001476 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001477 }
1478 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001479 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001480 break;
1481 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001482 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001483 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001484 c->c_errors++;
1485 i = 255;
1486 }
1487 else {
1488 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001489 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001490 }
1491 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001492 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001493 break;
1494 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001495 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001496 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001497 break;
1498 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001499 /* XXX fprintf(stderr, "node type %d\n", TYPE(ch)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001500 com_error(c, PyExc_SystemError,
1501 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001502 }
1503}
1504
1505static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001506com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001507{
1508 if (NCH(n) == 1) {
1509 com_addbyte(c, op);
1510 }
1511 else if (NCH(n) == 2) {
1512 if (TYPE(CHILD(n, 0)) != COLON) {
1513 com_node(c, CHILD(n, 0));
1514 com_addbyte(c, op+1);
1515 }
1516 else {
1517 com_node(c, CHILD(n, 1));
1518 com_addbyte(c, op+2);
1519 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001520 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001521 }
1522 else {
1523 com_node(c, CHILD(n, 0));
1524 com_node(c, CHILD(n, 2));
1525 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001526 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001527 }
1528}
1529
Guido van Rossum635abd21997-01-06 22:56:52 +00001530static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001531com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1532{
1533 if (NCH(n) == 1) {
1534 com_addbyte(c, DUP_TOP);
1535 com_push(c, 1);
1536 com_addbyte(c, SLICE);
1537 com_node(c, augn);
1538 com_addbyte(c, opcode);
1539 com_pop(c, 1);
1540 com_addbyte(c, ROT_TWO);
1541 com_addbyte(c, STORE_SLICE);
1542 com_pop(c, 2);
1543 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1544 com_node(c, CHILD(n, 0));
1545 com_addoparg(c, DUP_TOPX, 2);
1546 com_push(c, 2);
1547 com_addbyte(c, SLICE+1);
1548 com_pop(c, 1);
1549 com_node(c, augn);
1550 com_addbyte(c, opcode);
1551 com_pop(c, 1);
1552 com_addbyte(c, ROT_THREE);
1553 com_addbyte(c, STORE_SLICE+1);
1554 com_pop(c, 3);
1555 } else if (NCH(n) == 2) {
1556 com_node(c, CHILD(n, 1));
1557 com_addoparg(c, DUP_TOPX, 2);
1558 com_push(c, 2);
1559 com_addbyte(c, SLICE+2);
1560 com_pop(c, 1);
1561 com_node(c, augn);
1562 com_addbyte(c, opcode);
1563 com_pop(c, 1);
1564 com_addbyte(c, ROT_THREE);
1565 com_addbyte(c, STORE_SLICE+2);
1566 com_pop(c, 3);
1567 } else {
1568 com_node(c, CHILD(n, 0));
1569 com_node(c, CHILD(n, 2));
1570 com_addoparg(c, DUP_TOPX, 3);
1571 com_push(c, 3);
1572 com_addbyte(c, SLICE+3);
1573 com_pop(c, 2);
1574 com_node(c, augn);
1575 com_addbyte(c, opcode);
1576 com_pop(c, 1);
1577 com_addbyte(c, ROT_FOUR);
1578 com_addbyte(c, STORE_SLICE+3);
1579 com_pop(c, 4);
1580 }
1581}
1582
1583static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001584com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001585{
1586 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001587 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001588 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001589 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001590 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001591 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001592 }
1593 else {
1594 com_node(c, CHILD(n, 0));
1595 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001596 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001597 }
1598 m = n;
1599 do {
1600 m = CHILD(m, 0);
1601 } while (NCH(m) == 1);
1602 if (TYPE(m) != NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001603 com_error(c, PyExc_SyntaxError,
1604 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001605 }
1606 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001607 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001608 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001609 *pkeywords = PyDict_New();
Guido van Rossum635abd21997-01-06 22:56:52 +00001610 if (v == NULL || *pkeywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001611 c->c_errors++;
1612 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001613 if (PyDict_GetItem(*pkeywords, v) != NULL)
1614 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001615 "duplicate keyword argument");
1616 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001617 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001618 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001619 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001620 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001621 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001622 }
1623 }
1624 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001625}
1626
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001627static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001628com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001629{
1630 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001631 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001632 }
1633 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001634 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001635 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001636 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001637 int star_flag = 0;
1638 int starstar_flag = 0;
1639 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001640 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001641 na = 0;
1642 nk = 0;
1643 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001644 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001645 if (TYPE(ch) == STAR ||
1646 TYPE(ch) == DOUBLESTAR)
1647 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001648 if (ch->n_lineno != lineno) {
1649 lineno = ch->n_lineno;
1650 com_addoparg(c, SET_LINENO, lineno);
1651 }
1652 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001653 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001654 na++;
1655 else
1656 nk++;
1657 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001658 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001659 while (i < NCH(n)) {
1660 node *tok = CHILD(n, i);
1661 node *ch = CHILD(n, i+1);
1662 i += 3;
1663 switch (TYPE(tok)) {
1664 case STAR: star_flag = 1; break;
1665 case DOUBLESTAR: starstar_flag = 1; break;
1666 }
1667 com_node(c, ch);
1668 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001669 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001670 com_error(c, PyExc_SyntaxError,
1671 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001672 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001673 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001674 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001675 star_flag + (starstar_flag << 1);
1676 else
1677 opcode = CALL_FUNCTION;
1678 com_addoparg(c, opcode, na | (nk << 8));
1679 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001680 }
1681}
1682
1683static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001684com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001685{
1686 com_addopname(c, LOAD_ATTR, n);
1687}
1688
1689static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001690com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001691{
1692 int i=0;
1693 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001694 node *ch;
1695
1696 /* first argument */
1697 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001698 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001699 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001700 i++;
1701 }
1702 else {
1703 com_node(c, CHILD(n,i));
1704 i++;
1705 REQ(CHILD(n,i),COLON);
1706 i++;
1707 }
1708 /* second argument */
1709 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1710 com_node(c, CHILD(n,i));
1711 i++;
1712 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001713 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001714 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001715 com_push(c, 1);
1716 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001717 /* remaining arguments */
1718 for (; i < NCH(n); i++) {
1719 ns++;
1720 ch=CHILD(n,i);
1721 REQ(ch, sliceop);
1722 if (NCH(ch) == 1) {
1723 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001724 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001725 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001726 }
1727 else
1728 com_node(c, CHILD(ch,1));
1729 }
1730 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001731 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001732}
1733
1734static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001735com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001736{
1737 node *ch;
1738 REQ(n, subscript);
1739 ch = CHILD(n,0);
1740 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001741 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001742 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001743 com_push(c, 1);
1744 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001745 else {
1746 /* check for slice */
1747 if ((TYPE(ch) == COLON || NCH(n) > 1))
1748 com_sliceobj(c, n);
1749 else {
1750 REQ(ch, test);
1751 com_node(c, ch);
1752 }
1753 }
1754}
1755
1756static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001757com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001758{
1759 int i, op;
1760 REQ(n, subscriptlist);
1761 /* Check to make backward compatible slice behavior for '[i:j]' */
1762 if (NCH(n) == 1) {
1763 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001764 /* 'Basic' slice, should have exactly one colon. */
1765 if ((TYPE(CHILD(sub, 0)) == COLON
1766 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1767 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1768 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001769 switch (assigning) {
1770 case OP_DELETE:
1771 op = DELETE_SLICE;
1772 break;
1773 case OP_ASSIGN:
1774 op = STORE_SLICE;
1775 break;
1776 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001777 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001778 break;
1779 default:
1780 com_augassign_slice(c, sub, assigning, augn);
1781 return;
1782 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001783 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001784 if (op == STORE_SLICE)
1785 com_pop(c, 2);
1786 else if (op == DELETE_SLICE)
1787 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001788 return;
1789 }
1790 }
1791 /* Else normal subscriptlist. Compile each subscript. */
1792 for (i = 0; i < NCH(n); i += 2)
1793 com_subscript(c, CHILD(n, i));
1794 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001795 if (NCH(n) > 1) {
1796 i = (NCH(n)+1) / 2;
1797 com_addoparg(c, BUILD_TUPLE, i);
1798 com_pop(c, i-1);
1799 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001800 switch (assigning) {
1801 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001802 op = DELETE_SUBSCR;
1803 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00001804 break;
1805 default:
1806 case OP_ASSIGN:
1807 op = STORE_SUBSCR;
1808 i = 3;
1809 break;
1810 case OP_APPLY:
1811 op = BINARY_SUBSCR;
1812 i = 1;
1813 break;
1814 }
1815 if (assigning > OP_APPLY) {
1816 com_addoparg(c, DUP_TOPX, 2);
1817 com_push(c, 2);
1818 com_addbyte(c, BINARY_SUBSCR);
1819 com_pop(c, 1);
1820 com_node(c, augn);
1821 com_addbyte(c, assigning);
1822 com_pop(c, 1);
1823 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001824 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001825 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001826 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001827}
1828
1829static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001830com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001831{
1832 REQ(n, trailer);
1833 switch (TYPE(CHILD(n, 0))) {
1834 case LPAR:
1835 com_call_function(c, CHILD(n, 1));
1836 break;
1837 case DOT:
1838 com_select_member(c, CHILD(n, 1));
1839 break;
1840 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00001841 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001842 break;
1843 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001844 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001845 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001846 }
1847}
1848
1849static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001850com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001851{
1852 int i;
1853 REQ(n, power);
1854 com_atom(c, CHILD(n, 0));
1855 for (i = 1; i < NCH(n); i++) {
1856 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1857 com_factor(c, CHILD(n, i+1));
1858 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001859 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001860 break;
1861 }
1862 else
1863 com_apply_trailer(c, CHILD(n, i));
1864 }
1865}
1866
1867static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001868com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001869{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001870 REQ(n, factor);
1871 if (TYPE(CHILD(n, 0)) == PLUS) {
1872 com_factor(c, CHILD(n, 1));
1873 com_addbyte(c, UNARY_POSITIVE);
1874 }
1875 else if (TYPE(CHILD(n, 0)) == MINUS) {
1876 com_factor(c, CHILD(n, 1));
1877 com_addbyte(c, UNARY_NEGATIVE);
1878 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001879 else if (TYPE(CHILD(n, 0)) == TILDE) {
1880 com_factor(c, CHILD(n, 1));
1881 com_addbyte(c, UNARY_INVERT);
1882 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001883 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001884 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001885 }
1886}
1887
1888static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001889com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001890{
1891 int i;
1892 int op;
1893 REQ(n, term);
1894 com_factor(c, CHILD(n, 0));
1895 for (i = 2; i < NCH(n); i += 2) {
1896 com_factor(c, CHILD(n, i));
1897 switch (TYPE(CHILD(n, i-1))) {
1898 case STAR:
1899 op = BINARY_MULTIPLY;
1900 break;
1901 case SLASH:
1902 op = BINARY_DIVIDE;
1903 break;
1904 case PERCENT:
1905 op = BINARY_MODULO;
1906 break;
1907 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001908 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001909 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001910 op = 255;
1911 }
1912 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001913 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001914 }
1915}
1916
1917static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001918com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001919{
1920 int i;
1921 int op;
1922 REQ(n, arith_expr);
1923 com_term(c, CHILD(n, 0));
1924 for (i = 2; i < NCH(n); i += 2) {
1925 com_term(c, CHILD(n, i));
1926 switch (TYPE(CHILD(n, i-1))) {
1927 case PLUS:
1928 op = BINARY_ADD;
1929 break;
1930 case MINUS:
1931 op = BINARY_SUBTRACT;
1932 break;
1933 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001934 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001935 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001936 op = 255;
1937 }
1938 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001939 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001940 }
1941}
1942
1943static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001944com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001945{
1946 int i;
1947 int op;
1948 REQ(n, shift_expr);
1949 com_arith_expr(c, CHILD(n, 0));
1950 for (i = 2; i < NCH(n); i += 2) {
1951 com_arith_expr(c, CHILD(n, i));
1952 switch (TYPE(CHILD(n, i-1))) {
1953 case LEFTSHIFT:
1954 op = BINARY_LSHIFT;
1955 break;
1956 case RIGHTSHIFT:
1957 op = BINARY_RSHIFT;
1958 break;
1959 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001960 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001961 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001962 op = 255;
1963 }
1964 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001965 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001966 }
1967}
1968
1969static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001970com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001971{
1972 int i;
1973 int op;
1974 REQ(n, and_expr);
1975 com_shift_expr(c, CHILD(n, 0));
1976 for (i = 2; i < NCH(n); i += 2) {
1977 com_shift_expr(c, CHILD(n, i));
1978 if (TYPE(CHILD(n, i-1)) == AMPER) {
1979 op = BINARY_AND;
1980 }
1981 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001982 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001983 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001984 op = 255;
1985 }
1986 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001987 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001988 }
1989}
1990
1991static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001992com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001993{
1994 int i;
1995 int op;
1996 REQ(n, xor_expr);
1997 com_and_expr(c, CHILD(n, 0));
1998 for (i = 2; i < NCH(n); i += 2) {
1999 com_and_expr(c, CHILD(n, i));
2000 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2001 op = BINARY_XOR;
2002 }
2003 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002004 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002005 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002006 op = 255;
2007 }
2008 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002009 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002010 }
2011}
2012
2013static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002014com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002015{
2016 int i;
2017 int op;
2018 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002019 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002020 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002021 com_xor_expr(c, CHILD(n, i));
2022 if (TYPE(CHILD(n, i-1)) == VBAR) {
2023 op = BINARY_OR;
2024 }
2025 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002026 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002027 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002028 op = 255;
2029 }
2030 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002031 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002032 }
2033}
2034
2035static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002036cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002037{
2038 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00002039 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002040 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2041 if (NCH(n) == 1) {
2042 n = CHILD(n, 0);
2043 switch (TYPE(n)) {
2044 case LESS: return LT;
2045 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00002046 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002047 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00002048 case LESSEQUAL: return LE;
2049 case GREATEREQUAL: return GE;
2050 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002051 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
2052 if (strcmp(STR(n), "is") == 0) return IS;
2053 }
2054 }
2055 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002056 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002057 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
2058 return NOT_IN;
2059 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
2060 return IS_NOT;
2061 }
2062 }
2063 return BAD;
2064}
2065
2066static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002067com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002068{
2069 int i;
2070 enum cmp_op op;
2071 int anchor;
2072 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2073 com_expr(c, CHILD(n, 0));
2074 if (NCH(n) == 1)
2075 return;
2076
2077 /****************************************************************
2078 The following code is generated for all but the last
2079 comparison in a chain:
2080
2081 label: on stack: opcode: jump to:
2082
2083 a <code to load b>
2084 a, b DUP_TOP
2085 a, b, b ROT_THREE
2086 b, a, b COMPARE_OP
2087 b, 0-or-1 JUMP_IF_FALSE L1
2088 b, 1 POP_TOP
2089 b
2090
2091 We are now ready to repeat this sequence for the next
2092 comparison in the chain.
2093
2094 For the last we generate:
2095
2096 b <code to load c>
2097 b, c COMPARE_OP
2098 0-or-1
2099
2100 If there were any jumps to L1 (i.e., there was more than one
2101 comparison), we generate:
2102
2103 0-or-1 JUMP_FORWARD L2
2104 L1: b, 0 ROT_TWO
2105 0, b POP_TOP
2106 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002107 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002108 ****************************************************************/
2109
2110 anchor = 0;
2111
2112 for (i = 2; i < NCH(n); i += 2) {
2113 com_expr(c, CHILD(n, i));
2114 if (i+2 < NCH(n)) {
2115 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002116 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002117 com_addbyte(c, ROT_THREE);
2118 }
2119 op = cmp_type(CHILD(n, i-1));
2120 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002121 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002122 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002123 }
2124 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002125 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002126 if (i+2 < NCH(n)) {
2127 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2128 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002129 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002130 }
2131 }
2132
2133 if (anchor) {
2134 int anchor2 = 0;
2135 com_addfwref(c, JUMP_FORWARD, &anchor2);
2136 com_backpatch(c, anchor);
2137 com_addbyte(c, ROT_TWO);
2138 com_addbyte(c, POP_TOP);
2139 com_backpatch(c, anchor2);
2140 }
2141}
2142
2143static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002144com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002145{
2146 REQ(n, not_test); /* 'not' not_test | comparison */
2147 if (NCH(n) == 1) {
2148 com_comparison(c, CHILD(n, 0));
2149 }
2150 else {
2151 com_not_test(c, CHILD(n, 1));
2152 com_addbyte(c, UNARY_NOT);
2153 }
2154}
2155
2156static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002157com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002158{
2159 int i;
2160 int anchor;
2161 REQ(n, and_test); /* not_test ('and' not_test)* */
2162 anchor = 0;
2163 i = 0;
2164 for (;;) {
2165 com_not_test(c, CHILD(n, i));
2166 if ((i += 2) >= NCH(n))
2167 break;
2168 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2169 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002170 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002171 }
2172 if (anchor)
2173 com_backpatch(c, anchor);
2174}
2175
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002176static int
2177com_make_closure(struct compiling *c, PyCodeObject *co)
2178{
2179 int i, free = PyTuple_GET_SIZE(co->co_freevars);
2180 if (free == 0)
2181 return 0;
2182 for (i = 0; i < free; ++i) {
2183 /* Bypass com_addop_varname because it will generate
2184 LOAD_DEREF but LOAD_CLOSURE is needed.
2185 */
2186 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2187 int arg, reftype;
2188
2189 /* Special case: If a class contains a method with a
2190 free variable that has the same name as a method,
2191 the name will be considered free *and* local in the
2192 class. It should be handled by the closure, as
2193 well as by the normal name loookup logic.
2194 */
2195 reftype = get_ref_type(c, PyString_AS_STRING(name));
2196 if (reftype == CELL)
2197 arg = com_lookup_arg(c->c_cellvars, name);
2198 else /* (reftype == FREE) */
2199 arg = com_lookup_arg(c->c_freevars, name);
2200 if (arg == -1) {
2201 fprintf(stderr, "lookup %s in %s %d %d\n",
Jeremy Hylton483638c2001-02-01 20:20:45 +00002202 PyObject_REPR(name), c->c_name, reftype, arg);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002203 Py_FatalError("com_make_closure()");
2204 }
2205 com_addoparg(c, LOAD_CLOSURE, arg);
2206
2207 }
2208 com_push(c, free);
2209 return 1;
2210}
2211
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002212static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002213com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002214{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002215 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002216 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002217 PyObject *co;
2218 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002219 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002220 symtable_enter_scope(c->c_symtable, "lambda", lambdef);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002221 co = (PyObject *) icompile(CHILD(n, 0), c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002222 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002223 if (co == NULL) {
Guido van Rossum57531fe1993-11-30 14:57:42 +00002224 c->c_errors++;
2225 i = 255;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002226 closure = 0;
2227 } else {
2228 i = com_addconst(c, co);
2229 Py_DECREF(co);
2230 closure = com_make_closure(c, (PyCodeObject *)co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002231 }
2232 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002233 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002234 if (closure)
2235 com_addoparg(c, MAKE_CLOSURE, ndefs);
2236 else
2237 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002238 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002239 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002240 else {
2241 int anchor = 0;
2242 int i = 0;
2243 for (;;) {
2244 com_and_test(c, CHILD(n, i));
2245 if ((i += 2) >= NCH(n))
2246 break;
2247 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2248 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002249 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002250 }
2251 if (anchor)
2252 com_backpatch(c, anchor);
2253 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002254}
2255
2256static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002257com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002258{
2259 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002260 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002261 com_node(c, CHILD(n, 0));
2262 }
2263 else {
2264 int i;
2265 int len;
2266 len = (NCH(n) + 1) / 2;
2267 for (i = 0; i < NCH(n); i += 2)
2268 com_node(c, CHILD(n, i));
2269 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002270 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002271 }
2272}
2273
2274
2275/* Begin of assignment compilation */
2276
Thomas Wouters434d0822000-08-24 20:11:32 +00002277
2278static void
2279com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2280{
2281 com_addbyte(c, DUP_TOP);
2282 com_push(c, 1);
2283 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002284 com_node(c, augn);
2285 com_addbyte(c, opcode);
2286 com_pop(c, 1);
2287 com_addbyte(c, ROT_TWO);
2288 com_addopname(c, STORE_ATTR, n);
2289 com_pop(c, 2);
2290}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002291
2292static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002293com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002294{
2295 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002296 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002297}
2298
2299static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002300com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002301{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002302 REQ(n, trailer);
2303 switch (TYPE(CHILD(n, 0))) {
2304 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002305 com_error(c, PyExc_SyntaxError,
2306 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002307 break;
2308 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002309 if (assigning > OP_APPLY)
2310 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2311 else
2312 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002313 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002314 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002315 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002316 break;
2317 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002318 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002319 }
2320}
2321
2322static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002323com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002324{
2325 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002326 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002327 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002328 if (assigning) {
2329 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002330 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002331 com_push(c, i-1);
2332 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002333 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002334 com_assign(c, CHILD(n, i), assigning, NULL);
2335}
2336
2337static void
2338com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2339{
2340 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002341 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002342 com_push(c, 1);
2343 com_node(c, augn);
2344 com_addbyte(c, opcode);
2345 com_pop(c, 1);
2346 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002347}
2348
2349static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002350com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002351{
2352 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002353 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002354 if (assigning)
2355 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002356}
2357
2358static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002359com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002360{
2361 /* Loop to avoid trivial recursion */
2362 for (;;) {
2363 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002364
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002365 case exprlist:
2366 case testlist:
2367 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002368 if (assigning > OP_APPLY) {
2369 com_error(c, PyExc_SyntaxError,
2370 "augmented assign to tuple not possible");
2371 return;
2372 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002373 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002374 return;
2375 }
2376 n = CHILD(n, 0);
2377 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002378
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002379 case test:
2380 case and_test:
2381 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002382 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002383 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002384 case xor_expr:
2385 case and_expr:
2386 case shift_expr:
2387 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002388 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002389 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002390 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002391 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002392 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002393 return;
2394 }
2395 n = CHILD(n, 0);
2396 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002397
Guido van Rossum50564e81996-01-12 01:13:16 +00002398 case power: /* atom trailer* ('**' power)* */
2399/* ('+'|'-'|'~') factor | atom trailer* */
2400 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002401 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002402 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002403 return;
2404 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002405 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002406 int i;
2407 com_node(c, CHILD(n, 0));
2408 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002409 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002410 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002411 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002412 return;
2413 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002414 com_apply_trailer(c, CHILD(n, i));
2415 } /* NB i is still alive */
2416 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002417 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002418 return;
2419 }
2420 n = CHILD(n, 0);
2421 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002422
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002423 case atom:
2424 switch (TYPE(CHILD(n, 0))) {
2425 case LPAR:
2426 n = CHILD(n, 1);
2427 if (TYPE(n) == RPAR) {
2428 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002429 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002430 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002431 return;
2432 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002433 if (assigning > OP_APPLY) {
2434 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002435 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002436 return;
2437 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002438 break;
2439 case LSQB:
2440 n = CHILD(n, 1);
2441 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002442 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002443 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002444 return;
2445 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002446 if (assigning > OP_APPLY) {
2447 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002448 "augmented assign to list not possible");
2449 return;
2450 }
2451 if (NCH(n) > 1
2452 && TYPE(CHILD(n, 1)) == list_for) {
2453 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002454 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002455 return;
2456 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002457 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002458 return;
2459 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002460 if (assigning > OP_APPLY)
2461 com_augassign_name(c, CHILD(n, 0),
2462 assigning, augn);
2463 else
2464 com_assign_name(c, CHILD(n, 0),
2465 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002466 return;
2467 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002468 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002469 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002470 return;
2471 }
2472 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002473
2474 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002475 com_error(c, PyExc_SyntaxError,
2476 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002477 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002478
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002479 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002480 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002481 com_error(c, PyExc_SystemError,
2482 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002483 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002484
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002485 }
2486 }
2487}
Guido van Rossum7c531111997-03-11 18:42:21 +00002488
Thomas Wouters434d0822000-08-24 20:11:32 +00002489static void
2490com_augassign(struct compiling *c, node *n)
2491{
2492 int opcode;
2493
2494 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2495 case '+': opcode = INPLACE_ADD; break;
2496 case '-': opcode = INPLACE_SUBTRACT; break;
2497 case '/': opcode = INPLACE_DIVIDE; break;
2498 case '%': opcode = INPLACE_MODULO; break;
2499 case '<': opcode = INPLACE_LSHIFT; break;
2500 case '>': opcode = INPLACE_RSHIFT; break;
2501 case '&': opcode = INPLACE_AND; break;
2502 case '^': opcode = INPLACE_XOR; break;
2503 case '|': opcode = INPLACE_OR; break;
2504 case '*':
2505 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2506 opcode = INPLACE_POWER;
2507 else
2508 opcode = INPLACE_MULTIPLY;
2509 break;
2510 default:
2511 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2512 return;
2513 }
2514 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2515}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002516
2517static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002518com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002519{
Thomas Wouters434d0822000-08-24 20:11:32 +00002520 REQ(n, expr_stmt);
2521 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002522 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002523 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002524 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002525 if (NCH(n) == 1) {
2526 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002527 if (c->c_interactive)
2528 com_addbyte(c, PRINT_EXPR);
2529 else
2530 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002531 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002532 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002533 else if (TYPE(CHILD(n,1)) == augassign)
2534 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002535 else {
2536 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002537 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002538 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002539 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002540 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002541 com_push(c, 1);
2542 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002543 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002544 }
2545 }
2546}
2547
2548static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002549com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002550{
2551 int a = 0, b = 0;
2552 int i;
2553 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2554 /* Generate code like for
2555
2556 if __debug__:
2557 if not <test>:
2558 raise AssertionError [, <message>]
2559
2560 where <message> is the second test, if present.
2561 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002562
2563 /* XXX should __debug__ and AssertionError get inserted into
2564 the symbol table? they don't follow the normal rules
2565 because they are always loaded as globals */
2566
Guido van Rossum228d7f31997-04-02 05:24:36 +00002567 if (Py_OptimizeFlag)
2568 return;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002569 com_addop_name(c, LOAD_GLOBAL, "__debug__");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002570 com_push(c, 1);
2571 com_addfwref(c, JUMP_IF_FALSE, &a);
2572 com_addbyte(c, POP_TOP);
2573 com_pop(c, 1);
2574 com_node(c, CHILD(n, 1));
2575 com_addfwref(c, JUMP_IF_TRUE, &b);
2576 com_addbyte(c, POP_TOP);
2577 com_pop(c, 1);
2578 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002579 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002580 com_push(c, 1);
2581 i = NCH(n)/2; /* Either 2 or 4 */
2582 if (i > 1)
2583 com_node(c, CHILD(n, 3));
2584 com_addoparg(c, RAISE_VARARGS, i);
2585 com_pop(c, i);
2586 /* The interpreter does not fall through */
2587 /* All jumps converge here */
2588 com_backpatch(c, a);
2589 com_backpatch(c, b);
2590 com_addbyte(c, POP_TOP);
2591}
2592
2593static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002594com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002595{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002596 int i = 1;
2597 node* stream = NULL;
2598
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002599 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002600
2601 /* are we using the extended print form? */
2602 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2603 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002604 com_node(c, stream);
2605 /* stack: [...] => [... stream] */
2606 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002607 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2608 i = 4;
2609 else
2610 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002611 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002612 for (; i < NCH(n); i += 2) {
2613 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002614 com_addbyte(c, DUP_TOP);
2615 /* stack: [stream] => [stream stream] */
2616 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002617 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002618 /* stack: [stream stream] => [stream stream obj] */
2619 com_addbyte(c, ROT_TWO);
2620 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002621 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002622 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002623 com_pop(c, 2);
2624 }
2625 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002626 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002627 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002628 com_addbyte(c, PRINT_ITEM);
2629 com_pop(c, 1);
2630 }
2631 }
2632 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002633 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002634 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002635 /* must pop the extra stream object off the stack */
2636 com_addbyte(c, POP_TOP);
2637 /* stack: [... stream] => [...] */
2638 com_pop(c, 1);
2639 }
2640 }
2641 else {
2642 if (stream != NULL) {
2643 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002644 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002645 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002646 com_pop(c, 1);
2647 }
2648 else
2649 com_addbyte(c, PRINT_NEWLINE);
2650 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002651}
2652
2653static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002654com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002655{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002656 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002657 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002658 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002659 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002660 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002661 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002662 com_push(c, 1);
2663 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002664 else
2665 com_node(c, CHILD(n, 1));
2666 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002667 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002668}
2669
2670static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002671com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002672{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002673 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002674 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2675 if (NCH(n) > 1) {
2676 com_node(c, CHILD(n, 1));
2677 if (NCH(n) > 3) {
2678 com_node(c, CHILD(n, 3));
2679 if (NCH(n) > 5)
2680 com_node(c, CHILD(n, 5));
2681 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002682 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002683 i = NCH(n)/2;
2684 com_addoparg(c, RAISE_VARARGS, i);
2685 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002686}
2687
2688static void
Thomas Wouters52152252000-08-17 22:55:00 +00002689com_from_import(struct compiling *c, node *n)
2690{
2691 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2692 com_push(c, 1);
2693 if (NCH(n) > 1) {
2694 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2695 com_error(c, PyExc_SyntaxError, "invalid syntax");
2696 return;
2697 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002698 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002699 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002700 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00002701 com_pop(c, 1);
2702}
2703
2704static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002705com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002706{
2707 int i;
2708 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002709 /* 'import' dotted_name (',' dotted_name)* |
2710 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002711 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00002712 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002713 /* 'from' dotted_name 'import' ... */
2714 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002715
2716 if (TYPE(CHILD(n, 3)) == STAR) {
2717 tup = Py_BuildValue("(s)", "*");
2718 } else {
2719 tup = PyTuple_New((NCH(n) - 2)/2);
2720 for (i = 3; i < NCH(n); i += 2) {
2721 PyTuple_SET_ITEM(tup, (i-3)/2,
2722 PyString_FromString(STR(
2723 CHILD(CHILD(n, i), 0))));
2724 }
2725 }
2726 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00002727 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002728 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002729 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00002730 if (TYPE(CHILD(n, 3)) == STAR)
2731 com_addbyte(c, IMPORT_STAR);
2732 else {
2733 for (i = 3; i < NCH(n); i += 2)
2734 com_from_import(c, CHILD(n, i));
2735 com_addbyte(c, POP_TOP);
2736 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002737 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002738 }
2739 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002740 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002741 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00002742 node *subn = CHILD(n, i);
2743 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002744 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002745 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002746 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00002747 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00002748 int j;
2749 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00002750 com_error(c, PyExc_SyntaxError,
2751 "invalid syntax");
2752 return;
2753 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00002754 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
2755 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002756 CHILD(CHILD(subn, 0),
2757 j));
2758 com_addop_varname(c, VAR_STORE,
2759 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002760 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002761 com_addop_varname(c, VAR_STORE,
2762 STR(CHILD(CHILD(subn, 0),
2763 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002764 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002765 }
2766 }
2767}
2768
2769static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002770com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002771{
2772 REQ(n, exec_stmt);
2773 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2774 com_node(c, CHILD(n, 1));
2775 if (NCH(n) >= 4)
2776 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002777 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002778 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002779 com_push(c, 1);
2780 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002781 if (NCH(n) >= 6)
2782 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002783 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002784 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002785 com_push(c, 1);
2786 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002787 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002788 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002789}
2790
Guido van Rossum7c531111997-03-11 18:42:21 +00002791static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002792is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002793{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002794 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002795 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002796 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00002797
2798 /* Label to avoid tail recursion */
2799 next:
2800 switch (TYPE(n)) {
2801
2802 case suite:
2803 if (NCH(n) == 1) {
2804 n = CHILD(n, 0);
2805 goto next;
2806 }
2807 /* Fall through */
2808 case file_input:
2809 for (i = 0; i < NCH(n); i++) {
2810 node *ch = CHILD(n, i);
2811 if (TYPE(ch) == stmt) {
2812 n = ch;
2813 goto next;
2814 }
2815 }
2816 break;
2817
2818 case stmt:
2819 case simple_stmt:
2820 case small_stmt:
2821 n = CHILD(n, 0);
2822 goto next;
2823
2824 case expr_stmt:
2825 case testlist:
2826 case test:
2827 case and_test:
2828 case not_test:
2829 case comparison:
2830 case expr:
2831 case xor_expr:
2832 case and_expr:
2833 case shift_expr:
2834 case arith_expr:
2835 case term:
2836 case factor:
2837 case power:
2838 case atom:
2839 if (NCH(n) == 1) {
2840 n = CHILD(n, 0);
2841 goto next;
2842 }
2843 break;
2844
2845 case NAME:
2846 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2847 return 1;
2848 break;
2849
2850 case NUMBER:
2851 v = parsenumber(c, STR(n));
2852 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002853 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002854 break;
2855 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002856 i = PyObject_IsTrue(v);
2857 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002858 return i == 0;
2859
2860 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002861 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002862 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002863 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002864 break;
2865 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002866 i = PyObject_IsTrue(v);
2867 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002868 return i == 0;
2869
2870 }
2871 return 0;
2872}
2873
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002874static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002875com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002876{
2877 int i;
2878 int anchor = 0;
2879 REQ(n, if_stmt);
2880 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2881 for (i = 0; i+3 < NCH(n); i+=4) {
2882 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002883 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002884 if (is_constant_false(c, ch))
2885 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002886 if (i > 0)
2887 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002888 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002889 com_addfwref(c, JUMP_IF_FALSE, &a);
2890 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002891 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002892 com_node(c, CHILD(n, i+3));
2893 com_addfwref(c, JUMP_FORWARD, &anchor);
2894 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002895 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002896 com_addbyte(c, POP_TOP);
2897 }
2898 if (i+2 < NCH(n))
2899 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002900 if (anchor)
2901 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002902}
2903
2904static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002905com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002906{
2907 int break_anchor = 0;
2908 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002909 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002910 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2911 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002912 block_push(c, SETUP_LOOP);
2913 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002914 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002915 com_node(c, CHILD(n, 1));
2916 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2917 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002918 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002919 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002920 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002921 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002922 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2923 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002924 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002925 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002926 com_addbyte(c, POP_TOP);
2927 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002928 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002929 if (NCH(n) > 4)
2930 com_node(c, CHILD(n, 6));
2931 com_backpatch(c, break_anchor);
2932}
2933
2934static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002935com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002936{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002937 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002938 int break_anchor = 0;
2939 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002940 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002941 REQ(n, for_stmt);
2942 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2943 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002944 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002945 com_node(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002946 v = PyInt_FromLong(0L);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002947 if (v == NULL)
2948 c->c_errors++;
2949 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002950 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002951 Py_XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002952 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002953 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002954 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002955 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00002956 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002957 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002958 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002959 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002960 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2961 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002962 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002963 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002964 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002965 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002966 if (NCH(n) > 8)
2967 com_node(c, CHILD(n, 8));
2968 com_backpatch(c, break_anchor);
2969}
2970
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002971/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002972
2973 SETUP_FINALLY L
2974 <code for S>
2975 POP_BLOCK
2976 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002977 L: <code for Sf>
2978 END_FINALLY
2979
2980 The special instructions use the block stack. Each block
2981 stack entry contains the instruction that created it (here
2982 SETUP_FINALLY), the level of the value stack at the time the
2983 block stack entry was created, and a label (here L).
2984
2985 SETUP_FINALLY:
2986 Pushes the current value stack level and the label
2987 onto the block stack.
2988 POP_BLOCK:
2989 Pops en entry from the block stack, and pops the value
2990 stack until its level is the same as indicated on the
2991 block stack. (The label is ignored.)
2992 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002993 Pops a variable number of entries from the *value* stack
2994 and re-raises the exception they specify. The number of
2995 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002996
2997 The block stack is unwound when an exception is raised:
2998 when a SETUP_FINALLY entry is found, the exception is pushed
2999 onto the value stack (and the exception condition is cleared),
3000 and the interpreter jumps to the label gotten from the block
3001 stack.
3002
3003 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003004 (The contents of the value stack is shown in [], with the top
3005 at the right; 'tb' is trace-back info, 'val' the exception's
3006 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003007
3008 Value stack Label Instruction Argument
3009 [] SETUP_EXCEPT L1
3010 [] <code for S>
3011 [] POP_BLOCK
3012 [] JUMP_FORWARD L0
3013
Guido van Rossum3f5da241990-12-20 15:06:42 +00003014 [tb, val, exc] L1: DUP )
3015 [tb, val, exc, exc] <evaluate E1> )
3016 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3017 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3018 [tb, val, exc, 1] POP )
3019 [tb, val, exc] POP
3020 [tb, val] <assign to V1> (or POP if no V1)
3021 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003022 [] <code for S1>
3023 JUMP_FORWARD L0
3024
Guido van Rossum3f5da241990-12-20 15:06:42 +00003025 [tb, val, exc, 0] L2: POP
3026 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003027 .............................etc.......................
3028
Guido van Rossum3f5da241990-12-20 15:06:42 +00003029 [tb, val, exc, 0] Ln+1: POP
3030 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003031
3032 [] L0: <next statement>
3033
3034 Of course, parts are not generated if Vi or Ei is not present.
3035*/
3036
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003037static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003038com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003039{
3040 int except_anchor = 0;
3041 int end_anchor = 0;
3042 int else_anchor = 0;
3043 int i;
3044 node *ch;
3045
3046 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3047 block_push(c, SETUP_EXCEPT);
3048 com_node(c, CHILD(n, 2));
3049 com_addbyte(c, POP_BLOCK);
3050 block_pop(c, SETUP_EXCEPT);
3051 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3052 com_backpatch(c, except_anchor);
3053 for (i = 3;
3054 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3055 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003056 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003057 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003058 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003059 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003060 break;
3061 }
3062 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003063 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003064 com_addoparg(c, SET_LINENO, ch->n_lineno);
3065 if (NCH(ch) > 1) {
3066 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003067 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003068 com_node(c, CHILD(ch, 1));
3069 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003070 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003071 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3072 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003073 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003074 }
3075 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003076 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003077 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003078 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003079 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003080 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003081 com_pop(c, 1);
3082 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003083 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003084 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003085 com_node(c, CHILD(n, i+2));
3086 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3087 if (except_anchor) {
3088 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003089 /* We come in with [tb, val, exc, 0] on the
3090 stack; one pop and it's the same as
3091 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003092 com_addbyte(c, POP_TOP);
3093 }
3094 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003095 /* We actually come in here with [tb, val, exc] but the
3096 END_FINALLY will zap those and jump around.
3097 The c_stacklevel does not reflect them so we need not pop
3098 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003099 com_addbyte(c, END_FINALLY);
3100 com_backpatch(c, else_anchor);
3101 if (i < NCH(n))
3102 com_node(c, CHILD(n, i+2));
3103 com_backpatch(c, end_anchor);
3104}
3105
3106static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003107com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003108{
3109 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003110 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003111
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003112 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3113 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003114 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003115 com_addbyte(c, POP_BLOCK);
3116 block_pop(c, SETUP_FINALLY);
3117 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003118 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003119 /* While the generated code pushes only one item,
3120 the try-finally handling can enter here with
3121 up to three items. OK, here are the details:
3122 3 for an exception, 2 for RETURN, 1 for BREAK. */
3123 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003124 com_backpatch(c, finally_anchor);
3125 ch = CHILD(n, NCH(n)-1);
3126 com_addoparg(c, SET_LINENO, ch->n_lineno);
3127 com_node(c, ch);
3128 com_addbyte(c, END_FINALLY);
3129 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003130 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003131}
3132
3133static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003134com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003135{
3136 REQ(n, try_stmt);
3137 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3138 | 'try' ':' suite 'finally' ':' suite */
3139 if (TYPE(CHILD(n, 3)) != except_clause)
3140 com_try_finally(c, n);
3141 else
3142 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003143}
3144
Guido van Rossum8b993a91997-01-17 21:04:03 +00003145static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003146get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003147{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003148 int i;
3149
Guido van Rossum8b993a91997-01-17 21:04:03 +00003150 /* Label to avoid tail recursion */
3151 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003152 switch (TYPE(n)) {
3153
3154 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003155 if (NCH(n) == 1) {
3156 n = CHILD(n, 0);
3157 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003158 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003159 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003160 case file_input:
3161 for (i = 0; i < NCH(n); i++) {
3162 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003163 if (TYPE(ch) == stmt) {
3164 n = ch;
3165 goto next;
3166 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003167 }
3168 break;
3169
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003170 case stmt:
3171 case simple_stmt:
3172 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003173 n = CHILD(n, 0);
3174 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003175
3176 case expr_stmt:
3177 case testlist:
3178 case test:
3179 case and_test:
3180 case not_test:
3181 case comparison:
3182 case expr:
3183 case xor_expr:
3184 case and_expr:
3185 case shift_expr:
3186 case arith_expr:
3187 case term:
3188 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003189 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003190 if (NCH(n) == 1) {
3191 n = CHILD(n, 0);
3192 goto next;
3193 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003194 break;
3195
3196 case atom:
3197 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003198 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003199 break;
3200
3201 }
3202 return NULL;
3203}
3204
Guido van Rossum79f25d91997-04-29 20:08:16 +00003205static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003206get_docstring(node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003207{
Guido van Rossum541563e1999-01-28 15:08:09 +00003208 /* Don't generate doc-strings if run with -OO */
3209 if (Py_OptimizeFlag > 1)
3210 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003211 n = get_rawdocstring(n);
3212 if (n == NULL)
3213 return NULL;
3214 return parsestrplus(n);
3215}
3216
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003217static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003218com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003219{
3220 REQ(n, suite);
3221 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3222 if (NCH(n) == 1) {
3223 com_node(c, CHILD(n, 0));
3224 }
3225 else {
3226 int i;
3227 for (i = 0; i < NCH(n); i++) {
3228 node *ch = CHILD(n, i);
3229 if (TYPE(ch) == stmt)
3230 com_node(c, ch);
3231 }
3232 }
3233}
3234
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003235/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003236static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003237com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003238{
3239 int i = c->c_nblocks;
3240 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3241 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3242 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003243 else if (i <= 0) {
3244 /* at the outer level */
3245 com_error(c, PyExc_SyntaxError,
3246 "'continue' not properly in loop");
3247 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003248 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003249 int j;
3250 for (j = 0; j <= i; ++j) {
3251 if (c->c_block[j] == SETUP_LOOP)
3252 break;
3253 }
3254 if (j < i+1) {
3255 /* there is a loop, but something interferes */
3256 for (++j; j <= i; ++j) {
3257 if (c->c_block[i] == SETUP_EXCEPT
3258 || c->c_block[i] == SETUP_FINALLY) {
3259 com_error(c, PyExc_SyntaxError,
3260 "'continue' not supported inside 'try' clause");
3261 return;
3262 }
3263 }
3264 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003265 com_error(c, PyExc_SyntaxError,
3266 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003267 }
3268 /* XXX Could allow it inside a 'finally' clause
3269 XXX if we could pop the exception still on the stack */
3270}
3271
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003272static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003273com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003274{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003275 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003276 if (TYPE(n) == lambdef) {
3277 /* lambdef: 'lambda' [varargslist] ':' test */
3278 n = CHILD(n, 1);
3279 }
3280 else {
3281 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3282 n = CHILD(n, 2);
3283 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3284 n = CHILD(n, 1);
3285 }
3286 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003287 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003288 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003289 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003290 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3291 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003292 nargs = 0;
3293 ndefs = 0;
3294 for (i = 0; i < nch; i++) {
3295 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003296 if (TYPE(CHILD(n, i)) == STAR ||
3297 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003298 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003299 nargs++;
3300 i++;
3301 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003302 t = RPAR; /* Anything except EQUAL or COMMA */
3303 else
3304 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003305 if (t == EQUAL) {
3306 i++;
3307 ndefs++;
3308 com_node(c, CHILD(n, i));
3309 i++;
3310 if (i >= nch)
3311 break;
3312 t = TYPE(CHILD(n, i));
3313 }
3314 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003315 /* Treat "(a=1, b)" as an error */
3316 if (ndefs)
3317 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003318 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003319 }
3320 if (t != COMMA)
3321 break;
3322 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003323 return ndefs;
3324}
3325
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003326static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003327com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003328{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003329 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003330 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003331 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003332 ndefs = com_argdefs(c, n);
3333 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003334 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003335 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003336 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003337 c->c_errors++;
3338 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003339 int closure = com_make_closure(c, (PyCodeObject *)co);
3340 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003341 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003342 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003343 if (closure)
3344 com_addoparg(c, MAKE_CLOSURE, ndefs);
3345 else
3346 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003347 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003348 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003349 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003350 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003351 }
3352}
3353
3354static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003355com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003356{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003357 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003358 REQ(n, testlist);
3359 /* testlist: test (',' test)* [','] */
3360 for (i = 0; i < NCH(n); i += 2)
3361 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003362 i = (NCH(n)+1) / 2;
3363 com_addoparg(c, BUILD_TUPLE, i);
3364 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003365}
3366
3367static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003368com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003369{
Guido van Rossum25831651993-05-19 14:50:45 +00003370 int i;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003371 PyObject *co, *v;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003372 char *name;
3373
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003374 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003375 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003376 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003377 c->c_errors++;
3378 return;
3379 }
3380 /* Push the class name on the stack */
3381 i = com_addconst(c, v);
3382 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003383 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003384 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003385 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003386 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003387 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003388 com_push(c, 1);
3389 }
Guido van Rossum25831651993-05-19 14:50:45 +00003390 else
3391 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003392 name = STR(CHILD(n, 1));
3393 symtable_enter_scope(c->c_symtable, name, TYPE(n));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003394 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003395 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003396 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003397 c->c_errors++;
3398 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003399 int closure = com_make_closure(c, (PyCodeObject *)co);
3400 i = com_addconst(c, co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003401 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003402 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003403 if (closure)
3404 com_addoparg(c, MAKE_CLOSURE, 0);
3405 else
3406 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003407 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003408 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003409 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003410 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003411 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003412 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003413}
3414
3415static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003416com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003417{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003418 loop:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003419 switch (TYPE(n)) {
3420
3421 /* Definition nodes */
3422
3423 case funcdef:
3424 com_funcdef(c, n);
3425 break;
3426 case classdef:
3427 com_classdef(c, n);
3428 break;
3429
3430 /* Trivial parse tree nodes */
3431
3432 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003433 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003434 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003435 n = CHILD(n, 0);
3436 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003437
3438 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003439 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
3440 com_addoparg(c, SET_LINENO, n->n_lineno);
3441 {
3442 int i;
3443 for (i = 0; i < NCH(n)-1; i += 2)
3444 com_node(c, CHILD(n, i));
3445 }
3446 break;
3447
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003448 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003449 com_addoparg(c, SET_LINENO, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003450 n = CHILD(n, 0);
3451 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003452
3453 /* Statement nodes */
3454
3455 case expr_stmt:
3456 com_expr_stmt(c, n);
3457 break;
3458 case print_stmt:
3459 com_print_stmt(c, n);
3460 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003461 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003462 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003463 break;
3464 case pass_stmt:
3465 break;
3466 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003467 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003468 com_error(c, PyExc_SyntaxError,
3469 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003470 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003471 com_addbyte(c, BREAK_LOOP);
3472 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003473 case continue_stmt:
3474 com_continue_stmt(c, n);
3475 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003476 case return_stmt:
3477 com_return_stmt(c, n);
3478 break;
3479 case raise_stmt:
3480 com_raise_stmt(c, n);
3481 break;
3482 case import_stmt:
3483 com_import_stmt(c, n);
3484 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003485 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003486 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003487 case exec_stmt:
3488 com_exec_stmt(c, n);
3489 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003490 case assert_stmt:
3491 com_assert_stmt(c, n);
3492 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003493 case if_stmt:
3494 com_if_stmt(c, n);
3495 break;
3496 case while_stmt:
3497 com_while_stmt(c, n);
3498 break;
3499 case for_stmt:
3500 com_for_stmt(c, n);
3501 break;
3502 case try_stmt:
3503 com_try_stmt(c, n);
3504 break;
3505 case suite:
3506 com_suite(c, n);
3507 break;
3508
3509 /* Expression nodes */
3510
3511 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003512 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003513 break;
3514 case test:
3515 com_test(c, n);
3516 break;
3517 case and_test:
3518 com_and_test(c, n);
3519 break;
3520 case not_test:
3521 com_not_test(c, n);
3522 break;
3523 case comparison:
3524 com_comparison(c, n);
3525 break;
3526 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003527 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003528 break;
3529 case expr:
3530 com_expr(c, n);
3531 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003532 case xor_expr:
3533 com_xor_expr(c, n);
3534 break;
3535 case and_expr:
3536 com_and_expr(c, n);
3537 break;
3538 case shift_expr:
3539 com_shift_expr(c, n);
3540 break;
3541 case arith_expr:
3542 com_arith_expr(c, n);
3543 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003544 case term:
3545 com_term(c, n);
3546 break;
3547 case factor:
3548 com_factor(c, n);
3549 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003550 case power:
3551 com_power(c, n);
3552 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003553 case atom:
3554 com_atom(c, n);
3555 break;
3556
3557 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003558 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003559 com_error(c, PyExc_SystemError,
3560 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003561 }
3562}
3563
Tim Petersdbd9ba62000-07-09 03:09:57 +00003564static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003565
3566static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003567com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003568{
3569 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3570 if (TYPE(CHILD(n, 0)) == LPAR)
3571 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003572 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003573 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003574 com_pop(c, 1);
3575 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003576}
3577
3578static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003579com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003580{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003581 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003582 if (NCH(n) == 1) {
3583 com_fpdef(c, CHILD(n, 0));
3584 }
3585 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003586 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003587 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003588 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003589 for (i = 0; i < NCH(n); i += 2)
3590 com_fpdef(c, CHILD(n, i));
3591 }
3592}
3593
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003594/* XXX This function could probably be made simpler, because it
3595 doesn't do anything except generate code for complex arguments.
3596*/
3597
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003598static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003599com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003600{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003601 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003602 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003603 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003604 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003605 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003606 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003607 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003608 /* Enter all arguments in table of locals */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003609 for (i = 0, narg = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003610 node *ch = CHILD(n, i);
3611 node *fp;
3612 char *name;
Guido van Rossum50564e81996-01-12 01:13:16 +00003613 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003614 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003615 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3616 fp = CHILD(ch, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003617 if (TYPE(fp) == NAME) {
3618 PyObject *v;
3619 name = STR(fp);
3620 v = PyDict_GetItemString(c->c_cellvars, name);
3621 if (v) {
3622 com_addoparg(c, LOAD_FAST, narg);
3623 com_addoparg(c, STORE_DEREF,
3624 PyInt_AS_LONG(v));
3625 }
3626 } else {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003627 name = nbuf;
3628 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003629 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003630 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003631 narg++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003632 /* all name updates handled by symtable */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003633 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003634 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003635 ch = CHILD(n, i);
3636 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003637 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003638 else
3639 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003640 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003641 /* Handle *arguments */
3642 if (i < nch) {
3643 node *ch;
3644 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003645 if (TYPE(ch) != DOUBLESTAR) {
3646 REQ(ch, STAR);
3647 ch = CHILD(n, i+1);
3648 if (TYPE(ch) == NAME) {
Guido van Rossum50564e81996-01-12 01:13:16 +00003649 i += 3;
Guido van Rossum50564e81996-01-12 01:13:16 +00003650 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003651 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003652 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003653 /* Handle **keywords */
3654 if (i < nch) {
3655 node *ch;
3656 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003657 if (TYPE(ch) != DOUBLESTAR) {
3658 REQ(ch, STAR);
3659 ch = CHILD(n, i+1);
3660 REQ(ch, STAR);
3661 ch = CHILD(n, i+2);
3662 }
3663 else
3664 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003665 REQ(ch, NAME);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003666 }
3667 if (complex) {
3668 /* Generate code for complex arguments only after
3669 having counted the simple arguments */
3670 int ilocal = 0;
3671 for (i = 0; i < nch; i++) {
3672 node *ch = CHILD(n, i);
3673 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003674 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003675 break;
3676 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3677 fp = CHILD(ch, 0);
3678 if (TYPE(fp) != NAME) {
3679 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003680 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003681 com_fpdef(c, ch);
3682 }
3683 ilocal++;
3684 if (++i >= nch)
3685 break;
3686 ch = CHILD(n, i);
3687 if (TYPE(ch) == EQUAL)
3688 i += 2;
3689 else
3690 REQ(ch, COMMA);
3691 }
3692 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003693}
3694
3695static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003696com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003697{
3698 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003699 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003700 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003701 doc = get_docstring(n);
3702 if (doc != NULL) {
3703 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003704 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003705 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003706 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003707 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003708 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003709 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003710 for (i = 0; i < NCH(n); i++) {
3711 node *ch = CHILD(n, i);
3712 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3713 com_node(c, ch);
3714 }
3715}
3716
3717/* Top-level compile-node interface */
3718
3719static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003720compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003721{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003722 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003723 node *ch;
3724 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003725 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003726 doc = get_docstring(CHILD(n, 4));
3727 if (doc != NULL) {
3728 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003729 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003730 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003731 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003732 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003733 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3734 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003735 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003736 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003737 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003738 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003739 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003740 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003741 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003742 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003743 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003744}
3745
3746static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003747compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003748{
Guido van Rossum590baa41993-11-30 13:40:46 +00003749 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003750 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003751 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003752
3753 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003754 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003755 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003756 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003757 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003758 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003759 else
3760 ch = CHILD(n, 2);
3761 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003762 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003763 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003764}
3765
3766static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003767compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003768{
3769 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003770 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003771 REQ(n, classdef);
3772 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3773 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003774 c->c_private = c->c_name;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003775 ch = CHILD(n, NCH(n)-1); /* The suite */
3776 doc = get_docstring(ch);
3777 if (doc != NULL) {
3778 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003779 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003780 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003781 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003782 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003783 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003784 }
3785 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003786 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003787 com_node(c, ch);
3788 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003789 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003790 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003791 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003792}
3793
3794static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003795compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003796{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003797 com_addoparg(c, SET_LINENO, n->n_lineno);
3798
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003799 switch (TYPE(n)) {
3800
Guido van Rossum4c417781991-01-21 16:09:22 +00003801 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003802 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003803 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003804 n = CHILD(n, 0);
3805 if (TYPE(n) != NEWLINE)
3806 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003807 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003808 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003809 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003810 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003811 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003812 break;
3813
Guido van Rossum4c417781991-01-21 16:09:22 +00003814 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003815 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003816 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003817 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003818 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003819 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003820 break;
3821
Guido van Rossum590baa41993-11-30 13:40:46 +00003822 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003823 com_node(c, CHILD(n, 0));
3824 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003825 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003826 break;
3827
Guido van Rossum590baa41993-11-30 13:40:46 +00003828 case lambdef: /* anonymous function definition */
3829 compile_lambdef(c, n);
3830 break;
3831
Guido van Rossum4c417781991-01-21 16:09:22 +00003832 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003833 compile_funcdef(c, n);
3834 break;
3835
Guido van Rossum4c417781991-01-21 16:09:22 +00003836 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003837 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003838 break;
3839
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003840 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003841 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003842 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003843 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003844 }
3845}
3846
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003847static PyObject *
3848dict_keys_inorder(PyObject *dict, int offset)
3849{
3850 PyObject *tuple, *k, *v;
3851 int i, pos = 0, size = PyDict_Size(dict);
3852
3853 tuple = PyTuple_New(size);
3854 if (tuple == NULL)
3855 return NULL;
3856 while (PyDict_Next(dict, &pos, &k, &v)) {
3857 i = PyInt_AS_LONG(v);
3858 Py_INCREF(k);
3859 PyTuple_SET_ITEM(tuple, i - offset, k);
3860 }
3861 return tuple;
3862}
3863
Guido van Rossum79f25d91997-04-29 20:08:16 +00003864PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003865PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003866{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003867 return jcompile(n, filename, NULL);
3868}
3869
Guido van Rossum79f25d91997-04-29 20:08:16 +00003870static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003871icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003872{
3873 return jcompile(n, base->c_filename, base);
3874}
3875
Guido van Rossum79f25d91997-04-29 20:08:16 +00003876static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003877jcompile(node *n, char *filename, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003878{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003879 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003880 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003881 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003882 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003883 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003884 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003885 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003886 /* c_symtable still points to parent's symbols */
3887 if (base->c_nested
3888 || (sc.c_symtable->st_cur_type == TYPE_FUNCTION))
3889 sc.c_nested = 1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003890 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003891 sc.c_private = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003892 if (symtable_build(&sc, n) < 0) {
3893 com_free(&sc);
3894 return NULL;
3895 }
3896 }
3897 co = NULL;
3898 if (symtable_load_symbols(&sc) < 0)
3899 goto exit;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003900 compile_node(&sc, n);
3901 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00003902 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003903 PyObject *consts, *names, *varnames, *filename, *name,
3904 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003905 consts = PyList_AsTuple(sc.c_consts);
3906 names = PyList_AsTuple(sc.c_names);
3907 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003908 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
3909 freevars = dict_keys_inorder(sc.c_freevars,
3910 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003911 filename = PyString_InternFromString(sc.c_filename);
3912 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003913 if (!PyErr_Occurred())
3914 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003915 sc.c_nlocals,
3916 sc.c_maxstacklevel,
3917 sc.c_flags,
3918 sc.c_code,
3919 consts,
3920 names,
3921 varnames,
3922 freevars,
3923 cellvars,
3924 filename,
3925 name,
3926 sc.c_firstlineno,
3927 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003928 Py_XDECREF(consts);
3929 Py_XDECREF(names);
3930 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003931 Py_XDECREF(freevars);
3932 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003933 Py_XDECREF(filename);
3934 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003935 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00003936 else if (!PyErr_Occurred()) {
3937 /* This could happen if someone called PyErr_Clear() after an
3938 error was reported above. That's not supposed to happen,
3939 but I just plugged one case and I'm not sure there can't be
3940 others. In that case, raise SystemError so that at least
3941 it gets reported instead dumping core. */
3942 PyErr_SetString(PyExc_SystemError, "lost syntax error");
3943 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003944 exit:
3945 if (base == NULL)
3946 symtable_free(sc.c_symtable);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003947 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003948 return co;
3949}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003950
3951int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003952PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003953{
3954 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003955 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003956 int line = co->co_firstlineno;
3957 int addr = 0;
3958 while (--size >= 0) {
3959 addr += *p++;
3960 if (addr > addrq)
3961 break;
3962 line += *p++;
3963 }
3964 return line;
3965}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003966
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003967/* The test for LOCAL must come before the test for FREE in order to
3968 handle classes where name is both local and free. The local var is
3969 a method and the free var is a free var referenced within a method.
3970*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003971
3972static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003973get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003974{
3975 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003976 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
3977 return CELL;
3978 if (PyDict_GetItemString(c->c_locals, name) != NULL)
3979 return LOCAL;
3980 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
3981 return FREE;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003982 v = PyDict_GetItemString(c->c_globals, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003983 if (v) {
3984 if (v == Py_None)
3985 return GLOBAL_EXPLICIT;
3986 else {
3987 return GLOBAL_IMPLICIT;
3988 }
3989 }
3990 {
3991 char buf[250];
3992 sprintf(buf, "unknown scope for %.100s in %.100s (%s)",
Jeremy Hylton483638c2001-02-01 20:20:45 +00003993 name, c->c_name,
3994 PyObject_REPR(c->c_symtable->st_cur_id));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003995 Py_FatalError(buf);
3996 }
3997 return -1; /* can't get here */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003998}
3999
4000static int
4001symtable_build(struct compiling *c, node *n)
4002{
4003 if ((c->c_symtable = symtable_init()) == NULL)
4004 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004005 if (symtable_enter_scope(c->c_symtable, TOP, TYPE(n)) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004006 return -1;
4007 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004008 if (c->c_symtable->st_errors > 0)
4009 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004010 /* reset for second pass */
4011 c->c_symtable->st_scopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004012 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004013 return 0;
4014}
4015
4016static int
4017symtable_load_symbols(struct compiling *c)
4018{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004019 static PyObject *implicit = NULL;
4020 PyObject *name, *varnames, *v;
4021 int i, info, pos;
4022 int nlocals, nfrees, ncells;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004023 struct symtable *st = c->c_symtable;
4024
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004025 if (implicit == NULL) {
4026 implicit = PyInt_FromLong(1);
4027 if (implicit == NULL)
4028 return -1;
4029 }
4030 v = NULL;
4031
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004032 varnames = PyDict_GetItem(st->st_varnames, st->st_cur_id);
4033 if (varnames == NULL) {
4034 varnames = PyList_New(0);
4035 if (varnames == NULL)
4036 return -1;
4037 } else
4038 Py_INCREF(varnames);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004039 c->c_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004040
4041 c->c_globals = PyDict_New();
4042 if (c->c_globals == NULL)
4043 goto fail;
4044 c->c_freevars = PyDict_New();
4045 if (c->c_freevars == NULL)
4046 goto fail;
4047 c->c_cellvars = PyDict_New();
4048 if (c->c_cellvars == NULL)
4049 goto fail;
4050
4051 nlocals = PyList_GET_SIZE(varnames);
4052 c->c_argcount = nlocals;
4053 nfrees = 0;
4054 ncells = 0;
4055 for (i = 0; i < nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004056 v = PyInt_FromLong(i);
4057 if (PyDict_SetItem(c->c_locals,
4058 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004059 goto fail;
4060 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004061 }
4062
4063 /* XXX The cases below define the rules for whether a name is
4064 local or global. The logic could probably be clearer. */
4065 pos = 0;
4066 while (PyDict_Next(st->st_cur, &pos, &name, &v)) {
4067 info = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004068
4069 if (info & DEF_FREE_GLOBAL)
4070 /* undo the original DEF_FREE */
4071 info &= ~(DEF_FREE | DEF_FREE_CLASS);
4072
4073
4074 /* Seperate logic for DEF_FREE. If it occurs in a
4075 function, it indicates a local that we must
4076 allocate storage for (a cell var). If it occurs in
4077 a class, then the class has a method and a free
4078 variable with the same name.
4079 */
4080
4081 if ((info & (DEF_FREE | DEF_FREE_CLASS))
4082 && (info & (DEF_LOCAL | DEF_PARAM))) {
4083 PyObject *dict;
4084 if (st->st_cur_type == TYPE_FUNCTION) {
4085 v = PyInt_FromLong(ncells++);
4086 dict = c->c_cellvars;
4087 } else {
4088 v = PyInt_FromLong(nfrees++);
4089 dict = c->c_freevars;
4090 }
4091 if (v == NULL)
4092 return -1;
4093 if (PyDict_SetItem(dict, name, v) < 0)
4094 goto fail;
4095 Py_DECREF(v);
4096 }
4097
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004098 if (info & DEF_STAR) {
4099 c->c_argcount--;
4100 c->c_flags |= CO_VARARGS;
4101 } else if (info & DEF_DOUBLESTAR) {
4102 c->c_argcount--;
4103 c->c_flags |= CO_VARKEYWORDS;
4104 } else if (info & DEF_INTUPLE)
4105 c->c_argcount--;
4106 else if (info & DEF_GLOBAL) {
4107 if ((info & DEF_PARAM)
4108 && (PyString_AS_STRING(name)[0] != '.')){
4109 char buf[500];
4110 sprintf(buf,
4111 "name '%.400s' is local and global",
4112 PyString_AS_STRING(name));
4113 com_error(c, PyExc_SyntaxError, buf);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004114 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004115 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004116 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4117 goto fail;
4118 } else if (info & DEF_FREE_GLOBAL) {
4119 if (PyDict_SetItem(c->c_globals, name, implicit) < 0)
4120 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004121 } else if ((info & DEF_LOCAL) && !(info & DEF_PARAM)) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004122 v = PyInt_FromLong(nlocals++);
4123 if (v == NULL)
4124 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004125 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004126 goto fail;
4127 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004128 if (st->st_cur_type != TYPE_CLASS)
4129 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004130 goto fail;
4131 } else if (is_free(info)) {
4132 if (st->st_nested) {
4133 v = PyInt_FromLong(nfrees++);
4134 if (v == NULL)
4135 goto fail;
4136 if (PyDict_SetItem(c->c_freevars,
4137 name, v) < 0)
4138 goto fail;
4139 Py_DECREF(v);
4140 } else {
4141 if (PyDict_SetItem(c->c_globals, name,
4142 implicit) < 0)
4143 goto fail;
4144 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004145 }
4146 }
4147
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004148 /* The cell vars are the first elements of the closure,
4149 followed by the free vars. Update the offsets in
4150 c_freevars to account for number of cellvars. */
4151 pos = 0;
4152 while (PyDict_Next(c->c_freevars, &pos, &name, &v)) {
4153 int i = PyInt_AS_LONG(v) + ncells;
4154 PyObject *o = PyInt_FromLong(i);
4155 if (PyDict_SetItem(c->c_freevars, name, o) < 0) {
4156 Py_DECREF(o);
4157 return -1;
4158 }
4159 Py_DECREF(o);
4160 }
4161
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004162 if (st->st_cur_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004163 c->c_nlocals = nlocals;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004164
4165 if (st->st_cur_type != TYPE_MODULE)
4166 c->c_flags |= CO_NEWLOCALS;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004167 if (st->st_cur_type == TYPE_FUNCTION) {
4168 if (PyDict_GetItemString(st->st_cur, NOOPT) == NULL)
4169 c->c_flags |= CO_OPTIMIZED;
4170 else if (ncells || nfrees) {
4171 char buf[256];
4172 /* XXX need better error message */
4173 sprintf(buf,
4174 "function %.100s: may not use lexical scoping"
4175 " and 'import *' or exec in same function",
4176 PyString_AS_STRING(st->st_cur_name));
4177 com_error(c, PyExc_SyntaxError, buf);
4178 return -1;
4179 }
4180 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004181 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004182
4183 fail:
4184 /* is this always the right thing to do? */
4185 Py_XDECREF(v);
4186 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004187}
4188
4189static struct symtable *
4190symtable_init()
4191{
4192 struct symtable *st;
4193 PyObject *d;
4194
4195 st = (struct symtable *)PyMem_Malloc(sizeof(struct symtable));
4196 if (st == NULL)
4197 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004198 st->st_pass = 1;
4199 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004200 goto fail;
4201 if ((st->st_symbols = PyDict_New()) == NULL)
4202 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004203 if ((st->st_children = PyDict_New()) == NULL)
4204 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004205 if ((st->st_varnames = PyDict_New()) == NULL)
4206 goto fail;
4207 if ((d = PyDict_New()) == NULL)
4208 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004209 if (PyDict_SetItemString(st->st_symbols, TOP, d) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004210 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004211 Py_DECREF(d);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004212 st->st_global = d;
4213 st->st_cur = NULL;
4214 st->st_cur_id = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004215 st->st_cur_name = NULL;
4216 st->st_cur_children = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004217 st->st_cur_type = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004218 st->st_nested = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004219 st->st_scopes = 0;
4220 st->st_errors = 0;
4221 st->st_tmpname = 0;
4222 st->st_private = NULL;
4223 return st;
4224 fail:
4225 symtable_free(st);
4226 return NULL;
4227}
4228
4229static void
4230symtable_free(struct symtable *st)
4231{
4232 Py_XDECREF(st->st_symbols);
4233 Py_XDECREF(st->st_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004234 Py_XDECREF(st->st_children);
4235 Py_XDECREF(st->st_stack);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004236 Py_XDECREF(st->st_cur_id);
Jeremy Hylton2fdfadf2001-01-29 22:42:28 +00004237 Py_XDECREF(st->st_cur_name);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004238 PyMem_Free((void *)st);
4239}
4240
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004241static PyObject *
4242make_scope_info(PyObject *id, PyObject *name, int nested, int type)
4243{
4244 PyObject *t, *i1 = NULL, *i2 = NULL;
4245
4246 t = PyTuple_New(4);
4247 if (t == NULL)
4248 return NULL;
4249 i1 = PyInt_FromLong(nested);
4250 if (i1 == NULL)
4251 goto fail;
4252 i2 = PyInt_FromLong(type);
4253 if (i2 == NULL)
4254 goto fail;
4255
4256 Py_INCREF(name);
4257 Py_INCREF(id);
4258 PyTuple_SET_ITEM(t, 0, name);
4259 PyTuple_SET_ITEM(t, 1, id);
4260 /* i1 & i2 alloced here; don't need incref */
4261 PyTuple_SET_ITEM(t, 2, i1);
4262 PyTuple_SET_ITEM(t, 3, i2);
4263 return t;
4264 fail:
4265 Py_XDECREF(t);
4266 Py_XDECREF(i1);
4267 Py_XDECREF(i2);
4268 return NULL;
4269}
4270
4271/* When the compiler exits a scope, it must should update the scope's
4272 free variable information with the list of free variables in its
4273 children.
4274
4275 Variables that are free in children and defined in the current
4276 scope are cellvars.
4277
4278 If the scope being exited is defined at the top-level (st_nested is
4279 false), free variables in children that are not defined here are
4280 implicit globals.
4281
4282*/
4283
4284static int
4285symtable_update_free_vars(struct symtable *st)
4286{
4287 PyObject *dict, *o, *child, *name;
4288 int i, def;
4289
4290 if (st->st_cur_type == TYPE_CLASS)
4291 def = DEF_FREE_CLASS;
4292 else
4293 def = DEF_FREE;
4294 for (i = 0; i < PyList_GET_SIZE(st->st_cur_children); ++i) {
4295 int pos = 0;
4296
4297 child = PyList_GET_ITEM(st->st_cur_children, i);
4298 dict = PyDict_GetItem(st->st_symbols, child);
4299 if (dict == NULL)
4300 return -1;
4301 while (PyDict_Next(dict, &pos, &name, &o)) {
4302 int v = PyInt_AS_LONG(o);
4303 if (!(is_free(v)))
4304 continue; /* avoids indentation */
4305 if (st->st_nested) {
4306 if (symtable_add_def_o(st, st->st_cur,
4307 name, def) < 0)
4308 return -1;
4309 } else {
4310 if (symtable_check_global(st, child,
4311 name) < 0)
4312 return -1;
4313 }
4314 }
4315 }
4316
4317 return 0;
4318}
4319
4320/* If the current scope is a non-nested class or if name is not
4321 defined in the current, non-nested scope, then it is an implicit
4322 global in all nested scopes.
4323*/
4324
4325static int
4326symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
4327{
4328 PyObject *o;
4329 int v;
4330
4331 if (st->st_cur_type == TYPE_CLASS)
4332 return symtable_undo_free(st, child, name);
4333 o = PyDict_GetItem(st->st_cur, name);
4334 if (o == NULL)
4335 return symtable_undo_free(st, child, name);
4336 v = PyInt_AS_LONG(o);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004337 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004338 return symtable_undo_free(st, child, name);
4339 else
4340 return symtable_add_def_o(st, st->st_cur, name, DEF_FREE);
4341}
4342
4343static int
4344symtable_undo_free(struct symtable *st, PyObject *id,
4345 PyObject *name)
4346{
4347 int i, v, x;
4348 PyObject *dict, *children, *info;
4349
4350 dict = PyDict_GetItem(st->st_symbols, id);
4351 if (dict == NULL)
4352 return -1;
4353 info = PyDict_GetItem(dict, name);
4354 if (info == NULL)
4355 return 0;
4356 v = PyInt_AS_LONG(info);
4357 if (is_free(v)) {
4358 if (symtable_add_def_o(st, dict, name,
4359 DEF_FREE_GLOBAL) < 0)
4360 return -1;
4361 } else
4362 /* If the name is defined here or declared global,
4363 then the recursion stops. */
4364 return 0;
4365
4366 children = PyDict_GetItem(st->st_children, id);
4367 for (i = 0; i < PyList_GET_SIZE(children); ++i) {
4368 x = symtable_undo_free(st, PyList_GET_ITEM(children, i),
4369 name);
4370 if (x < 0)
4371 return x;
4372 }
4373 return 0;
4374}
4375
4376
4377static int
4378symtable_exit_scope(struct symtable *st)
4379{
4380 PyObject *o;
4381 int end;
4382
4383 if (st->st_pass == 1)
4384 symtable_update_free_vars(st);
4385 if (st->st_cur_name) {
4386 Py_XDECREF(st->st_cur_name);
4387 Py_XDECREF(st->st_cur_id);
4388 }
4389 end = PyList_GET_SIZE(st->st_stack) - 1;
4390 o = PyList_GET_ITEM(st->st_stack, end);
4391 st->st_cur_name = PyTuple_GET_ITEM(o, 0);
4392 st->st_cur_id = PyTuple_GET_ITEM(o, 1);
4393 st->st_nested = PyInt_AS_LONG(PyTuple_GET_ITEM(o, 2));
4394 st->st_cur_type = PyInt_AS_LONG(PyTuple_GET_ITEM(o, 3));
4395 if (PySequence_DelItem(st->st_stack, end) < 0)
4396 return -1;
4397 return symtable_update_cur(st);
4398}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004399
4400static int
4401symtable_enter_scope(struct symtable *st, char *name, int type)
4402{
4403 PyObject *o;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004404
4405 if (st->st_cur) {
4406 /* push current scope info on stack */
4407 o = make_scope_info(st->st_cur_id, st->st_cur_name,
4408 st->st_nested, st->st_cur_type);
4409 if (o == NULL)
4410 return -1;
4411 if (PyList_Append(st->st_stack, o) < 0) {
4412 Py_DECREF(o);
4413 return -1;
4414 }
4415 Py_DECREF(o);
4416 }
4417 st->st_cur_name = PyString_FromString(name);
4418 if (st->st_nested || st->st_cur_type == TYPE_FUNCTION)
4419 st->st_nested = 1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004420 switch (type) {
4421 case funcdef:
4422 case lambdef:
4423 st->st_cur_type = TYPE_FUNCTION;
4424 break;
4425 case classdef:
4426 st->st_cur_type = TYPE_CLASS;
4427 break;
4428 case single_input:
4429 case eval_input:
4430 case file_input:
4431 st->st_cur_type = TYPE_MODULE;
4432 break;
4433 default:
4434 fprintf(stderr, "invalid symtable scope: %d\n", type);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004435 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004436 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004437 /* update st_cur_id and parent's st_cur_children */
4438 o = PyInt_FromLong(st->st_scopes++);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004439 if (o == NULL)
4440 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004441 if (st->st_cur_children) {
4442 if (PyList_Append(st->st_cur_children, o) < 0) {
4443 Py_DECREF(o);
4444 return -1;
4445 }
4446 }
4447 st->st_cur_id = o;
4448 /* create st_cur_children list */
4449 o = PyList_New(0);
4450 if (o == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004451 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004452 if (PyDict_SetItem(st->st_children, st->st_cur_id, o) < 0) {
4453 Py_DECREF(o);
4454 return -1;
4455 }
4456 Py_DECREF(o);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004457
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004458 return symtable_update_cur(st);
4459}
4460
4461static int
4462symtable_update_cur(struct symtable *st)
4463{
4464 PyObject *s, *d, *l;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004465
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004466 s = st->st_cur_id;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004467 d = PyDict_GetItem(st->st_symbols, s);
4468 if (d == NULL) {
4469 if ((d = PyDict_New()) == NULL)
4470 return -1;
4471 if (PyObject_SetItem(st->st_symbols, s, d) < 0) {
4472 Py_DECREF(d);
4473 return -1;
4474 }
4475 if (st->st_cur_type == TYPE_FUNCTION) {
4476 if ((l = PyList_New(0)) == NULL)
4477 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004478 if (PyDict_SetItem(st->st_varnames, s, l) < 0) {
4479 Py_DECREF(l);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004480 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004481 }
4482 Py_DECREF(l);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004483 }
4484 }
4485
4486 st->st_cur = d;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004487
4488 d = PyDict_GetItem(st->st_children, s);
4489 if (d == NULL)
4490 return -1;
4491 st->st_cur_children = d;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004492 return 0;
4493}
4494
4495static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004496symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004497{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004498 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004499 char buffer[MANGLE_LEN];
4500
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004501 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004502 name = buffer;
4503 if ((s = PyString_InternFromString(name)) == NULL)
4504 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004505 return symtable_add_def_o(st, st->st_cur, s, flag);
4506}
4507
4508/* Must only be called with mangled names */
4509
4510static int
4511symtable_add_def_o(struct symtable *st, PyObject *dict,
4512 PyObject *name, int flag)
4513{
4514 PyObject *o;
4515 int val;
4516
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004517 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004518 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004519 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004520 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00004521 PyString_AsString(name));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004522 return -1;
4523 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004524 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004525 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004526 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004527 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004528 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004529 Py_DECREF(o);
4530 return -1;
4531 }
4532 Py_DECREF(o);
4533
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004534 if (flag & DEF_PARAM) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004535 PyObject *l = PyDict_GetItem(st->st_varnames,
4536 st->st_cur_id);
4537 if (l == NULL)
4538 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004539 if (PyList_Append(l, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004540 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004541 } else if (flag & DEF_GLOBAL) {
4542 /* XXX need to update DEF_GLOBAL for other flags too;
4543 perhaps only DEF_FREE_GLOBAL */
4544 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004545 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004546 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004547 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004548 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004549 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004550 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004551 Py_DECREF(o);
4552 return -1;
4553 }
4554 Py_DECREF(o);
4555 }
4556 return 0;
4557}
4558
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004559#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004560
4561static void
4562symtable_node(struct symtable *st, node *n)
4563{
4564 int i, start = 0;
4565
4566 loop:
4567 switch (TYPE(n)) {
4568 case funcdef: {
4569 char *func_name = STR(CHILD(n, 1));
4570 symtable_add_def(st, func_name, DEF_LOCAL);
4571 symtable_default_args(st, CHILD(n, 2));
4572 symtable_enter_scope(st, func_name, TYPE(n));
4573 symtable_funcdef(st, n);
4574 symtable_exit_scope(st);
4575 break;
4576 }
4577 case lambdef:
4578 if (NCH(n) == 4)
4579 symtable_default_args(st, CHILD(n, 1));
4580 symtable_enter_scope(st, "lambda", TYPE(n));
4581 symtable_funcdef(st, n);
4582 symtable_exit_scope(st);
4583 break;
4584 case classdef: {
4585 char *tmp, *class_name = STR(CHILD(n, 1));
4586 symtable_add_def(st, class_name, DEF_LOCAL);
4587 if (TYPE(CHILD(n, 2)) == LPAR) {
4588 node *bases = CHILD(n, 3);
4589 int i;
4590 for (i = 0; i < NCH(bases); i += 2) {
4591 symtable_node(st, CHILD(bases, i));
4592 }
4593 }
4594 symtable_enter_scope(st, class_name, TYPE(n));
4595 tmp = st->st_private;
4596 st->st_private = class_name;
4597 symtable_node(st, CHILD(n, NCH(n) - 1));
4598 st->st_private = tmp;
4599 symtable_exit_scope(st);
4600 break;
4601 }
4602 case if_stmt:
4603 for (i = 0; i + 3 < NCH(n); i += 4) {
4604 if (is_constant_false(NULL, (CHILD(n, i + 1))))
4605 continue;
4606 symtable_node(st, CHILD(n, i + 1));
4607 symtable_node(st, CHILD(n, i + 3));
4608 }
4609 if (i + 2 < NCH(n))
4610 symtable_node(st, CHILD(n, i + 2));
4611 break;
4612 case global_stmt:
4613 symtable_global(st, n);
4614 break;
4615 case import_stmt:
4616 symtable_import(st, n);
4617 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004618 case exec_stmt: {
4619 PyObject *zero = PyInt_FromLong(0);
4620 if (zero == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004621 st->st_errors++;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004622 else {
4623 if (PyDict_SetItemString(st->st_cur, NOOPT,
4624 zero) < 0)
4625 st->st_errors++;
4626 Py_DECREF(zero);
4627 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004628 symtable_node(st, CHILD(n, 1));
4629 if (NCH(n) > 2)
4630 symtable_node(st, CHILD(n, 3));
4631 if (NCH(n) > 4)
4632 symtable_node(st, CHILD(n, 5));
4633 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004634
4635 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004636 case except_clause:
4637 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004638 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004639 if (NCH(n) > 1) {
4640 n = CHILD(n, 1);
4641 goto loop;
4642 }
4643 break;
4644 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004645 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004646 break;
4647 case expr_stmt:
4648 if (NCH(n) == 1)
4649 n = CHILD(n, 0);
4650 else {
4651 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004652 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004653 symtable_node(st, CHILD(n, 2));
4654 break;
4655 } else {
4656 int i;
4657 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004658 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004659 n = CHILD(n, NCH(n) - 1);
4660 }
4661 }
4662 goto loop;
4663 /* watchout for fall-through logic below */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004664 case argument:
4665 if (NCH(n) == 3) {
4666 n = CHILD(n, 2);
4667 goto loop;
4668 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004669 case listmaker:
4670 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
4671 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton5f827f42001-01-23 01:26:20 +00004672 n = CHILD(n, 0);
4673 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004674 }
4675 case atom:
4676 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
4677 symtable_add_use(st, STR(CHILD(n, 0)));
4678 break;
4679 }
4680 case for_stmt:
4681 if (TYPE(n) == for_stmt) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004682 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004683 start = 3;
4684 }
4685 default:
4686 if (NCH(n) == 1) {
4687 n = CHILD(n, 0);
4688 goto loop;
4689 }
4690 for (i = start; i < NCH(n); ++i)
4691 if (TYPE(CHILD(n, i)) >= single_input)
4692 symtable_node(st, CHILD(n, i));
4693 }
4694}
4695
4696static void
4697symtable_funcdef(struct symtable *st, node *n)
4698{
4699 node *body;
4700
4701 if (TYPE(n) == lambdef) {
4702 if (NCH(n) == 4)
4703 symtable_params(st, CHILD(n, 1));
4704 } else
4705 symtable_params(st, CHILD(n, 2));
4706 body = CHILD(n, NCH(n) - 1);
4707 symtable_node(st, body);
4708}
4709
4710/* The next two functions parse the argument tuple.
4711 symtable_default_arg() checks for names in the default arguments,
4712 which are references in the defining scope. symtable_params()
4713 parses the parameter names, which are defined in the function's
4714 body.
4715
4716 varargslist:
4717 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
4718 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
4719*/
4720
4721static void
4722symtable_default_args(struct symtable *st, node *n)
4723{
4724 node *c;
4725 int i;
4726
4727 if (TYPE(n) == parameters) {
4728 n = CHILD(n, 1);
4729 if (TYPE(n) == RPAR)
4730 return;
4731 }
4732 REQ(n, varargslist);
4733 for (i = 0; i < NCH(n); i += 2) {
4734 c = CHILD(n, i);
4735 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
4736 break;
4737 }
4738 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
4739 symtable_node(st, CHILD(n, i));
4740 }
4741}
4742
4743static void
4744symtable_params(struct symtable *st, node *n)
4745{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004746 int i, complex = -1, ext = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004747 node *c = NULL;
4748
4749 if (TYPE(n) == parameters) {
4750 n = CHILD(n, 1);
4751 if (TYPE(n) == RPAR)
4752 return;
4753 }
4754 REQ(n, varargslist);
4755 for (i = 0; i < NCH(n); i += 2) {
4756 c = CHILD(n, i);
4757 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
4758 ext = 1;
4759 break;
4760 }
4761 if (TYPE(c) == test) {
4762 continue;
4763 }
4764 if (TYPE(CHILD(c, 0)) == NAME)
4765 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
4766 else {
4767 char nbuf[10];
4768 sprintf(nbuf, ".%d", i);
4769 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004770 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004771 }
4772 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004773 if (ext) {
4774 c = CHILD(n, i);
4775 if (TYPE(c) == STAR) {
4776 i++;
4777 symtable_add_def(st, STR(CHILD(n, i)),
4778 DEF_PARAM | DEF_STAR);
4779 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00004780 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004781 c = NULL;
4782 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004783 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004784 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004785 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004786 i++;
4787 symtable_add_def(st, STR(CHILD(n, i)),
4788 DEF_PARAM | DEF_DOUBLESTAR);
4789 }
4790 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004791 if (complex >= 0) {
4792 int j;
4793 for (j = 0; j <= complex; j++) {
4794 c = CHILD(n, j);
4795 if (TYPE(c) == COMMA)
4796 c = CHILD(n, ++j);
4797 if (TYPE(CHILD(c, 0)) == LPAR)
4798 symtable_params_fplist(st, CHILD(c, 1));
4799 }
4800 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004801}
4802
4803static void
4804symtable_params_fplist(struct symtable *st, node *n)
4805{
4806 int i;
4807 node *c;
4808
4809 REQ(n, fplist);
4810 for (i = 0; i < NCH(n); i += 2) {
4811 c = CHILD(n, i);
4812 REQ(c, fpdef);
4813 if (NCH(c) == 1)
4814 symtable_add_def(st, STR(CHILD(c, 0)),
4815 DEF_PARAM | DEF_INTUPLE);
4816 else
4817 symtable_params_fplist(st, CHILD(c, 1));
4818 }
4819
4820}
4821
4822static void
4823symtable_global(struct symtable *st, node *n)
4824{
4825 int i;
4826
4827 for (i = 1; i < NCH(n); i += 2)
4828 symtable_add_def(st, STR(CHILD(n, i)), DEF_GLOBAL);
4829}
4830
4831static void
4832symtable_list_comprehension(struct symtable *st, node *n)
4833{
4834 char tmpname[12];
4835
4836 sprintf(tmpname, "[%d]", ++st->st_tmpname);
4837 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004838 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004839 symtable_node(st, CHILD(n, 3));
4840 if (NCH(n) == 5)
4841 symtable_node(st, CHILD(n, 4));
4842 --st->st_tmpname;
4843}
4844
4845static void
4846symtable_import(struct symtable *st, node *n)
4847{
4848 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004849 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004850 | 'from' dotted_name 'import'
4851 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00004852 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004853 */
4854
4855 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
4856 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton483638c2001-02-01 20:20:45 +00004857 PyObject *zero = PyInt_FromLong(0);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004858 if (st->st_cur_type != TYPE_MODULE) {
4859 PyErr_SetString(PyExc_SyntaxError,
4860 ILLEGAL_IMPORT_STAR);
4861 st->st_errors++;
4862 return;
4863 }
Jeremy Hylton483638c2001-02-01 20:20:45 +00004864 if (zero == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004865 st->st_errors++;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004866 else {
4867 if (PyDict_SetItemString(st->st_cur, NOOPT,
4868 zero) < 0)
4869 st->st_errors++;
4870 Py_DECREF(zero);
4871 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004872 } else {
4873 for (i = 3; i < NCH(n); i += 2) {
4874 node *c = CHILD(n, i);
4875 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004876 symtable_assign(st, CHILD(c, 2),
4877 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004878 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004879 symtable_assign(st, CHILD(c, 0),
4880 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004881 }
4882 }
4883 } else {
4884 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004885 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004886 }
4887 }
4888}
4889
4890static void
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004891symtable_assign(struct symtable *st, node *n, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004892{
4893 node *tmp;
4894 int i;
4895
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004896 loop:
4897 switch (TYPE(n)) {
4898 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004899 /* invalid assignment, e.g. lambda x:x=2. The next
4900 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004901 return;
4902 case power:
4903 if (NCH(n) > 2) {
4904 for (i = 2; i < NCH(n); ++i)
4905 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
4906 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004907 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004908 if (NCH(n) > 1) {
4909 symtable_node(st, CHILD(n, 0));
4910 symtable_node(st, CHILD(n, 1));
4911 } else {
4912 n = CHILD(n, 0);
4913 goto loop;
4914 }
4915 return;
4916 case listmaker:
4917 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
4918 symtable_list_comprehension(st, CHILD(n, 1));
4919 else {
4920 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004921 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004922 }
4923 return;
4924 case exprlist:
4925 case testlist:
4926 if (NCH(n) == 1) {
4927 n = CHILD(n, 0);
4928 goto loop;
4929 }
4930 else {
4931 int i;
4932 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004933 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004934 return;
4935 }
4936 goto loop;
4937 case atom:
4938 tmp = CHILD(n, 0);
4939 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
4940 n = CHILD(n, 1);
4941 goto loop;
4942 } else if (TYPE(tmp) == NAME)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004943 symtable_add_def(st, STR(tmp), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004944 return;
4945 case dotted_as_name:
4946 if (NCH(n) == 3)
4947 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004948 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004949 else
4950 symtable_add_def(st,
4951 STR(CHILD(CHILD(n,
4952 0), 0)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004953 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004954 return;
4955 case dotted_name:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004956 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004957 return;
4958 case NAME:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004959 symtable_add_def(st, STR(n), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004960 return;
4961 default:
4962 if (NCH(n) == 0)
4963 return;
4964 if (NCH(n) != 1) {
4965 DUMP(n);
4966 Py_FatalError("too many children in default case\n");
4967 }
4968 n = CHILD(n, 0);
4969 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004970 }
4971}