blob: d95287cf262b45a41ef74d021c0603aea998ed53 [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
Jeremy Hylton64949cb2001-01-25 20:06:59 +000022#define REPR(O) PyString_AS_STRING(PyObject_Repr(O))
23
Guido van Rossum3f5da241990-12-20 15:06:42 +000024#include <ctype.h>
Guido van Rossum282914b1991-04-04 10:42:56 +000025
Guido van Rossumb05a5c71997-05-07 17:46:13 +000026/* Three symbols from graminit.h are also defined in Python.h, with
27 Py_ prefixes to their names. Python.h can't include graminit.h
28 (which defines too many confusing symbols), but we can check here
29 that they haven't changed (which is very unlikely, but possible). */
30#if Py_single_input != single_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000031 #error "single_input has changed -- update Py_single_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000032#endif
33#if Py_file_input != file_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000034 #error "file_input has changed -- update Py_file_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000035#endif
36#if Py_eval_input != eval_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000037 #error "eval_input has changed -- update Py_eval_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000038#endif
39
Guido van Rossum8e793d91997-03-03 19:13:14 +000040int Py_OptimizeFlag = 0;
41
Guido van Rossum8861b741996-07-30 16:49:37 +000042#define OP_DELETE 0
43#define OP_ASSIGN 1
44#define OP_APPLY 2
45
Jeremy Hyltone36f7782001-01-19 03:21:30 +000046#define VAR_LOAD 0
47#define VAR_STORE 1
48#define VAR_DELETE 2
49
Jeremy Hylton64949cb2001-01-25 20:06:59 +000050#define TYPE_FUNCTION 1
51#define TYPE_CLASS 2
52#define TYPE_MODULE 3
Jeremy Hyltone36f7782001-01-19 03:21:30 +000053
Jeremy Hylton64949cb2001-01-25 20:06:59 +000054#define LOCAL 1
55#define GLOBAL_EXPLICIT 2
56#define GLOBAL_IMPLICIT 3
57#define FREE 4
58#define CELL 5
Jeremy Hyltone36f7782001-01-19 03:21:30 +000059
Jeremy Hylton64949cb2001-01-25 20:06:59 +000060#define DEL_CLOSURE_ERROR \
Jeremy Hyltoneab156f2001-01-30 01:24:43 +000061"can not delete variable '%.400s' referenced in nested scope"
62
63#define DUPLICATE_ARGUMENT \
64"duplicate argument '%s' in function definition"
65
66#define ILLEGAL_IMPORT_STAR \
67"'from ... import *' may only occur in a module scope"
68
69#define ILLEGAL_IMPORT_GLOBAL \
70"may not import name '%.400s' because it is declared global"
Jeremy Hyltone36f7782001-01-19 03:21:30 +000071
72#define MANGLE_LEN 256
73
Guido van Rossum79f25d91997-04-29 20:08:16 +000074#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000075
76static struct memberlist code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000077 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
78 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000079 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000080 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000081 {"co_code", T_OBJECT, OFF(co_code), READONLY},
82 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
83 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000084 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Jeremy Hylton64949cb2001-01-25 20:06:59 +000085 {"co_freevars", T_OBJECT, OFF(co_freevars), READONLY},
86 {"co_cellvars", T_OBJECT, OFF(co_cellvars), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000087 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000088 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000089 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
90 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000091 {NULL} /* Sentinel */
92};
93
Guido van Rossum79f25d91997-04-29 20:08:16 +000094static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000095code_getattr(PyCodeObject *co, char *name)
Guido van Rossum3f5da241990-12-20 15:06:42 +000096{
Guido van Rossum79f25d91997-04-29 20:08:16 +000097 return PyMember_Get((char *)co, code_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +000098}
Guido van Rossum10dc2e81990-11-18 17:27:39 +000099
100static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000101code_dealloc(PyCodeObject *co)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000102{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000103 Py_XDECREF(co->co_code);
104 Py_XDECREF(co->co_consts);
105 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +0000106 Py_XDECREF(co->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000107 Py_XDECREF(co->co_freevars);
108 Py_XDECREF(co->co_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000109 Py_XDECREF(co->co_filename);
110 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +0000111 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000112 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000113}
114
Guido van Rossum79f25d91997-04-29 20:08:16 +0000115static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000116code_repr(PyCodeObject *co)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000117{
118 char buf[500];
119 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000120 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000121 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000122
Guido van Rossuma396a882000-04-07 01:21:36 +0000123 if (co->co_firstlineno != 0)
124 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000125 if (co->co_filename && PyString_Check(co->co_filename))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000126 filename = PyString_AS_STRING(co->co_filename);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000127 if (co->co_name && PyString_Check(co->co_name))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000128 name = PyString_AS_STRING(co->co_name);
Fred Drake615ae552000-06-30 16:20:13 +0000129 sprintf(buf, "<code object %.100s at %p, file \"%.300s\", line %d>",
130 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000131 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000132}
133
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000134static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000135code_compare(PyCodeObject *co, PyCodeObject *cp)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000136{
137 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000138 cmp = PyObject_Compare(co->co_name, cp->co_name);
139 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000140 cmp = co->co_argcount - cp->co_argcount;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000141 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000142 cmp = co->co_nlocals - cp->co_nlocals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000143 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000144 cmp = co->co_flags - cp->co_flags;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000145 if (cmp) return cmp;
Guido van Rossumd076c731998-10-07 19:42:25 +0000146 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000147 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000148 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000149 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000150 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000151 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000152 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000153 if (cmp) return cmp;
154 cmp = PyObject_Compare(co->co_freevars, cp->co_freevars);
155 if (cmp) return cmp;
156 cmp = PyObject_Compare(co->co_cellvars, cp->co_cellvars);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000157 return cmp;
158}
159
160static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000161code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000162{
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000163 long h, h0, h1, h2, h3, h4, h5, h6;
Guido van Rossum44679592000-04-10 16:20:31 +0000164 h0 = PyObject_Hash(co->co_name);
165 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000166 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000167 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000168 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000169 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000170 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000171 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000172 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000173 if (h4 == -1) return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000174 h5 = PyObject_Hash(co->co_freevars);
175 if (h5 == -1) return -1;
176 h6 = PyObject_Hash(co->co_cellvars);
177 if (h6 == -1) return -1;
178 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^ h5 ^ h6 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000179 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000180 if (h == -1) h = -2;
181 return h;
182}
183
Guido van Rossum79f25d91997-04-29 20:08:16 +0000184PyTypeObject PyCode_Type = {
185 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000186 0,
187 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000188 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000189 0,
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000190 (destructor)code_dealloc, /*tp_dealloc*/
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000191 0, /*tp_print*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000192 (getattrfunc)code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000193 0, /*tp_setattr*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000194 (cmpfunc)code_compare, /*tp_compare*/
195 (reprfunc)code_repr, /*tp_repr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000196 0, /*tp_as_number*/
197 0, /*tp_as_sequence*/
198 0, /*tp_as_mapping*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000199 (hashfunc)code_hash, /*tp_hash*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000200};
201
Guido van Rossum644a12b1997-04-09 19:24:53 +0000202#define NAME_CHARS \
203 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
204
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000205/* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
206
207static int
208all_name_chars(unsigned char *s)
209{
210 static char ok_name_char[256];
Tim Peters7f3e4ad2001-01-20 05:15:26 +0000211 static unsigned char *name_chars = (unsigned char *)NAME_CHARS;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000212
213 if (ok_name_char[*name_chars] == 0) {
214 unsigned char *p;
215 for (p = name_chars; *p; p++)
216 ok_name_char[*p] = 1;
217 }
218 while (*s) {
219 if (ok_name_char[*s++] == 0)
220 return 0;
221 }
222 return 1;
223}
224
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000225static int
226intern_strings(PyObject *tuple)
227{
228 int i;
229
230 for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) {
231 PyObject *v = PyTuple_GET_ITEM(tuple, i);
232 if (v == NULL || !PyString_Check(v)) {
233 Py_FatalError("non-string found in code slot");
234 PyErr_BadInternalCall();
235 return -1;
236 }
237 PyString_InternInPlace(&PyTuple_GET_ITEM(tuple, i));
238 }
239 return 0;
240}
241
Guido van Rossum79f25d91997-04-29 20:08:16 +0000242PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000243PyCode_New(int argcount, int nlocals, int stacksize, int flags,
244 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000245 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
246 PyObject *filename, PyObject *name, int firstlineno,
247 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000248{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000249 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000250 int i;
Guido van Rossumd076c731998-10-07 19:42:25 +0000251 PyBufferProcs *pb;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000252 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000253 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000254 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000255 consts == NULL || !PyTuple_Check(consts) ||
256 names == NULL || !PyTuple_Check(names) ||
257 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000258 freevars == NULL || !PyTuple_Check(freevars) ||
259 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000260 name == NULL || !PyString_Check(name) ||
261 filename == NULL || !PyString_Check(filename) ||
262 lnotab == NULL || !PyString_Check(lnotab)) {
263 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000264 return NULL;
265 }
Guido van Rossumd076c731998-10-07 19:42:25 +0000266 pb = code->ob_type->tp_as_buffer;
267 if (pb == NULL ||
268 pb->bf_getreadbuffer == NULL ||
269 pb->bf_getsegcount == NULL ||
270 (*pb->bf_getsegcount)(code, NULL) != 1)
271 {
272 PyErr_BadInternalCall();
273 return NULL;
274 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000275 intern_strings(names);
276 intern_strings(varnames);
277 if (freevars == NULL)
278 freevars = PyTuple_New(0);
279 intern_strings(freevars);
280 if (cellvars == NULL)
281 cellvars = PyTuple_New(0);
282 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000283 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000284 for (i = PyTuple_Size(consts); --i >= 0; ) {
285 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000286 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000287 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000288 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000289 continue;
290 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000291 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000292 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000293 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000294 co->co_argcount = argcount;
295 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000296 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000297 co->co_flags = flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000298 Py_INCREF(code);
Guido van Rossumd076c731998-10-07 19:42:25 +0000299 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000300 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000301 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000302 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000303 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000304 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000305 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000306 Py_INCREF(freevars);
307 co->co_freevars = freevars;
308 Py_INCREF(cellvars);
309 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000310 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000311 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000312 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000313 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000314 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000315 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000316 co->co_lnotab = lnotab;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000317/* PyObject_Print((PyObject *)co, stderr, 0); */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000318 }
319 return co;
320}
321
322
323/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000324
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000325/* The compiler uses two passes to generate bytecodes. The first pass
326 builds the symbol table. The second pass generates the bytecode.
327
328 The first pass uses a single symtable struct. The second pass uses
329 a compiling struct for each code block. The compiling structs
330 share a reference to the symtable.
331
332 The two passes communicate via symtable_load_symbols() and via
333 is_local() and is_global(). The former initializes several slots
334 in the compiling struct: c_varnames, c_locals, c_nlocals,
335 c_argcount, c_globals, and c_flags.
336*/
337
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000338struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000339 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000340 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000341 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000342 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000343 PyObject *c_name_dict; /* inverse of c_names */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000344 PyObject *c_globals; /* dictionary (value=None) */
345 PyObject *c_locals; /* dictionary (value=localID) */
346 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000347 PyObject *c_freevars; /* dictionary (value=None) */
348 PyObject *c_cellvars; /* list */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000349 int c_nlocals; /* index of next local */
350 int c_argcount; /* number of top-level arguments */
351 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000352 int c_nexti; /* index into c_code */
353 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000354 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000355 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000356 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000357 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000358 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000359 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000360 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000361 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000362 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000363 int c_stacklevel; /* Current stack level */
364 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000365 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000366 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000367 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000368 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000369 int c_tmpname; /* temporary local name counter */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000370 int c_nested; /* Is block nested funcdef or lamdef? */
371 int c_closure; /* Is nested w/freevars? */
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000372 struct symtable *c_symtable; /* pointer to module symbol table */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000373};
374
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000375/* A symbol table is constructed each time PyNode_Compile() is
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000376 called. The table walks the entire parse tree and identifies each
377 use or definition of a variable.
378
379 The symbol table contains a dictionary for each code block in a
380 module: The symbol dictionary for the block. They keys of these
381 dictionaries are the name of all variables used or defined in the
382 block; the integer values are used to store several flags,
383 e.g. DEF_PARAM indicates that a variable is a parameter to a
384 function.
385
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000386 The slots st_cur_XXX pointers always refer to the current code
387 block. The st_cur slot is the symbol dictionary. The st_cur_id
388 slot is the id is the key in st_symbols. The st_cur_name slot is
389 the name of the current scope. The st_cur_type slot is one of
390 TYPE_FUNCTION, TYPE_CLASS, or TYPE_MODULE. The st_cur_children is
391 a list of the ids of the current node's children.
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000392
393 The st_symbols slot is a dictionary that maps code block ids to
394 symbol dictionaries. The keys are generated by a counter that is
395 incremented each time a new code block is found. The counter is
396 identifies a specific scope, because both passes walk the parse
397 tree in the same order.
398
399 The st_varnames slot is a dictionary that maps code block ids to
400 parameter lists. The st_global slot always refers to the symbol
401 dictionary for the module.
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000402
403 The st_children slot is a dictionary that maps ids to a list
404 containing the ids of its children.
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000405*/
406
407struct symtable {
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000408 int st_pass; /* pass == 1 or 2 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000409 PyObject *st_symbols; /* dictionary of symbol tables */
410 PyObject *st_varnames; /* dictionary of parameter lists */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000411 PyObject *st_stack; /* stack of namespace info */
412 PyObject *st_children; /* dictionary (id=[ids]) */
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000413 PyObject *st_cur; /* borrowed ref to dict in st_symbols */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000414 PyObject *st_cur_name; /* string, name of current scope */
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000415 PyObject *st_cur_id; /* int id of current code block */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000416 PyObject *st_cur_children; /* ref to current children list */
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000417 int st_cur_type; /* type of current scope */
418 PyObject *st_global; /* borrowed ref to MODULE in st_symbols */
419 int st_scopes; /* number of scopes */
420 int st_errors; /* number of errors */
421 char *st_private; /* name of current class or NULL */
422 int st_tmpname; /* temporary name counter */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000423 int st_nested; /* bool (true if nested scope) */
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000424};
425
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000426#define TOP "global"
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000427#define NOOPT ".noopt"
428
429/* Flags for def-use information */
430
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000431#define DEF_GLOBAL 1 /* global stmt */
432#define DEF_LOCAL 2 /* assignment in code block */
433#define DEF_PARAM 2<<1 /* formal parameter */
434#define USE 2<<2 /* name is used */
435#define DEF_STAR 2<<3 /* parameter is star arg */
436#define DEF_DOUBLESTAR 2<<4 /* parameter is star-star arg */
437#define DEF_INTUPLE 2<<5 /* name defined in tuple in parameters */
438#define DEF_FREE 2<<6 /* name used by not defined in nested scope */
439#define DEF_FREE_GLOBAL 2<<7 /* free variable is actually implicit global */
440#define DEF_FREE_CLASS 2<<8 /* free variable from class's method */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000441#define DEF_IMPORT 2<<9 /* assignment occurred via import */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000442
443int is_free(int v)
444{
445 if ((v & (USE | DEF_FREE))
446 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
447 return 1;
448 if (v & DEF_FREE_CLASS)
449 return 1;
450 return 0;
451}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000452
Guido van Rossum452a9831996-09-17 14:32:04 +0000453/* Error message including line number */
454
455static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000456com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000457{
Fred Drakedcf08e02000-08-15 15:49:44 +0000458 PyObject *v, *tb, *tmp;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000459 if (c == NULL) {
460 /* Error occurred via symtable call to
461 is_constant_false */
462 PyErr_SetString(exc, msg);
463 return;
464 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000465 c->c_errors++;
Guido van Rossum452a9831996-09-17 14:32:04 +0000466 if (c->c_lineno <= 1) {
467 /* Unknown line number or single interactive command */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000468 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000469 return;
470 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000471 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000472 if (v == NULL)
473 return; /* MemoryError, too bad */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000474 PyErr_SetObject(exc, v);
475 Py_DECREF(v);
Fred Drakedcf08e02000-08-15 15:49:44 +0000476
477 /* add attributes for the line number and filename for the error */
478 PyErr_Fetch(&exc, &v, &tb);
479 PyErr_NormalizeException(&exc, &v, &tb);
480 tmp = PyInt_FromLong(c->c_lineno);
481 if (tmp == NULL)
482 PyErr_Clear();
483 else {
484 if (PyObject_SetAttrString(v, "lineno", tmp))
485 PyErr_Clear();
486 Py_DECREF(tmp);
487 }
488 if (c->c_filename != NULL) {
489 tmp = PyString_FromString(c->c_filename);
490 if (tmp == NULL)
491 PyErr_Clear();
492 else {
493 if (PyObject_SetAttrString(v, "filename", tmp))
494 PyErr_Clear();
495 Py_DECREF(tmp);
496 }
497 }
498 PyErr_Restore(exc, v, tb);
Guido van Rossum452a9831996-09-17 14:32:04 +0000499}
500
501
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000502/* Interface to the block stack */
503
504static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000505block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000506{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000507 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000508 com_error(c, PyExc_SystemError,
509 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000510 }
511 else {
512 c->c_block[c->c_nblocks++] = type;
513 }
514}
515
516static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000517block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000518{
519 if (c->c_nblocks > 0)
520 c->c_nblocks--;
521 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000522 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000523 }
524}
525
526
Guido van Rossum681d79a1995-07-18 14:51:37 +0000527/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000528
Tim Petersdbd9ba62000-07-09 03:09:57 +0000529static int com_init(struct compiling *, char *);
530static void com_free(struct compiling *);
531static void com_push(struct compiling *, int);
532static void com_pop(struct compiling *, int);
533static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000534static void com_node(struct compiling *, node *);
535static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000536static void com_addbyte(struct compiling *, int);
537static void com_addint(struct compiling *, int);
538static void com_addoparg(struct compiling *, int, int);
539static void com_addfwref(struct compiling *, int, int *);
540static void com_backpatch(struct compiling *, int);
541static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
542static int com_addconst(struct compiling *, PyObject *);
543static int com_addname(struct compiling *, PyObject *);
544static void com_addopname(struct compiling *, int, node *);
545static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000546static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000547static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000548static void com_assign(struct compiling *, node *, int, node *);
549static void com_assign_name(struct compiling *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000550static PyCodeObject *icompile(node *, struct compiling *);
551static PyCodeObject *jcompile(node *, char *, struct compiling *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000552static PyObject *parsestrplus(node *);
553static PyObject *parsestr(char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000554static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000555
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000556static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000557
558/* symtable operations */
559static int symtable_build(struct compiling *, node *);
560static int symtable_load_symbols(struct compiling *);
561static struct symtable *symtable_init(void);
562static void symtable_free(struct symtable *);
563static int symtable_enter_scope(struct symtable *, char *, int);
564static int symtable_exit_scope(struct symtable *);
565static int symtable_update_cur(struct symtable *);
566static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000567static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000568
569static void symtable_node(struct symtable *, node *);
570static void symtable_funcdef(struct symtable *, node *);
571static void symtable_default_args(struct symtable *, node *);
572static void symtable_params(struct symtable *, node *);
573static void symtable_params_fplist(struct symtable *, node *n);
574static void symtable_global(struct symtable *, node *);
575static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000576static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000577static void symtable_list_comprehension(struct symtable *, node *);
578
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000579static int symtable_update_free_vars(struct symtable *);
580static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
581static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
582
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000583/* helper */
584static void
585do_pad(int pad)
586{
587 int i;
588 for (i = 0; i < pad; ++i)
589 fprintf(stderr, " ");
590}
591
592static void
593dump(node *n, int pad, int depth)
594{
595 int i;
596 if (depth == 0)
597 return;
598 do_pad(pad);
599 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
600 if (depth > 0)
601 depth--;
602 for (i = 0; i < NCH(n); ++i)
603 dump(CHILD(n, i), pad + 1, depth);
604}
605
606#define DUMP(N) dump(N, 0, -1)
607
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000608static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000609com_init(struct compiling *c, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000610{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000611 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000612 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
613 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000614 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000615 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000616 goto fail;
617 if ((c->c_const_dict = PyDict_New()) == NULL)
618 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000619 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000620 goto fail;
621 if ((c->c_name_dict = PyDict_New()) == NULL)
622 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000623 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000624 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000625 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
626 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000627 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000628 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000629 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000630 c->c_freevars = NULL;
631 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000632 c->c_nlocals = 0;
633 c->c_argcount = 0;
634 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000635 c->c_nexti = 0;
636 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000637 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000638 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000639 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000640 c->c_begin = 0;
641 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000642 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000643 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000644 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000645 c->c_stacklevel = 0;
646 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000647 c->c_firstlineno = 0;
648 c->c_last_addr = 0;
649 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000650 c->c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000651 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000652 c->c_nested = 0;
653 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000654 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000655 return 1;
656
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000657 fail:
658 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000659 return 0;
660}
661
662static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000663com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000664{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000665 Py_XDECREF(c->c_code);
666 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000667 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000668 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000669 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000670 Py_XDECREF(c->c_globals);
671 Py_XDECREF(c->c_locals);
672 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000673 Py_XDECREF(c->c_freevars);
674 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000675 Py_XDECREF(c->c_lnotab);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000676}
677
678static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000679com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000680{
681 c->c_stacklevel += n;
682 if (c->c_stacklevel > c->c_maxstacklevel)
683 c->c_maxstacklevel = c->c_stacklevel;
684}
685
686static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000687com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000688{
689 if (c->c_stacklevel < n) {
Guido van Rossum90f827c1998-08-25 18:22:17 +0000690 /* fprintf(stderr,
Guido van Rossum8b993a91997-01-17 21:04:03 +0000691 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
692 c->c_filename, c->c_lineno,
Guido van Rossum90f827c1998-08-25 18:22:17 +0000693 c->c_nexti, c->c_stacklevel, n); */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000694 c->c_stacklevel = 0;
695 }
696 else
697 c->c_stacklevel -= n;
698}
699
700static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000701com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000702{
703 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000704 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000705 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000706 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000707}
708
709static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000710com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000711{
712 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000713 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000714 assert(byte >= 0 && byte <= 255);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000715 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000716 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000717 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000718 fatal("com_addbyte: byte out of range");
Guido van Rossum01cfd441991-10-20 20:12:38 +0000719 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000720 com_error(c, PyExc_SystemError,
721 "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000722 }
723 if (c->c_code == NULL)
724 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000725 len = PyString_Size(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000726 if (c->c_nexti >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000727 if (_PyString_Resize(&c->c_code, len+1000) != 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000728 c->c_errors++;
729 return;
730 }
731 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000732 PyString_AsString(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000733}
734
735static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000736com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000737{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000738 com_addbyte(c, x & 0xff);
739 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000740}
741
742static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000743com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000744{
745 int size;
746 char *p;
747 if (c->c_lnotab == NULL)
748 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000749 size = PyString_Size(c->c_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000750 if (c->c_lnotab_next+2 > size) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000751 if (_PyString_Resize(&c->c_lnotab, size + 1000) < 0) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000752 c->c_errors++;
753 return;
754 }
755 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000756 p = PyString_AsString(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000757 *p++ = addr;
758 *p++ = line;
759 c->c_lnotab_next += 2;
760}
761
762static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000763com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000764{
765 c->c_lineno = lineno;
766 if (c->c_firstlineno == 0) {
767 c->c_firstlineno = c->c_last_line = lineno;
768 }
769 else {
770 int incr_addr = c->c_nexti - c->c_last_addr;
771 int incr_line = lineno - c->c_last_line;
772 while (incr_addr > 0 || incr_line > 0) {
773 int trunc_addr = incr_addr;
774 int trunc_line = incr_line;
775 if (trunc_addr > 255)
776 trunc_addr = 255;
777 if (trunc_line > 255)
778 trunc_line = 255;
779 com_add_lnotab(c, trunc_addr, trunc_line);
780 incr_addr -= trunc_addr;
781 incr_line -= trunc_line;
782 }
783 c->c_last_addr = c->c_nexti;
784 c->c_last_line = lineno;
785 }
786}
787
788static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000789com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000790{
Fred Drakeef8ace32000-08-24 00:32:09 +0000791 int extended_arg = arg >> 16;
Guido van Rossum8e793d91997-03-03 19:13:14 +0000792 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000793 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000794 if (Py_OptimizeFlag)
795 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000796 }
Fred Drakeef8ace32000-08-24 00:32:09 +0000797 if (extended_arg){
798 com_addbyte(c, EXTENDED_ARG);
799 com_addint(c, extended_arg);
800 arg &= 0xffff;
801 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000802 com_addbyte(c, op);
803 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000804}
805
806static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000807com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000808{
809 /* Compile a forward reference for backpatching */
810 int here;
811 int anchor;
812 com_addbyte(c, op);
813 here = c->c_nexti;
814 anchor = *p_anchor;
815 *p_anchor = here;
816 com_addint(c, anchor == 0 ? 0 : here - anchor);
817}
818
819static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000820com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000821{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000822 unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000823 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000824 int dist;
825 int prev;
826 for (;;) {
827 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000828 prev = code[anchor] + (code[anchor+1] << 8);
829 dist = target - (anchor+2);
830 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +0000831 dist >>= 8;
832 code[anchor+1] = dist;
833 dist >>= 8;
834 if (dist) {
835 com_error(c, PyExc_SystemError,
836 "com_backpatch: offset too large");
837 break;
838 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000839 if (!prev)
840 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000841 anchor -= prev;
842 }
843}
844
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000845/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000846
847static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000848com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000849{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000850 PyObject *w, *t, *np=NULL;
851 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000852
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000853 t = Py_BuildValue("(OO)", v, v->ob_type);
854 if (t == NULL)
855 goto fail;
856 w = PyDict_GetItem(dict, t);
857 if (w != NULL) {
858 n = PyInt_AsLong(w);
859 } else {
860 n = PyList_Size(list);
861 np = PyInt_FromLong(n);
862 if (np == NULL)
863 goto fail;
864 if (PyList_Append(list, v) != 0)
865 goto fail;
866 if (PyDict_SetItem(dict, t, np) != 0)
867 goto fail;
868 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000869 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000870 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000871 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000872 fail:
873 Py_XDECREF(np);
874 Py_XDECREF(t);
875 c->c_errors++;
876 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000877}
878
879static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000880com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000881{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000882 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000883}
884
885static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000886com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000887{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000888 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000889}
890
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000891static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000892mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000893{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000894 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000895 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +0000896 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000897 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
898 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000899 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000900 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000901 return 0; /* Don't mangle __extremely_long_names */
902 if (name[nlen-1] == '_' && name[nlen-2] == '_')
903 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000904 /* Strip leading underscores from class name */
905 while (*p == '_')
906 p++;
907 if (*p == '\0')
908 return 0; /* Don't mangle if class is just underscores */
909 plen = strlen(p);
910 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000911 plen = maxlen-nlen-2; /* Truncate class name if too long */
912 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000913 buffer[0] = '_';
914 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000915 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000916 /* fprintf(stderr, "mangle %s -> %s\n", name, buffer); */
917 return 1;
918}
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000919
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000920static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000921com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000922{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000923 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000924 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000925 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000926
927 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000928 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000929 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000930 c->c_errors++;
931 i = 255;
932 }
933 else {
934 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000935 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000936 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000937 com_addoparg(c, op, i);
938}
939
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000940#define NAME_LOCAL 0
941#define NAME_GLOBAL 1
942#define NAME_DEFAULT 2
943#define NAME_CLOSURE 3
944
945static int
946com_lookup_arg(PyObject *dict, PyObject *name)
947{
948 PyObject *v = PyDict_GetItem(dict, name);
949 if (v == NULL)
950 return -1;
951 else
952 return PyInt_AS_LONG(v);
953}
954
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000955static void
956com_addop_varname(struct compiling *c, int kind, char *name)
957{
958 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000959 int i, reftype;
960 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000961 int op = STOP_CODE;
962 char buffer[MANGLE_LEN];
963
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000964 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000965 name = buffer;
966 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
967 c->c_errors++;
968 i = 255;
969 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000970 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000971
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000972 reftype = get_ref_type(c, name);
973 switch (reftype) {
974 case LOCAL:
975 if (c->c_symtable->st_cur_type == TYPE_FUNCTION)
976 scope = NAME_LOCAL;
977 break;
978 case GLOBAL_EXPLICIT:
979 scope = NAME_GLOBAL;
980 break;
981 case GLOBAL_IMPLICIT:
982 if (c->c_flags & CO_OPTIMIZED)
983 scope = NAME_GLOBAL;
984 break;
985 case FREE:
986 case CELL:
987 scope = NAME_CLOSURE;
988 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000989 }
990
991 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000992 if (scope == NAME_LOCAL)
993 i = com_lookup_arg(c->c_locals, v);
994 else if (reftype == FREE)
995 i = com_lookup_arg(c->c_freevars, v);
996 else if (reftype == CELL)
997 i = com_lookup_arg(c->c_cellvars, v);
998 if (i == -1) {
999 c->c_errors++; /* XXX no exception set */
1000 i = 255;
1001 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001002 }
1003 Py_DECREF(v);
1004
1005 switch (kind) {
1006 case VAR_LOAD:
1007 switch (scope) {
1008 case NAME_LOCAL:
1009 op = LOAD_FAST;
1010 break;
1011 case NAME_GLOBAL:
1012 op = LOAD_GLOBAL;
1013 break;
1014 case NAME_DEFAULT:
1015 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001016 break;
1017 case NAME_CLOSURE:
1018 op = LOAD_DEREF;
1019 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001020 }
1021 break;
1022 case VAR_STORE:
1023 switch (scope) {
1024 case NAME_LOCAL:
1025 op = STORE_FAST;
1026 break;
1027 case NAME_GLOBAL:
1028 op = STORE_GLOBAL;
1029 break;
1030 case NAME_DEFAULT:
1031 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001032 break;
1033 case NAME_CLOSURE:
1034 op = STORE_DEREF;
1035 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001036 }
1037 break;
1038 case VAR_DELETE:
1039 switch (scope) {
1040 case NAME_LOCAL:
1041 op = DELETE_FAST;
1042 break;
1043 case NAME_GLOBAL:
1044 op = DELETE_GLOBAL;
1045 break;
1046 case NAME_DEFAULT:
1047 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001048 break;
1049 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001050 char buf[500];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001051 sprintf(buf, DEL_CLOSURE_ERROR, name);
1052 com_error(c, PyExc_SyntaxError, buf);
1053 i = 255;
1054 break;
1055 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001056 }
1057 break;
1058 }
1059done:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001060/* fprintf(stderr, " addoparg(op=%d, arg=%d)\n", op, i);*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001061 com_addoparg(c, op, i);
1062}
1063
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001064static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001065com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001066{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001067 char *name;
1068 char buffer[1000];
1069 /* XXX it is possible to write this code without the 1000
1070 chars on the total length of dotted names, I just can't be
1071 bothered right now */
1072 if (TYPE(n) == STAR)
1073 name = "*";
1074 else if (TYPE(n) == dotted_name) {
1075 char *p = buffer;
1076 int i;
1077 name = buffer;
1078 for (i = 0; i < NCH(n); i += 2) {
1079 char *s = STR(CHILD(n, i));
1080 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001081 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001082 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001083 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001084 break;
1085 }
1086 if (p != buffer)
1087 *p++ = '.';
1088 strcpy(p, s);
1089 p = strchr(p, '\0');
1090 }
1091 }
1092 else {
1093 REQ(n, NAME);
1094 name = STR(n);
1095 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001096 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001097}
1098
Guido van Rossum79f25d91997-04-29 20:08:16 +00001099static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001100parsenumber(struct compiling *co, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001101{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001102 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001103 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001104 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001105#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +00001106 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +00001107 int imflag;
1108#endif
1109
Guido van Rossum282914b1991-04-04 10:42:56 +00001110 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001111 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001112#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001113 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001114#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001115 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001116 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001117 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001118 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001119 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001120 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001121 if (*end == '\0') {
1122 if (errno != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001123 com_error(co, PyExc_OverflowError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001124 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +00001125 return NULL;
1126 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001127 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001128 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001129 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001130#ifndef WITHOUT_COMPLEX
1131 if (imflag) {
1132 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001133 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +00001134 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001135 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001136 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +00001137 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001138 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001139#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001140 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001141 PyFPE_START_PROTECT("atof", return 0)
1142 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001143 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001144 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001145 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001146}
1147
Guido van Rossum79f25d91997-04-29 20:08:16 +00001148static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001149parsestr(char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001150{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001151 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001152 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001153 char *buf;
1154 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001155 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001156 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001157 int first = *s;
1158 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001159 int rawmode = 0;
1160 int unicode = 0;
1161 if (isalpha(quote) || quote == '_') {
1162 if (quote == 'u' || quote == 'U') {
1163 quote = *++s;
1164 unicode = 1;
1165 }
1166 if (quote == 'r' || quote == 'R') {
1167 quote = *++s;
1168 rawmode = 1;
1169 }
1170 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001171 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001172 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001173 return NULL;
1174 }
1175 s++;
1176 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001177 if (len > INT_MAX) {
1178 PyErr_SetString(PyExc_OverflowError, "string to parse is too long");
1179 return NULL;
1180 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001181 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001182 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001183 return NULL;
1184 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001185 if (len >= 4 && s[0] == quote && s[1] == quote) {
1186 s += 2;
1187 len -= 2;
1188 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001189 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001190 return NULL;
1191 }
1192 }
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001193 if (unicode || Py_UnicodeFlag) {
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001194 if (rawmode)
1195 return PyUnicode_DecodeRawUnicodeEscape(
1196 s, len, NULL);
1197 else
1198 return PyUnicode_DecodeUnicodeEscape(
1199 s, len, NULL);
1200 }
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001201 if (rawmode || strchr(s, '\\') == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001202 return PyString_FromStringAndSize(s, len);
1203 v = PyString_FromStringAndSize((char *)NULL, len);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001204 if (v == NULL)
1205 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001206 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001207 end = s + len;
1208 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001209 if (*s != '\\') {
1210 *p++ = *s++;
1211 continue;
1212 }
1213 s++;
1214 switch (*s++) {
1215 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001216 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001217 case '\\': *p++ = '\\'; break;
1218 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +00001219 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001220 case 'b': *p++ = '\b'; break;
1221 case 'f': *p++ = '\014'; break; /* FF */
1222 case 't': *p++ = '\t'; break;
1223 case 'n': *p++ = '\n'; break;
1224 case 'r': *p++ = '\r'; break;
1225 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001226 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
1227 case '0': case '1': case '2': case '3':
1228 case '4': case '5': case '6': case '7':
1229 c = s[-1] - '0';
1230 if ('0' <= *s && *s <= '7') {
1231 c = (c<<3) + *s++ - '0';
1232 if ('0' <= *s && *s <= '7')
1233 c = (c<<3) + *s++ - '0';
1234 }
1235 *p++ = c;
1236 break;
1237 case 'x':
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001238 if (isxdigit(Py_CHARMASK(s[0])) && isxdigit(Py_CHARMASK(s[1]))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +00001239 unsigned int x = 0;
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001240 c = Py_CHARMASK(*s);
1241 s++;
1242 if (isdigit(c))
1243 x = c - '0';
1244 else if (islower(c))
1245 x = 10 + c - 'a';
1246 else
1247 x = 10 + c - 'A';
1248 x = x << 4;
1249 c = Py_CHARMASK(*s);
1250 s++;
1251 if (isdigit(c))
1252 x += c - '0';
1253 else if (islower(c))
1254 x += 10 + c - 'a';
1255 else
1256 x += 10 + c - 'A';
Guido van Rossumed1100f1997-10-20 23:24:07 +00001257 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001258 break;
1259 }
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001260 PyErr_SetString(PyExc_ValueError, "invalid \\x escape");
1261 Py_DECREF(v);
1262 return NULL;
1263 default:
1264 *p++ = '\\';
1265 *p++ = s[-1];
1266 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001267 }
1268 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001269 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001270 return v;
1271}
1272
Guido van Rossum79f25d91997-04-29 20:08:16 +00001273static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001274parsestrplus(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001275{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001276 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001277 int i;
1278 REQ(CHILD(n, 0), STRING);
1279 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
1280 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001281 for (i = 1; i < NCH(n); i++) {
1282 PyObject *s;
1283 s = parsestr(STR(CHILD(n, i)));
1284 if (s == NULL)
1285 goto onError;
1286 if (PyString_Check(v) && PyString_Check(s)) {
1287 PyString_ConcatAndDel(&v, s);
1288 if (v == NULL)
1289 goto onError;
1290 }
1291 else {
1292 PyObject *temp;
1293 temp = PyUnicode_Concat(v, s);
1294 Py_DECREF(s);
1295 if (temp == NULL)
1296 goto onError;
1297 Py_DECREF(v);
1298 v = temp;
1299 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001300 }
1301 }
1302 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001303
1304 onError:
1305 Py_XDECREF(v);
1306 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001307}
1308
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001309static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001310com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001311{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001312 PyObject *v;
1313 int anchor = 0;
1314 int save_begin = c->c_begin;
1315
1316 /* list_iter: for v in expr [list_iter] */
1317 com_node(c, CHILD(n, 3)); /* expr */
1318 v = PyInt_FromLong(0L);
1319 if (v == NULL)
1320 c->c_errors++;
1321 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
1322 com_push(c, 1);
1323 Py_XDECREF(v);
1324 c->c_begin = c->c_nexti;
1325 com_addoparg(c, SET_LINENO, n->n_lineno);
1326 com_addfwref(c, FOR_LOOP, &anchor);
1327 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001328 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001329 c->c_loops++;
1330 com_list_iter(c, n, e, t);
1331 c->c_loops--;
1332 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1333 c->c_begin = save_begin;
1334 com_backpatch(c, anchor);
1335 com_pop(c, 2); /* FOR_LOOP has popped these */
1336}
1337
1338static void
1339com_list_if(struct compiling *c, node *n, node *e, char *t)
1340{
1341 int anchor = 0;
1342 int a = 0;
1343 /* list_iter: 'if' test [list_iter] */
1344 com_addoparg(c, SET_LINENO, n->n_lineno);
1345 com_node(c, CHILD(n, 1));
1346 com_addfwref(c, JUMP_IF_FALSE, &a);
1347 com_addbyte(c, POP_TOP);
1348 com_pop(c, 1);
1349 com_list_iter(c, n, e, t);
1350 com_addfwref(c, JUMP_FORWARD, &anchor);
1351 com_backpatch(c, a);
1352 /* We jump here with an extra entry which we now pop */
1353 com_addbyte(c, POP_TOP);
1354 com_backpatch(c, anchor);
1355}
1356
1357static void
1358com_list_iter(struct compiling *c,
1359 node *p, /* parent of list_iter node */
1360 node *e, /* element expression node */
1361 char *t /* name of result list temp local */)
1362{
1363 /* list_iter is the last child in a listmaker, list_for, or list_if */
1364 node *n = CHILD(p, NCH(p)-1);
1365 if (TYPE(n) == list_iter) {
1366 n = CHILD(n, 0);
1367 switch (TYPE(n)) {
1368 case list_for:
1369 com_list_for(c, n, e, t);
1370 break;
1371 case list_if:
1372 com_list_if(c, n, e, t);
1373 break;
1374 default:
1375 com_error(c, PyExc_SystemError,
1376 "invalid list_iter node type");
1377 }
1378 }
1379 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001380 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001381 com_push(c, 1);
1382 com_node(c, e);
1383 com_addoparg(c, CALL_FUNCTION, 1);
1384 com_addbyte(c, POP_TOP);
1385 com_pop(c, 2);
1386 }
1387}
1388
1389static void
1390com_list_comprehension(struct compiling *c, node *n)
1391{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001392 /* listmaker: test list_for */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001393 char tmpname[12];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001394 sprintf(tmpname, "[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001395 com_addoparg(c, BUILD_LIST, 0);
1396 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1397 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001398 com_addop_name(c, LOAD_ATTR, "append");
1399 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001400 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001401 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001402 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001403 --c->c_tmpname;
1404}
1405
1406static void
1407com_listmaker(struct compiling *c, node *n)
1408{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001409 /* listmaker: test ( list_for | (',' test)* [','] ) */
1410 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001411 com_list_comprehension(c, n);
1412 else {
1413 int len = 0;
1414 int i;
1415 for (i = 0; i < NCH(n); i += 2, len++)
1416 com_node(c, CHILD(n, i));
1417 com_addoparg(c, BUILD_LIST, len);
1418 com_pop(c, len-1);
1419 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001420}
1421
1422static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001423com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001424{
1425 int i;
1426 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1427 for (i = 0; i+2 < NCH(n); i += 4) {
1428 /* We must arrange things just right for STORE_SUBSCR.
1429 It wants the stack to look like (value) (dict) (key) */
1430 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001431 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001432 com_node(c, CHILD(n, i+2)); /* value */
1433 com_addbyte(c, ROT_TWO);
1434 com_node(c, CHILD(n, i)); /* key */
1435 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001436 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001437 }
1438}
1439
1440static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001441com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001442{
1443 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001444 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001445 int i;
1446 REQ(n, atom);
1447 ch = CHILD(n, 0);
1448 switch (TYPE(ch)) {
1449 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001450 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001451 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001452 com_push(c, 1);
1453 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001454 else
1455 com_node(c, CHILD(n, 1));
1456 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001457 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001458 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001459 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001460 com_push(c, 1);
1461 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001462 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001463 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001464 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001465 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001466 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001467 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001468 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001469 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001470 break;
1471 case BACKQUOTE:
1472 com_node(c, CHILD(n, 1));
1473 com_addbyte(c, UNARY_CONVERT);
1474 break;
1475 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001476 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001477 i = 255;
1478 }
1479 else {
1480 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001481 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001482 }
1483 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001484 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001485 break;
1486 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001487 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001488 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001489 c->c_errors++;
1490 i = 255;
1491 }
1492 else {
1493 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001494 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001495 }
1496 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001497 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001498 break;
1499 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001500 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001501 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001502 break;
1503 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001504 /* XXX fprintf(stderr, "node type %d\n", TYPE(ch)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001505 com_error(c, PyExc_SystemError,
1506 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001507 }
1508}
1509
1510static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001511com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001512{
1513 if (NCH(n) == 1) {
1514 com_addbyte(c, op);
1515 }
1516 else if (NCH(n) == 2) {
1517 if (TYPE(CHILD(n, 0)) != COLON) {
1518 com_node(c, CHILD(n, 0));
1519 com_addbyte(c, op+1);
1520 }
1521 else {
1522 com_node(c, CHILD(n, 1));
1523 com_addbyte(c, op+2);
1524 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001525 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001526 }
1527 else {
1528 com_node(c, CHILD(n, 0));
1529 com_node(c, CHILD(n, 2));
1530 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001531 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001532 }
1533}
1534
Guido van Rossum635abd21997-01-06 22:56:52 +00001535static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001536com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1537{
1538 if (NCH(n) == 1) {
1539 com_addbyte(c, DUP_TOP);
1540 com_push(c, 1);
1541 com_addbyte(c, SLICE);
1542 com_node(c, augn);
1543 com_addbyte(c, opcode);
1544 com_pop(c, 1);
1545 com_addbyte(c, ROT_TWO);
1546 com_addbyte(c, STORE_SLICE);
1547 com_pop(c, 2);
1548 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1549 com_node(c, CHILD(n, 0));
1550 com_addoparg(c, DUP_TOPX, 2);
1551 com_push(c, 2);
1552 com_addbyte(c, SLICE+1);
1553 com_pop(c, 1);
1554 com_node(c, augn);
1555 com_addbyte(c, opcode);
1556 com_pop(c, 1);
1557 com_addbyte(c, ROT_THREE);
1558 com_addbyte(c, STORE_SLICE+1);
1559 com_pop(c, 3);
1560 } else if (NCH(n) == 2) {
1561 com_node(c, CHILD(n, 1));
1562 com_addoparg(c, DUP_TOPX, 2);
1563 com_push(c, 2);
1564 com_addbyte(c, SLICE+2);
1565 com_pop(c, 1);
1566 com_node(c, augn);
1567 com_addbyte(c, opcode);
1568 com_pop(c, 1);
1569 com_addbyte(c, ROT_THREE);
1570 com_addbyte(c, STORE_SLICE+2);
1571 com_pop(c, 3);
1572 } else {
1573 com_node(c, CHILD(n, 0));
1574 com_node(c, CHILD(n, 2));
1575 com_addoparg(c, DUP_TOPX, 3);
1576 com_push(c, 3);
1577 com_addbyte(c, SLICE+3);
1578 com_pop(c, 2);
1579 com_node(c, augn);
1580 com_addbyte(c, opcode);
1581 com_pop(c, 1);
1582 com_addbyte(c, ROT_FOUR);
1583 com_addbyte(c, STORE_SLICE+3);
1584 com_pop(c, 4);
1585 }
1586}
1587
1588static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001589com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001590{
1591 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001592 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001593 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001594 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001595 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001596 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001597 }
1598 else {
1599 com_node(c, CHILD(n, 0));
1600 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001601 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001602 }
1603 m = n;
1604 do {
1605 m = CHILD(m, 0);
1606 } while (NCH(m) == 1);
1607 if (TYPE(m) != NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001608 com_error(c, PyExc_SyntaxError,
1609 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001610 }
1611 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001612 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001613 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001614 *pkeywords = PyDict_New();
Guido van Rossum635abd21997-01-06 22:56:52 +00001615 if (v == NULL || *pkeywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001616 c->c_errors++;
1617 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001618 if (PyDict_GetItem(*pkeywords, v) != NULL)
1619 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001620 "duplicate keyword argument");
1621 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001622 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001623 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001624 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001625 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001626 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001627 }
1628 }
1629 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001630}
1631
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001632static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001633com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001634{
1635 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001636 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001637 }
1638 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001639 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001640 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001641 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001642 int star_flag = 0;
1643 int starstar_flag = 0;
1644 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001645 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001646 na = 0;
1647 nk = 0;
1648 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001649 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001650 if (TYPE(ch) == STAR ||
1651 TYPE(ch) == DOUBLESTAR)
1652 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001653 if (ch->n_lineno != lineno) {
1654 lineno = ch->n_lineno;
1655 com_addoparg(c, SET_LINENO, lineno);
1656 }
1657 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001658 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001659 na++;
1660 else
1661 nk++;
1662 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001663 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001664 while (i < NCH(n)) {
1665 node *tok = CHILD(n, i);
1666 node *ch = CHILD(n, i+1);
1667 i += 3;
1668 switch (TYPE(tok)) {
1669 case STAR: star_flag = 1; break;
1670 case DOUBLESTAR: starstar_flag = 1; break;
1671 }
1672 com_node(c, ch);
1673 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001674 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001675 com_error(c, PyExc_SyntaxError,
1676 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001677 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001678 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001679 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001680 star_flag + (starstar_flag << 1);
1681 else
1682 opcode = CALL_FUNCTION;
1683 com_addoparg(c, opcode, na | (nk << 8));
1684 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001685 }
1686}
1687
1688static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001689com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001690{
1691 com_addopname(c, LOAD_ATTR, n);
1692}
1693
1694static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001695com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001696{
1697 int i=0;
1698 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001699 node *ch;
1700
1701 /* first argument */
1702 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001703 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001704 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001705 i++;
1706 }
1707 else {
1708 com_node(c, CHILD(n,i));
1709 i++;
1710 REQ(CHILD(n,i),COLON);
1711 i++;
1712 }
1713 /* second argument */
1714 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1715 com_node(c, CHILD(n,i));
1716 i++;
1717 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001718 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001719 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001720 com_push(c, 1);
1721 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001722 /* remaining arguments */
1723 for (; i < NCH(n); i++) {
1724 ns++;
1725 ch=CHILD(n,i);
1726 REQ(ch, sliceop);
1727 if (NCH(ch) == 1) {
1728 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001729 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001730 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001731 }
1732 else
1733 com_node(c, CHILD(ch,1));
1734 }
1735 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001736 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001737}
1738
1739static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001740com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001741{
1742 node *ch;
1743 REQ(n, subscript);
1744 ch = CHILD(n,0);
1745 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001746 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001747 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001748 com_push(c, 1);
1749 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001750 else {
1751 /* check for slice */
1752 if ((TYPE(ch) == COLON || NCH(n) > 1))
1753 com_sliceobj(c, n);
1754 else {
1755 REQ(ch, test);
1756 com_node(c, ch);
1757 }
1758 }
1759}
1760
1761static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001762com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001763{
1764 int i, op;
1765 REQ(n, subscriptlist);
1766 /* Check to make backward compatible slice behavior for '[i:j]' */
1767 if (NCH(n) == 1) {
1768 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001769 /* 'Basic' slice, should have exactly one colon. */
1770 if ((TYPE(CHILD(sub, 0)) == COLON
1771 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1772 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1773 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001774 switch (assigning) {
1775 case OP_DELETE:
1776 op = DELETE_SLICE;
1777 break;
1778 case OP_ASSIGN:
1779 op = STORE_SLICE;
1780 break;
1781 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001782 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001783 break;
1784 default:
1785 com_augassign_slice(c, sub, assigning, augn);
1786 return;
1787 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001788 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001789 if (op == STORE_SLICE)
1790 com_pop(c, 2);
1791 else if (op == DELETE_SLICE)
1792 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001793 return;
1794 }
1795 }
1796 /* Else normal subscriptlist. Compile each subscript. */
1797 for (i = 0; i < NCH(n); i += 2)
1798 com_subscript(c, CHILD(n, i));
1799 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001800 if (NCH(n) > 1) {
1801 i = (NCH(n)+1) / 2;
1802 com_addoparg(c, BUILD_TUPLE, i);
1803 com_pop(c, i-1);
1804 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001805 switch (assigning) {
1806 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001807 op = DELETE_SUBSCR;
1808 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00001809 break;
1810 default:
1811 case OP_ASSIGN:
1812 op = STORE_SUBSCR;
1813 i = 3;
1814 break;
1815 case OP_APPLY:
1816 op = BINARY_SUBSCR;
1817 i = 1;
1818 break;
1819 }
1820 if (assigning > OP_APPLY) {
1821 com_addoparg(c, DUP_TOPX, 2);
1822 com_push(c, 2);
1823 com_addbyte(c, BINARY_SUBSCR);
1824 com_pop(c, 1);
1825 com_node(c, augn);
1826 com_addbyte(c, assigning);
1827 com_pop(c, 1);
1828 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001829 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001830 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001831 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001832}
1833
1834static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001835com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001836{
1837 REQ(n, trailer);
1838 switch (TYPE(CHILD(n, 0))) {
1839 case LPAR:
1840 com_call_function(c, CHILD(n, 1));
1841 break;
1842 case DOT:
1843 com_select_member(c, CHILD(n, 1));
1844 break;
1845 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00001846 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001847 break;
1848 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001849 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001850 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001851 }
1852}
1853
1854static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001855com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001856{
1857 int i;
1858 REQ(n, power);
1859 com_atom(c, CHILD(n, 0));
1860 for (i = 1; i < NCH(n); i++) {
1861 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1862 com_factor(c, CHILD(n, i+1));
1863 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001864 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001865 break;
1866 }
1867 else
1868 com_apply_trailer(c, CHILD(n, i));
1869 }
1870}
1871
1872static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001873com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001874{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001875 REQ(n, factor);
1876 if (TYPE(CHILD(n, 0)) == PLUS) {
1877 com_factor(c, CHILD(n, 1));
1878 com_addbyte(c, UNARY_POSITIVE);
1879 }
1880 else if (TYPE(CHILD(n, 0)) == MINUS) {
1881 com_factor(c, CHILD(n, 1));
1882 com_addbyte(c, UNARY_NEGATIVE);
1883 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001884 else if (TYPE(CHILD(n, 0)) == TILDE) {
1885 com_factor(c, CHILD(n, 1));
1886 com_addbyte(c, UNARY_INVERT);
1887 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001888 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001889 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001890 }
1891}
1892
1893static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001894com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001895{
1896 int i;
1897 int op;
1898 REQ(n, term);
1899 com_factor(c, CHILD(n, 0));
1900 for (i = 2; i < NCH(n); i += 2) {
1901 com_factor(c, CHILD(n, i));
1902 switch (TYPE(CHILD(n, i-1))) {
1903 case STAR:
1904 op = BINARY_MULTIPLY;
1905 break;
1906 case SLASH:
1907 op = BINARY_DIVIDE;
1908 break;
1909 case PERCENT:
1910 op = BINARY_MODULO;
1911 break;
1912 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001913 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001914 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001915 op = 255;
1916 }
1917 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001918 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001919 }
1920}
1921
1922static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001923com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001924{
1925 int i;
1926 int op;
1927 REQ(n, arith_expr);
1928 com_term(c, CHILD(n, 0));
1929 for (i = 2; i < NCH(n); i += 2) {
1930 com_term(c, CHILD(n, i));
1931 switch (TYPE(CHILD(n, i-1))) {
1932 case PLUS:
1933 op = BINARY_ADD;
1934 break;
1935 case MINUS:
1936 op = BINARY_SUBTRACT;
1937 break;
1938 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001939 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001940 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001941 op = 255;
1942 }
1943 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001944 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001945 }
1946}
1947
1948static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001949com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001950{
1951 int i;
1952 int op;
1953 REQ(n, shift_expr);
1954 com_arith_expr(c, CHILD(n, 0));
1955 for (i = 2; i < NCH(n); i += 2) {
1956 com_arith_expr(c, CHILD(n, i));
1957 switch (TYPE(CHILD(n, i-1))) {
1958 case LEFTSHIFT:
1959 op = BINARY_LSHIFT;
1960 break;
1961 case RIGHTSHIFT:
1962 op = BINARY_RSHIFT;
1963 break;
1964 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001965 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001966 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001967 op = 255;
1968 }
1969 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001970 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001971 }
1972}
1973
1974static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001975com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001976{
1977 int i;
1978 int op;
1979 REQ(n, and_expr);
1980 com_shift_expr(c, CHILD(n, 0));
1981 for (i = 2; i < NCH(n); i += 2) {
1982 com_shift_expr(c, CHILD(n, i));
1983 if (TYPE(CHILD(n, i-1)) == AMPER) {
1984 op = BINARY_AND;
1985 }
1986 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001987 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001988 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001989 op = 255;
1990 }
1991 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001992 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001993 }
1994}
1995
1996static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001997com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001998{
1999 int i;
2000 int op;
2001 REQ(n, xor_expr);
2002 com_and_expr(c, CHILD(n, 0));
2003 for (i = 2; i < NCH(n); i += 2) {
2004 com_and_expr(c, CHILD(n, i));
2005 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2006 op = BINARY_XOR;
2007 }
2008 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002009 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002010 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002011 op = 255;
2012 }
2013 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002014 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002015 }
2016}
2017
2018static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002019com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002020{
2021 int i;
2022 int op;
2023 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002024 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002025 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002026 com_xor_expr(c, CHILD(n, i));
2027 if (TYPE(CHILD(n, i-1)) == VBAR) {
2028 op = BINARY_OR;
2029 }
2030 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002031 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002032 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002033 op = 255;
2034 }
2035 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002036 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002037 }
2038}
2039
2040static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002041cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002042{
2043 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00002044 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002045 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2046 if (NCH(n) == 1) {
2047 n = CHILD(n, 0);
2048 switch (TYPE(n)) {
2049 case LESS: return LT;
2050 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00002051 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002052 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00002053 case LESSEQUAL: return LE;
2054 case GREATEREQUAL: return GE;
2055 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002056 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
2057 if (strcmp(STR(n), "is") == 0) return IS;
2058 }
2059 }
2060 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002061 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002062 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
2063 return NOT_IN;
2064 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
2065 return IS_NOT;
2066 }
2067 }
2068 return BAD;
2069}
2070
2071static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002072com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002073{
2074 int i;
2075 enum cmp_op op;
2076 int anchor;
2077 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2078 com_expr(c, CHILD(n, 0));
2079 if (NCH(n) == 1)
2080 return;
2081
2082 /****************************************************************
2083 The following code is generated for all but the last
2084 comparison in a chain:
2085
2086 label: on stack: opcode: jump to:
2087
2088 a <code to load b>
2089 a, b DUP_TOP
2090 a, b, b ROT_THREE
2091 b, a, b COMPARE_OP
2092 b, 0-or-1 JUMP_IF_FALSE L1
2093 b, 1 POP_TOP
2094 b
2095
2096 We are now ready to repeat this sequence for the next
2097 comparison in the chain.
2098
2099 For the last we generate:
2100
2101 b <code to load c>
2102 b, c COMPARE_OP
2103 0-or-1
2104
2105 If there were any jumps to L1 (i.e., there was more than one
2106 comparison), we generate:
2107
2108 0-or-1 JUMP_FORWARD L2
2109 L1: b, 0 ROT_TWO
2110 0, b POP_TOP
2111 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002112 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002113 ****************************************************************/
2114
2115 anchor = 0;
2116
2117 for (i = 2; i < NCH(n); i += 2) {
2118 com_expr(c, CHILD(n, i));
2119 if (i+2 < NCH(n)) {
2120 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002121 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002122 com_addbyte(c, ROT_THREE);
2123 }
2124 op = cmp_type(CHILD(n, i-1));
2125 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002126 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002127 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002128 }
2129 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002130 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002131 if (i+2 < NCH(n)) {
2132 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2133 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002134 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002135 }
2136 }
2137
2138 if (anchor) {
2139 int anchor2 = 0;
2140 com_addfwref(c, JUMP_FORWARD, &anchor2);
2141 com_backpatch(c, anchor);
2142 com_addbyte(c, ROT_TWO);
2143 com_addbyte(c, POP_TOP);
2144 com_backpatch(c, anchor2);
2145 }
2146}
2147
2148static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002149com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002150{
2151 REQ(n, not_test); /* 'not' not_test | comparison */
2152 if (NCH(n) == 1) {
2153 com_comparison(c, CHILD(n, 0));
2154 }
2155 else {
2156 com_not_test(c, CHILD(n, 1));
2157 com_addbyte(c, UNARY_NOT);
2158 }
2159}
2160
2161static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002162com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002163{
2164 int i;
2165 int anchor;
2166 REQ(n, and_test); /* not_test ('and' not_test)* */
2167 anchor = 0;
2168 i = 0;
2169 for (;;) {
2170 com_not_test(c, CHILD(n, i));
2171 if ((i += 2) >= NCH(n))
2172 break;
2173 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2174 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002175 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002176 }
2177 if (anchor)
2178 com_backpatch(c, anchor);
2179}
2180
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002181static int
2182com_make_closure(struct compiling *c, PyCodeObject *co)
2183{
2184 int i, free = PyTuple_GET_SIZE(co->co_freevars);
2185 if (free == 0)
2186 return 0;
2187 for (i = 0; i < free; ++i) {
2188 /* Bypass com_addop_varname because it will generate
2189 LOAD_DEREF but LOAD_CLOSURE is needed.
2190 */
2191 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2192 int arg, reftype;
2193
2194 /* Special case: If a class contains a method with a
2195 free variable that has the same name as a method,
2196 the name will be considered free *and* local in the
2197 class. It should be handled by the closure, as
2198 well as by the normal name loookup logic.
2199 */
2200 reftype = get_ref_type(c, PyString_AS_STRING(name));
2201 if (reftype == CELL)
2202 arg = com_lookup_arg(c->c_cellvars, name);
2203 else /* (reftype == FREE) */
2204 arg = com_lookup_arg(c->c_freevars, name);
2205 if (arg == -1) {
2206 fprintf(stderr, "lookup %s in %s %d %d\n",
2207 REPR(name), c->c_name, reftype, arg);
2208 Py_FatalError("com_make_closure()");
2209 }
2210 com_addoparg(c, LOAD_CLOSURE, arg);
2211
2212 }
2213 com_push(c, free);
2214 return 1;
2215}
2216
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002217static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002218com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002219{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002220 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002221 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002222 PyObject *co;
2223 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002224 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002225 symtable_enter_scope(c->c_symtable, "lambda", lambdef);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002226 co = (PyObject *) icompile(CHILD(n, 0), c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002227 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002228 if (co == NULL) {
Guido van Rossum57531fe1993-11-30 14:57:42 +00002229 c->c_errors++;
2230 i = 255;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002231 closure = 0;
2232 } else {
2233 i = com_addconst(c, co);
2234 Py_DECREF(co);
2235 closure = com_make_closure(c, (PyCodeObject *)co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002236 }
2237 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002238 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002239 if (closure)
2240 com_addoparg(c, MAKE_CLOSURE, ndefs);
2241 else
2242 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002243 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002244 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002245 else {
2246 int anchor = 0;
2247 int i = 0;
2248 for (;;) {
2249 com_and_test(c, CHILD(n, i));
2250 if ((i += 2) >= NCH(n))
2251 break;
2252 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2253 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002254 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002255 }
2256 if (anchor)
2257 com_backpatch(c, anchor);
2258 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002259}
2260
2261static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002262com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002263{
2264 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002265 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002266 com_node(c, CHILD(n, 0));
2267 }
2268 else {
2269 int i;
2270 int len;
2271 len = (NCH(n) + 1) / 2;
2272 for (i = 0; i < NCH(n); i += 2)
2273 com_node(c, CHILD(n, i));
2274 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002275 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002276 }
2277}
2278
2279
2280/* Begin of assignment compilation */
2281
Thomas Wouters434d0822000-08-24 20:11:32 +00002282
2283static void
2284com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2285{
2286 com_addbyte(c, DUP_TOP);
2287 com_push(c, 1);
2288 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002289 com_node(c, augn);
2290 com_addbyte(c, opcode);
2291 com_pop(c, 1);
2292 com_addbyte(c, ROT_TWO);
2293 com_addopname(c, STORE_ATTR, n);
2294 com_pop(c, 2);
2295}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002296
2297static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002298com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002299{
2300 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002301 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002302}
2303
2304static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002305com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002306{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002307 REQ(n, trailer);
2308 switch (TYPE(CHILD(n, 0))) {
2309 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002310 com_error(c, PyExc_SyntaxError,
2311 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002312 break;
2313 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002314 if (assigning > OP_APPLY)
2315 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2316 else
2317 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002318 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002319 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002320 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002321 break;
2322 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002323 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002324 }
2325}
2326
2327static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002328com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002329{
2330 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002331 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002332 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002333 if (assigning) {
2334 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002335 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002336 com_push(c, i-1);
2337 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002338 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002339 com_assign(c, CHILD(n, i), assigning, NULL);
2340}
2341
2342static void
2343com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2344{
2345 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002346 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002347 com_push(c, 1);
2348 com_node(c, augn);
2349 com_addbyte(c, opcode);
2350 com_pop(c, 1);
2351 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002352}
2353
2354static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002355com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002356{
2357 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002358 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002359 if (assigning)
2360 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002361}
2362
2363static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002364com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002365{
2366 /* Loop to avoid trivial recursion */
2367 for (;;) {
2368 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002369
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002370 case exprlist:
2371 case testlist:
2372 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002373 if (assigning > OP_APPLY) {
2374 com_error(c, PyExc_SyntaxError,
2375 "augmented assign to tuple not possible");
2376 return;
2377 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002378 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002379 return;
2380 }
2381 n = CHILD(n, 0);
2382 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002383
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002384 case test:
2385 case and_test:
2386 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002387 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002388 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002389 case xor_expr:
2390 case and_expr:
2391 case shift_expr:
2392 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002393 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002394 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002395 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002396 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002397 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002398 return;
2399 }
2400 n = CHILD(n, 0);
2401 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002402
Guido van Rossum50564e81996-01-12 01:13:16 +00002403 case power: /* atom trailer* ('**' power)* */
2404/* ('+'|'-'|'~') factor | atom trailer* */
2405 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002406 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002407 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002408 return;
2409 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002410 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002411 int i;
2412 com_node(c, CHILD(n, 0));
2413 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002414 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002415 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002416 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002417 return;
2418 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002419 com_apply_trailer(c, CHILD(n, i));
2420 } /* NB i is still alive */
2421 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002422 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002423 return;
2424 }
2425 n = CHILD(n, 0);
2426 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002427
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002428 case atom:
2429 switch (TYPE(CHILD(n, 0))) {
2430 case LPAR:
2431 n = CHILD(n, 1);
2432 if (TYPE(n) == RPAR) {
2433 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002434 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002435 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002436 return;
2437 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002438 if (assigning > OP_APPLY) {
2439 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002440 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002441 return;
2442 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002443 break;
2444 case LSQB:
2445 n = CHILD(n, 1);
2446 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002447 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002448 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002449 return;
2450 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002451 if (assigning > OP_APPLY) {
2452 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002453 "augmented assign to list not possible");
2454 return;
2455 }
2456 if (NCH(n) > 1
2457 && TYPE(CHILD(n, 1)) == list_for) {
2458 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002459 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002460 return;
2461 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002462 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002463 return;
2464 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002465 if (assigning > OP_APPLY)
2466 com_augassign_name(c, CHILD(n, 0),
2467 assigning, augn);
2468 else
2469 com_assign_name(c, CHILD(n, 0),
2470 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002471 return;
2472 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002473 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002474 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002475 return;
2476 }
2477 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002478
2479 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002480 com_error(c, PyExc_SyntaxError,
2481 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002482 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002483
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002484 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002485 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002486 com_error(c, PyExc_SystemError,
2487 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002488 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002489
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002490 }
2491 }
2492}
Guido van Rossum7c531111997-03-11 18:42:21 +00002493
Thomas Wouters434d0822000-08-24 20:11:32 +00002494static void
2495com_augassign(struct compiling *c, node *n)
2496{
2497 int opcode;
2498
2499 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2500 case '+': opcode = INPLACE_ADD; break;
2501 case '-': opcode = INPLACE_SUBTRACT; break;
2502 case '/': opcode = INPLACE_DIVIDE; break;
2503 case '%': opcode = INPLACE_MODULO; break;
2504 case '<': opcode = INPLACE_LSHIFT; break;
2505 case '>': opcode = INPLACE_RSHIFT; break;
2506 case '&': opcode = INPLACE_AND; break;
2507 case '^': opcode = INPLACE_XOR; break;
2508 case '|': opcode = INPLACE_OR; break;
2509 case '*':
2510 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2511 opcode = INPLACE_POWER;
2512 else
2513 opcode = INPLACE_MULTIPLY;
2514 break;
2515 default:
2516 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2517 return;
2518 }
2519 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2520}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002521
2522static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002523com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002524{
Thomas Wouters434d0822000-08-24 20:11:32 +00002525 REQ(n, expr_stmt);
2526 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002527 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002528 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002529 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002530 if (NCH(n) == 1) {
2531 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002532 if (c->c_interactive)
2533 com_addbyte(c, PRINT_EXPR);
2534 else
2535 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002536 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002537 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002538 else if (TYPE(CHILD(n,1)) == augassign)
2539 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002540 else {
2541 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002542 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002543 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002544 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002545 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002546 com_push(c, 1);
2547 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002548 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002549 }
2550 }
2551}
2552
2553static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002554com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002555{
2556 int a = 0, b = 0;
2557 int i;
2558 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2559 /* Generate code like for
2560
2561 if __debug__:
2562 if not <test>:
2563 raise AssertionError [, <message>]
2564
2565 where <message> is the second test, if present.
2566 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002567
2568 /* XXX should __debug__ and AssertionError get inserted into
2569 the symbol table? they don't follow the normal rules
2570 because they are always loaded as globals */
2571
Guido van Rossum228d7f31997-04-02 05:24:36 +00002572 if (Py_OptimizeFlag)
2573 return;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002574 com_addop_name(c, LOAD_GLOBAL, "__debug__");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002575 com_push(c, 1);
2576 com_addfwref(c, JUMP_IF_FALSE, &a);
2577 com_addbyte(c, POP_TOP);
2578 com_pop(c, 1);
2579 com_node(c, CHILD(n, 1));
2580 com_addfwref(c, JUMP_IF_TRUE, &b);
2581 com_addbyte(c, POP_TOP);
2582 com_pop(c, 1);
2583 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002584 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002585 com_push(c, 1);
2586 i = NCH(n)/2; /* Either 2 or 4 */
2587 if (i > 1)
2588 com_node(c, CHILD(n, 3));
2589 com_addoparg(c, RAISE_VARARGS, i);
2590 com_pop(c, i);
2591 /* The interpreter does not fall through */
2592 /* All jumps converge here */
2593 com_backpatch(c, a);
2594 com_backpatch(c, b);
2595 com_addbyte(c, POP_TOP);
2596}
2597
2598static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002599com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002600{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002601 int i = 1;
2602 node* stream = NULL;
2603
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002604 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002605
2606 /* are we using the extended print form? */
2607 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2608 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002609 com_node(c, stream);
2610 /* stack: [...] => [... stream] */
2611 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002612 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2613 i = 4;
2614 else
2615 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002616 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002617 for (; i < NCH(n); i += 2) {
2618 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002619 com_addbyte(c, DUP_TOP);
2620 /* stack: [stream] => [stream stream] */
2621 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002622 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002623 /* stack: [stream stream] => [stream stream obj] */
2624 com_addbyte(c, ROT_TWO);
2625 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002626 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002627 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002628 com_pop(c, 2);
2629 }
2630 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002631 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002632 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002633 com_addbyte(c, PRINT_ITEM);
2634 com_pop(c, 1);
2635 }
2636 }
2637 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002638 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002639 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002640 /* must pop the extra stream object off the stack */
2641 com_addbyte(c, POP_TOP);
2642 /* stack: [... stream] => [...] */
2643 com_pop(c, 1);
2644 }
2645 }
2646 else {
2647 if (stream != NULL) {
2648 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002649 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002650 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002651 com_pop(c, 1);
2652 }
2653 else
2654 com_addbyte(c, PRINT_NEWLINE);
2655 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002656}
2657
2658static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002659com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002660{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002661 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002662 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002663 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002664 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002665 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002666 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002667 com_push(c, 1);
2668 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002669 else
2670 com_node(c, CHILD(n, 1));
2671 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002672 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002673}
2674
2675static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002676com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002677{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002678 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002679 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2680 if (NCH(n) > 1) {
2681 com_node(c, CHILD(n, 1));
2682 if (NCH(n) > 3) {
2683 com_node(c, CHILD(n, 3));
2684 if (NCH(n) > 5)
2685 com_node(c, CHILD(n, 5));
2686 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002687 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002688 i = NCH(n)/2;
2689 com_addoparg(c, RAISE_VARARGS, i);
2690 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002691}
2692
2693static void
Thomas Wouters52152252000-08-17 22:55:00 +00002694com_from_import(struct compiling *c, node *n)
2695{
2696 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2697 com_push(c, 1);
2698 if (NCH(n) > 1) {
2699 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2700 com_error(c, PyExc_SyntaxError, "invalid syntax");
2701 return;
2702 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002703 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002704 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002705 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00002706 com_pop(c, 1);
2707}
2708
2709static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002710com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002711{
2712 int i;
2713 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002714 /* 'import' dotted_name (',' dotted_name)* |
2715 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002716 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00002717 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002718 /* 'from' dotted_name 'import' ... */
2719 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002720
2721 if (TYPE(CHILD(n, 3)) == STAR) {
2722 tup = Py_BuildValue("(s)", "*");
2723 } else {
2724 tup = PyTuple_New((NCH(n) - 2)/2);
2725 for (i = 3; i < NCH(n); i += 2) {
2726 PyTuple_SET_ITEM(tup, (i-3)/2,
2727 PyString_FromString(STR(
2728 CHILD(CHILD(n, i), 0))));
2729 }
2730 }
2731 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00002732 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002733 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002734 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00002735 if (TYPE(CHILD(n, 3)) == STAR)
2736 com_addbyte(c, IMPORT_STAR);
2737 else {
2738 for (i = 3; i < NCH(n); i += 2)
2739 com_from_import(c, CHILD(n, i));
2740 com_addbyte(c, POP_TOP);
2741 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002742 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002743 }
2744 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002745 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002746 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00002747 node *subn = CHILD(n, i);
2748 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002749 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002750 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002751 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00002752 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00002753 int j;
2754 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00002755 com_error(c, PyExc_SyntaxError,
2756 "invalid syntax");
2757 return;
2758 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00002759 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
2760 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002761 CHILD(CHILD(subn, 0),
2762 j));
2763 com_addop_varname(c, VAR_STORE,
2764 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002765 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002766 com_addop_varname(c, VAR_STORE,
2767 STR(CHILD(CHILD(subn, 0),
2768 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002769 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002770 }
2771 }
2772}
2773
2774static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002775com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002776{
2777 REQ(n, exec_stmt);
2778 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2779 com_node(c, CHILD(n, 1));
2780 if (NCH(n) >= 4)
2781 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002782 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002783 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002784 com_push(c, 1);
2785 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002786 if (NCH(n) >= 6)
2787 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002788 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002789 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002790 com_push(c, 1);
2791 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002792 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002793 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002794}
2795
Guido van Rossum7c531111997-03-11 18:42:21 +00002796static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002797is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002798{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002799 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002800 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002801 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00002802
2803 /* Label to avoid tail recursion */
2804 next:
2805 switch (TYPE(n)) {
2806
2807 case suite:
2808 if (NCH(n) == 1) {
2809 n = CHILD(n, 0);
2810 goto next;
2811 }
2812 /* Fall through */
2813 case file_input:
2814 for (i = 0; i < NCH(n); i++) {
2815 node *ch = CHILD(n, i);
2816 if (TYPE(ch) == stmt) {
2817 n = ch;
2818 goto next;
2819 }
2820 }
2821 break;
2822
2823 case stmt:
2824 case simple_stmt:
2825 case small_stmt:
2826 n = CHILD(n, 0);
2827 goto next;
2828
2829 case expr_stmt:
2830 case testlist:
2831 case test:
2832 case and_test:
2833 case not_test:
2834 case comparison:
2835 case expr:
2836 case xor_expr:
2837 case and_expr:
2838 case shift_expr:
2839 case arith_expr:
2840 case term:
2841 case factor:
2842 case power:
2843 case atom:
2844 if (NCH(n) == 1) {
2845 n = CHILD(n, 0);
2846 goto next;
2847 }
2848 break;
2849
2850 case NAME:
2851 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2852 return 1;
2853 break;
2854
2855 case NUMBER:
2856 v = parsenumber(c, STR(n));
2857 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002858 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002859 break;
2860 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002861 i = PyObject_IsTrue(v);
2862 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002863 return i == 0;
2864
2865 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002866 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002867 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002868 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002869 break;
2870 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002871 i = PyObject_IsTrue(v);
2872 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002873 return i == 0;
2874
2875 }
2876 return 0;
2877}
2878
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002879static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002880com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002881{
2882 int i;
2883 int anchor = 0;
2884 REQ(n, if_stmt);
2885 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2886 for (i = 0; i+3 < NCH(n); i+=4) {
2887 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002888 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002889 if (is_constant_false(c, ch))
2890 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002891 if (i > 0)
2892 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002893 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002894 com_addfwref(c, JUMP_IF_FALSE, &a);
2895 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002896 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002897 com_node(c, CHILD(n, i+3));
2898 com_addfwref(c, JUMP_FORWARD, &anchor);
2899 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002900 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002901 com_addbyte(c, POP_TOP);
2902 }
2903 if (i+2 < NCH(n))
2904 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002905 if (anchor)
2906 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002907}
2908
2909static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002910com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002911{
2912 int break_anchor = 0;
2913 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002914 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002915 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2916 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002917 block_push(c, SETUP_LOOP);
2918 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002919 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002920 com_node(c, CHILD(n, 1));
2921 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2922 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002923 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002924 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002925 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002926 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002927 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2928 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002929 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002930 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002931 com_addbyte(c, POP_TOP);
2932 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002933 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002934 if (NCH(n) > 4)
2935 com_node(c, CHILD(n, 6));
2936 com_backpatch(c, break_anchor);
2937}
2938
2939static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002940com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002941{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002942 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002943 int break_anchor = 0;
2944 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002945 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002946 REQ(n, for_stmt);
2947 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2948 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002949 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002950 com_node(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002951 v = PyInt_FromLong(0L);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002952 if (v == NULL)
2953 c->c_errors++;
2954 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002955 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002956 Py_XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002957 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002958 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002959 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002960 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00002961 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002962 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002963 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002964 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002965 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2966 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002967 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002968 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002969 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002970 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002971 if (NCH(n) > 8)
2972 com_node(c, CHILD(n, 8));
2973 com_backpatch(c, break_anchor);
2974}
2975
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002976/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002977
2978 SETUP_FINALLY L
2979 <code for S>
2980 POP_BLOCK
2981 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002982 L: <code for Sf>
2983 END_FINALLY
2984
2985 The special instructions use the block stack. Each block
2986 stack entry contains the instruction that created it (here
2987 SETUP_FINALLY), the level of the value stack at the time the
2988 block stack entry was created, and a label (here L).
2989
2990 SETUP_FINALLY:
2991 Pushes the current value stack level and the label
2992 onto the block stack.
2993 POP_BLOCK:
2994 Pops en entry from the block stack, and pops the value
2995 stack until its level is the same as indicated on the
2996 block stack. (The label is ignored.)
2997 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002998 Pops a variable number of entries from the *value* stack
2999 and re-raises the exception they specify. The number of
3000 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003001
3002 The block stack is unwound when an exception is raised:
3003 when a SETUP_FINALLY entry is found, the exception is pushed
3004 onto the value stack (and the exception condition is cleared),
3005 and the interpreter jumps to the label gotten from the block
3006 stack.
3007
3008 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003009 (The contents of the value stack is shown in [], with the top
3010 at the right; 'tb' is trace-back info, 'val' the exception's
3011 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003012
3013 Value stack Label Instruction Argument
3014 [] SETUP_EXCEPT L1
3015 [] <code for S>
3016 [] POP_BLOCK
3017 [] JUMP_FORWARD L0
3018
Guido van Rossum3f5da241990-12-20 15:06:42 +00003019 [tb, val, exc] L1: DUP )
3020 [tb, val, exc, exc] <evaluate E1> )
3021 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3022 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3023 [tb, val, exc, 1] POP )
3024 [tb, val, exc] POP
3025 [tb, val] <assign to V1> (or POP if no V1)
3026 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003027 [] <code for S1>
3028 JUMP_FORWARD L0
3029
Guido van Rossum3f5da241990-12-20 15:06:42 +00003030 [tb, val, exc, 0] L2: POP
3031 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003032 .............................etc.......................
3033
Guido van Rossum3f5da241990-12-20 15:06:42 +00003034 [tb, val, exc, 0] Ln+1: POP
3035 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003036
3037 [] L0: <next statement>
3038
3039 Of course, parts are not generated if Vi or Ei is not present.
3040*/
3041
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003042static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003043com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003044{
3045 int except_anchor = 0;
3046 int end_anchor = 0;
3047 int else_anchor = 0;
3048 int i;
3049 node *ch;
3050
3051 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3052 block_push(c, SETUP_EXCEPT);
3053 com_node(c, CHILD(n, 2));
3054 com_addbyte(c, POP_BLOCK);
3055 block_pop(c, SETUP_EXCEPT);
3056 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3057 com_backpatch(c, except_anchor);
3058 for (i = 3;
3059 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3060 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003061 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003062 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003063 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003064 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003065 break;
3066 }
3067 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003068 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003069 com_addoparg(c, SET_LINENO, ch->n_lineno);
3070 if (NCH(ch) > 1) {
3071 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003072 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003073 com_node(c, CHILD(ch, 1));
3074 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003075 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003076 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3077 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003078 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003079 }
3080 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003081 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003082 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003083 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003084 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003085 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003086 com_pop(c, 1);
3087 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003088 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003089 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003090 com_node(c, CHILD(n, i+2));
3091 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3092 if (except_anchor) {
3093 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003094 /* We come in with [tb, val, exc, 0] on the
3095 stack; one pop and it's the same as
3096 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003097 com_addbyte(c, POP_TOP);
3098 }
3099 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003100 /* We actually come in here with [tb, val, exc] but the
3101 END_FINALLY will zap those and jump around.
3102 The c_stacklevel does not reflect them so we need not pop
3103 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003104 com_addbyte(c, END_FINALLY);
3105 com_backpatch(c, else_anchor);
3106 if (i < NCH(n))
3107 com_node(c, CHILD(n, i+2));
3108 com_backpatch(c, end_anchor);
3109}
3110
3111static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003112com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003113{
3114 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003115 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003116
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003117 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3118 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003119 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003120 com_addbyte(c, POP_BLOCK);
3121 block_pop(c, SETUP_FINALLY);
3122 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003123 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003124 /* While the generated code pushes only one item,
3125 the try-finally handling can enter here with
3126 up to three items. OK, here are the details:
3127 3 for an exception, 2 for RETURN, 1 for BREAK. */
3128 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003129 com_backpatch(c, finally_anchor);
3130 ch = CHILD(n, NCH(n)-1);
3131 com_addoparg(c, SET_LINENO, ch->n_lineno);
3132 com_node(c, ch);
3133 com_addbyte(c, END_FINALLY);
3134 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003135 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003136}
3137
3138static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003139com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003140{
3141 REQ(n, try_stmt);
3142 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3143 | 'try' ':' suite 'finally' ':' suite */
3144 if (TYPE(CHILD(n, 3)) != except_clause)
3145 com_try_finally(c, n);
3146 else
3147 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003148}
3149
Guido van Rossum8b993a91997-01-17 21:04:03 +00003150static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003151get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003152{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003153 int i;
3154
Guido van Rossum8b993a91997-01-17 21:04:03 +00003155 /* Label to avoid tail recursion */
3156 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003157 switch (TYPE(n)) {
3158
3159 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003160 if (NCH(n) == 1) {
3161 n = CHILD(n, 0);
3162 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003163 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003164 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003165 case file_input:
3166 for (i = 0; i < NCH(n); i++) {
3167 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003168 if (TYPE(ch) == stmt) {
3169 n = ch;
3170 goto next;
3171 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003172 }
3173 break;
3174
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003175 case stmt:
3176 case simple_stmt:
3177 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003178 n = CHILD(n, 0);
3179 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003180
3181 case expr_stmt:
3182 case testlist:
3183 case test:
3184 case and_test:
3185 case not_test:
3186 case comparison:
3187 case expr:
3188 case xor_expr:
3189 case and_expr:
3190 case shift_expr:
3191 case arith_expr:
3192 case term:
3193 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003194 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003195 if (NCH(n) == 1) {
3196 n = CHILD(n, 0);
3197 goto next;
3198 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003199 break;
3200
3201 case atom:
3202 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003203 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003204 break;
3205
3206 }
3207 return NULL;
3208}
3209
Guido van Rossum79f25d91997-04-29 20:08:16 +00003210static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003211get_docstring(node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003212{
Guido van Rossum541563e1999-01-28 15:08:09 +00003213 /* Don't generate doc-strings if run with -OO */
3214 if (Py_OptimizeFlag > 1)
3215 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003216 n = get_rawdocstring(n);
3217 if (n == NULL)
3218 return NULL;
3219 return parsestrplus(n);
3220}
3221
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003222static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003223com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003224{
3225 REQ(n, suite);
3226 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3227 if (NCH(n) == 1) {
3228 com_node(c, CHILD(n, 0));
3229 }
3230 else {
3231 int i;
3232 for (i = 0; i < NCH(n); i++) {
3233 node *ch = CHILD(n, i);
3234 if (TYPE(ch) == stmt)
3235 com_node(c, ch);
3236 }
3237 }
3238}
3239
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003240/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003241static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003242com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003243{
3244 int i = c->c_nblocks;
3245 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3246 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3247 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003248 else if (i <= 0) {
3249 /* at the outer level */
3250 com_error(c, PyExc_SyntaxError,
3251 "'continue' not properly in loop");
3252 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003253 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003254 int j;
3255 for (j = 0; j <= i; ++j) {
3256 if (c->c_block[j] == SETUP_LOOP)
3257 break;
3258 }
3259 if (j < i+1) {
3260 /* there is a loop, but something interferes */
3261 for (++j; j <= i; ++j) {
3262 if (c->c_block[i] == SETUP_EXCEPT
3263 || c->c_block[i] == SETUP_FINALLY) {
3264 com_error(c, PyExc_SyntaxError,
3265 "'continue' not supported inside 'try' clause");
3266 return;
3267 }
3268 }
3269 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003270 com_error(c, PyExc_SyntaxError,
3271 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003272 }
3273 /* XXX Could allow it inside a 'finally' clause
3274 XXX if we could pop the exception still on the stack */
3275}
3276
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003277static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003278com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003279{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003280 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003281 if (TYPE(n) == lambdef) {
3282 /* lambdef: 'lambda' [varargslist] ':' test */
3283 n = CHILD(n, 1);
3284 }
3285 else {
3286 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3287 n = CHILD(n, 2);
3288 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3289 n = CHILD(n, 1);
3290 }
3291 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003292 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003293 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003294 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003295 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3296 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003297 nargs = 0;
3298 ndefs = 0;
3299 for (i = 0; i < nch; i++) {
3300 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003301 if (TYPE(CHILD(n, i)) == STAR ||
3302 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003303 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003304 nargs++;
3305 i++;
3306 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003307 t = RPAR; /* Anything except EQUAL or COMMA */
3308 else
3309 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003310 if (t == EQUAL) {
3311 i++;
3312 ndefs++;
3313 com_node(c, CHILD(n, i));
3314 i++;
3315 if (i >= nch)
3316 break;
3317 t = TYPE(CHILD(n, i));
3318 }
3319 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003320 /* Treat "(a=1, b)" as an error */
3321 if (ndefs)
3322 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003323 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003324 }
3325 if (t != COMMA)
3326 break;
3327 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003328 return ndefs;
3329}
3330
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003331static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003332com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003333{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003334 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003335 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003336 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003337 ndefs = com_argdefs(c, n);
3338 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003339 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003340 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003341 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003342 c->c_errors++;
3343 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003344 int closure = com_make_closure(c, (PyCodeObject *)co);
3345 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003346 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003347 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003348 if (closure)
3349 com_addoparg(c, MAKE_CLOSURE, ndefs);
3350 else
3351 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003352 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003353 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003354 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003355 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003356 }
3357}
3358
3359static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003360com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003361{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003362 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003363 REQ(n, testlist);
3364 /* testlist: test (',' test)* [','] */
3365 for (i = 0; i < NCH(n); i += 2)
3366 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003367 i = (NCH(n)+1) / 2;
3368 com_addoparg(c, BUILD_TUPLE, i);
3369 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003370}
3371
3372static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003373com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003374{
Guido van Rossum25831651993-05-19 14:50:45 +00003375 int i;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003376 PyObject *co, *v;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003377 char *name;
3378
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003379 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003380 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003381 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003382 c->c_errors++;
3383 return;
3384 }
3385 /* Push the class name on the stack */
3386 i = com_addconst(c, v);
3387 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003388 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003389 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003390 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003391 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003392 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003393 com_push(c, 1);
3394 }
Guido van Rossum25831651993-05-19 14:50:45 +00003395 else
3396 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003397 name = STR(CHILD(n, 1));
3398 symtable_enter_scope(c->c_symtable, name, TYPE(n));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003399 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003400 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003401 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003402 c->c_errors++;
3403 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003404 int closure = com_make_closure(c, (PyCodeObject *)co);
3405 i = com_addconst(c, co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003406 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003407 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003408 if (closure)
3409 com_addoparg(c, MAKE_CLOSURE, 0);
3410 else
3411 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003412 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003413 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003414 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003415 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003416 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003417 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003418}
3419
3420static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003421com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003422{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003423 loop:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003424 switch (TYPE(n)) {
3425
3426 /* Definition nodes */
3427
3428 case funcdef:
3429 com_funcdef(c, n);
3430 break;
3431 case classdef:
3432 com_classdef(c, n);
3433 break;
3434
3435 /* Trivial parse tree nodes */
3436
3437 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003438 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003439 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003440 n = CHILD(n, 0);
3441 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003442
3443 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003444 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
3445 com_addoparg(c, SET_LINENO, n->n_lineno);
3446 {
3447 int i;
3448 for (i = 0; i < NCH(n)-1; i += 2)
3449 com_node(c, CHILD(n, i));
3450 }
3451 break;
3452
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003453 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003454 com_addoparg(c, SET_LINENO, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003455 n = CHILD(n, 0);
3456 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003457
3458 /* Statement nodes */
3459
3460 case expr_stmt:
3461 com_expr_stmt(c, n);
3462 break;
3463 case print_stmt:
3464 com_print_stmt(c, n);
3465 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003466 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003467 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003468 break;
3469 case pass_stmt:
3470 break;
3471 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003472 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003473 com_error(c, PyExc_SyntaxError,
3474 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003475 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003476 com_addbyte(c, BREAK_LOOP);
3477 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003478 case continue_stmt:
3479 com_continue_stmt(c, n);
3480 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003481 case return_stmt:
3482 com_return_stmt(c, n);
3483 break;
3484 case raise_stmt:
3485 com_raise_stmt(c, n);
3486 break;
3487 case import_stmt:
3488 com_import_stmt(c, n);
3489 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003490 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003491 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003492 case exec_stmt:
3493 com_exec_stmt(c, n);
3494 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003495 case assert_stmt:
3496 com_assert_stmt(c, n);
3497 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003498 case if_stmt:
3499 com_if_stmt(c, n);
3500 break;
3501 case while_stmt:
3502 com_while_stmt(c, n);
3503 break;
3504 case for_stmt:
3505 com_for_stmt(c, n);
3506 break;
3507 case try_stmt:
3508 com_try_stmt(c, n);
3509 break;
3510 case suite:
3511 com_suite(c, n);
3512 break;
3513
3514 /* Expression nodes */
3515
3516 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003517 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003518 break;
3519 case test:
3520 com_test(c, n);
3521 break;
3522 case and_test:
3523 com_and_test(c, n);
3524 break;
3525 case not_test:
3526 com_not_test(c, n);
3527 break;
3528 case comparison:
3529 com_comparison(c, n);
3530 break;
3531 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003532 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003533 break;
3534 case expr:
3535 com_expr(c, n);
3536 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003537 case xor_expr:
3538 com_xor_expr(c, n);
3539 break;
3540 case and_expr:
3541 com_and_expr(c, n);
3542 break;
3543 case shift_expr:
3544 com_shift_expr(c, n);
3545 break;
3546 case arith_expr:
3547 com_arith_expr(c, n);
3548 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003549 case term:
3550 com_term(c, n);
3551 break;
3552 case factor:
3553 com_factor(c, n);
3554 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003555 case power:
3556 com_power(c, n);
3557 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003558 case atom:
3559 com_atom(c, n);
3560 break;
3561
3562 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003563 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003564 com_error(c, PyExc_SystemError,
3565 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003566 }
3567}
3568
Tim Petersdbd9ba62000-07-09 03:09:57 +00003569static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003570
3571static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003572com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003573{
3574 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3575 if (TYPE(CHILD(n, 0)) == LPAR)
3576 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003577 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003578 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003579 com_pop(c, 1);
3580 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003581}
3582
3583static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003584com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003585{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003586 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003587 if (NCH(n) == 1) {
3588 com_fpdef(c, CHILD(n, 0));
3589 }
3590 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003591 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003592 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003593 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003594 for (i = 0; i < NCH(n); i += 2)
3595 com_fpdef(c, CHILD(n, i));
3596 }
3597}
3598
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003599/* XXX This function could probably be made simpler, because it
3600 doesn't do anything except generate code for complex arguments.
3601*/
3602
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003603static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003604com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003605{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003606 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003607 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003608 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003609 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003610 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003611 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003612 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003613 /* Enter all arguments in table of locals */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003614 for (i = 0, narg = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003615 node *ch = CHILD(n, i);
3616 node *fp;
3617 char *name;
Guido van Rossum50564e81996-01-12 01:13:16 +00003618 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003619 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003620 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3621 fp = CHILD(ch, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003622 if (TYPE(fp) == NAME) {
3623 PyObject *v;
3624 name = STR(fp);
3625 v = PyDict_GetItemString(c->c_cellvars, name);
3626 if (v) {
3627 com_addoparg(c, LOAD_FAST, narg);
3628 com_addoparg(c, STORE_DEREF,
3629 PyInt_AS_LONG(v));
3630 }
3631 } else {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003632 name = nbuf;
3633 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003634 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003635 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003636 narg++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003637 /* all name updates handled by symtable */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003638 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003639 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003640 ch = CHILD(n, i);
3641 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003642 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003643 else
3644 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003645 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003646 /* Handle *arguments */
3647 if (i < nch) {
3648 node *ch;
3649 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003650 if (TYPE(ch) != DOUBLESTAR) {
3651 REQ(ch, STAR);
3652 ch = CHILD(n, i+1);
3653 if (TYPE(ch) == NAME) {
Guido van Rossum50564e81996-01-12 01:13:16 +00003654 i += 3;
Guido van Rossum50564e81996-01-12 01:13:16 +00003655 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003656 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003657 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003658 /* Handle **keywords */
3659 if (i < nch) {
3660 node *ch;
3661 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003662 if (TYPE(ch) != DOUBLESTAR) {
3663 REQ(ch, STAR);
3664 ch = CHILD(n, i+1);
3665 REQ(ch, STAR);
3666 ch = CHILD(n, i+2);
3667 }
3668 else
3669 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003670 REQ(ch, NAME);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003671 }
3672 if (complex) {
3673 /* Generate code for complex arguments only after
3674 having counted the simple arguments */
3675 int ilocal = 0;
3676 for (i = 0; i < nch; i++) {
3677 node *ch = CHILD(n, i);
3678 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003679 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003680 break;
3681 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3682 fp = CHILD(ch, 0);
3683 if (TYPE(fp) != NAME) {
3684 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003685 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003686 com_fpdef(c, ch);
3687 }
3688 ilocal++;
3689 if (++i >= nch)
3690 break;
3691 ch = CHILD(n, i);
3692 if (TYPE(ch) == EQUAL)
3693 i += 2;
3694 else
3695 REQ(ch, COMMA);
3696 }
3697 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003698}
3699
3700static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003701com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003702{
3703 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003704 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003705 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003706 doc = get_docstring(n);
3707 if (doc != NULL) {
3708 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003709 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003710 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003711 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003712 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003713 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003714 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003715 for (i = 0; i < NCH(n); i++) {
3716 node *ch = CHILD(n, i);
3717 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3718 com_node(c, ch);
3719 }
3720}
3721
3722/* Top-level compile-node interface */
3723
3724static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003725compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003726{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003727 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003728 node *ch;
3729 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003730 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003731 doc = get_docstring(CHILD(n, 4));
3732 if (doc != NULL) {
3733 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003734 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003735 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003736 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003737 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003738 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3739 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003740 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003741 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003742 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003743 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003744 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003745 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003746 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003747 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003748 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003749}
3750
3751static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003752compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003753{
Guido van Rossum590baa41993-11-30 13:40:46 +00003754 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003755 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003756 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003757
3758 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003759 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003760 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003761 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003762 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003763 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003764 else
3765 ch = CHILD(n, 2);
3766 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003767 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003768 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003769}
3770
3771static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003772compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003773{
3774 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003775 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003776 REQ(n, classdef);
3777 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3778 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003779 c->c_private = c->c_name;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003780 ch = CHILD(n, NCH(n)-1); /* The suite */
3781 doc = get_docstring(ch);
3782 if (doc != NULL) {
3783 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003784 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003785 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003786 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003787 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003788 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003789 }
3790 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003791 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003792 com_node(c, ch);
3793 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003794 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003795 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003796 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003797}
3798
3799static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003800compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003801{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003802 com_addoparg(c, SET_LINENO, n->n_lineno);
3803
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003804 switch (TYPE(n)) {
3805
Guido van Rossum4c417781991-01-21 16:09:22 +00003806 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003807 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003808 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003809 n = CHILD(n, 0);
3810 if (TYPE(n) != NEWLINE)
3811 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003812 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003813 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003814 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003815 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003816 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003817 break;
3818
Guido van Rossum4c417781991-01-21 16:09:22 +00003819 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003820 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003821 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003822 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003823 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003824 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003825 break;
3826
Guido van Rossum590baa41993-11-30 13:40:46 +00003827 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003828 com_node(c, CHILD(n, 0));
3829 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003830 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003831 break;
3832
Guido van Rossum590baa41993-11-30 13:40:46 +00003833 case lambdef: /* anonymous function definition */
3834 compile_lambdef(c, n);
3835 break;
3836
Guido van Rossum4c417781991-01-21 16:09:22 +00003837 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003838 compile_funcdef(c, n);
3839 break;
3840
Guido van Rossum4c417781991-01-21 16:09:22 +00003841 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003842 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003843 break;
3844
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003845 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003846 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003847 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003848 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003849 }
3850}
3851
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003852static PyObject *
3853dict_keys_inorder(PyObject *dict, int offset)
3854{
3855 PyObject *tuple, *k, *v;
3856 int i, pos = 0, size = PyDict_Size(dict);
3857
3858 tuple = PyTuple_New(size);
3859 if (tuple == NULL)
3860 return NULL;
3861 while (PyDict_Next(dict, &pos, &k, &v)) {
3862 i = PyInt_AS_LONG(v);
3863 Py_INCREF(k);
3864 PyTuple_SET_ITEM(tuple, i - offset, k);
3865 }
3866 return tuple;
3867}
3868
Guido van Rossum79f25d91997-04-29 20:08:16 +00003869PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003870PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003871{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003872 return jcompile(n, filename, NULL);
3873}
3874
Guido van Rossum79f25d91997-04-29 20:08:16 +00003875static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003876icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003877{
3878 return jcompile(n, base->c_filename, base);
3879}
3880
Guido van Rossum79f25d91997-04-29 20:08:16 +00003881static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003882jcompile(node *n, char *filename, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003883{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003884 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003885 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003886 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003887 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003888 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003889 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003890 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003891 /* c_symtable still points to parent's symbols */
3892 if (base->c_nested
3893 || (sc.c_symtable->st_cur_type == TYPE_FUNCTION))
3894 sc.c_nested = 1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003895 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003896 sc.c_private = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003897 if (symtable_build(&sc, n) < 0) {
3898 com_free(&sc);
3899 return NULL;
3900 }
3901 }
3902 co = NULL;
3903 if (symtable_load_symbols(&sc) < 0)
3904 goto exit;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003905 compile_node(&sc, n);
3906 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00003907 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003908 PyObject *consts, *names, *varnames, *filename, *name,
3909 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003910 consts = PyList_AsTuple(sc.c_consts);
3911 names = PyList_AsTuple(sc.c_names);
3912 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003913 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
3914 freevars = dict_keys_inorder(sc.c_freevars,
3915 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003916 filename = PyString_InternFromString(sc.c_filename);
3917 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003918 if (!PyErr_Occurred())
3919 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003920 sc.c_nlocals,
3921 sc.c_maxstacklevel,
3922 sc.c_flags,
3923 sc.c_code,
3924 consts,
3925 names,
3926 varnames,
3927 freevars,
3928 cellvars,
3929 filename,
3930 name,
3931 sc.c_firstlineno,
3932 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003933 Py_XDECREF(consts);
3934 Py_XDECREF(names);
3935 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003936 Py_XDECREF(freevars);
3937 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003938 Py_XDECREF(filename);
3939 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003940 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00003941 else if (!PyErr_Occurred()) {
3942 /* This could happen if someone called PyErr_Clear() after an
3943 error was reported above. That's not supposed to happen,
3944 but I just plugged one case and I'm not sure there can't be
3945 others. In that case, raise SystemError so that at least
3946 it gets reported instead dumping core. */
3947 PyErr_SetString(PyExc_SystemError, "lost syntax error");
3948 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003949 exit:
3950 if (base == NULL)
3951 symtable_free(sc.c_symtable);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003952 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003953 return co;
3954}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003955
3956int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003957PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003958{
3959 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003960 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003961 int line = co->co_firstlineno;
3962 int addr = 0;
3963 while (--size >= 0) {
3964 addr += *p++;
3965 if (addr > addrq)
3966 break;
3967 line += *p++;
3968 }
3969 return line;
3970}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003971
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003972/* The test for LOCAL must come before the test for FREE in order to
3973 handle classes where name is both local and free. The local var is
3974 a method and the free var is a free var referenced within a method.
3975*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003976
3977static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003978get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003979{
3980 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003981 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
3982 return CELL;
3983 if (PyDict_GetItemString(c->c_locals, name) != NULL)
3984 return LOCAL;
3985 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
3986 return FREE;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003987 v = PyDict_GetItemString(c->c_globals, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003988 if (v) {
3989 if (v == Py_None)
3990 return GLOBAL_EXPLICIT;
3991 else {
3992 return GLOBAL_IMPLICIT;
3993 }
3994 }
3995 {
3996 char buf[250];
3997 sprintf(buf, "unknown scope for %.100s in %.100s (%s)",
3998 name, c->c_name, REPR(c->c_symtable->st_cur_id));
3999 Py_FatalError(buf);
4000 }
4001 return -1; /* can't get here */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004002}
4003
4004static int
4005symtable_build(struct compiling *c, node *n)
4006{
4007 if ((c->c_symtable = symtable_init()) == NULL)
4008 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004009 if (symtable_enter_scope(c->c_symtable, TOP, TYPE(n)) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004010 return -1;
4011 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004012 if (c->c_symtable->st_errors > 0)
4013 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004014 /* reset for second pass */
4015 c->c_symtable->st_scopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004016 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004017 return 0;
4018}
4019
4020static int
4021symtable_load_symbols(struct compiling *c)
4022{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004023 static PyObject *implicit = NULL;
4024 PyObject *name, *varnames, *v;
4025 int i, info, pos;
4026 int nlocals, nfrees, ncells;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004027 struct symtable *st = c->c_symtable;
4028
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004029 if (implicit == NULL) {
4030 implicit = PyInt_FromLong(1);
4031 if (implicit == NULL)
4032 return -1;
4033 }
4034 v = NULL;
4035
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004036 varnames = PyDict_GetItem(st->st_varnames, st->st_cur_id);
4037 if (varnames == NULL) {
4038 varnames = PyList_New(0);
4039 if (varnames == NULL)
4040 return -1;
4041 } else
4042 Py_INCREF(varnames);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004043 c->c_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004044
4045 c->c_globals = PyDict_New();
4046 if (c->c_globals == NULL)
4047 goto fail;
4048 c->c_freevars = PyDict_New();
4049 if (c->c_freevars == NULL)
4050 goto fail;
4051 c->c_cellvars = PyDict_New();
4052 if (c->c_cellvars == NULL)
4053 goto fail;
4054
4055 nlocals = PyList_GET_SIZE(varnames);
4056 c->c_argcount = nlocals;
4057 nfrees = 0;
4058 ncells = 0;
4059 for (i = 0; i < nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004060 v = PyInt_FromLong(i);
4061 if (PyDict_SetItem(c->c_locals,
4062 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004063 goto fail;
4064 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004065 }
4066
4067 /* XXX The cases below define the rules for whether a name is
4068 local or global. The logic could probably be clearer. */
4069 pos = 0;
4070 while (PyDict_Next(st->st_cur, &pos, &name, &v)) {
4071 info = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004072
4073 if (info & DEF_FREE_GLOBAL)
4074 /* undo the original DEF_FREE */
4075 info &= ~(DEF_FREE | DEF_FREE_CLASS);
4076
4077
4078 /* Seperate logic for DEF_FREE. If it occurs in a
4079 function, it indicates a local that we must
4080 allocate storage for (a cell var). If it occurs in
4081 a class, then the class has a method and a free
4082 variable with the same name.
4083 */
4084
4085 if ((info & (DEF_FREE | DEF_FREE_CLASS))
4086 && (info & (DEF_LOCAL | DEF_PARAM))) {
4087 PyObject *dict;
4088 if (st->st_cur_type == TYPE_FUNCTION) {
4089 v = PyInt_FromLong(ncells++);
4090 dict = c->c_cellvars;
4091 } else {
4092 v = PyInt_FromLong(nfrees++);
4093 dict = c->c_freevars;
4094 }
4095 if (v == NULL)
4096 return -1;
4097 if (PyDict_SetItem(dict, name, v) < 0)
4098 goto fail;
4099 Py_DECREF(v);
4100 }
4101
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004102 if (info & DEF_STAR) {
4103 c->c_argcount--;
4104 c->c_flags |= CO_VARARGS;
4105 } else if (info & DEF_DOUBLESTAR) {
4106 c->c_argcount--;
4107 c->c_flags |= CO_VARKEYWORDS;
4108 } else if (info & DEF_INTUPLE)
4109 c->c_argcount--;
4110 else if (info & DEF_GLOBAL) {
4111 if ((info & DEF_PARAM)
4112 && (PyString_AS_STRING(name)[0] != '.')){
4113 char buf[500];
4114 sprintf(buf,
4115 "name '%.400s' is local and global",
4116 PyString_AS_STRING(name));
4117 com_error(c, PyExc_SyntaxError, buf);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004118 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004119 }
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004120 if (info & DEF_IMPORT) {
4121 char buf[500];
4122 sprintf(buf, ILLEGAL_IMPORT_GLOBAL,
4123 PyString_AS_STRING(name));
4124 com_error(c, PyExc_SyntaxError, buf);
4125 goto fail;
4126 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004127 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4128 goto fail;
4129 } else if (info & DEF_FREE_GLOBAL) {
4130 if (PyDict_SetItem(c->c_globals, name, implicit) < 0)
4131 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004132 } else if ((info & DEF_LOCAL) && !(info & DEF_PARAM)) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004133 v = PyInt_FromLong(nlocals++);
4134 if (v == NULL)
4135 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004136 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004137 goto fail;
4138 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004139 if (st->st_cur_type != TYPE_CLASS)
4140 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004141 goto fail;
4142 } else if (is_free(info)) {
4143 if (st->st_nested) {
4144 v = PyInt_FromLong(nfrees++);
4145 if (v == NULL)
4146 goto fail;
4147 if (PyDict_SetItem(c->c_freevars,
4148 name, v) < 0)
4149 goto fail;
4150 Py_DECREF(v);
4151 } else {
4152 if (PyDict_SetItem(c->c_globals, name,
4153 implicit) < 0)
4154 goto fail;
4155 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004156 }
4157 }
4158
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004159 /* The cell vars are the first elements of the closure,
4160 followed by the free vars. Update the offsets in
4161 c_freevars to account for number of cellvars. */
4162 pos = 0;
4163 while (PyDict_Next(c->c_freevars, &pos, &name, &v)) {
4164 int i = PyInt_AS_LONG(v) + ncells;
4165 PyObject *o = PyInt_FromLong(i);
4166 if (PyDict_SetItem(c->c_freevars, name, o) < 0) {
4167 Py_DECREF(o);
4168 return -1;
4169 }
4170 Py_DECREF(o);
4171 }
4172
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004173 if (st->st_cur_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004174 c->c_nlocals = nlocals;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004175
4176 if (st->st_cur_type != TYPE_MODULE)
4177 c->c_flags |= CO_NEWLOCALS;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004178 if (st->st_cur_type == TYPE_FUNCTION) {
4179 if (PyDict_GetItemString(st->st_cur, NOOPT) == NULL)
4180 c->c_flags |= CO_OPTIMIZED;
4181 else if (ncells || nfrees) {
4182 char buf[256];
4183 /* XXX need better error message */
4184 sprintf(buf,
4185 "function %.100s: may not use lexical scoping"
4186 " and 'import *' or exec in same function",
4187 PyString_AS_STRING(st->st_cur_name));
4188 com_error(c, PyExc_SyntaxError, buf);
4189 return -1;
4190 }
4191 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004192 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004193
4194 fail:
4195 /* is this always the right thing to do? */
4196 Py_XDECREF(v);
4197 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004198}
4199
4200static struct symtable *
4201symtable_init()
4202{
4203 struct symtable *st;
4204 PyObject *d;
4205
4206 st = (struct symtable *)PyMem_Malloc(sizeof(struct symtable));
4207 if (st == NULL)
4208 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004209 st->st_pass = 1;
4210 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004211 goto fail;
4212 if ((st->st_symbols = PyDict_New()) == NULL)
4213 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004214 if ((st->st_children = PyDict_New()) == NULL)
4215 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004216 if ((st->st_varnames = PyDict_New()) == NULL)
4217 goto fail;
4218 if ((d = PyDict_New()) == NULL)
4219 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004220 if (PyDict_SetItemString(st->st_symbols, TOP, d) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004221 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004222 Py_DECREF(d);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004223 st->st_global = d;
4224 st->st_cur = NULL;
4225 st->st_cur_id = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004226 st->st_cur_name = NULL;
4227 st->st_cur_children = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004228 st->st_cur_type = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004229 st->st_nested = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004230 st->st_scopes = 0;
4231 st->st_errors = 0;
4232 st->st_tmpname = 0;
4233 st->st_private = NULL;
4234 return st;
4235 fail:
4236 symtable_free(st);
4237 return NULL;
4238}
4239
4240static void
4241symtable_free(struct symtable *st)
4242{
4243 Py_XDECREF(st->st_symbols);
4244 Py_XDECREF(st->st_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004245 Py_XDECREF(st->st_children);
4246 Py_XDECREF(st->st_stack);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004247 Py_XDECREF(st->st_cur_id);
Jeremy Hylton2fdfadf2001-01-29 22:42:28 +00004248 Py_XDECREF(st->st_cur_name);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004249 PyMem_Free((void *)st);
4250}
4251
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004252static PyObject *
4253make_scope_info(PyObject *id, PyObject *name, int nested, int type)
4254{
4255 PyObject *t, *i1 = NULL, *i2 = NULL;
4256
4257 t = PyTuple_New(4);
4258 if (t == NULL)
4259 return NULL;
4260 i1 = PyInt_FromLong(nested);
4261 if (i1 == NULL)
4262 goto fail;
4263 i2 = PyInt_FromLong(type);
4264 if (i2 == NULL)
4265 goto fail;
4266
4267 Py_INCREF(name);
4268 Py_INCREF(id);
4269 PyTuple_SET_ITEM(t, 0, name);
4270 PyTuple_SET_ITEM(t, 1, id);
4271 /* i1 & i2 alloced here; don't need incref */
4272 PyTuple_SET_ITEM(t, 2, i1);
4273 PyTuple_SET_ITEM(t, 3, i2);
4274 return t;
4275 fail:
4276 Py_XDECREF(t);
4277 Py_XDECREF(i1);
4278 Py_XDECREF(i2);
4279 return NULL;
4280}
4281
4282/* When the compiler exits a scope, it must should update the scope's
4283 free variable information with the list of free variables in its
4284 children.
4285
4286 Variables that are free in children and defined in the current
4287 scope are cellvars.
4288
4289 If the scope being exited is defined at the top-level (st_nested is
4290 false), free variables in children that are not defined here are
4291 implicit globals.
4292
4293*/
4294
4295static int
4296symtable_update_free_vars(struct symtable *st)
4297{
4298 PyObject *dict, *o, *child, *name;
4299 int i, def;
4300
4301 if (st->st_cur_type == TYPE_CLASS)
4302 def = DEF_FREE_CLASS;
4303 else
4304 def = DEF_FREE;
4305 for (i = 0; i < PyList_GET_SIZE(st->st_cur_children); ++i) {
4306 int pos = 0;
4307
4308 child = PyList_GET_ITEM(st->st_cur_children, i);
4309 dict = PyDict_GetItem(st->st_symbols, child);
4310 if (dict == NULL)
4311 return -1;
4312 while (PyDict_Next(dict, &pos, &name, &o)) {
4313 int v = PyInt_AS_LONG(o);
4314 if (!(is_free(v)))
4315 continue; /* avoids indentation */
4316 if (st->st_nested) {
4317 if (symtable_add_def_o(st, st->st_cur,
4318 name, def) < 0)
4319 return -1;
4320 } else {
4321 if (symtable_check_global(st, child,
4322 name) < 0)
4323 return -1;
4324 }
4325 }
4326 }
4327
4328 return 0;
4329}
4330
4331/* If the current scope is a non-nested class or if name is not
4332 defined in the current, non-nested scope, then it is an implicit
4333 global in all nested scopes.
4334*/
4335
4336static int
4337symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
4338{
4339 PyObject *o;
4340 int v;
4341
4342 if (st->st_cur_type == TYPE_CLASS)
4343 return symtable_undo_free(st, child, name);
4344 o = PyDict_GetItem(st->st_cur, name);
4345 if (o == NULL)
4346 return symtable_undo_free(st, child, name);
4347 v = PyInt_AS_LONG(o);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004348 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004349 return symtable_undo_free(st, child, name);
4350 else
4351 return symtable_add_def_o(st, st->st_cur, name, DEF_FREE);
4352}
4353
4354static int
4355symtable_undo_free(struct symtable *st, PyObject *id,
4356 PyObject *name)
4357{
4358 int i, v, x;
4359 PyObject *dict, *children, *info;
4360
4361 dict = PyDict_GetItem(st->st_symbols, id);
4362 if (dict == NULL)
4363 return -1;
4364 info = PyDict_GetItem(dict, name);
4365 if (info == NULL)
4366 return 0;
4367 v = PyInt_AS_LONG(info);
4368 if (is_free(v)) {
4369 if (symtable_add_def_o(st, dict, name,
4370 DEF_FREE_GLOBAL) < 0)
4371 return -1;
4372 } else
4373 /* If the name is defined here or declared global,
4374 then the recursion stops. */
4375 return 0;
4376
4377 children = PyDict_GetItem(st->st_children, id);
4378 for (i = 0; i < PyList_GET_SIZE(children); ++i) {
4379 x = symtable_undo_free(st, PyList_GET_ITEM(children, i),
4380 name);
4381 if (x < 0)
4382 return x;
4383 }
4384 return 0;
4385}
4386
4387
4388static int
4389symtable_exit_scope(struct symtable *st)
4390{
4391 PyObject *o;
4392 int end;
4393
4394 if (st->st_pass == 1)
4395 symtable_update_free_vars(st);
4396 if (st->st_cur_name) {
4397 Py_XDECREF(st->st_cur_name);
4398 Py_XDECREF(st->st_cur_id);
4399 }
4400 end = PyList_GET_SIZE(st->st_stack) - 1;
4401 o = PyList_GET_ITEM(st->st_stack, end);
4402 st->st_cur_name = PyTuple_GET_ITEM(o, 0);
4403 st->st_cur_id = PyTuple_GET_ITEM(o, 1);
4404 st->st_nested = PyInt_AS_LONG(PyTuple_GET_ITEM(o, 2));
4405 st->st_cur_type = PyInt_AS_LONG(PyTuple_GET_ITEM(o, 3));
4406 if (PySequence_DelItem(st->st_stack, end) < 0)
4407 return -1;
4408 return symtable_update_cur(st);
4409}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004410
4411static int
4412symtable_enter_scope(struct symtable *st, char *name, int type)
4413{
4414 PyObject *o;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004415
4416 if (st->st_cur) {
4417 /* push current scope info on stack */
4418 o = make_scope_info(st->st_cur_id, st->st_cur_name,
4419 st->st_nested, st->st_cur_type);
4420 if (o == NULL)
4421 return -1;
4422 if (PyList_Append(st->st_stack, o) < 0) {
4423 Py_DECREF(o);
4424 return -1;
4425 }
4426 Py_DECREF(o);
4427 }
4428 st->st_cur_name = PyString_FromString(name);
4429 if (st->st_nested || st->st_cur_type == TYPE_FUNCTION)
4430 st->st_nested = 1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004431 switch (type) {
4432 case funcdef:
4433 case lambdef:
4434 st->st_cur_type = TYPE_FUNCTION;
4435 break;
4436 case classdef:
4437 st->st_cur_type = TYPE_CLASS;
4438 break;
4439 case single_input:
4440 case eval_input:
4441 case file_input:
4442 st->st_cur_type = TYPE_MODULE;
4443 break;
4444 default:
4445 fprintf(stderr, "invalid symtable scope: %d\n", type);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004446 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004447 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004448 /* update st_cur_id and parent's st_cur_children */
4449 o = PyInt_FromLong(st->st_scopes++);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004450 if (o == NULL)
4451 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004452 if (st->st_cur_children) {
4453 if (PyList_Append(st->st_cur_children, o) < 0) {
4454 Py_DECREF(o);
4455 return -1;
4456 }
4457 }
4458 st->st_cur_id = o;
4459 /* create st_cur_children list */
4460 o = PyList_New(0);
4461 if (o == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004462 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004463 if (PyDict_SetItem(st->st_children, st->st_cur_id, o) < 0) {
4464 Py_DECREF(o);
4465 return -1;
4466 }
4467 Py_DECREF(o);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004468
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004469 return symtable_update_cur(st);
4470}
4471
4472static int
4473symtable_update_cur(struct symtable *st)
4474{
4475 PyObject *s, *d, *l;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004476
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004477 s = st->st_cur_id;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004478 d = PyDict_GetItem(st->st_symbols, s);
4479 if (d == NULL) {
4480 if ((d = PyDict_New()) == NULL)
4481 return -1;
4482 if (PyObject_SetItem(st->st_symbols, s, d) < 0) {
4483 Py_DECREF(d);
4484 return -1;
4485 }
4486 if (st->st_cur_type == TYPE_FUNCTION) {
4487 if ((l = PyList_New(0)) == NULL)
4488 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004489 if (PyDict_SetItem(st->st_varnames, s, l) < 0) {
4490 Py_DECREF(l);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004491 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004492 }
4493 Py_DECREF(l);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004494 }
4495 }
4496
4497 st->st_cur = d;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004498
4499 d = PyDict_GetItem(st->st_children, s);
4500 if (d == NULL)
4501 return -1;
4502 st->st_cur_children = d;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004503 return 0;
4504}
4505
4506static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004507symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004508{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004509 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004510 char buffer[MANGLE_LEN];
4511
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004512 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004513 name = buffer;
4514 if ((s = PyString_InternFromString(name)) == NULL)
4515 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004516 return symtable_add_def_o(st, st->st_cur, s, flag);
4517}
4518
4519/* Must only be called with mangled names */
4520
4521static int
4522symtable_add_def_o(struct symtable *st, PyObject *dict,
4523 PyObject *name, int flag)
4524{
4525 PyObject *o;
4526 int val;
4527
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004528 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004529 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004530 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004531 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004532 name);
4533 return -1;
4534 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004535 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004536 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004537 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004538 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004539 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004540 Py_DECREF(o);
4541 return -1;
4542 }
4543 Py_DECREF(o);
4544
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004545 if (flag & DEF_PARAM) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004546 PyObject *l = PyDict_GetItem(st->st_varnames,
4547 st->st_cur_id);
4548 if (l == NULL)
4549 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004550 if (PyList_Append(l, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004551 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004552 } else if (flag & DEF_GLOBAL) {
4553 /* XXX need to update DEF_GLOBAL for other flags too;
4554 perhaps only DEF_FREE_GLOBAL */
4555 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004556 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004557 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004558 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004559 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004560 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004561 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004562 Py_DECREF(o);
4563 return -1;
4564 }
4565 Py_DECREF(o);
4566 }
4567 return 0;
4568}
4569
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004570#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004571
4572static void
4573symtable_node(struct symtable *st, node *n)
4574{
4575 int i, start = 0;
4576
4577 loop:
4578 switch (TYPE(n)) {
4579 case funcdef: {
4580 char *func_name = STR(CHILD(n, 1));
4581 symtable_add_def(st, func_name, DEF_LOCAL);
4582 symtable_default_args(st, CHILD(n, 2));
4583 symtable_enter_scope(st, func_name, TYPE(n));
4584 symtable_funcdef(st, n);
4585 symtable_exit_scope(st);
4586 break;
4587 }
4588 case lambdef:
4589 if (NCH(n) == 4)
4590 symtable_default_args(st, CHILD(n, 1));
4591 symtable_enter_scope(st, "lambda", TYPE(n));
4592 symtable_funcdef(st, n);
4593 symtable_exit_scope(st);
4594 break;
4595 case classdef: {
4596 char *tmp, *class_name = STR(CHILD(n, 1));
4597 symtable_add_def(st, class_name, DEF_LOCAL);
4598 if (TYPE(CHILD(n, 2)) == LPAR) {
4599 node *bases = CHILD(n, 3);
4600 int i;
4601 for (i = 0; i < NCH(bases); i += 2) {
4602 symtable_node(st, CHILD(bases, i));
4603 }
4604 }
4605 symtable_enter_scope(st, class_name, TYPE(n));
4606 tmp = st->st_private;
4607 st->st_private = class_name;
4608 symtable_node(st, CHILD(n, NCH(n) - 1));
4609 st->st_private = tmp;
4610 symtable_exit_scope(st);
4611 break;
4612 }
4613 case if_stmt:
4614 for (i = 0; i + 3 < NCH(n); i += 4) {
4615 if (is_constant_false(NULL, (CHILD(n, i + 1))))
4616 continue;
4617 symtable_node(st, CHILD(n, i + 1));
4618 symtable_node(st, CHILD(n, i + 3));
4619 }
4620 if (i + 2 < NCH(n))
4621 symtable_node(st, CHILD(n, i + 2));
4622 break;
4623 case global_stmt:
4624 symtable_global(st, n);
4625 break;
4626 case import_stmt:
4627 symtable_import(st, n);
4628 break;
4629 case exec_stmt:
4630 if (PyDict_SetItemString(st->st_cur, NOOPT, Py_None) < 0)
4631 st->st_errors++;
4632 symtable_node(st, CHILD(n, 1));
4633 if (NCH(n) > 2)
4634 symtable_node(st, CHILD(n, 3));
4635 if (NCH(n) > 4)
4636 symtable_node(st, CHILD(n, 5));
4637 break;
4638 case except_clause:
4639 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004640 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004641 if (NCH(n) > 1) {
4642 n = CHILD(n, 1);
4643 goto loop;
4644 }
4645 break;
4646 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004647 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004648 break;
4649 case expr_stmt:
4650 if (NCH(n) == 1)
4651 n = CHILD(n, 0);
4652 else {
4653 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004654 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004655 symtable_node(st, CHILD(n, 2));
4656 break;
4657 } else {
4658 int i;
4659 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004660 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004661 n = CHILD(n, NCH(n) - 1);
4662 }
4663 }
4664 goto loop;
4665 /* watchout for fall-through logic below */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004666 case argument:
4667 if (NCH(n) == 3) {
4668 n = CHILD(n, 2);
4669 goto loop;
4670 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004671 case listmaker:
4672 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
4673 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton5f827f42001-01-23 01:26:20 +00004674 n = CHILD(n, 0);
4675 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004676 }
4677 case atom:
4678 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
4679 symtable_add_use(st, STR(CHILD(n, 0)));
4680 break;
4681 }
4682 case for_stmt:
4683 if (TYPE(n) == for_stmt) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004684 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004685 start = 3;
4686 }
4687 default:
4688 if (NCH(n) == 1) {
4689 n = CHILD(n, 0);
4690 goto loop;
4691 }
4692 for (i = start; i < NCH(n); ++i)
4693 if (TYPE(CHILD(n, i)) >= single_input)
4694 symtable_node(st, CHILD(n, i));
4695 }
4696}
4697
4698static void
4699symtable_funcdef(struct symtable *st, node *n)
4700{
4701 node *body;
4702
4703 if (TYPE(n) == lambdef) {
4704 if (NCH(n) == 4)
4705 symtable_params(st, CHILD(n, 1));
4706 } else
4707 symtable_params(st, CHILD(n, 2));
4708 body = CHILD(n, NCH(n) - 1);
4709 symtable_node(st, body);
4710}
4711
4712/* The next two functions parse the argument tuple.
4713 symtable_default_arg() checks for names in the default arguments,
4714 which are references in the defining scope. symtable_params()
4715 parses the parameter names, which are defined in the function's
4716 body.
4717
4718 varargslist:
4719 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
4720 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
4721*/
4722
4723static void
4724symtable_default_args(struct symtable *st, node *n)
4725{
4726 node *c;
4727 int i;
4728
4729 if (TYPE(n) == parameters) {
4730 n = CHILD(n, 1);
4731 if (TYPE(n) == RPAR)
4732 return;
4733 }
4734 REQ(n, varargslist);
4735 for (i = 0; i < NCH(n); i += 2) {
4736 c = CHILD(n, i);
4737 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
4738 break;
4739 }
4740 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
4741 symtable_node(st, CHILD(n, i));
4742 }
4743}
4744
4745static void
4746symtable_params(struct symtable *st, node *n)
4747{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004748 int i, complex = -1, ext = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004749 node *c = NULL;
4750
4751 if (TYPE(n) == parameters) {
4752 n = CHILD(n, 1);
4753 if (TYPE(n) == RPAR)
4754 return;
4755 }
4756 REQ(n, varargslist);
4757 for (i = 0; i < NCH(n); i += 2) {
4758 c = CHILD(n, i);
4759 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
4760 ext = 1;
4761 break;
4762 }
4763 if (TYPE(c) == test) {
4764 continue;
4765 }
4766 if (TYPE(CHILD(c, 0)) == NAME)
4767 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
4768 else {
4769 char nbuf[10];
4770 sprintf(nbuf, ".%d", i);
4771 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004772 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004773 }
4774 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004775 if (ext) {
4776 c = CHILD(n, i);
4777 if (TYPE(c) == STAR) {
4778 i++;
4779 symtable_add_def(st, STR(CHILD(n, i)),
4780 DEF_PARAM | DEF_STAR);
4781 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00004782 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004783 c = NULL;
4784 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004785 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004786 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004787 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004788 i++;
4789 symtable_add_def(st, STR(CHILD(n, i)),
4790 DEF_PARAM | DEF_DOUBLESTAR);
4791 }
4792 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004793 if (complex >= 0) {
4794 int j;
4795 for (j = 0; j <= complex; j++) {
4796 c = CHILD(n, j);
4797 if (TYPE(c) == COMMA)
4798 c = CHILD(n, ++j);
4799 if (TYPE(CHILD(c, 0)) == LPAR)
4800 symtable_params_fplist(st, CHILD(c, 1));
4801 }
4802 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004803}
4804
4805static void
4806symtable_params_fplist(struct symtable *st, node *n)
4807{
4808 int i;
4809 node *c;
4810
4811 REQ(n, fplist);
4812 for (i = 0; i < NCH(n); i += 2) {
4813 c = CHILD(n, i);
4814 REQ(c, fpdef);
4815 if (NCH(c) == 1)
4816 symtable_add_def(st, STR(CHILD(c, 0)),
4817 DEF_PARAM | DEF_INTUPLE);
4818 else
4819 symtable_params_fplist(st, CHILD(c, 1));
4820 }
4821
4822}
4823
4824static void
4825symtable_global(struct symtable *st, node *n)
4826{
4827 int i;
4828
4829 for (i = 1; i < NCH(n); i += 2)
4830 symtable_add_def(st, STR(CHILD(n, i)), DEF_GLOBAL);
4831}
4832
4833static void
4834symtable_list_comprehension(struct symtable *st, node *n)
4835{
4836 char tmpname[12];
4837
4838 sprintf(tmpname, "[%d]", ++st->st_tmpname);
4839 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004840 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004841 symtable_node(st, CHILD(n, 3));
4842 if (NCH(n) == 5)
4843 symtable_node(st, CHILD(n, 4));
4844 --st->st_tmpname;
4845}
4846
4847static void
4848symtable_import(struct symtable *st, node *n)
4849{
4850 int i;
4851 /*
4852 import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
4853 | 'from' dotted_name 'import'
4854 ('*' | import_as_name (',' import_as_name)*)
4855 import_as_name: NAME [NAME NAME]
4856 */
4857
4858 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
4859 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004860 if (st->st_cur_type != TYPE_MODULE) {
4861 PyErr_SetString(PyExc_SyntaxError,
4862 ILLEGAL_IMPORT_STAR);
4863 st->st_errors++;
4864 return;
4865 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004866 if (PyDict_SetItemString(st->st_cur, NOOPT,
4867 Py_None) < 0)
4868 st->st_errors++;
4869 } else {
4870 for (i = 3; i < NCH(n); i += 2) {
4871 node *c = CHILD(n, i);
4872 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004873 symtable_assign(st, CHILD(c, 2),
4874 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004875 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004876 symtable_assign(st, CHILD(c, 0),
4877 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004878 }
4879 }
4880 } else {
4881 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004882 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004883 }
4884 }
4885}
4886
4887static void
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004888symtable_assign(struct symtable *st, node *n, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004889{
4890 node *tmp;
4891 int i;
4892
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004893 loop:
4894 switch (TYPE(n)) {
4895 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004896 /* invalid assignment, e.g. lambda x:x=2. The next
4897 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004898 return;
4899 case power:
4900 if (NCH(n) > 2) {
4901 for (i = 2; i < NCH(n); ++i)
4902 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
4903 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004904 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004905 if (NCH(n) > 1) {
4906 symtable_node(st, CHILD(n, 0));
4907 symtable_node(st, CHILD(n, 1));
4908 } else {
4909 n = CHILD(n, 0);
4910 goto loop;
4911 }
4912 return;
4913 case listmaker:
4914 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
4915 symtable_list_comprehension(st, CHILD(n, 1));
4916 else {
4917 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004918 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004919 }
4920 return;
4921 case exprlist:
4922 case testlist:
4923 if (NCH(n) == 1) {
4924 n = CHILD(n, 0);
4925 goto loop;
4926 }
4927 else {
4928 int i;
4929 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004930 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004931 return;
4932 }
4933 goto loop;
4934 case atom:
4935 tmp = CHILD(n, 0);
4936 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
4937 n = CHILD(n, 1);
4938 goto loop;
4939 } else if (TYPE(tmp) == NAME)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004940 symtable_add_def(st, STR(tmp), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004941 return;
4942 case dotted_as_name:
4943 if (NCH(n) == 3)
4944 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004945 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004946 else
4947 symtable_add_def(st,
4948 STR(CHILD(CHILD(n,
4949 0), 0)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004950 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004951 return;
4952 case dotted_name:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004953 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004954 return;
4955 case NAME:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004956 symtable_add_def(st, STR(n), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004957 return;
4958 default:
4959 if (NCH(n) == 0)
4960 return;
4961 if (NCH(n) != 1) {
4962 DUMP(n);
4963 Py_FatalError("too many children in default case\n");
4964 }
4965 n = CHILD(n, 0);
4966 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004967 }
4968}