blob: 100e9101407efe64110461cf1c6b226d7ac56e08 [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 \
61"can not delete variable '%s' referenced in nested scope"
Jeremy Hyltone36f7782001-01-19 03:21:30 +000062
63#define MANGLE_LEN 256
64
Guido van Rossum79f25d91997-04-29 20:08:16 +000065#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000066
67static struct memberlist code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000068 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
69 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000070 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000071 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000072 {"co_code", T_OBJECT, OFF(co_code), READONLY},
73 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
74 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000075 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Jeremy Hylton64949cb2001-01-25 20:06:59 +000076 {"co_freevars", T_OBJECT, OFF(co_freevars), READONLY},
77 {"co_cellvars", T_OBJECT, OFF(co_cellvars), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000078 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000079 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000080 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
81 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000082 {NULL} /* Sentinel */
83};
84
Guido van Rossum79f25d91997-04-29 20:08:16 +000085static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000086code_getattr(PyCodeObject *co, char *name)
Guido van Rossum3f5da241990-12-20 15:06:42 +000087{
Guido van Rossum79f25d91997-04-29 20:08:16 +000088 return PyMember_Get((char *)co, code_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +000089}
Guido van Rossum10dc2e81990-11-18 17:27:39 +000090
91static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000092code_dealloc(PyCodeObject *co)
Guido van Rossum10dc2e81990-11-18 17:27:39 +000093{
Guido van Rossum79f25d91997-04-29 20:08:16 +000094 Py_XDECREF(co->co_code);
95 Py_XDECREF(co->co_consts);
96 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +000097 Py_XDECREF(co->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +000098 Py_XDECREF(co->co_freevars);
99 Py_XDECREF(co->co_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000100 Py_XDECREF(co->co_filename);
101 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +0000102 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000103 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000104}
105
Guido van Rossum79f25d91997-04-29 20:08:16 +0000106static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000107code_repr(PyCodeObject *co)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000108{
109 char buf[500];
110 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000111 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000112 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000113
Guido van Rossuma396a882000-04-07 01:21:36 +0000114 if (co->co_firstlineno != 0)
115 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000116 if (co->co_filename && PyString_Check(co->co_filename))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000117 filename = PyString_AS_STRING(co->co_filename);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000118 if (co->co_name && PyString_Check(co->co_name))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000119 name = PyString_AS_STRING(co->co_name);
Fred Drake615ae552000-06-30 16:20:13 +0000120 sprintf(buf, "<code object %.100s at %p, file \"%.300s\", line %d>",
121 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000122 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000123}
124
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000125static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000126code_compare(PyCodeObject *co, PyCodeObject *cp)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000127{
128 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000129 cmp = PyObject_Compare(co->co_name, cp->co_name);
130 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000131 cmp = co->co_argcount - cp->co_argcount;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000132 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000133 cmp = co->co_nlocals - cp->co_nlocals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000134 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000135 cmp = co->co_flags - cp->co_flags;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000136 if (cmp) return cmp;
Guido van Rossumd076c731998-10-07 19:42:25 +0000137 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000138 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000139 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000140 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000141 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000142 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000143 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000144 if (cmp) return cmp;
145 cmp = PyObject_Compare(co->co_freevars, cp->co_freevars);
146 if (cmp) return cmp;
147 cmp = PyObject_Compare(co->co_cellvars, cp->co_cellvars);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000148 return cmp;
149}
150
151static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000152code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000153{
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000154 long h, h0, h1, h2, h3, h4, h5, h6;
Guido van Rossum44679592000-04-10 16:20:31 +0000155 h0 = PyObject_Hash(co->co_name);
156 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000157 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000158 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000159 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000160 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000161 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000162 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000163 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000164 if (h4 == -1) return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000165 h5 = PyObject_Hash(co->co_freevars);
166 if (h5 == -1) return -1;
167 h6 = PyObject_Hash(co->co_cellvars);
168 if (h6 == -1) return -1;
169 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^ h5 ^ h6 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000170 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000171 if (h == -1) h = -2;
172 return h;
173}
174
Guido van Rossum79f25d91997-04-29 20:08:16 +0000175PyTypeObject PyCode_Type = {
176 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000177 0,
178 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000179 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000180 0,
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000181 (destructor)code_dealloc, /*tp_dealloc*/
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000182 0, /*tp_print*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000183 (getattrfunc)code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000184 0, /*tp_setattr*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000185 (cmpfunc)code_compare, /*tp_compare*/
186 (reprfunc)code_repr, /*tp_repr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000187 0, /*tp_as_number*/
188 0, /*tp_as_sequence*/
189 0, /*tp_as_mapping*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000190 (hashfunc)code_hash, /*tp_hash*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000191};
192
Guido van Rossum644a12b1997-04-09 19:24:53 +0000193#define NAME_CHARS \
194 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
195
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000196/* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
197
198static int
199all_name_chars(unsigned char *s)
200{
201 static char ok_name_char[256];
Tim Peters7f3e4ad2001-01-20 05:15:26 +0000202 static unsigned char *name_chars = (unsigned char *)NAME_CHARS;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000203
204 if (ok_name_char[*name_chars] == 0) {
205 unsigned char *p;
206 for (p = name_chars; *p; p++)
207 ok_name_char[*p] = 1;
208 }
209 while (*s) {
210 if (ok_name_char[*s++] == 0)
211 return 0;
212 }
213 return 1;
214}
215
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000216static int
217intern_strings(PyObject *tuple)
218{
219 int i;
220
221 for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) {
222 PyObject *v = PyTuple_GET_ITEM(tuple, i);
223 if (v == NULL || !PyString_Check(v)) {
224 Py_FatalError("non-string found in code slot");
225 PyErr_BadInternalCall();
226 return -1;
227 }
228 PyString_InternInPlace(&PyTuple_GET_ITEM(tuple, i));
229 }
230 return 0;
231}
232
Guido van Rossum79f25d91997-04-29 20:08:16 +0000233PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000234PyCode_New(int argcount, int nlocals, int stacksize, int flags,
235 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000236 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
237 PyObject *filename, PyObject *name, int firstlineno,
238 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000239{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000240 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000241 int i;
Guido van Rossumd076c731998-10-07 19:42:25 +0000242 PyBufferProcs *pb;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000243 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000244 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000245 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000246 consts == NULL || !PyTuple_Check(consts) ||
247 names == NULL || !PyTuple_Check(names) ||
248 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000249 freevars == NULL || !PyTuple_Check(freevars) ||
250 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000251 name == NULL || !PyString_Check(name) ||
252 filename == NULL || !PyString_Check(filename) ||
253 lnotab == NULL || !PyString_Check(lnotab)) {
254 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000255 return NULL;
256 }
Guido van Rossumd076c731998-10-07 19:42:25 +0000257 pb = code->ob_type->tp_as_buffer;
258 if (pb == NULL ||
259 pb->bf_getreadbuffer == NULL ||
260 pb->bf_getsegcount == NULL ||
261 (*pb->bf_getsegcount)(code, NULL) != 1)
262 {
263 PyErr_BadInternalCall();
264 return NULL;
265 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000266 intern_strings(names);
267 intern_strings(varnames);
268 if (freevars == NULL)
269 freevars = PyTuple_New(0);
270 intern_strings(freevars);
271 if (cellvars == NULL)
272 cellvars = PyTuple_New(0);
273 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000274 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000275 for (i = PyTuple_Size(consts); --i >= 0; ) {
276 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000277 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000278 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000279 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000280 continue;
281 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000282 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000283 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000284 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000285 co->co_argcount = argcount;
286 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000287 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000288 co->co_flags = flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000289 Py_INCREF(code);
Guido van Rossumd076c731998-10-07 19:42:25 +0000290 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000291 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000292 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000293 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000294 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000295 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000296 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000297 Py_INCREF(freevars);
298 co->co_freevars = freevars;
299 Py_INCREF(cellvars);
300 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000301 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000302 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000303 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000304 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000305 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000306 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000307 co->co_lnotab = lnotab;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000308/* PyObject_Print((PyObject *)co, stderr, 0); */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000309 }
310 return co;
311}
312
313
314/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000315
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000316/* The compiler uses two passes to generate bytecodes. The first pass
317 builds the symbol table. The second pass generates the bytecode.
318
319 The first pass uses a single symtable struct. The second pass uses
320 a compiling struct for each code block. The compiling structs
321 share a reference to the symtable.
322
323 The two passes communicate via symtable_load_symbols() and via
324 is_local() and is_global(). The former initializes several slots
325 in the compiling struct: c_varnames, c_locals, c_nlocals,
326 c_argcount, c_globals, and c_flags.
327*/
328
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000329struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000330 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000331 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000332 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000333 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000334 PyObject *c_name_dict; /* inverse of c_names */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000335 PyObject *c_globals; /* dictionary (value=None) */
336 PyObject *c_locals; /* dictionary (value=localID) */
337 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000338 PyObject *c_freevars; /* dictionary (value=None) */
339 PyObject *c_cellvars; /* list */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000340 int c_nlocals; /* index of next local */
341 int c_argcount; /* number of top-level arguments */
342 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000343 int c_nexti; /* index into c_code */
344 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000345 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000346 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000347 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000348 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000349 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000350 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000351 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000352 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000353 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000354 int c_stacklevel; /* Current stack level */
355 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000356 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000357 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000358 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000359 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000360 int c_tmpname; /* temporary local name counter */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000361 int c_nested; /* Is block nested funcdef or lamdef? */
362 int c_closure; /* Is nested w/freevars? */
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000363 struct symtable *c_symtable; /* pointer to module symbol table */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000364};
365
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000366/* A symbol table is constructed each time PyNode_Compile() is
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000367 called. The table walks the entire parse tree and identifies each
368 use or definition of a variable.
369
370 The symbol table contains a dictionary for each code block in a
371 module: The symbol dictionary for the block. They keys of these
372 dictionaries are the name of all variables used or defined in the
373 block; the integer values are used to store several flags,
374 e.g. DEF_PARAM indicates that a variable is a parameter to a
375 function.
376
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000377 The slots st_cur_XXX pointers always refer to the current code
378 block. The st_cur slot is the symbol dictionary. The st_cur_id
379 slot is the id is the key in st_symbols. The st_cur_name slot is
380 the name of the current scope. The st_cur_type slot is one of
381 TYPE_FUNCTION, TYPE_CLASS, or TYPE_MODULE. The st_cur_children is
382 a list of the ids of the current node's children.
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000383
384 The st_symbols slot is a dictionary that maps code block ids to
385 symbol dictionaries. The keys are generated by a counter that is
386 incremented each time a new code block is found. The counter is
387 identifies a specific scope, because both passes walk the parse
388 tree in the same order.
389
390 The st_varnames slot is a dictionary that maps code block ids to
391 parameter lists. The st_global slot always refers to the symbol
392 dictionary for the module.
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000393
394 The st_children slot is a dictionary that maps ids to a list
395 containing the ids of its children.
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000396*/
397
398struct symtable {
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000399 int st_pass; /* pass == 1 or 2 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000400 PyObject *st_symbols; /* dictionary of symbol tables */
401 PyObject *st_varnames; /* dictionary of parameter lists */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000402 PyObject *st_stack; /* stack of namespace info */
403 PyObject *st_children; /* dictionary (id=[ids]) */
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000404 PyObject *st_cur; /* borrowed ref to dict in st_symbols */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000405 PyObject *st_cur_name; /* string, name of current scope */
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000406 PyObject *st_cur_id; /* int id of current code block */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000407 PyObject *st_cur_children; /* ref to current children list */
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000408 int st_cur_type; /* type of current scope */
409 PyObject *st_global; /* borrowed ref to MODULE in st_symbols */
410 int st_scopes; /* number of scopes */
411 int st_errors; /* number of errors */
412 char *st_private; /* name of current class or NULL */
413 int st_tmpname; /* temporary name counter */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000414 int st_nested; /* bool (true if nested scope) */
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000415};
416
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000417#define TOP "global"
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000418#define NOOPT ".noopt"
419
420/* Flags for def-use information */
421
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000422#define DEF_GLOBAL 1 /* global stmt */
423#define DEF_LOCAL 2 /* assignment in code block */
424#define DEF_PARAM 2<<1 /* formal parameter */
425#define USE 2<<2 /* name is used */
426#define DEF_STAR 2<<3 /* parameter is star arg */
427#define DEF_DOUBLESTAR 2<<4 /* parameter is star-star arg */
428#define DEF_INTUPLE 2<<5 /* name defined in tuple in parameters */
429#define DEF_FREE 2<<6 /* name used by not defined in nested scope */
430#define DEF_FREE_GLOBAL 2<<7 /* free variable is actually implicit global */
431#define DEF_FREE_CLASS 2<<8 /* free variable from class's method */
432
433int is_free(int v)
434{
435 if ((v & (USE | DEF_FREE))
436 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
437 return 1;
438 if (v & DEF_FREE_CLASS)
439 return 1;
440 return 0;
441}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000442
Guido van Rossum452a9831996-09-17 14:32:04 +0000443/* Error message including line number */
444
445static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000446com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000447{
Fred Drakedcf08e02000-08-15 15:49:44 +0000448 PyObject *v, *tb, *tmp;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000449 if (c == NULL) {
450 /* Error occurred via symtable call to
451 is_constant_false */
452 PyErr_SetString(exc, msg);
453 return;
454 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000455 c->c_errors++;
Guido van Rossum452a9831996-09-17 14:32:04 +0000456 if (c->c_lineno <= 1) {
457 /* Unknown line number or single interactive command */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000458 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000459 return;
460 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000461 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000462 if (v == NULL)
463 return; /* MemoryError, too bad */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000464 PyErr_SetObject(exc, v);
465 Py_DECREF(v);
Fred Drakedcf08e02000-08-15 15:49:44 +0000466
467 /* add attributes for the line number and filename for the error */
468 PyErr_Fetch(&exc, &v, &tb);
469 PyErr_NormalizeException(&exc, &v, &tb);
470 tmp = PyInt_FromLong(c->c_lineno);
471 if (tmp == NULL)
472 PyErr_Clear();
473 else {
474 if (PyObject_SetAttrString(v, "lineno", tmp))
475 PyErr_Clear();
476 Py_DECREF(tmp);
477 }
478 if (c->c_filename != NULL) {
479 tmp = PyString_FromString(c->c_filename);
480 if (tmp == NULL)
481 PyErr_Clear();
482 else {
483 if (PyObject_SetAttrString(v, "filename", tmp))
484 PyErr_Clear();
485 Py_DECREF(tmp);
486 }
487 }
488 PyErr_Restore(exc, v, tb);
Guido van Rossum452a9831996-09-17 14:32:04 +0000489}
490
491
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000492/* Interface to the block stack */
493
494static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000495block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000496{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000497 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000498 com_error(c, PyExc_SystemError,
499 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000500 }
501 else {
502 c->c_block[c->c_nblocks++] = type;
503 }
504}
505
506static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000507block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000508{
509 if (c->c_nblocks > 0)
510 c->c_nblocks--;
511 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000512 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000513 }
514}
515
516
Guido van Rossum681d79a1995-07-18 14:51:37 +0000517/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000518
Tim Petersdbd9ba62000-07-09 03:09:57 +0000519static int com_init(struct compiling *, char *);
520static void com_free(struct compiling *);
521static void com_push(struct compiling *, int);
522static void com_pop(struct compiling *, int);
523static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000524static void com_node(struct compiling *, node *);
525static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000526static void com_addbyte(struct compiling *, int);
527static void com_addint(struct compiling *, int);
528static void com_addoparg(struct compiling *, int, int);
529static void com_addfwref(struct compiling *, int, int *);
530static void com_backpatch(struct compiling *, int);
531static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
532static int com_addconst(struct compiling *, PyObject *);
533static int com_addname(struct compiling *, PyObject *);
534static void com_addopname(struct compiling *, int, node *);
535static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000536static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000537static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000538static void com_assign(struct compiling *, node *, int, node *);
539static void com_assign_name(struct compiling *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000540static PyCodeObject *icompile(node *, struct compiling *);
541static PyCodeObject *jcompile(node *, char *, struct compiling *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000542static PyObject *parsestrplus(node *);
543static PyObject *parsestr(char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000544static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000545
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000546static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000547
548/* symtable operations */
549static int symtable_build(struct compiling *, node *);
550static int symtable_load_symbols(struct compiling *);
551static struct symtable *symtable_init(void);
552static void symtable_free(struct symtable *);
553static int symtable_enter_scope(struct symtable *, char *, int);
554static int symtable_exit_scope(struct symtable *);
555static int symtable_update_cur(struct symtable *);
556static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000557static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000558
559static void symtable_node(struct symtable *, node *);
560static void symtable_funcdef(struct symtable *, node *);
561static void symtable_default_args(struct symtable *, node *);
562static void symtable_params(struct symtable *, node *);
563static void symtable_params_fplist(struct symtable *, node *n);
564static void symtable_global(struct symtable *, node *);
565static void symtable_import(struct symtable *, node *);
566static void symtable_assign(struct symtable *, node *);
567static void symtable_list_comprehension(struct symtable *, node *);
568
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000569static int symtable_update_free_vars(struct symtable *);
570static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
571static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
572
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000573/* helper */
574static void
575do_pad(int pad)
576{
577 int i;
578 for (i = 0; i < pad; ++i)
579 fprintf(stderr, " ");
580}
581
582static void
583dump(node *n, int pad, int depth)
584{
585 int i;
586 if (depth == 0)
587 return;
588 do_pad(pad);
589 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
590 if (depth > 0)
591 depth--;
592 for (i = 0; i < NCH(n); ++i)
593 dump(CHILD(n, i), pad + 1, depth);
594}
595
596#define DUMP(N) dump(N, 0, -1)
597
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000598static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000599com_init(struct compiling *c, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000600{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000601 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000602 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
603 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000604 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000605 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000606 goto fail;
607 if ((c->c_const_dict = PyDict_New()) == NULL)
608 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000609 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000610 goto fail;
611 if ((c->c_name_dict = PyDict_New()) == NULL)
612 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000613 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000614 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000615 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
616 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000617 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000618 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000619 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000620 c->c_freevars = NULL;
621 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000622 c->c_nlocals = 0;
623 c->c_argcount = 0;
624 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000625 c->c_nexti = 0;
626 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000627 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000628 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000629 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000630 c->c_begin = 0;
631 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000632 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000633 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000634 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000635 c->c_stacklevel = 0;
636 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000637 c->c_firstlineno = 0;
638 c->c_last_addr = 0;
639 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000640 c->c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000641 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000642 c->c_nested = 0;
643 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000644 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000645 return 1;
646
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000647 fail:
648 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000649 return 0;
650}
651
652static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000653com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000654{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000655 Py_XDECREF(c->c_code);
656 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000657 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000658 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000659 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000660 Py_XDECREF(c->c_globals);
661 Py_XDECREF(c->c_locals);
662 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000663 Py_XDECREF(c->c_freevars);
664 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000665 Py_XDECREF(c->c_lnotab);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000666}
667
668static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000669com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000670{
671 c->c_stacklevel += n;
672 if (c->c_stacklevel > c->c_maxstacklevel)
673 c->c_maxstacklevel = c->c_stacklevel;
674}
675
676static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000677com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000678{
679 if (c->c_stacklevel < n) {
Guido van Rossum90f827c1998-08-25 18:22:17 +0000680 /* fprintf(stderr,
Guido van Rossum8b993a91997-01-17 21:04:03 +0000681 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
682 c->c_filename, c->c_lineno,
Guido van Rossum90f827c1998-08-25 18:22:17 +0000683 c->c_nexti, c->c_stacklevel, n); */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000684 c->c_stacklevel = 0;
685 }
686 else
687 c->c_stacklevel -= n;
688}
689
690static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000691com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000692{
693 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000694 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000695 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000696 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000697}
698
699static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000700com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000701{
702 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000703 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000704 assert(byte >= 0 && byte <= 255);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000705 if (byte < 0 || byte > 255) {
Guido van Rossum01cfd441991-10-20 20:12:38 +0000706 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000707 fprintf(stderr, "XXX compiling bad byte: %d\n", byte);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000708 fatal("com_addbyte: byte out of range");
Guido van Rossum01cfd441991-10-20 20:12:38 +0000709 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000710 com_error(c, PyExc_SystemError,
711 "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000712 }
713 if (c->c_code == NULL)
714 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000715 len = PyString_Size(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000716 if (c->c_nexti >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000717 if (_PyString_Resize(&c->c_code, len+1000) != 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000718 c->c_errors++;
719 return;
720 }
721 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000722 PyString_AsString(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000723}
724
725static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000726com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000727{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000728 com_addbyte(c, x & 0xff);
729 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000730}
731
732static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000733com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000734{
735 int size;
736 char *p;
737 if (c->c_lnotab == NULL)
738 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000739 size = PyString_Size(c->c_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000740 if (c->c_lnotab_next+2 > size) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000741 if (_PyString_Resize(&c->c_lnotab, size + 1000) < 0) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000742 c->c_errors++;
743 return;
744 }
745 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000746 p = PyString_AsString(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000747 *p++ = addr;
748 *p++ = line;
749 c->c_lnotab_next += 2;
750}
751
752static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000753com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000754{
755 c->c_lineno = lineno;
756 if (c->c_firstlineno == 0) {
757 c->c_firstlineno = c->c_last_line = lineno;
758 }
759 else {
760 int incr_addr = c->c_nexti - c->c_last_addr;
761 int incr_line = lineno - c->c_last_line;
762 while (incr_addr > 0 || incr_line > 0) {
763 int trunc_addr = incr_addr;
764 int trunc_line = incr_line;
765 if (trunc_addr > 255)
766 trunc_addr = 255;
767 if (trunc_line > 255)
768 trunc_line = 255;
769 com_add_lnotab(c, trunc_addr, trunc_line);
770 incr_addr -= trunc_addr;
771 incr_line -= trunc_line;
772 }
773 c->c_last_addr = c->c_nexti;
774 c->c_last_line = lineno;
775 }
776}
777
778static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000779com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000780{
Fred Drakeef8ace32000-08-24 00:32:09 +0000781 int extended_arg = arg >> 16;
Guido van Rossum8e793d91997-03-03 19:13:14 +0000782 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000783 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000784 if (Py_OptimizeFlag)
785 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000786 }
Fred Drakeef8ace32000-08-24 00:32:09 +0000787 if (extended_arg){
788 com_addbyte(c, EXTENDED_ARG);
789 com_addint(c, extended_arg);
790 arg &= 0xffff;
791 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000792 com_addbyte(c, op);
793 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000794}
795
796static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000797com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000798{
799 /* Compile a forward reference for backpatching */
800 int here;
801 int anchor;
802 com_addbyte(c, op);
803 here = c->c_nexti;
804 anchor = *p_anchor;
805 *p_anchor = here;
806 com_addint(c, anchor == 0 ? 0 : here - anchor);
807}
808
809static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000810com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000811{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000812 unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000813 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000814 int dist;
815 int prev;
816 for (;;) {
817 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000818 prev = code[anchor] + (code[anchor+1] << 8);
819 dist = target - (anchor+2);
820 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +0000821 dist >>= 8;
822 code[anchor+1] = dist;
823 dist >>= 8;
824 if (dist) {
825 com_error(c, PyExc_SystemError,
826 "com_backpatch: offset too large");
827 break;
828 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000829 if (!prev)
830 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000831 anchor -= prev;
832 }
833}
834
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000835/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000836
837static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000838com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000839{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000840 PyObject *w, *t, *np=NULL;
841 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000842
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000843 t = Py_BuildValue("(OO)", v, v->ob_type);
844 if (t == NULL)
845 goto fail;
846 w = PyDict_GetItem(dict, t);
847 if (w != NULL) {
848 n = PyInt_AsLong(w);
849 } else {
850 n = PyList_Size(list);
851 np = PyInt_FromLong(n);
852 if (np == NULL)
853 goto fail;
854 if (PyList_Append(list, v) != 0)
855 goto fail;
856 if (PyDict_SetItem(dict, t, np) != 0)
857 goto fail;
858 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000859 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000860 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000861 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000862 fail:
863 Py_XDECREF(np);
864 Py_XDECREF(t);
865 c->c_errors++;
866 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000867}
868
869static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000870com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000871{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000872 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000873}
874
875static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000876com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000877{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000878 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000879}
880
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000881static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000882mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000883{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000884 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000885 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +0000886 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000887 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
888 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000889 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000890 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000891 return 0; /* Don't mangle __extremely_long_names */
892 if (name[nlen-1] == '_' && name[nlen-2] == '_')
893 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000894 /* Strip leading underscores from class name */
895 while (*p == '_')
896 p++;
897 if (*p == '\0')
898 return 0; /* Don't mangle if class is just underscores */
899 plen = strlen(p);
900 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000901 plen = maxlen-nlen-2; /* Truncate class name if too long */
902 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000903 buffer[0] = '_';
904 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000905 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000906 /* fprintf(stderr, "mangle %s -> %s\n", name, buffer); */
907 return 1;
908}
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000909
910static int
911com_mangle(struct compiling *c, char *name, char *buffer, size_t maxlen)
912{
913 return mangle(c->c_private, name, buffer, maxlen);
914}
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000915
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000916static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000917com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000918{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000919 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000920 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000921 char buffer[MANGLE_LEN];
922/* fprintf(stderr, "com_addop_name(%s, %d, %s)\n",
923 c->c_name, op, name);
924*/
925 if (com_mangle(c, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000926 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000927 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000928 c->c_errors++;
929 i = 255;
930 }
931 else {
932 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000933 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000934 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000935 com_addoparg(c, op, i);
936}
937
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000938#define NAME_LOCAL 0
939#define NAME_GLOBAL 1
940#define NAME_DEFAULT 2
941#define NAME_CLOSURE 3
942
943static int
944com_lookup_arg(PyObject *dict, PyObject *name)
945{
946 PyObject *v = PyDict_GetItem(dict, name);
947 if (v == NULL)
948 return -1;
949 else
950 return PyInt_AS_LONG(v);
951}
952
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000953static void
954com_addop_varname(struct compiling *c, int kind, char *name)
955{
956 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000957 int i, reftype;
958 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000959 int op = STOP_CODE;
960 char buffer[MANGLE_LEN];
961
962 if (com_mangle(c, name, buffer, sizeof(buffer)))
963 name = buffer;
964 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
965 c->c_errors++;
966 i = 255;
967 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000968 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000969
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000970 reftype = get_ref_type(c, name);
971 switch (reftype) {
972 case LOCAL:
973 if (c->c_symtable->st_cur_type == TYPE_FUNCTION)
974 scope = NAME_LOCAL;
975 break;
976 case GLOBAL_EXPLICIT:
977 scope = NAME_GLOBAL;
978 break;
979 case GLOBAL_IMPLICIT:
980 if (c->c_flags & CO_OPTIMIZED)
981 scope = NAME_GLOBAL;
982 break;
983 case FREE:
984 case CELL:
985 scope = NAME_CLOSURE;
986 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000987 }
988
989 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000990 if (scope == NAME_LOCAL)
991 i = com_lookup_arg(c->c_locals, v);
992 else if (reftype == FREE)
993 i = com_lookup_arg(c->c_freevars, v);
994 else if (reftype == CELL)
995 i = com_lookup_arg(c->c_cellvars, v);
996 if (i == -1) {
997 c->c_errors++; /* XXX no exception set */
998 i = 255;
999 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001000 }
1001 Py_DECREF(v);
1002
1003 switch (kind) {
1004 case VAR_LOAD:
1005 switch (scope) {
1006 case NAME_LOCAL:
1007 op = LOAD_FAST;
1008 break;
1009 case NAME_GLOBAL:
1010 op = LOAD_GLOBAL;
1011 break;
1012 case NAME_DEFAULT:
1013 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001014 break;
1015 case NAME_CLOSURE:
1016 op = LOAD_DEREF;
1017 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001018 }
1019 break;
1020 case VAR_STORE:
1021 switch (scope) {
1022 case NAME_LOCAL:
1023 op = STORE_FAST;
1024 break;
1025 case NAME_GLOBAL:
1026 op = STORE_GLOBAL;
1027 break;
1028 case NAME_DEFAULT:
1029 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001030 break;
1031 case NAME_CLOSURE:
1032 op = STORE_DEREF;
1033 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001034 }
1035 break;
1036 case VAR_DELETE:
1037 switch (scope) {
1038 case NAME_LOCAL:
1039 op = DELETE_FAST;
1040 break;
1041 case NAME_GLOBAL:
1042 op = DELETE_GLOBAL;
1043 break;
1044 case NAME_DEFAULT:
1045 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001046 break;
1047 case NAME_CLOSURE: {
1048 char buf[256];
1049 sprintf(buf, DEL_CLOSURE_ERROR, name);
1050 com_error(c, PyExc_SyntaxError, buf);
1051 i = 255;
1052 break;
1053 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001054 }
1055 break;
1056 }
1057done:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001058/* fprintf(stderr, " addoparg(op=%d, arg=%d)\n", op, i);*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001059 com_addoparg(c, op, i);
1060}
1061
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001062static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001063com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001064{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001065 char *name;
1066 char buffer[1000];
1067 /* XXX it is possible to write this code without the 1000
1068 chars on the total length of dotted names, I just can't be
1069 bothered right now */
1070 if (TYPE(n) == STAR)
1071 name = "*";
1072 else if (TYPE(n) == dotted_name) {
1073 char *p = buffer;
1074 int i;
1075 name = buffer;
1076 for (i = 0; i < NCH(n); i += 2) {
1077 char *s = STR(CHILD(n, i));
1078 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001079 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001080 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001081 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001082 break;
1083 }
1084 if (p != buffer)
1085 *p++ = '.';
1086 strcpy(p, s);
1087 p = strchr(p, '\0');
1088 }
1089 }
1090 else {
1091 REQ(n, NAME);
1092 name = STR(n);
1093 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001094 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001095}
1096
Guido van Rossum79f25d91997-04-29 20:08:16 +00001097static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001098parsenumber(struct compiling *co, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001099{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001100 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001101 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001102 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001103#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +00001104 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +00001105 int imflag;
1106#endif
1107
Guido van Rossum282914b1991-04-04 10:42:56 +00001108 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001109 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001110#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001111 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001112#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001113 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001114 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001115 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001116 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001117 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001118 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001119 if (*end == '\0') {
1120 if (errno != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001121 com_error(co, PyExc_OverflowError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001122 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +00001123 return NULL;
1124 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001125 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001126 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001127 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001128#ifndef WITHOUT_COMPLEX
1129 if (imflag) {
1130 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001131 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +00001132 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001133 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001134 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +00001135 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001136 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001137#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001138 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001139 PyFPE_START_PROTECT("atof", return 0)
1140 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001141 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001142 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001143 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001144}
1145
Guido van Rossum79f25d91997-04-29 20:08:16 +00001146static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001147parsestr(char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001148{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001149 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001150 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001151 char *buf;
1152 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001153 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001154 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001155 int first = *s;
1156 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001157 int rawmode = 0;
1158 int unicode = 0;
1159 if (isalpha(quote) || quote == '_') {
1160 if (quote == 'u' || quote == 'U') {
1161 quote = *++s;
1162 unicode = 1;
1163 }
1164 if (quote == 'r' || quote == 'R') {
1165 quote = *++s;
1166 rawmode = 1;
1167 }
1168 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001169 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001170 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001171 return NULL;
1172 }
1173 s++;
1174 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001175 if (len > INT_MAX) {
1176 PyErr_SetString(PyExc_OverflowError, "string to parse is too long");
1177 return NULL;
1178 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001179 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001180 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001181 return NULL;
1182 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001183 if (len >= 4 && s[0] == quote && s[1] == quote) {
1184 s += 2;
1185 len -= 2;
1186 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001187 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001188 return NULL;
1189 }
1190 }
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001191 if (unicode || Py_UnicodeFlag) {
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001192 if (rawmode)
1193 return PyUnicode_DecodeRawUnicodeEscape(
1194 s, len, NULL);
1195 else
1196 return PyUnicode_DecodeUnicodeEscape(
1197 s, len, NULL);
1198 }
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001199 if (rawmode || strchr(s, '\\') == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001200 return PyString_FromStringAndSize(s, len);
1201 v = PyString_FromStringAndSize((char *)NULL, len);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001202 if (v == NULL)
1203 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001204 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001205 end = s + len;
1206 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001207 if (*s != '\\') {
1208 *p++ = *s++;
1209 continue;
1210 }
1211 s++;
1212 switch (*s++) {
1213 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001214 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001215 case '\\': *p++ = '\\'; break;
1216 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +00001217 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001218 case 'b': *p++ = '\b'; break;
1219 case 'f': *p++ = '\014'; break; /* FF */
1220 case 't': *p++ = '\t'; break;
1221 case 'n': *p++ = '\n'; break;
1222 case 'r': *p++ = '\r'; break;
1223 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001224 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
1225 case '0': case '1': case '2': case '3':
1226 case '4': case '5': case '6': case '7':
1227 c = s[-1] - '0';
1228 if ('0' <= *s && *s <= '7') {
1229 c = (c<<3) + *s++ - '0';
1230 if ('0' <= *s && *s <= '7')
1231 c = (c<<3) + *s++ - '0';
1232 }
1233 *p++ = c;
1234 break;
1235 case 'x':
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001236 if (isxdigit(Py_CHARMASK(s[0])) && isxdigit(Py_CHARMASK(s[1]))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +00001237 unsigned int x = 0;
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001238 c = Py_CHARMASK(*s);
1239 s++;
1240 if (isdigit(c))
1241 x = c - '0';
1242 else if (islower(c))
1243 x = 10 + c - 'a';
1244 else
1245 x = 10 + c - 'A';
1246 x = x << 4;
1247 c = Py_CHARMASK(*s);
1248 s++;
1249 if (isdigit(c))
1250 x += c - '0';
1251 else if (islower(c))
1252 x += 10 + c - 'a';
1253 else
1254 x += 10 + c - 'A';
Guido van Rossumed1100f1997-10-20 23:24:07 +00001255 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001256 break;
1257 }
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001258 PyErr_SetString(PyExc_ValueError, "invalid \\x escape");
1259 Py_DECREF(v);
1260 return NULL;
1261 default:
1262 *p++ = '\\';
1263 *p++ = s[-1];
1264 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001265 }
1266 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001267 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001268 return v;
1269}
1270
Guido van Rossum79f25d91997-04-29 20:08:16 +00001271static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001272parsestrplus(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001273{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001274 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001275 int i;
1276 REQ(CHILD(n, 0), STRING);
1277 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
1278 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001279 for (i = 1; i < NCH(n); i++) {
1280 PyObject *s;
1281 s = parsestr(STR(CHILD(n, i)));
1282 if (s == NULL)
1283 goto onError;
1284 if (PyString_Check(v) && PyString_Check(s)) {
1285 PyString_ConcatAndDel(&v, s);
1286 if (v == NULL)
1287 goto onError;
1288 }
1289 else {
1290 PyObject *temp;
1291 temp = PyUnicode_Concat(v, s);
1292 Py_DECREF(s);
1293 if (temp == NULL)
1294 goto onError;
1295 Py_DECREF(v);
1296 v = temp;
1297 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001298 }
1299 }
1300 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001301
1302 onError:
1303 Py_XDECREF(v);
1304 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001305}
1306
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001307static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001308com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001309{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001310 PyObject *v;
1311 int anchor = 0;
1312 int save_begin = c->c_begin;
1313
1314 /* list_iter: for v in expr [list_iter] */
1315 com_node(c, CHILD(n, 3)); /* expr */
1316 v = PyInt_FromLong(0L);
1317 if (v == NULL)
1318 c->c_errors++;
1319 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
1320 com_push(c, 1);
1321 Py_XDECREF(v);
1322 c->c_begin = c->c_nexti;
1323 com_addoparg(c, SET_LINENO, n->n_lineno);
1324 com_addfwref(c, FOR_LOOP, &anchor);
1325 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001326 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001327 c->c_loops++;
1328 com_list_iter(c, n, e, t);
1329 c->c_loops--;
1330 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1331 c->c_begin = save_begin;
1332 com_backpatch(c, anchor);
1333 com_pop(c, 2); /* FOR_LOOP has popped these */
1334}
1335
1336static void
1337com_list_if(struct compiling *c, node *n, node *e, char *t)
1338{
1339 int anchor = 0;
1340 int a = 0;
1341 /* list_iter: 'if' test [list_iter] */
1342 com_addoparg(c, SET_LINENO, n->n_lineno);
1343 com_node(c, CHILD(n, 1));
1344 com_addfwref(c, JUMP_IF_FALSE, &a);
1345 com_addbyte(c, POP_TOP);
1346 com_pop(c, 1);
1347 com_list_iter(c, n, e, t);
1348 com_addfwref(c, JUMP_FORWARD, &anchor);
1349 com_backpatch(c, a);
1350 /* We jump here with an extra entry which we now pop */
1351 com_addbyte(c, POP_TOP);
1352 com_backpatch(c, anchor);
1353}
1354
1355static void
1356com_list_iter(struct compiling *c,
1357 node *p, /* parent of list_iter node */
1358 node *e, /* element expression node */
1359 char *t /* name of result list temp local */)
1360{
1361 /* list_iter is the last child in a listmaker, list_for, or list_if */
1362 node *n = CHILD(p, NCH(p)-1);
1363 if (TYPE(n) == list_iter) {
1364 n = CHILD(n, 0);
1365 switch (TYPE(n)) {
1366 case list_for:
1367 com_list_for(c, n, e, t);
1368 break;
1369 case list_if:
1370 com_list_if(c, n, e, t);
1371 break;
1372 default:
1373 com_error(c, PyExc_SystemError,
1374 "invalid list_iter node type");
1375 }
1376 }
1377 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001378 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001379 com_push(c, 1);
1380 com_node(c, e);
1381 com_addoparg(c, CALL_FUNCTION, 1);
1382 com_addbyte(c, POP_TOP);
1383 com_pop(c, 2);
1384 }
1385}
1386
1387static void
1388com_list_comprehension(struct compiling *c, node *n)
1389{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001390 /* listmaker: test list_for */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001391 char tmpname[12];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001392 sprintf(tmpname, "[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001393 com_addoparg(c, BUILD_LIST, 0);
1394 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1395 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001396 com_addop_name(c, LOAD_ATTR, "append");
1397 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001398 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001399 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001400 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001401 --c->c_tmpname;
1402}
1403
1404static void
1405com_listmaker(struct compiling *c, node *n)
1406{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001407 /* listmaker: test ( list_for | (',' test)* [','] ) */
1408 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001409 com_list_comprehension(c, n);
1410 else {
1411 int len = 0;
1412 int i;
1413 for (i = 0; i < NCH(n); i += 2, len++)
1414 com_node(c, CHILD(n, i));
1415 com_addoparg(c, BUILD_LIST, len);
1416 com_pop(c, len-1);
1417 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001418}
1419
1420static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001421com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001422{
1423 int i;
1424 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1425 for (i = 0; i+2 < NCH(n); i += 4) {
1426 /* We must arrange things just right for STORE_SUBSCR.
1427 It wants the stack to look like (value) (dict) (key) */
1428 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001429 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001430 com_node(c, CHILD(n, i+2)); /* value */
1431 com_addbyte(c, ROT_TWO);
1432 com_node(c, CHILD(n, i)); /* key */
1433 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001434 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001435 }
1436}
1437
1438static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001439com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001440{
1441 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001442 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001443 int i;
1444 REQ(n, atom);
1445 ch = CHILD(n, 0);
1446 switch (TYPE(ch)) {
1447 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001448 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001449 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001450 com_push(c, 1);
1451 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001452 else
1453 com_node(c, CHILD(n, 1));
1454 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001455 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001456 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001457 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001458 com_push(c, 1);
1459 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001460 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001461 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001462 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001463 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001464 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001465 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001466 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001467 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001468 break;
1469 case BACKQUOTE:
1470 com_node(c, CHILD(n, 1));
1471 com_addbyte(c, UNARY_CONVERT);
1472 break;
1473 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001474 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001475 i = 255;
1476 }
1477 else {
1478 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001479 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001480 }
1481 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001482 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001483 break;
1484 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001485 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001486 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001487 c->c_errors++;
1488 i = 255;
1489 }
1490 else {
1491 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001492 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001493 }
1494 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001495 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001496 break;
1497 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001498 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001499 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001500 break;
1501 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001502 /* XXX fprintf(stderr, "node type %d\n", TYPE(ch)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001503 com_error(c, PyExc_SystemError,
1504 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001505 }
1506}
1507
1508static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001509com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001510{
1511 if (NCH(n) == 1) {
1512 com_addbyte(c, op);
1513 }
1514 else if (NCH(n) == 2) {
1515 if (TYPE(CHILD(n, 0)) != COLON) {
1516 com_node(c, CHILD(n, 0));
1517 com_addbyte(c, op+1);
1518 }
1519 else {
1520 com_node(c, CHILD(n, 1));
1521 com_addbyte(c, op+2);
1522 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001523 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001524 }
1525 else {
1526 com_node(c, CHILD(n, 0));
1527 com_node(c, CHILD(n, 2));
1528 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001529 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001530 }
1531}
1532
Guido van Rossum635abd21997-01-06 22:56:52 +00001533static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001534com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1535{
1536 if (NCH(n) == 1) {
1537 com_addbyte(c, DUP_TOP);
1538 com_push(c, 1);
1539 com_addbyte(c, SLICE);
1540 com_node(c, augn);
1541 com_addbyte(c, opcode);
1542 com_pop(c, 1);
1543 com_addbyte(c, ROT_TWO);
1544 com_addbyte(c, STORE_SLICE);
1545 com_pop(c, 2);
1546 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1547 com_node(c, CHILD(n, 0));
1548 com_addoparg(c, DUP_TOPX, 2);
1549 com_push(c, 2);
1550 com_addbyte(c, SLICE+1);
1551 com_pop(c, 1);
1552 com_node(c, augn);
1553 com_addbyte(c, opcode);
1554 com_pop(c, 1);
1555 com_addbyte(c, ROT_THREE);
1556 com_addbyte(c, STORE_SLICE+1);
1557 com_pop(c, 3);
1558 } else if (NCH(n) == 2) {
1559 com_node(c, CHILD(n, 1));
1560 com_addoparg(c, DUP_TOPX, 2);
1561 com_push(c, 2);
1562 com_addbyte(c, SLICE+2);
1563 com_pop(c, 1);
1564 com_node(c, augn);
1565 com_addbyte(c, opcode);
1566 com_pop(c, 1);
1567 com_addbyte(c, ROT_THREE);
1568 com_addbyte(c, STORE_SLICE+2);
1569 com_pop(c, 3);
1570 } else {
1571 com_node(c, CHILD(n, 0));
1572 com_node(c, CHILD(n, 2));
1573 com_addoparg(c, DUP_TOPX, 3);
1574 com_push(c, 3);
1575 com_addbyte(c, SLICE+3);
1576 com_pop(c, 2);
1577 com_node(c, augn);
1578 com_addbyte(c, opcode);
1579 com_pop(c, 1);
1580 com_addbyte(c, ROT_FOUR);
1581 com_addbyte(c, STORE_SLICE+3);
1582 com_pop(c, 4);
1583 }
1584}
1585
1586static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001587com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001588{
1589 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001590 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001591 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001592 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001593 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001594 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001595 }
1596 else {
1597 com_node(c, CHILD(n, 0));
1598 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001599 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001600 }
1601 m = n;
1602 do {
1603 m = CHILD(m, 0);
1604 } while (NCH(m) == 1);
1605 if (TYPE(m) != NAME) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001606 com_error(c, PyExc_SyntaxError,
1607 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001608 }
1609 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001610 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001611 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001612 *pkeywords = PyDict_New();
Guido van Rossum635abd21997-01-06 22:56:52 +00001613 if (v == NULL || *pkeywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001614 c->c_errors++;
1615 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001616 if (PyDict_GetItem(*pkeywords, v) != NULL)
1617 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001618 "duplicate keyword argument");
1619 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001620 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001621 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001622 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001623 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001624 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001625 }
1626 }
1627 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001628}
1629
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001630static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001631com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001632{
1633 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001634 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001635 }
1636 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001637 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001638 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001639 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001640 int star_flag = 0;
1641 int starstar_flag = 0;
1642 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001643 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001644 na = 0;
1645 nk = 0;
1646 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001647 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001648 if (TYPE(ch) == STAR ||
1649 TYPE(ch) == DOUBLESTAR)
1650 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001651 if (ch->n_lineno != lineno) {
1652 lineno = ch->n_lineno;
1653 com_addoparg(c, SET_LINENO, lineno);
1654 }
1655 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001656 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001657 na++;
1658 else
1659 nk++;
1660 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001661 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001662 while (i < NCH(n)) {
1663 node *tok = CHILD(n, i);
1664 node *ch = CHILD(n, i+1);
1665 i += 3;
1666 switch (TYPE(tok)) {
1667 case STAR: star_flag = 1; break;
1668 case DOUBLESTAR: starstar_flag = 1; break;
1669 }
1670 com_node(c, ch);
1671 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001672 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001673 com_error(c, PyExc_SyntaxError,
1674 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001675 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001676 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001677 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001678 star_flag + (starstar_flag << 1);
1679 else
1680 opcode = CALL_FUNCTION;
1681 com_addoparg(c, opcode, na | (nk << 8));
1682 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001683 }
1684}
1685
1686static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001687com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001688{
1689 com_addopname(c, LOAD_ATTR, n);
1690}
1691
1692static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001693com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001694{
1695 int i=0;
1696 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001697 node *ch;
1698
1699 /* first argument */
1700 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001701 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001702 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001703 i++;
1704 }
1705 else {
1706 com_node(c, CHILD(n,i));
1707 i++;
1708 REQ(CHILD(n,i),COLON);
1709 i++;
1710 }
1711 /* second argument */
1712 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1713 com_node(c, CHILD(n,i));
1714 i++;
1715 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001716 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001717 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001718 com_push(c, 1);
1719 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001720 /* remaining arguments */
1721 for (; i < NCH(n); i++) {
1722 ns++;
1723 ch=CHILD(n,i);
1724 REQ(ch, sliceop);
1725 if (NCH(ch) == 1) {
1726 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001727 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001728 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001729 }
1730 else
1731 com_node(c, CHILD(ch,1));
1732 }
1733 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001734 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001735}
1736
1737static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001738com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001739{
1740 node *ch;
1741 REQ(n, subscript);
1742 ch = CHILD(n,0);
1743 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001744 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001745 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001746 com_push(c, 1);
1747 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001748 else {
1749 /* check for slice */
1750 if ((TYPE(ch) == COLON || NCH(n) > 1))
1751 com_sliceobj(c, n);
1752 else {
1753 REQ(ch, test);
1754 com_node(c, ch);
1755 }
1756 }
1757}
1758
1759static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001760com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001761{
1762 int i, op;
1763 REQ(n, subscriptlist);
1764 /* Check to make backward compatible slice behavior for '[i:j]' */
1765 if (NCH(n) == 1) {
1766 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001767 /* 'Basic' slice, should have exactly one colon. */
1768 if ((TYPE(CHILD(sub, 0)) == COLON
1769 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1770 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1771 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001772 switch (assigning) {
1773 case OP_DELETE:
1774 op = DELETE_SLICE;
1775 break;
1776 case OP_ASSIGN:
1777 op = STORE_SLICE;
1778 break;
1779 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001780 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001781 break;
1782 default:
1783 com_augassign_slice(c, sub, assigning, augn);
1784 return;
1785 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001786 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001787 if (op == STORE_SLICE)
1788 com_pop(c, 2);
1789 else if (op == DELETE_SLICE)
1790 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001791 return;
1792 }
1793 }
1794 /* Else normal subscriptlist. Compile each subscript. */
1795 for (i = 0; i < NCH(n); i += 2)
1796 com_subscript(c, CHILD(n, i));
1797 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001798 if (NCH(n) > 1) {
1799 i = (NCH(n)+1) / 2;
1800 com_addoparg(c, BUILD_TUPLE, i);
1801 com_pop(c, i-1);
1802 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001803 switch (assigning) {
1804 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001805 op = DELETE_SUBSCR;
1806 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00001807 break;
1808 default:
1809 case OP_ASSIGN:
1810 op = STORE_SUBSCR;
1811 i = 3;
1812 break;
1813 case OP_APPLY:
1814 op = BINARY_SUBSCR;
1815 i = 1;
1816 break;
1817 }
1818 if (assigning > OP_APPLY) {
1819 com_addoparg(c, DUP_TOPX, 2);
1820 com_push(c, 2);
1821 com_addbyte(c, BINARY_SUBSCR);
1822 com_pop(c, 1);
1823 com_node(c, augn);
1824 com_addbyte(c, assigning);
1825 com_pop(c, 1);
1826 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001827 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001828 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001829 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001830}
1831
1832static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001833com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001834{
1835 REQ(n, trailer);
1836 switch (TYPE(CHILD(n, 0))) {
1837 case LPAR:
1838 com_call_function(c, CHILD(n, 1));
1839 break;
1840 case DOT:
1841 com_select_member(c, CHILD(n, 1));
1842 break;
1843 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00001844 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001845 break;
1846 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001847 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001848 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001849 }
1850}
1851
1852static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001853com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001854{
1855 int i;
1856 REQ(n, power);
1857 com_atom(c, CHILD(n, 0));
1858 for (i = 1; i < NCH(n); i++) {
1859 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1860 com_factor(c, CHILD(n, i+1));
1861 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001862 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001863 break;
1864 }
1865 else
1866 com_apply_trailer(c, CHILD(n, i));
1867 }
1868}
1869
1870static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001871com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001872{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001873 REQ(n, factor);
1874 if (TYPE(CHILD(n, 0)) == PLUS) {
1875 com_factor(c, CHILD(n, 1));
1876 com_addbyte(c, UNARY_POSITIVE);
1877 }
1878 else if (TYPE(CHILD(n, 0)) == MINUS) {
1879 com_factor(c, CHILD(n, 1));
1880 com_addbyte(c, UNARY_NEGATIVE);
1881 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001882 else if (TYPE(CHILD(n, 0)) == TILDE) {
1883 com_factor(c, CHILD(n, 1));
1884 com_addbyte(c, UNARY_INVERT);
1885 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001886 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001887 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001888 }
1889}
1890
1891static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001892com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001893{
1894 int i;
1895 int op;
1896 REQ(n, term);
1897 com_factor(c, CHILD(n, 0));
1898 for (i = 2; i < NCH(n); i += 2) {
1899 com_factor(c, CHILD(n, i));
1900 switch (TYPE(CHILD(n, i-1))) {
1901 case STAR:
1902 op = BINARY_MULTIPLY;
1903 break;
1904 case SLASH:
1905 op = BINARY_DIVIDE;
1906 break;
1907 case PERCENT:
1908 op = BINARY_MODULO;
1909 break;
1910 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001911 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001912 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001913 op = 255;
1914 }
1915 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001916 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001917 }
1918}
1919
1920static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001921com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001922{
1923 int i;
1924 int op;
1925 REQ(n, arith_expr);
1926 com_term(c, CHILD(n, 0));
1927 for (i = 2; i < NCH(n); i += 2) {
1928 com_term(c, CHILD(n, i));
1929 switch (TYPE(CHILD(n, i-1))) {
1930 case PLUS:
1931 op = BINARY_ADD;
1932 break;
1933 case MINUS:
1934 op = BINARY_SUBTRACT;
1935 break;
1936 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001937 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001938 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001939 op = 255;
1940 }
1941 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001942 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001943 }
1944}
1945
1946static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001947com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001948{
1949 int i;
1950 int op;
1951 REQ(n, shift_expr);
1952 com_arith_expr(c, CHILD(n, 0));
1953 for (i = 2; i < NCH(n); i += 2) {
1954 com_arith_expr(c, CHILD(n, i));
1955 switch (TYPE(CHILD(n, i-1))) {
1956 case LEFTSHIFT:
1957 op = BINARY_LSHIFT;
1958 break;
1959 case RIGHTSHIFT:
1960 op = BINARY_RSHIFT;
1961 break;
1962 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001963 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001964 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001965 op = 255;
1966 }
1967 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001968 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001969 }
1970}
1971
1972static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001973com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001974{
1975 int i;
1976 int op;
1977 REQ(n, and_expr);
1978 com_shift_expr(c, CHILD(n, 0));
1979 for (i = 2; i < NCH(n); i += 2) {
1980 com_shift_expr(c, CHILD(n, i));
1981 if (TYPE(CHILD(n, i-1)) == AMPER) {
1982 op = BINARY_AND;
1983 }
1984 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001985 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001986 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001987 op = 255;
1988 }
1989 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001990 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001991 }
1992}
1993
1994static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001995com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001996{
1997 int i;
1998 int op;
1999 REQ(n, xor_expr);
2000 com_and_expr(c, CHILD(n, 0));
2001 for (i = 2; i < NCH(n); i += 2) {
2002 com_and_expr(c, CHILD(n, i));
2003 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2004 op = BINARY_XOR;
2005 }
2006 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002007 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002008 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002009 op = 255;
2010 }
2011 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002012 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002013 }
2014}
2015
2016static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002017com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002018{
2019 int i;
2020 int op;
2021 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002022 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002023 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002024 com_xor_expr(c, CHILD(n, i));
2025 if (TYPE(CHILD(n, i-1)) == VBAR) {
2026 op = BINARY_OR;
2027 }
2028 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002029 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002030 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002031 op = 255;
2032 }
2033 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002034 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002035 }
2036}
2037
2038static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002039cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002040{
2041 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00002042 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002043 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2044 if (NCH(n) == 1) {
2045 n = CHILD(n, 0);
2046 switch (TYPE(n)) {
2047 case LESS: return LT;
2048 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00002049 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002050 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00002051 case LESSEQUAL: return LE;
2052 case GREATEREQUAL: return GE;
2053 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002054 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
2055 if (strcmp(STR(n), "is") == 0) return IS;
2056 }
2057 }
2058 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002059 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002060 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
2061 return NOT_IN;
2062 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
2063 return IS_NOT;
2064 }
2065 }
2066 return BAD;
2067}
2068
2069static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002070com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002071{
2072 int i;
2073 enum cmp_op op;
2074 int anchor;
2075 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2076 com_expr(c, CHILD(n, 0));
2077 if (NCH(n) == 1)
2078 return;
2079
2080 /****************************************************************
2081 The following code is generated for all but the last
2082 comparison in a chain:
2083
2084 label: on stack: opcode: jump to:
2085
2086 a <code to load b>
2087 a, b DUP_TOP
2088 a, b, b ROT_THREE
2089 b, a, b COMPARE_OP
2090 b, 0-or-1 JUMP_IF_FALSE L1
2091 b, 1 POP_TOP
2092 b
2093
2094 We are now ready to repeat this sequence for the next
2095 comparison in the chain.
2096
2097 For the last we generate:
2098
2099 b <code to load c>
2100 b, c COMPARE_OP
2101 0-or-1
2102
2103 If there were any jumps to L1 (i.e., there was more than one
2104 comparison), we generate:
2105
2106 0-or-1 JUMP_FORWARD L2
2107 L1: b, 0 ROT_TWO
2108 0, b POP_TOP
2109 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002110 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002111 ****************************************************************/
2112
2113 anchor = 0;
2114
2115 for (i = 2; i < NCH(n); i += 2) {
2116 com_expr(c, CHILD(n, i));
2117 if (i+2 < NCH(n)) {
2118 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002119 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002120 com_addbyte(c, ROT_THREE);
2121 }
2122 op = cmp_type(CHILD(n, i-1));
2123 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002124 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002125 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002126 }
2127 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002128 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002129 if (i+2 < NCH(n)) {
2130 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2131 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002132 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002133 }
2134 }
2135
2136 if (anchor) {
2137 int anchor2 = 0;
2138 com_addfwref(c, JUMP_FORWARD, &anchor2);
2139 com_backpatch(c, anchor);
2140 com_addbyte(c, ROT_TWO);
2141 com_addbyte(c, POP_TOP);
2142 com_backpatch(c, anchor2);
2143 }
2144}
2145
2146static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002147com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002148{
2149 REQ(n, not_test); /* 'not' not_test | comparison */
2150 if (NCH(n) == 1) {
2151 com_comparison(c, CHILD(n, 0));
2152 }
2153 else {
2154 com_not_test(c, CHILD(n, 1));
2155 com_addbyte(c, UNARY_NOT);
2156 }
2157}
2158
2159static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002160com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002161{
2162 int i;
2163 int anchor;
2164 REQ(n, and_test); /* not_test ('and' not_test)* */
2165 anchor = 0;
2166 i = 0;
2167 for (;;) {
2168 com_not_test(c, CHILD(n, i));
2169 if ((i += 2) >= NCH(n))
2170 break;
2171 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2172 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002173 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002174 }
2175 if (anchor)
2176 com_backpatch(c, anchor);
2177}
2178
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002179static int
2180com_make_closure(struct compiling *c, PyCodeObject *co)
2181{
2182 int i, free = PyTuple_GET_SIZE(co->co_freevars);
2183 if (free == 0)
2184 return 0;
2185 for (i = 0; i < free; ++i) {
2186 /* Bypass com_addop_varname because it will generate
2187 LOAD_DEREF but LOAD_CLOSURE is needed.
2188 */
2189 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2190 int arg, reftype;
2191
2192 /* Special case: If a class contains a method with a
2193 free variable that has the same name as a method,
2194 the name will be considered free *and* local in the
2195 class. It should be handled by the closure, as
2196 well as by the normal name loookup logic.
2197 */
2198 reftype = get_ref_type(c, PyString_AS_STRING(name));
2199 if (reftype == CELL)
2200 arg = com_lookup_arg(c->c_cellvars, name);
2201 else /* (reftype == FREE) */
2202 arg = com_lookup_arg(c->c_freevars, name);
2203 if (arg == -1) {
2204 fprintf(stderr, "lookup %s in %s %d %d\n",
2205 REPR(name), c->c_name, reftype, arg);
2206 Py_FatalError("com_make_closure()");
2207 }
2208 com_addoparg(c, LOAD_CLOSURE, arg);
2209
2210 }
2211 com_push(c, free);
2212 return 1;
2213}
2214
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002215static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002216com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002217{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002218 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002219 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002220 PyObject *co;
2221 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002222 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002223 symtable_enter_scope(c->c_symtable, "lambda", lambdef);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002224 co = (PyObject *) icompile(CHILD(n, 0), c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002225 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002226 if (co == NULL) {
Guido van Rossum57531fe1993-11-30 14:57:42 +00002227 c->c_errors++;
2228 i = 255;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002229 closure = 0;
2230 } else {
2231 i = com_addconst(c, co);
2232 Py_DECREF(co);
2233 closure = com_make_closure(c, (PyCodeObject *)co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002234 }
2235 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002236 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002237 if (closure)
2238 com_addoparg(c, MAKE_CLOSURE, ndefs);
2239 else
2240 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002241 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002242 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002243 else {
2244 int anchor = 0;
2245 int i = 0;
2246 for (;;) {
2247 com_and_test(c, CHILD(n, i));
2248 if ((i += 2) >= NCH(n))
2249 break;
2250 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2251 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002252 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002253 }
2254 if (anchor)
2255 com_backpatch(c, anchor);
2256 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002257}
2258
2259static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002260com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002261{
2262 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002263 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002264 com_node(c, CHILD(n, 0));
2265 }
2266 else {
2267 int i;
2268 int len;
2269 len = (NCH(n) + 1) / 2;
2270 for (i = 0; i < NCH(n); i += 2)
2271 com_node(c, CHILD(n, i));
2272 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002273 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002274 }
2275}
2276
2277
2278/* Begin of assignment compilation */
2279
Thomas Wouters434d0822000-08-24 20:11:32 +00002280
2281static void
2282com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2283{
2284 com_addbyte(c, DUP_TOP);
2285 com_push(c, 1);
2286 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002287 com_node(c, augn);
2288 com_addbyte(c, opcode);
2289 com_pop(c, 1);
2290 com_addbyte(c, ROT_TWO);
2291 com_addopname(c, STORE_ATTR, n);
2292 com_pop(c, 2);
2293}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002294
2295static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002296com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002297{
2298 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002299 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002300}
2301
2302static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002303com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002304{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002305 REQ(n, trailer);
2306 switch (TYPE(CHILD(n, 0))) {
2307 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002308 com_error(c, PyExc_SyntaxError,
2309 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002310 break;
2311 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002312 if (assigning > OP_APPLY)
2313 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2314 else
2315 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002316 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002317 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002318 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002319 break;
2320 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002321 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002322 }
2323}
2324
2325static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002326com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002327{
2328 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002329 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002330 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002331 if (assigning) {
2332 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002333 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002334 com_push(c, i-1);
2335 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002336 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002337 com_assign(c, CHILD(n, i), assigning, NULL);
2338}
2339
2340static void
2341com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2342{
2343 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002344 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002345 com_push(c, 1);
2346 com_node(c, augn);
2347 com_addbyte(c, opcode);
2348 com_pop(c, 1);
2349 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002350}
2351
2352static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002353com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002354{
2355 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002356 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002357 if (assigning)
2358 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002359}
2360
2361static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002362com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002363{
2364 /* Loop to avoid trivial recursion */
2365 for (;;) {
2366 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002367
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002368 case exprlist:
2369 case testlist:
2370 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002371 if (assigning > OP_APPLY) {
2372 com_error(c, PyExc_SyntaxError,
2373 "augmented assign to tuple not possible");
2374 return;
2375 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002376 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002377 return;
2378 }
2379 n = CHILD(n, 0);
2380 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002381
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002382 case test:
2383 case and_test:
2384 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002385 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002386 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002387 case xor_expr:
2388 case and_expr:
2389 case shift_expr:
2390 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002391 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002392 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002393 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002394 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002395 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002396 return;
2397 }
2398 n = CHILD(n, 0);
2399 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002400
Guido van Rossum50564e81996-01-12 01:13:16 +00002401 case power: /* atom trailer* ('**' power)* */
2402/* ('+'|'-'|'~') factor | atom trailer* */
2403 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002404 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002405 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002406 return;
2407 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002408 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002409 int i;
2410 com_node(c, CHILD(n, 0));
2411 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002412 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002413 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002414 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002415 return;
2416 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002417 com_apply_trailer(c, CHILD(n, i));
2418 } /* NB i is still alive */
2419 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002420 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002421 return;
2422 }
2423 n = CHILD(n, 0);
2424 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002425
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002426 case atom:
2427 switch (TYPE(CHILD(n, 0))) {
2428 case LPAR:
2429 n = CHILD(n, 1);
2430 if (TYPE(n) == RPAR) {
2431 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002432 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002433 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002434 return;
2435 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002436 if (assigning > OP_APPLY) {
2437 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002438 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002439 return;
2440 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002441 break;
2442 case LSQB:
2443 n = CHILD(n, 1);
2444 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002445 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002446 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002447 return;
2448 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002449 if (assigning > OP_APPLY) {
2450 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002451 "augmented assign to list not possible");
2452 return;
2453 }
2454 if (NCH(n) > 1
2455 && TYPE(CHILD(n, 1)) == list_for) {
2456 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002457 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002458 return;
2459 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002460 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002461 return;
2462 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002463 if (assigning > OP_APPLY)
2464 com_augassign_name(c, CHILD(n, 0),
2465 assigning, augn);
2466 else
2467 com_assign_name(c, CHILD(n, 0),
2468 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002469 return;
2470 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002471 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002472 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002473 return;
2474 }
2475 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002476
2477 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002478 com_error(c, PyExc_SyntaxError,
2479 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002480 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002481
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002482 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002483 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002484 com_error(c, PyExc_SystemError,
2485 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002486 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002487
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002488 }
2489 }
2490}
Guido van Rossum7c531111997-03-11 18:42:21 +00002491
Thomas Wouters434d0822000-08-24 20:11:32 +00002492static void
2493com_augassign(struct compiling *c, node *n)
2494{
2495 int opcode;
2496
2497 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2498 case '+': opcode = INPLACE_ADD; break;
2499 case '-': opcode = INPLACE_SUBTRACT; break;
2500 case '/': opcode = INPLACE_DIVIDE; break;
2501 case '%': opcode = INPLACE_MODULO; break;
2502 case '<': opcode = INPLACE_LSHIFT; break;
2503 case '>': opcode = INPLACE_RSHIFT; break;
2504 case '&': opcode = INPLACE_AND; break;
2505 case '^': opcode = INPLACE_XOR; break;
2506 case '|': opcode = INPLACE_OR; break;
2507 case '*':
2508 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2509 opcode = INPLACE_POWER;
2510 else
2511 opcode = INPLACE_MULTIPLY;
2512 break;
2513 default:
2514 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2515 return;
2516 }
2517 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2518}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002519
2520static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002521com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002522{
Thomas Wouters434d0822000-08-24 20:11:32 +00002523 REQ(n, expr_stmt);
2524 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002525 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002526 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002527 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002528 if (NCH(n) == 1) {
2529 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002530 if (c->c_interactive)
2531 com_addbyte(c, PRINT_EXPR);
2532 else
2533 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002534 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002535 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002536 else if (TYPE(CHILD(n,1)) == augassign)
2537 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002538 else {
2539 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002540 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002541 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002542 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002543 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002544 com_push(c, 1);
2545 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002546 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002547 }
2548 }
2549}
2550
2551static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002552com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002553{
2554 int a = 0, b = 0;
2555 int i;
2556 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2557 /* Generate code like for
2558
2559 if __debug__:
2560 if not <test>:
2561 raise AssertionError [, <message>]
2562
2563 where <message> is the second test, if present.
2564 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002565
2566 /* XXX should __debug__ and AssertionError get inserted into
2567 the symbol table? they don't follow the normal rules
2568 because they are always loaded as globals */
2569
Guido van Rossum228d7f31997-04-02 05:24:36 +00002570 if (Py_OptimizeFlag)
2571 return;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002572 com_addop_name(c, LOAD_GLOBAL, "__debug__");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002573 com_push(c, 1);
2574 com_addfwref(c, JUMP_IF_FALSE, &a);
2575 com_addbyte(c, POP_TOP);
2576 com_pop(c, 1);
2577 com_node(c, CHILD(n, 1));
2578 com_addfwref(c, JUMP_IF_TRUE, &b);
2579 com_addbyte(c, POP_TOP);
2580 com_pop(c, 1);
2581 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002582 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002583 com_push(c, 1);
2584 i = NCH(n)/2; /* Either 2 or 4 */
2585 if (i > 1)
2586 com_node(c, CHILD(n, 3));
2587 com_addoparg(c, RAISE_VARARGS, i);
2588 com_pop(c, i);
2589 /* The interpreter does not fall through */
2590 /* All jumps converge here */
2591 com_backpatch(c, a);
2592 com_backpatch(c, b);
2593 com_addbyte(c, POP_TOP);
2594}
2595
2596static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002597com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002598{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002599 int i = 1;
2600 node* stream = NULL;
2601
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002602 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002603
2604 /* are we using the extended print form? */
2605 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2606 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002607 com_node(c, stream);
2608 /* stack: [...] => [... stream] */
2609 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002610 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2611 i = 4;
2612 else
2613 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002614 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002615 for (; i < NCH(n); i += 2) {
2616 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002617 com_addbyte(c, DUP_TOP);
2618 /* stack: [stream] => [stream stream] */
2619 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002620 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002621 /* stack: [stream stream] => [stream stream obj] */
2622 com_addbyte(c, ROT_TWO);
2623 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002624 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002625 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002626 com_pop(c, 2);
2627 }
2628 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002629 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002630 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002631 com_addbyte(c, PRINT_ITEM);
2632 com_pop(c, 1);
2633 }
2634 }
2635 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002636 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002637 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002638 /* must pop the extra stream object off the stack */
2639 com_addbyte(c, POP_TOP);
2640 /* stack: [... stream] => [...] */
2641 com_pop(c, 1);
2642 }
2643 }
2644 else {
2645 if (stream != NULL) {
2646 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002647 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002648 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002649 com_pop(c, 1);
2650 }
2651 else
2652 com_addbyte(c, PRINT_NEWLINE);
2653 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002654}
2655
2656static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002657com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002658{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002659 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002660 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002661 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002662 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002663 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002664 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002665 com_push(c, 1);
2666 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002667 else
2668 com_node(c, CHILD(n, 1));
2669 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002670 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002671}
2672
2673static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002674com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002675{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002676 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002677 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2678 if (NCH(n) > 1) {
2679 com_node(c, CHILD(n, 1));
2680 if (NCH(n) > 3) {
2681 com_node(c, CHILD(n, 3));
2682 if (NCH(n) > 5)
2683 com_node(c, CHILD(n, 5));
2684 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002685 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002686 i = NCH(n)/2;
2687 com_addoparg(c, RAISE_VARARGS, i);
2688 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002689}
2690
2691static void
Thomas Wouters52152252000-08-17 22:55:00 +00002692com_from_import(struct compiling *c, node *n)
2693{
2694 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2695 com_push(c, 1);
2696 if (NCH(n) > 1) {
2697 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2698 com_error(c, PyExc_SyntaxError, "invalid syntax");
2699 return;
2700 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002701 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002702 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002703 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00002704 com_pop(c, 1);
2705}
2706
2707static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002708com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002709{
2710 int i;
2711 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002712 /* 'import' dotted_name (',' dotted_name)* |
2713 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002714 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00002715 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002716 /* 'from' dotted_name 'import' ... */
2717 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002718
2719 if (TYPE(CHILD(n, 3)) == STAR) {
2720 tup = Py_BuildValue("(s)", "*");
2721 } else {
2722 tup = PyTuple_New((NCH(n) - 2)/2);
2723 for (i = 3; i < NCH(n); i += 2) {
2724 PyTuple_SET_ITEM(tup, (i-3)/2,
2725 PyString_FromString(STR(
2726 CHILD(CHILD(n, i), 0))));
2727 }
2728 }
2729 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00002730 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002731 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002732 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00002733 if (TYPE(CHILD(n, 3)) == STAR)
2734 com_addbyte(c, IMPORT_STAR);
2735 else {
2736 for (i = 3; i < NCH(n); i += 2)
2737 com_from_import(c, CHILD(n, i));
2738 com_addbyte(c, POP_TOP);
2739 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002740 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002741 }
2742 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002743 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002744 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00002745 node *subn = CHILD(n, i);
2746 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002747 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002748 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002749 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00002750 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00002751 int j;
2752 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00002753 com_error(c, PyExc_SyntaxError,
2754 "invalid syntax");
2755 return;
2756 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00002757 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
2758 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002759 CHILD(CHILD(subn, 0),
2760 j));
2761 com_addop_varname(c, VAR_STORE,
2762 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002763 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002764 com_addop_varname(c, VAR_STORE,
2765 STR(CHILD(CHILD(subn, 0),
2766 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002767 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002768 }
2769 }
2770}
2771
2772static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002773com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002774{
2775 REQ(n, exec_stmt);
2776 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2777 com_node(c, CHILD(n, 1));
2778 if (NCH(n) >= 4)
2779 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002780 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002781 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002782 com_push(c, 1);
2783 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002784 if (NCH(n) >= 6)
2785 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002786 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002787 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002788 com_push(c, 1);
2789 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002790 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002791 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002792}
2793
Guido van Rossum7c531111997-03-11 18:42:21 +00002794static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002795is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002796{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002797 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002798 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002799 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00002800
2801 /* Label to avoid tail recursion */
2802 next:
2803 switch (TYPE(n)) {
2804
2805 case suite:
2806 if (NCH(n) == 1) {
2807 n = CHILD(n, 0);
2808 goto next;
2809 }
2810 /* Fall through */
2811 case file_input:
2812 for (i = 0; i < NCH(n); i++) {
2813 node *ch = CHILD(n, i);
2814 if (TYPE(ch) == stmt) {
2815 n = ch;
2816 goto next;
2817 }
2818 }
2819 break;
2820
2821 case stmt:
2822 case simple_stmt:
2823 case small_stmt:
2824 n = CHILD(n, 0);
2825 goto next;
2826
2827 case expr_stmt:
2828 case testlist:
2829 case test:
2830 case and_test:
2831 case not_test:
2832 case comparison:
2833 case expr:
2834 case xor_expr:
2835 case and_expr:
2836 case shift_expr:
2837 case arith_expr:
2838 case term:
2839 case factor:
2840 case power:
2841 case atom:
2842 if (NCH(n) == 1) {
2843 n = CHILD(n, 0);
2844 goto next;
2845 }
2846 break;
2847
2848 case NAME:
2849 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2850 return 1;
2851 break;
2852
2853 case NUMBER:
2854 v = parsenumber(c, STR(n));
2855 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002856 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002857 break;
2858 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002859 i = PyObject_IsTrue(v);
2860 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002861 return i == 0;
2862
2863 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002864 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002865 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002866 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002867 break;
2868 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002869 i = PyObject_IsTrue(v);
2870 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002871 return i == 0;
2872
2873 }
2874 return 0;
2875}
2876
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002877static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002878com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002879{
2880 int i;
2881 int anchor = 0;
2882 REQ(n, if_stmt);
2883 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2884 for (i = 0; i+3 < NCH(n); i+=4) {
2885 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002886 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002887 if (is_constant_false(c, ch))
2888 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002889 if (i > 0)
2890 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002891 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002892 com_addfwref(c, JUMP_IF_FALSE, &a);
2893 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002894 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002895 com_node(c, CHILD(n, i+3));
2896 com_addfwref(c, JUMP_FORWARD, &anchor);
2897 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002898 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002899 com_addbyte(c, POP_TOP);
2900 }
2901 if (i+2 < NCH(n))
2902 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002903 if (anchor)
2904 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002905}
2906
2907static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002908com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002909{
2910 int break_anchor = 0;
2911 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002912 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002913 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2914 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002915 block_push(c, SETUP_LOOP);
2916 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002917 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002918 com_node(c, CHILD(n, 1));
2919 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2920 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002921 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002922 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002923 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002924 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002925 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2926 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002927 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002928 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002929 com_addbyte(c, POP_TOP);
2930 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002931 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002932 if (NCH(n) > 4)
2933 com_node(c, CHILD(n, 6));
2934 com_backpatch(c, break_anchor);
2935}
2936
2937static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002938com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002939{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002940 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002941 int break_anchor = 0;
2942 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002943 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002944 REQ(n, for_stmt);
2945 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2946 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002947 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002948 com_node(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002949 v = PyInt_FromLong(0L);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002950 if (v == NULL)
2951 c->c_errors++;
2952 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002953 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002954 Py_XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002955 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002956 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002957 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002958 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00002959 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002960 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002961 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002962 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002963 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2964 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002965 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002966 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002967 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002968 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002969 if (NCH(n) > 8)
2970 com_node(c, CHILD(n, 8));
2971 com_backpatch(c, break_anchor);
2972}
2973
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002974/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002975
2976 SETUP_FINALLY L
2977 <code for S>
2978 POP_BLOCK
2979 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002980 L: <code for Sf>
2981 END_FINALLY
2982
2983 The special instructions use the block stack. Each block
2984 stack entry contains the instruction that created it (here
2985 SETUP_FINALLY), the level of the value stack at the time the
2986 block stack entry was created, and a label (here L).
2987
2988 SETUP_FINALLY:
2989 Pushes the current value stack level and the label
2990 onto the block stack.
2991 POP_BLOCK:
2992 Pops en entry from the block stack, and pops the value
2993 stack until its level is the same as indicated on the
2994 block stack. (The label is ignored.)
2995 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002996 Pops a variable number of entries from the *value* stack
2997 and re-raises the exception they specify. The number of
2998 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002999
3000 The block stack is unwound when an exception is raised:
3001 when a SETUP_FINALLY entry is found, the exception is pushed
3002 onto the value stack (and the exception condition is cleared),
3003 and the interpreter jumps to the label gotten from the block
3004 stack.
3005
3006 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003007 (The contents of the value stack is shown in [], with the top
3008 at the right; 'tb' is trace-back info, 'val' the exception's
3009 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003010
3011 Value stack Label Instruction Argument
3012 [] SETUP_EXCEPT L1
3013 [] <code for S>
3014 [] POP_BLOCK
3015 [] JUMP_FORWARD L0
3016
Guido van Rossum3f5da241990-12-20 15:06:42 +00003017 [tb, val, exc] L1: DUP )
3018 [tb, val, exc, exc] <evaluate E1> )
3019 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3020 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3021 [tb, val, exc, 1] POP )
3022 [tb, val, exc] POP
3023 [tb, val] <assign to V1> (or POP if no V1)
3024 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003025 [] <code for S1>
3026 JUMP_FORWARD L0
3027
Guido van Rossum3f5da241990-12-20 15:06:42 +00003028 [tb, val, exc, 0] L2: POP
3029 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003030 .............................etc.......................
3031
Guido van Rossum3f5da241990-12-20 15:06:42 +00003032 [tb, val, exc, 0] Ln+1: POP
3033 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003034
3035 [] L0: <next statement>
3036
3037 Of course, parts are not generated if Vi or Ei is not present.
3038*/
3039
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003040static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003041com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003042{
3043 int except_anchor = 0;
3044 int end_anchor = 0;
3045 int else_anchor = 0;
3046 int i;
3047 node *ch;
3048
3049 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3050 block_push(c, SETUP_EXCEPT);
3051 com_node(c, CHILD(n, 2));
3052 com_addbyte(c, POP_BLOCK);
3053 block_pop(c, SETUP_EXCEPT);
3054 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3055 com_backpatch(c, except_anchor);
3056 for (i = 3;
3057 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3058 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003059 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003060 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003061 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003062 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003063 break;
3064 }
3065 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003066 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003067 com_addoparg(c, SET_LINENO, ch->n_lineno);
3068 if (NCH(ch) > 1) {
3069 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003070 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003071 com_node(c, CHILD(ch, 1));
3072 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003073 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003074 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3075 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003076 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003077 }
3078 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003079 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003080 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003081 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003082 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003083 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003084 com_pop(c, 1);
3085 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003086 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003087 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003088 com_node(c, CHILD(n, i+2));
3089 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3090 if (except_anchor) {
3091 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003092 /* We come in with [tb, val, exc, 0] on the
3093 stack; one pop and it's the same as
3094 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003095 com_addbyte(c, POP_TOP);
3096 }
3097 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003098 /* We actually come in here with [tb, val, exc] but the
3099 END_FINALLY will zap those and jump around.
3100 The c_stacklevel does not reflect them so we need not pop
3101 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003102 com_addbyte(c, END_FINALLY);
3103 com_backpatch(c, else_anchor);
3104 if (i < NCH(n))
3105 com_node(c, CHILD(n, i+2));
3106 com_backpatch(c, end_anchor);
3107}
3108
3109static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003110com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003111{
3112 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003113 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003114
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003115 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3116 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003117 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003118 com_addbyte(c, POP_BLOCK);
3119 block_pop(c, SETUP_FINALLY);
3120 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003121 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003122 /* While the generated code pushes only one item,
3123 the try-finally handling can enter here with
3124 up to three items. OK, here are the details:
3125 3 for an exception, 2 for RETURN, 1 for BREAK. */
3126 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003127 com_backpatch(c, finally_anchor);
3128 ch = CHILD(n, NCH(n)-1);
3129 com_addoparg(c, SET_LINENO, ch->n_lineno);
3130 com_node(c, ch);
3131 com_addbyte(c, END_FINALLY);
3132 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003133 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003134}
3135
3136static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003137com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003138{
3139 REQ(n, try_stmt);
3140 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3141 | 'try' ':' suite 'finally' ':' suite */
3142 if (TYPE(CHILD(n, 3)) != except_clause)
3143 com_try_finally(c, n);
3144 else
3145 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003146}
3147
Guido van Rossum8b993a91997-01-17 21:04:03 +00003148static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003149get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003150{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003151 int i;
3152
Guido van Rossum8b993a91997-01-17 21:04:03 +00003153 /* Label to avoid tail recursion */
3154 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003155 switch (TYPE(n)) {
3156
3157 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003158 if (NCH(n) == 1) {
3159 n = CHILD(n, 0);
3160 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003161 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003162 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003163 case file_input:
3164 for (i = 0; i < NCH(n); i++) {
3165 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003166 if (TYPE(ch) == stmt) {
3167 n = ch;
3168 goto next;
3169 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003170 }
3171 break;
3172
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003173 case stmt:
3174 case simple_stmt:
3175 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003176 n = CHILD(n, 0);
3177 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003178
3179 case expr_stmt:
3180 case testlist:
3181 case test:
3182 case and_test:
3183 case not_test:
3184 case comparison:
3185 case expr:
3186 case xor_expr:
3187 case and_expr:
3188 case shift_expr:
3189 case arith_expr:
3190 case term:
3191 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003192 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003193 if (NCH(n) == 1) {
3194 n = CHILD(n, 0);
3195 goto next;
3196 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003197 break;
3198
3199 case atom:
3200 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003201 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003202 break;
3203
3204 }
3205 return NULL;
3206}
3207
Guido van Rossum79f25d91997-04-29 20:08:16 +00003208static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003209get_docstring(node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003210{
Guido van Rossum541563e1999-01-28 15:08:09 +00003211 /* Don't generate doc-strings if run with -OO */
3212 if (Py_OptimizeFlag > 1)
3213 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003214 n = get_rawdocstring(n);
3215 if (n == NULL)
3216 return NULL;
3217 return parsestrplus(n);
3218}
3219
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003220static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003221com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003222{
3223 REQ(n, suite);
3224 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3225 if (NCH(n) == 1) {
3226 com_node(c, CHILD(n, 0));
3227 }
3228 else {
3229 int i;
3230 for (i = 0; i < NCH(n); i++) {
3231 node *ch = CHILD(n, i);
3232 if (TYPE(ch) == stmt)
3233 com_node(c, ch);
3234 }
3235 }
3236}
3237
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003238/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003239static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003240com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003241{
3242 int i = c->c_nblocks;
3243 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3244 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3245 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003246 else if (i <= 0) {
3247 /* at the outer level */
3248 com_error(c, PyExc_SyntaxError,
3249 "'continue' not properly in loop");
3250 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003251 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003252 int j;
3253 for (j = 0; j <= i; ++j) {
3254 if (c->c_block[j] == SETUP_LOOP)
3255 break;
3256 }
3257 if (j < i+1) {
3258 /* there is a loop, but something interferes */
3259 for (++j; j <= i; ++j) {
3260 if (c->c_block[i] == SETUP_EXCEPT
3261 || c->c_block[i] == SETUP_FINALLY) {
3262 com_error(c, PyExc_SyntaxError,
3263 "'continue' not supported inside 'try' clause");
3264 return;
3265 }
3266 }
3267 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003268 com_error(c, PyExc_SyntaxError,
3269 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003270 }
3271 /* XXX Could allow it inside a 'finally' clause
3272 XXX if we could pop the exception still on the stack */
3273}
3274
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003275static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003276com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003277{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003278 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003279 if (TYPE(n) == lambdef) {
3280 /* lambdef: 'lambda' [varargslist] ':' test */
3281 n = CHILD(n, 1);
3282 }
3283 else {
3284 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3285 n = CHILD(n, 2);
3286 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3287 n = CHILD(n, 1);
3288 }
3289 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003290 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003291 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003292 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003293 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3294 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003295 nargs = 0;
3296 ndefs = 0;
3297 for (i = 0; i < nch; i++) {
3298 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003299 if (TYPE(CHILD(n, i)) == STAR ||
3300 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003301 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003302 nargs++;
3303 i++;
3304 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003305 t = RPAR; /* Anything except EQUAL or COMMA */
3306 else
3307 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003308 if (t == EQUAL) {
3309 i++;
3310 ndefs++;
3311 com_node(c, CHILD(n, i));
3312 i++;
3313 if (i >= nch)
3314 break;
3315 t = TYPE(CHILD(n, i));
3316 }
3317 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003318 /* Treat "(a=1, b)" as an error */
3319 if (ndefs)
3320 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003321 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003322 }
3323 if (t != COMMA)
3324 break;
3325 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003326 return ndefs;
3327}
3328
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003329static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003330com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003331{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003332 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003333 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003334 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003335 ndefs = com_argdefs(c, n);
3336 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003337 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003338 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003339 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003340 c->c_errors++;
3341 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003342 int closure = com_make_closure(c, (PyCodeObject *)co);
3343 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003344 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003345 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003346 if (closure)
3347 com_addoparg(c, MAKE_CLOSURE, ndefs);
3348 else
3349 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003350 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003351 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003352 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003353 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003354 }
3355}
3356
3357static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003358com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003359{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003360 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003361 REQ(n, testlist);
3362 /* testlist: test (',' test)* [','] */
3363 for (i = 0; i < NCH(n); i += 2)
3364 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003365 i = (NCH(n)+1) / 2;
3366 com_addoparg(c, BUILD_TUPLE, i);
3367 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003368}
3369
3370static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003371com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003372{
Guido van Rossum25831651993-05-19 14:50:45 +00003373 int i;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003374 PyObject *co, *v;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003375 char *name;
3376
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003377 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003378 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003379 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003380 c->c_errors++;
3381 return;
3382 }
3383 /* Push the class name on the stack */
3384 i = com_addconst(c, v);
3385 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003386 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003387 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003388 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003389 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003390 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003391 com_push(c, 1);
3392 }
Guido van Rossum25831651993-05-19 14:50:45 +00003393 else
3394 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003395 name = STR(CHILD(n, 1));
3396 symtable_enter_scope(c->c_symtable, name, TYPE(n));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003397 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003398 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003399 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003400 c->c_errors++;
3401 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003402 int closure = com_make_closure(c, (PyCodeObject *)co);
3403 i = com_addconst(c, co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003404 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003405 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003406 if (closure)
3407 com_addoparg(c, MAKE_CLOSURE, 0);
3408 else
3409 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003410 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003411 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003412 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003413 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003414 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003415 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003416}
3417
3418static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003419com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003420{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003421 loop:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003422 switch (TYPE(n)) {
3423
3424 /* Definition nodes */
3425
3426 case funcdef:
3427 com_funcdef(c, n);
3428 break;
3429 case classdef:
3430 com_classdef(c, n);
3431 break;
3432
3433 /* Trivial parse tree nodes */
3434
3435 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003436 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003437 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003438 n = CHILD(n, 0);
3439 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003440
3441 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003442 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
3443 com_addoparg(c, SET_LINENO, n->n_lineno);
3444 {
3445 int i;
3446 for (i = 0; i < NCH(n)-1; i += 2)
3447 com_node(c, CHILD(n, i));
3448 }
3449 break;
3450
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003451 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003452 com_addoparg(c, SET_LINENO, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003453 n = CHILD(n, 0);
3454 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003455
3456 /* Statement nodes */
3457
3458 case expr_stmt:
3459 com_expr_stmt(c, n);
3460 break;
3461 case print_stmt:
3462 com_print_stmt(c, n);
3463 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003464 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003465 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003466 break;
3467 case pass_stmt:
3468 break;
3469 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003470 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003471 com_error(c, PyExc_SyntaxError,
3472 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003473 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003474 com_addbyte(c, BREAK_LOOP);
3475 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003476 case continue_stmt:
3477 com_continue_stmt(c, n);
3478 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003479 case return_stmt:
3480 com_return_stmt(c, n);
3481 break;
3482 case raise_stmt:
3483 com_raise_stmt(c, n);
3484 break;
3485 case import_stmt:
3486 com_import_stmt(c, n);
3487 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003488 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003489 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003490 case exec_stmt:
3491 com_exec_stmt(c, n);
3492 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003493 case assert_stmt:
3494 com_assert_stmt(c, n);
3495 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003496 case if_stmt:
3497 com_if_stmt(c, n);
3498 break;
3499 case while_stmt:
3500 com_while_stmt(c, n);
3501 break;
3502 case for_stmt:
3503 com_for_stmt(c, n);
3504 break;
3505 case try_stmt:
3506 com_try_stmt(c, n);
3507 break;
3508 case suite:
3509 com_suite(c, n);
3510 break;
3511
3512 /* Expression nodes */
3513
3514 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003515 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003516 break;
3517 case test:
3518 com_test(c, n);
3519 break;
3520 case and_test:
3521 com_and_test(c, n);
3522 break;
3523 case not_test:
3524 com_not_test(c, n);
3525 break;
3526 case comparison:
3527 com_comparison(c, n);
3528 break;
3529 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003530 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003531 break;
3532 case expr:
3533 com_expr(c, n);
3534 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003535 case xor_expr:
3536 com_xor_expr(c, n);
3537 break;
3538 case and_expr:
3539 com_and_expr(c, n);
3540 break;
3541 case shift_expr:
3542 com_shift_expr(c, n);
3543 break;
3544 case arith_expr:
3545 com_arith_expr(c, n);
3546 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003547 case term:
3548 com_term(c, n);
3549 break;
3550 case factor:
3551 com_factor(c, n);
3552 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003553 case power:
3554 com_power(c, n);
3555 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003556 case atom:
3557 com_atom(c, n);
3558 break;
3559
3560 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003561 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003562 com_error(c, PyExc_SystemError,
3563 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003564 }
3565}
3566
Tim Petersdbd9ba62000-07-09 03:09:57 +00003567static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003568
3569static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003570com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003571{
3572 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3573 if (TYPE(CHILD(n, 0)) == LPAR)
3574 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003575 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003576 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003577 com_pop(c, 1);
3578 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003579}
3580
3581static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003582com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003583{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003584 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003585 if (NCH(n) == 1) {
3586 com_fpdef(c, CHILD(n, 0));
3587 }
3588 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003589 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003590 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003591 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003592 for (i = 0; i < NCH(n); i += 2)
3593 com_fpdef(c, CHILD(n, i));
3594 }
3595}
3596
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003597/* XXX This function could probably be made simpler, because it
3598 doesn't do anything except generate code for complex arguments.
3599*/
3600
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003601static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003602com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003603{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003604 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003605 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003606 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003607 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003608 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003609 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003610 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003611 /* Enter all arguments in table of locals */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003612 for (i = 0, narg = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003613 node *ch = CHILD(n, i);
3614 node *fp;
3615 char *name;
Guido van Rossum50564e81996-01-12 01:13:16 +00003616 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003617 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003618 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3619 fp = CHILD(ch, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003620 if (TYPE(fp) == NAME) {
3621 PyObject *v;
3622 name = STR(fp);
3623 v = PyDict_GetItemString(c->c_cellvars, name);
3624 if (v) {
3625 com_addoparg(c, LOAD_FAST, narg);
3626 com_addoparg(c, STORE_DEREF,
3627 PyInt_AS_LONG(v));
3628 }
3629 } else {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003630 name = nbuf;
3631 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003632 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003633 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003634 narg++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003635 /* all name updates handled by symtable */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003636 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003637 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003638 ch = CHILD(n, i);
3639 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003640 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003641 else
3642 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003643 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003644 /* Handle *arguments */
3645 if (i < nch) {
3646 node *ch;
3647 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003648 if (TYPE(ch) != DOUBLESTAR) {
3649 REQ(ch, STAR);
3650 ch = CHILD(n, i+1);
3651 if (TYPE(ch) == NAME) {
Guido van Rossum50564e81996-01-12 01:13:16 +00003652 i += 3;
Guido van Rossum50564e81996-01-12 01:13:16 +00003653 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003654 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003655 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003656 /* Handle **keywords */
3657 if (i < nch) {
3658 node *ch;
3659 ch = CHILD(n, i);
Guido van Rossum50564e81996-01-12 01:13:16 +00003660 if (TYPE(ch) != DOUBLESTAR) {
3661 REQ(ch, STAR);
3662 ch = CHILD(n, i+1);
3663 REQ(ch, STAR);
3664 ch = CHILD(n, i+2);
3665 }
3666 else
3667 ch = CHILD(n, i+1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003668 REQ(ch, NAME);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003669 }
3670 if (complex) {
3671 /* Generate code for complex arguments only after
3672 having counted the simple arguments */
3673 int ilocal = 0;
3674 for (i = 0; i < nch; i++) {
3675 node *ch = CHILD(n, i);
3676 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003677 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003678 break;
3679 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3680 fp = CHILD(ch, 0);
3681 if (TYPE(fp) != NAME) {
3682 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003683 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003684 com_fpdef(c, ch);
3685 }
3686 ilocal++;
3687 if (++i >= nch)
3688 break;
3689 ch = CHILD(n, i);
3690 if (TYPE(ch) == EQUAL)
3691 i += 2;
3692 else
3693 REQ(ch, COMMA);
3694 }
3695 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003696}
3697
3698static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003699com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003700{
3701 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003702 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003703 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003704 doc = get_docstring(n);
3705 if (doc != NULL) {
3706 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003707 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003708 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003709 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003710 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003711 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003712 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003713 for (i = 0; i < NCH(n); i++) {
3714 node *ch = CHILD(n, i);
3715 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3716 com_node(c, ch);
3717 }
3718}
3719
3720/* Top-level compile-node interface */
3721
3722static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003723compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003724{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003725 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003726 node *ch;
3727 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003728 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003729 doc = get_docstring(CHILD(n, 4));
3730 if (doc != NULL) {
3731 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003732 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003733 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003734 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003735 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003736 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3737 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003738 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003739 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003740 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003741 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003742 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003743 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003744 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003745 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003746 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003747}
3748
3749static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003750compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003751{
Guido van Rossum590baa41993-11-30 13:40:46 +00003752 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003753 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003754 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003755
3756 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003757 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003758 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003759 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003760 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003761 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003762 else
3763 ch = CHILD(n, 2);
3764 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003765 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003766 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003767}
3768
3769static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003770compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003771{
3772 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003773 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003774 REQ(n, classdef);
3775 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3776 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003777 c->c_private = c->c_name;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003778 ch = CHILD(n, NCH(n)-1); /* The suite */
3779 doc = get_docstring(ch);
3780 if (doc != NULL) {
3781 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003782 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003783 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003784 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003785 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003786 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003787 }
3788 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003789 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003790 com_node(c, ch);
3791 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003792 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003793 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003794 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003795}
3796
3797static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003798compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003799{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003800 com_addoparg(c, SET_LINENO, n->n_lineno);
3801
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003802 switch (TYPE(n)) {
3803
Guido van Rossum4c417781991-01-21 16:09:22 +00003804 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003805 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003806 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003807 n = CHILD(n, 0);
3808 if (TYPE(n) != NEWLINE)
3809 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003810 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003811 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003812 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003813 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003814 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003815 break;
3816
Guido van Rossum4c417781991-01-21 16:09:22 +00003817 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003818 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003819 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003820 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003821 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003822 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003823 break;
3824
Guido van Rossum590baa41993-11-30 13:40:46 +00003825 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003826 com_node(c, CHILD(n, 0));
3827 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003828 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003829 break;
3830
Guido van Rossum590baa41993-11-30 13:40:46 +00003831 case lambdef: /* anonymous function definition */
3832 compile_lambdef(c, n);
3833 break;
3834
Guido van Rossum4c417781991-01-21 16:09:22 +00003835 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003836 compile_funcdef(c, n);
3837 break;
3838
Guido van Rossum4c417781991-01-21 16:09:22 +00003839 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003840 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003841 break;
3842
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003843 default:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003844 /* XXX fprintf(stderr, "node type %d\n", TYPE(n)); */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003845 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003846 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003847 }
3848}
3849
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003850static PyObject *
3851dict_keys_inorder(PyObject *dict, int offset)
3852{
3853 PyObject *tuple, *k, *v;
3854 int i, pos = 0, size = PyDict_Size(dict);
3855
3856 tuple = PyTuple_New(size);
3857 if (tuple == NULL)
3858 return NULL;
3859 while (PyDict_Next(dict, &pos, &k, &v)) {
3860 i = PyInt_AS_LONG(v);
3861 Py_INCREF(k);
3862 PyTuple_SET_ITEM(tuple, i - offset, k);
3863 }
3864 return tuple;
3865}
3866
Guido van Rossum79f25d91997-04-29 20:08:16 +00003867PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003868PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003869{
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003870 return jcompile(n, filename, NULL);
3871}
3872
Guido van Rossum79f25d91997-04-29 20:08:16 +00003873static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003874icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003875{
3876 return jcompile(n, base->c_filename, base);
3877}
3878
Guido van Rossum79f25d91997-04-29 20:08:16 +00003879static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003880jcompile(node *n, char *filename, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003881{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003882 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003883 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003884 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003885 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003886 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003887 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003888 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003889 /* c_symtable still points to parent's symbols */
3890 if (base->c_nested
3891 || (sc.c_symtable->st_cur_type == TYPE_FUNCTION))
3892 sc.c_nested = 1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003893 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003894 sc.c_private = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003895 if (symtable_build(&sc, n) < 0) {
3896 com_free(&sc);
3897 return NULL;
3898 }
3899 }
3900 co = NULL;
3901 if (symtable_load_symbols(&sc) < 0)
3902 goto exit;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003903 compile_node(&sc, n);
3904 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00003905 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003906 PyObject *consts, *names, *varnames, *filename, *name,
3907 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003908 consts = PyList_AsTuple(sc.c_consts);
3909 names = PyList_AsTuple(sc.c_names);
3910 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003911 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
3912 freevars = dict_keys_inorder(sc.c_freevars,
3913 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003914 filename = PyString_InternFromString(sc.c_filename);
3915 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003916 if (!PyErr_Occurred())
3917 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003918 sc.c_nlocals,
3919 sc.c_maxstacklevel,
3920 sc.c_flags,
3921 sc.c_code,
3922 consts,
3923 names,
3924 varnames,
3925 freevars,
3926 cellvars,
3927 filename,
3928 name,
3929 sc.c_firstlineno,
3930 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003931 Py_XDECREF(consts);
3932 Py_XDECREF(names);
3933 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003934 Py_XDECREF(freevars);
3935 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003936 Py_XDECREF(filename);
3937 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003938 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00003939 else if (!PyErr_Occurred()) {
3940 /* This could happen if someone called PyErr_Clear() after an
3941 error was reported above. That's not supposed to happen,
3942 but I just plugged one case and I'm not sure there can't be
3943 others. In that case, raise SystemError so that at least
3944 it gets reported instead dumping core. */
3945 PyErr_SetString(PyExc_SystemError, "lost syntax error");
3946 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003947 exit:
3948 if (base == NULL)
3949 symtable_free(sc.c_symtable);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003950 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003951 return co;
3952}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003953
3954int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003955PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003956{
3957 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003958 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003959 int line = co->co_firstlineno;
3960 int addr = 0;
3961 while (--size >= 0) {
3962 addr += *p++;
3963 if (addr > addrq)
3964 break;
3965 line += *p++;
3966 }
3967 return line;
3968}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003969
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003970/* The test for LOCAL must come before the test for FREE in order to
3971 handle classes where name is both local and free. The local var is
3972 a method and the free var is a free var referenced within a method.
3973*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003974
3975static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003976get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003977{
3978 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003979 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
3980 return CELL;
3981 if (PyDict_GetItemString(c->c_locals, name) != NULL)
3982 return LOCAL;
3983 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
3984 return FREE;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003985 v = PyDict_GetItemString(c->c_globals, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003986 if (v) {
3987 if (v == Py_None)
3988 return GLOBAL_EXPLICIT;
3989 else {
3990 return GLOBAL_IMPLICIT;
3991 }
3992 }
3993 {
3994 char buf[250];
3995 sprintf(buf, "unknown scope for %.100s in %.100s (%s)",
3996 name, c->c_name, REPR(c->c_symtable->st_cur_id));
3997 Py_FatalError(buf);
3998 }
3999 return -1; /* can't get here */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004000}
4001
4002static int
4003symtable_build(struct compiling *c, node *n)
4004{
4005 if ((c->c_symtable = symtable_init()) == NULL)
4006 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004007 if (symtable_enter_scope(c->c_symtable, TOP, TYPE(n)) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004008 return -1;
4009 symtable_node(c->c_symtable, n);
4010 /* reset for second pass */
4011 c->c_symtable->st_scopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004012 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004013 return 0;
4014}
4015
4016static int
4017symtable_load_symbols(struct compiling *c)
4018{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004019 static PyObject *implicit = NULL;
4020 PyObject *name, *varnames, *v;
4021 int i, info, pos;
4022 int nlocals, nfrees, ncells;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004023 struct symtable *st = c->c_symtable;
4024
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004025 if (implicit == NULL) {
4026 implicit = PyInt_FromLong(1);
4027 if (implicit == NULL)
4028 return -1;
4029 }
4030 v = NULL;
4031
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004032 varnames = PyDict_GetItem(st->st_varnames, st->st_cur_id);
4033 if (varnames == NULL) {
4034 varnames = PyList_New(0);
4035 if (varnames == NULL)
4036 return -1;
4037 } else
4038 Py_INCREF(varnames);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004039 c->c_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004040
4041 c->c_globals = PyDict_New();
4042 if (c->c_globals == NULL)
4043 goto fail;
4044 c->c_freevars = PyDict_New();
4045 if (c->c_freevars == NULL)
4046 goto fail;
4047 c->c_cellvars = PyDict_New();
4048 if (c->c_cellvars == NULL)
4049 goto fail;
4050
4051 nlocals = PyList_GET_SIZE(varnames);
4052 c->c_argcount = nlocals;
4053 nfrees = 0;
4054 ncells = 0;
4055 for (i = 0; i < nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004056 v = PyInt_FromLong(i);
4057 if (PyDict_SetItem(c->c_locals,
4058 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004059 goto fail;
4060 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004061 }
4062
4063 /* XXX The cases below define the rules for whether a name is
4064 local or global. The logic could probably be clearer. */
4065 pos = 0;
4066 while (PyDict_Next(st->st_cur, &pos, &name, &v)) {
4067 info = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004068
4069 if (info & DEF_FREE_GLOBAL)
4070 /* undo the original DEF_FREE */
4071 info &= ~(DEF_FREE | DEF_FREE_CLASS);
4072
4073
4074 /* Seperate logic for DEF_FREE. If it occurs in a
4075 function, it indicates a local that we must
4076 allocate storage for (a cell var). If it occurs in
4077 a class, then the class has a method and a free
4078 variable with the same name.
4079 */
4080
4081 if ((info & (DEF_FREE | DEF_FREE_CLASS))
4082 && (info & (DEF_LOCAL | DEF_PARAM))) {
4083 PyObject *dict;
4084 if (st->st_cur_type == TYPE_FUNCTION) {
4085 v = PyInt_FromLong(ncells++);
4086 dict = c->c_cellvars;
4087 } else {
4088 v = PyInt_FromLong(nfrees++);
4089 dict = c->c_freevars;
4090 }
4091 if (v == NULL)
4092 return -1;
4093 if (PyDict_SetItem(dict, name, v) < 0)
4094 goto fail;
4095 Py_DECREF(v);
4096 }
4097
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004098 if (info & DEF_STAR) {
4099 c->c_argcount--;
4100 c->c_flags |= CO_VARARGS;
4101 } else if (info & DEF_DOUBLESTAR) {
4102 c->c_argcount--;
4103 c->c_flags |= CO_VARKEYWORDS;
4104 } else if (info & DEF_INTUPLE)
4105 c->c_argcount--;
4106 else if (info & DEF_GLOBAL) {
4107 if ((info & DEF_PARAM)
4108 && (PyString_AS_STRING(name)[0] != '.')){
4109 char buf[500];
4110 sprintf(buf,
4111 "name '%.400s' is local and global",
4112 PyString_AS_STRING(name));
4113 com_error(c, PyExc_SyntaxError, buf);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004114 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004115 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004116 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4117 goto fail;
4118 } else if (info & DEF_FREE_GLOBAL) {
4119 if (PyDict_SetItem(c->c_globals, name, implicit) < 0)
4120 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004121 } else if ((info & DEF_LOCAL) && !(info & DEF_PARAM)) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004122 v = PyInt_FromLong(nlocals++);
4123 if (v == NULL)
4124 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004125 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004126 goto fail;
4127 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004128 if (st->st_cur_type != TYPE_CLASS)
4129 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004130 goto fail;
4131 } else if (is_free(info)) {
4132 if (st->st_nested) {
4133 v = PyInt_FromLong(nfrees++);
4134 if (v == NULL)
4135 goto fail;
4136 if (PyDict_SetItem(c->c_freevars,
4137 name, v) < 0)
4138 goto fail;
4139 Py_DECREF(v);
4140 } else {
4141 if (PyDict_SetItem(c->c_globals, name,
4142 implicit) < 0)
4143 goto fail;
4144 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004145 }
4146 }
4147
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004148 /* The cell vars are the first elements of the closure,
4149 followed by the free vars. Update the offsets in
4150 c_freevars to account for number of cellvars. */
4151 pos = 0;
4152 while (PyDict_Next(c->c_freevars, &pos, &name, &v)) {
4153 int i = PyInt_AS_LONG(v) + ncells;
4154 PyObject *o = PyInt_FromLong(i);
4155 if (PyDict_SetItem(c->c_freevars, name, o) < 0) {
4156 Py_DECREF(o);
4157 return -1;
4158 }
4159 Py_DECREF(o);
4160 }
4161
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004162 if (st->st_cur_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004163 c->c_nlocals = nlocals;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004164
4165 if (st->st_cur_type != TYPE_MODULE)
4166 c->c_flags |= CO_NEWLOCALS;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004167 if (st->st_cur_type == TYPE_FUNCTION) {
4168 if (PyDict_GetItemString(st->st_cur, NOOPT) == NULL)
4169 c->c_flags |= CO_OPTIMIZED;
4170 else if (ncells || nfrees) {
4171 char buf[256];
4172 /* XXX need better error message */
4173 sprintf(buf,
4174 "function %.100s: may not use lexical scoping"
4175 " and 'import *' or exec in same function",
4176 PyString_AS_STRING(st->st_cur_name));
4177 com_error(c, PyExc_SyntaxError, buf);
4178 return -1;
4179 }
4180 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004181 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004182
4183 fail:
4184 /* is this always the right thing to do? */
4185 Py_XDECREF(v);
4186 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004187}
4188
4189static struct symtable *
4190symtable_init()
4191{
4192 struct symtable *st;
4193 PyObject *d;
4194
4195 st = (struct symtable *)PyMem_Malloc(sizeof(struct symtable));
4196 if (st == NULL)
4197 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004198 st->st_pass = 1;
4199 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004200 goto fail;
4201 if ((st->st_symbols = PyDict_New()) == NULL)
4202 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004203 if ((st->st_children = PyDict_New()) == NULL)
4204 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004205 if ((st->st_varnames = PyDict_New()) == NULL)
4206 goto fail;
4207 if ((d = PyDict_New()) == NULL)
4208 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004209 if (PyDict_SetItemString(st->st_symbols, TOP, d) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004210 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004211 Py_DECREF(d);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004212 st->st_global = d;
4213 st->st_cur = NULL;
4214 st->st_cur_id = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004215 st->st_cur_name = NULL;
4216 st->st_cur_children = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004217 st->st_cur_type = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004218 st->st_nested = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004219 st->st_scopes = 0;
4220 st->st_errors = 0;
4221 st->st_tmpname = 0;
4222 st->st_private = NULL;
4223 return st;
4224 fail:
4225 symtable_free(st);
4226 return NULL;
4227}
4228
4229static void
4230symtable_free(struct symtable *st)
4231{
4232 Py_XDECREF(st->st_symbols);
4233 Py_XDECREF(st->st_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004234 Py_XDECREF(st->st_children);
4235 Py_XDECREF(st->st_stack);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004236 Py_XDECREF(st->st_cur_id);
4237 PyMem_Free((void *)st);
4238}
4239
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004240static PyObject *
4241make_scope_info(PyObject *id, PyObject *name, int nested, int type)
4242{
4243 PyObject *t, *i1 = NULL, *i2 = NULL;
4244
4245 t = PyTuple_New(4);
4246 if (t == NULL)
4247 return NULL;
4248 i1 = PyInt_FromLong(nested);
4249 if (i1 == NULL)
4250 goto fail;
4251 i2 = PyInt_FromLong(type);
4252 if (i2 == NULL)
4253 goto fail;
4254
4255 Py_INCREF(name);
4256 Py_INCREF(id);
4257 PyTuple_SET_ITEM(t, 0, name);
4258 PyTuple_SET_ITEM(t, 1, id);
4259 /* i1 & i2 alloced here; don't need incref */
4260 PyTuple_SET_ITEM(t, 2, i1);
4261 PyTuple_SET_ITEM(t, 3, i2);
4262 return t;
4263 fail:
4264 Py_XDECREF(t);
4265 Py_XDECREF(i1);
4266 Py_XDECREF(i2);
4267 return NULL;
4268}
4269
4270/* When the compiler exits a scope, it must should update the scope's
4271 free variable information with the list of free variables in its
4272 children.
4273
4274 Variables that are free in children and defined in the current
4275 scope are cellvars.
4276
4277 If the scope being exited is defined at the top-level (st_nested is
4278 false), free variables in children that are not defined here are
4279 implicit globals.
4280
4281*/
4282
4283static int
4284symtable_update_free_vars(struct symtable *st)
4285{
4286 PyObject *dict, *o, *child, *name;
4287 int i, def;
4288
4289 if (st->st_cur_type == TYPE_CLASS)
4290 def = DEF_FREE_CLASS;
4291 else
4292 def = DEF_FREE;
4293 for (i = 0; i < PyList_GET_SIZE(st->st_cur_children); ++i) {
4294 int pos = 0;
4295
4296 child = PyList_GET_ITEM(st->st_cur_children, i);
4297 dict = PyDict_GetItem(st->st_symbols, child);
4298 if (dict == NULL)
4299 return -1;
4300 while (PyDict_Next(dict, &pos, &name, &o)) {
4301 int v = PyInt_AS_LONG(o);
4302 if (!(is_free(v)))
4303 continue; /* avoids indentation */
4304 if (st->st_nested) {
4305 if (symtable_add_def_o(st, st->st_cur,
4306 name, def) < 0)
4307 return -1;
4308 } else {
4309 if (symtable_check_global(st, child,
4310 name) < 0)
4311 return -1;
4312 }
4313 }
4314 }
4315
4316 return 0;
4317}
4318
4319/* If the current scope is a non-nested class or if name is not
4320 defined in the current, non-nested scope, then it is an implicit
4321 global in all nested scopes.
4322*/
4323
4324static int
4325symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
4326{
4327 PyObject *o;
4328 int v;
4329
4330 if (st->st_cur_type == TYPE_CLASS)
4331 return symtable_undo_free(st, child, name);
4332 o = PyDict_GetItem(st->st_cur, name);
4333 if (o == NULL)
4334 return symtable_undo_free(st, child, name);
4335 v = PyInt_AS_LONG(o);
4336 if (is_free(v))
4337 return symtable_undo_free(st, child, name);
4338 else
4339 return symtable_add_def_o(st, st->st_cur, name, DEF_FREE);
4340}
4341
4342static int
4343symtable_undo_free(struct symtable *st, PyObject *id,
4344 PyObject *name)
4345{
4346 int i, v, x;
4347 PyObject *dict, *children, *info;
4348
4349 dict = PyDict_GetItem(st->st_symbols, id);
4350 if (dict == NULL)
4351 return -1;
4352 info = PyDict_GetItem(dict, name);
4353 if (info == NULL)
4354 return 0;
4355 v = PyInt_AS_LONG(info);
4356 if (is_free(v)) {
4357 if (symtable_add_def_o(st, dict, name,
4358 DEF_FREE_GLOBAL) < 0)
4359 return -1;
4360 } else
4361 /* If the name is defined here or declared global,
4362 then the recursion stops. */
4363 return 0;
4364
4365 children = PyDict_GetItem(st->st_children, id);
4366 for (i = 0; i < PyList_GET_SIZE(children); ++i) {
4367 x = symtable_undo_free(st, PyList_GET_ITEM(children, i),
4368 name);
4369 if (x < 0)
4370 return x;
4371 }
4372 return 0;
4373}
4374
4375
4376static int
4377symtable_exit_scope(struct symtable *st)
4378{
4379 PyObject *o;
4380 int end;
4381
4382 if (st->st_pass == 1)
4383 symtable_update_free_vars(st);
4384 if (st->st_cur_name) {
4385 Py_XDECREF(st->st_cur_name);
4386 Py_XDECREF(st->st_cur_id);
4387 }
4388 end = PyList_GET_SIZE(st->st_stack) - 1;
4389 o = PyList_GET_ITEM(st->st_stack, end);
4390 st->st_cur_name = PyTuple_GET_ITEM(o, 0);
4391 st->st_cur_id = PyTuple_GET_ITEM(o, 1);
4392 st->st_nested = PyInt_AS_LONG(PyTuple_GET_ITEM(o, 2));
4393 st->st_cur_type = PyInt_AS_LONG(PyTuple_GET_ITEM(o, 3));
4394 if (PySequence_DelItem(st->st_stack, end) < 0)
4395 return -1;
4396 return symtable_update_cur(st);
4397}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004398
4399static int
4400symtable_enter_scope(struct symtable *st, char *name, int type)
4401{
4402 PyObject *o;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004403
4404 if (st->st_cur) {
4405 /* push current scope info on stack */
4406 o = make_scope_info(st->st_cur_id, st->st_cur_name,
4407 st->st_nested, st->st_cur_type);
4408 if (o == NULL)
4409 return -1;
4410 if (PyList_Append(st->st_stack, o) < 0) {
4411 Py_DECREF(o);
4412 return -1;
4413 }
4414 Py_DECREF(o);
4415 }
4416 st->st_cur_name = PyString_FromString(name);
4417 if (st->st_nested || st->st_cur_type == TYPE_FUNCTION)
4418 st->st_nested = 1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004419 switch (type) {
4420 case funcdef:
4421 case lambdef:
4422 st->st_cur_type = TYPE_FUNCTION;
4423 break;
4424 case classdef:
4425 st->st_cur_type = TYPE_CLASS;
4426 break;
4427 case single_input:
4428 case eval_input:
4429 case file_input:
4430 st->st_cur_type = TYPE_MODULE;
4431 break;
4432 default:
4433 fprintf(stderr, "invalid symtable scope: %d\n", type);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004434 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004435 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004436 /* update st_cur_id and parent's st_cur_children */
4437 o = PyInt_FromLong(st->st_scopes++);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004438 if (o == NULL)
4439 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004440 if (st->st_cur_children) {
4441 if (PyList_Append(st->st_cur_children, o) < 0) {
4442 Py_DECREF(o);
4443 return -1;
4444 }
4445 }
4446 st->st_cur_id = o;
4447 /* create st_cur_children list */
4448 o = PyList_New(0);
4449 if (o == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004450 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004451 if (PyDict_SetItem(st->st_children, st->st_cur_id, o) < 0) {
4452 Py_DECREF(o);
4453 return -1;
4454 }
4455 Py_DECREF(o);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004456
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004457 return symtable_update_cur(st);
4458}
4459
4460static int
4461symtable_update_cur(struct symtable *st)
4462{
4463 PyObject *s, *d, *l;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004464
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004465 s = st->st_cur_id;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004466 d = PyDict_GetItem(st->st_symbols, s);
4467 if (d == NULL) {
4468 if ((d = PyDict_New()) == NULL)
4469 return -1;
4470 if (PyObject_SetItem(st->st_symbols, s, d) < 0) {
4471 Py_DECREF(d);
4472 return -1;
4473 }
4474 if (st->st_cur_type == TYPE_FUNCTION) {
4475 if ((l = PyList_New(0)) == NULL)
4476 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004477 if (PyDict_SetItem(st->st_varnames, s, l) < 0) {
4478 Py_DECREF(l);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004479 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004480 }
4481 Py_DECREF(l);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004482 }
4483 }
4484
4485 st->st_cur = d;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004486
4487 d = PyDict_GetItem(st->st_children, s);
4488 if (d == NULL)
4489 return -1;
4490 st->st_cur_children = d;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004491 return 0;
4492}
4493
4494static int
4495symtable_mangle(struct symtable *st, char *name, char *buffer, size_t maxlen)
4496{
4497 return mangle(st->st_private, name, buffer, maxlen);
4498}
4499
4500static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004501symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004502{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004503 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004504 char buffer[MANGLE_LEN];
4505
4506 if (symtable_mangle(st, name, buffer, sizeof(buffer)))
4507 name = buffer;
4508 if ((s = PyString_InternFromString(name)) == NULL)
4509 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004510 return symtable_add_def_o(st, st->st_cur, s, flag);
4511}
4512
4513/* Must only be called with mangled names */
4514
4515static int
4516symtable_add_def_o(struct symtable *st, PyObject *dict,
4517 PyObject *name, int flag)
4518{
4519 PyObject *o;
4520 int val;
4521
4522/* fprintf(stderr, "def(%s, %d)\n", REPR(name), flag); */
4523 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004524 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004525 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004526 PyErr_Format(PyExc_SyntaxError,
4527 "duplicate argument '%s' in function definition",
4528 name);
4529 return -1;
4530 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004531 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004532 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004533 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004534 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004535 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004536 Py_DECREF(o);
4537 return -1;
4538 }
4539 Py_DECREF(o);
4540
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004541 if (flag & DEF_PARAM) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004542 PyObject *l = PyDict_GetItem(st->st_varnames,
4543 st->st_cur_id);
4544 if (l == NULL)
4545 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004546 if (PyList_Append(l, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004547 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004548 } else if (flag & DEF_GLOBAL) {
4549 /* XXX need to update DEF_GLOBAL for other flags too;
4550 perhaps only DEF_FREE_GLOBAL */
4551 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004552 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004553 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004554 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004555 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004556 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004557 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004558 Py_DECREF(o);
4559 return -1;
4560 }
4561 Py_DECREF(o);
4562 }
4563 return 0;
4564}
4565
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004566#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004567
4568static void
4569symtable_node(struct symtable *st, node *n)
4570{
4571 int i, start = 0;
4572
4573 loop:
4574 switch (TYPE(n)) {
4575 case funcdef: {
4576 char *func_name = STR(CHILD(n, 1));
4577 symtable_add_def(st, func_name, DEF_LOCAL);
4578 symtable_default_args(st, CHILD(n, 2));
4579 symtable_enter_scope(st, func_name, TYPE(n));
4580 symtable_funcdef(st, n);
4581 symtable_exit_scope(st);
4582 break;
4583 }
4584 case lambdef:
4585 if (NCH(n) == 4)
4586 symtable_default_args(st, CHILD(n, 1));
4587 symtable_enter_scope(st, "lambda", TYPE(n));
4588 symtable_funcdef(st, n);
4589 symtable_exit_scope(st);
4590 break;
4591 case classdef: {
4592 char *tmp, *class_name = STR(CHILD(n, 1));
4593 symtable_add_def(st, class_name, DEF_LOCAL);
4594 if (TYPE(CHILD(n, 2)) == LPAR) {
4595 node *bases = CHILD(n, 3);
4596 int i;
4597 for (i = 0; i < NCH(bases); i += 2) {
4598 symtable_node(st, CHILD(bases, i));
4599 }
4600 }
4601 symtable_enter_scope(st, class_name, TYPE(n));
4602 tmp = st->st_private;
4603 st->st_private = class_name;
4604 symtable_node(st, CHILD(n, NCH(n) - 1));
4605 st->st_private = tmp;
4606 symtable_exit_scope(st);
4607 break;
4608 }
4609 case if_stmt:
4610 for (i = 0; i + 3 < NCH(n); i += 4) {
4611 if (is_constant_false(NULL, (CHILD(n, i + 1))))
4612 continue;
4613 symtable_node(st, CHILD(n, i + 1));
4614 symtable_node(st, CHILD(n, i + 3));
4615 }
4616 if (i + 2 < NCH(n))
4617 symtable_node(st, CHILD(n, i + 2));
4618 break;
4619 case global_stmt:
4620 symtable_global(st, n);
4621 break;
4622 case import_stmt:
4623 symtable_import(st, n);
4624 break;
4625 case exec_stmt:
4626 if (PyDict_SetItemString(st->st_cur, NOOPT, Py_None) < 0)
4627 st->st_errors++;
4628 symtable_node(st, CHILD(n, 1));
4629 if (NCH(n) > 2)
4630 symtable_node(st, CHILD(n, 3));
4631 if (NCH(n) > 4)
4632 symtable_node(st, CHILD(n, 5));
4633 break;
4634 case except_clause:
4635 if (NCH(n) == 4)
4636 symtable_assign(st, CHILD(n, 3));
4637 if (NCH(n) > 1) {
4638 n = CHILD(n, 1);
4639 goto loop;
4640 }
4641 break;
4642 case del_stmt:
4643 symtable_assign(st, CHILD(n, 1));
4644 break;
4645 case expr_stmt:
4646 if (NCH(n) == 1)
4647 n = CHILD(n, 0);
4648 else {
4649 if (TYPE(CHILD(n, 1)) == augassign) {
4650 symtable_assign(st, CHILD(n, 0));
4651 symtable_node(st, CHILD(n, 2));
4652 break;
4653 } else {
4654 int i;
4655 for (i = 0; i < NCH(n) - 2; i += 2)
4656 symtable_assign(st, CHILD(n, i));
4657 n = CHILD(n, NCH(n) - 1);
4658 }
4659 }
4660 goto loop;
4661 /* watchout for fall-through logic below */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004662 case argument:
4663 if (NCH(n) == 3) {
4664 n = CHILD(n, 2);
4665 goto loop;
4666 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004667 case listmaker:
4668 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
4669 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton5f827f42001-01-23 01:26:20 +00004670 n = CHILD(n, 0);
4671 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004672 }
4673 case atom:
4674 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
4675 symtable_add_use(st, STR(CHILD(n, 0)));
4676 break;
4677 }
4678 case for_stmt:
4679 if (TYPE(n) == for_stmt) {
4680 symtable_assign(st, CHILD(n, 1));
4681 start = 3;
4682 }
4683 default:
4684 if (NCH(n) == 1) {
4685 n = CHILD(n, 0);
4686 goto loop;
4687 }
4688 for (i = start; i < NCH(n); ++i)
4689 if (TYPE(CHILD(n, i)) >= single_input)
4690 symtable_node(st, CHILD(n, i));
4691 }
4692}
4693
4694static void
4695symtable_funcdef(struct symtable *st, node *n)
4696{
4697 node *body;
4698
4699 if (TYPE(n) == lambdef) {
4700 if (NCH(n) == 4)
4701 symtable_params(st, CHILD(n, 1));
4702 } else
4703 symtable_params(st, CHILD(n, 2));
4704 body = CHILD(n, NCH(n) - 1);
4705 symtable_node(st, body);
4706}
4707
4708/* The next two functions parse the argument tuple.
4709 symtable_default_arg() checks for names in the default arguments,
4710 which are references in the defining scope. symtable_params()
4711 parses the parameter names, which are defined in the function's
4712 body.
4713
4714 varargslist:
4715 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
4716 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
4717*/
4718
4719static void
4720symtable_default_args(struct symtable *st, node *n)
4721{
4722 node *c;
4723 int i;
4724
4725 if (TYPE(n) == parameters) {
4726 n = CHILD(n, 1);
4727 if (TYPE(n) == RPAR)
4728 return;
4729 }
4730 REQ(n, varargslist);
4731 for (i = 0; i < NCH(n); i += 2) {
4732 c = CHILD(n, i);
4733 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
4734 break;
4735 }
4736 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
4737 symtable_node(st, CHILD(n, i));
4738 }
4739}
4740
4741static void
4742symtable_params(struct symtable *st, node *n)
4743{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004744 int i, complex = -1, ext = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004745 node *c = NULL;
4746
4747 if (TYPE(n) == parameters) {
4748 n = CHILD(n, 1);
4749 if (TYPE(n) == RPAR)
4750 return;
4751 }
4752 REQ(n, varargslist);
4753 for (i = 0; i < NCH(n); i += 2) {
4754 c = CHILD(n, i);
4755 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
4756 ext = 1;
4757 break;
4758 }
4759 if (TYPE(c) == test) {
4760 continue;
4761 }
4762 if (TYPE(CHILD(c, 0)) == NAME)
4763 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
4764 else {
4765 char nbuf[10];
4766 sprintf(nbuf, ".%d", i);
4767 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004768 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004769 }
4770 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004771 if (ext) {
4772 c = CHILD(n, i);
4773 if (TYPE(c) == STAR) {
4774 i++;
4775 symtable_add_def(st, STR(CHILD(n, i)),
4776 DEF_PARAM | DEF_STAR);
4777 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00004778 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004779 c = NULL;
4780 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004781 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004782 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004783 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004784 i++;
4785 symtable_add_def(st, STR(CHILD(n, i)),
4786 DEF_PARAM | DEF_DOUBLESTAR);
4787 }
4788 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004789 if (complex >= 0) {
4790 int j;
4791 for (j = 0; j <= complex; j++) {
4792 c = CHILD(n, j);
4793 if (TYPE(c) == COMMA)
4794 c = CHILD(n, ++j);
4795 if (TYPE(CHILD(c, 0)) == LPAR)
4796 symtable_params_fplist(st, CHILD(c, 1));
4797 }
4798 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004799}
4800
4801static void
4802symtable_params_fplist(struct symtable *st, node *n)
4803{
4804 int i;
4805 node *c;
4806
4807 REQ(n, fplist);
4808 for (i = 0; i < NCH(n); i += 2) {
4809 c = CHILD(n, i);
4810 REQ(c, fpdef);
4811 if (NCH(c) == 1)
4812 symtable_add_def(st, STR(CHILD(c, 0)),
4813 DEF_PARAM | DEF_INTUPLE);
4814 else
4815 symtable_params_fplist(st, CHILD(c, 1));
4816 }
4817
4818}
4819
4820static void
4821symtable_global(struct symtable *st, node *n)
4822{
4823 int i;
4824
4825 for (i = 1; i < NCH(n); i += 2)
4826 symtable_add_def(st, STR(CHILD(n, i)), DEF_GLOBAL);
4827}
4828
4829static void
4830symtable_list_comprehension(struct symtable *st, node *n)
4831{
4832 char tmpname[12];
4833
4834 sprintf(tmpname, "[%d]", ++st->st_tmpname);
4835 symtable_add_def(st, tmpname, DEF_LOCAL);
4836 symtable_assign(st, CHILD(n, 1));
4837 symtable_node(st, CHILD(n, 3));
4838 if (NCH(n) == 5)
4839 symtable_node(st, CHILD(n, 4));
4840 --st->st_tmpname;
4841}
4842
4843static void
4844symtable_import(struct symtable *st, node *n)
4845{
4846 int i;
4847 /*
4848 import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
4849 | 'from' dotted_name 'import'
4850 ('*' | import_as_name (',' import_as_name)*)
4851 import_as_name: NAME [NAME NAME]
4852 */
4853
4854 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
4855 if (TYPE(CHILD(n, 3)) == STAR) {
4856 if (PyDict_SetItemString(st->st_cur, NOOPT,
4857 Py_None) < 0)
4858 st->st_errors++;
4859 } else {
4860 for (i = 3; i < NCH(n); i += 2) {
4861 node *c = CHILD(n, i);
4862 if (NCH(c) > 1) /* import as */
4863 symtable_assign(st, CHILD(c, 2));
4864 else
4865 symtable_assign(st, CHILD(c, 0));
4866 }
4867 }
4868 } else {
4869 for (i = 1; i < NCH(n); i += 2) {
4870 symtable_assign(st, CHILD(n, i));
4871 }
4872 }
4873}
4874
4875static void
4876symtable_assign(struct symtable *st, node *n)
4877{
4878 node *tmp;
4879 int i;
4880
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004881 loop:
4882 switch (TYPE(n)) {
4883 case lambdef:
4884 /* invalid assignment, e.g. lambda x:x=2 */
4885 st->st_errors++;
4886 return;
4887 case power:
4888 if (NCH(n) > 2) {
4889 for (i = 2; i < NCH(n); ++i)
4890 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
4891 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004892 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004893 if (NCH(n) > 1) {
4894 symtable_node(st, CHILD(n, 0));
4895 symtable_node(st, CHILD(n, 1));
4896 } else {
4897 n = CHILD(n, 0);
4898 goto loop;
4899 }
4900 return;
4901 case listmaker:
4902 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
4903 symtable_list_comprehension(st, CHILD(n, 1));
4904 else {
4905 for (i = 0; i < NCH(n); i += 2)
4906 symtable_assign(st, CHILD(n, i));
4907 }
4908 return;
4909 case exprlist:
4910 case testlist:
4911 if (NCH(n) == 1) {
4912 n = CHILD(n, 0);
4913 goto loop;
4914 }
4915 else {
4916 int i;
4917 for (i = 0; i < NCH(n); i += 2)
4918 symtable_assign(st, CHILD(n, i));
4919 return;
4920 }
4921 goto loop;
4922 case atom:
4923 tmp = CHILD(n, 0);
4924 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
4925 n = CHILD(n, 1);
4926 goto loop;
4927 } else if (TYPE(tmp) == NAME)
4928 symtable_add_def(st, STR(tmp), DEF_LOCAL);
4929 return;
4930 case dotted_as_name:
4931 if (NCH(n) == 3)
4932 symtable_add_def(st, STR(CHILD(n, 2)),
4933 DEF_LOCAL);
4934 else
4935 symtable_add_def(st,
4936 STR(CHILD(CHILD(n,
4937 0), 0)),
4938 DEF_LOCAL);
4939 return;
4940 case dotted_name:
4941 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL);
4942 return;
4943 case NAME:
4944 symtable_add_def(st, STR(n), DEF_LOCAL);
4945 return;
4946 default:
4947 if (NCH(n) == 0)
4948 return;
4949 if (NCH(n) != 1) {
4950 DUMP(n);
4951 Py_FatalError("too many children in default case\n");
4952 }
4953 n = CHILD(n, 0);
4954 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004955 }
4956}