blob: 0939f059c40ff1bb2e5a377a3b3d91cad12e8580 [file] [log] [blame]
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001/* Compile an expression node to intermediate code */
2
Guido van Rossum3f5da241990-12-20 15:06:42 +00003/* XXX TO DO:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004 XXX add __doc__ attribute == co_doc to code object attributes?
5 XXX (it's currently the first item of the co_const tuple)
Guido van Rossum3f5da241990-12-20 15:06:42 +00006 XXX Generate simple jump for break/return outside 'try...finally'
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00007 XXX Allow 'continue' inside finally clause of try-finally
Guido van Rossum8b993a91997-01-17 21:04:03 +00008 XXX New opcode for loading the initial index for a for loop
Guido van Rossum681d79a1995-07-18 14:51:37 +00009 XXX other JAR tricks?
Guido van Rossum3f5da241990-12-20 15:06:42 +000010*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +000011
Guido van Rossum79f25d91997-04-29 20:08:16 +000012#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000013
Guido van Rossum10dc2e81990-11-18 17:27:39 +000014#include "node.h"
15#include "token.h"
16#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000017#include "compile.h"
Jeremy Hylton4b38da62001-02-02 18:19:15 +000018#include "symtable.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000019#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000020#include "structmember.h"
21
22#include <ctype.h>
Guido van Rossum282914b1991-04-04 10:42:56 +000023
Guido van Rossumb05a5c71997-05-07 17:46:13 +000024/* Three symbols from graminit.h are also defined in Python.h, with
25 Py_ prefixes to their names. Python.h can't include graminit.h
26 (which defines too many confusing symbols), but we can check here
27 that they haven't changed (which is very unlikely, but possible). */
28#if Py_single_input != single_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000029 #error "single_input has changed -- update Py_single_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000030#endif
31#if Py_file_input != file_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000032 #error "file_input has changed -- update Py_file_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000033#endif
34#if Py_eval_input != eval_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000035 #error "eval_input has changed -- update Py_eval_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000036#endif
37
Guido van Rossum8e793d91997-03-03 19:13:14 +000038int Py_OptimizeFlag = 0;
39
Guido van Rossum8861b741996-07-30 16:49:37 +000040#define OP_DELETE 0
41#define OP_ASSIGN 1
42#define OP_APPLY 2
43
Jeremy Hyltone36f7782001-01-19 03:21:30 +000044#define VAR_LOAD 0
45#define VAR_STORE 1
46#define VAR_DELETE 2
47
Jeremy Hylton64949cb2001-01-25 20:06:59 +000048#define DEL_CLOSURE_ERROR \
Jeremy Hyltoneab156f2001-01-30 01:24:43 +000049"can not delete variable '%.400s' referenced in nested scope"
50
51#define DUPLICATE_ARGUMENT \
52"duplicate argument '%s' in function definition"
53
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000054#define ILLEGAL_DYNAMIC_SCOPE \
55"%.100s: exec or 'import *' makes names ambiguous in nested scope"
Jeremy Hyltoneab156f2001-01-30 01:24:43 +000056
Jeremy Hylton29906ee2001-02-27 04:23:34 +000057#define GLOBAL_AFTER_ASSIGN \
58"name '%.400s' is assigned to before global declaration"
59
60#define GLOBAL_AFTER_USE \
61"name '%.400s' is used prior to global declaration"
62
63#define LOCAL_GLOBAL \
64"name '%.400s' is a function paramter and declared global"
65
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +000066#define LATE_FUTURE \
67"from __future__ imports must occur at the beginning of the file"
68
Jeremy Hylton897b8212001-03-23 14:08:38 +000069#define ASSIGN_DEBUG \
70"can not assign to __debug__"
71
Jeremy Hyltone36f7782001-01-19 03:21:30 +000072#define MANGLE_LEN 256
73
Guido van Rossum79f25d91997-04-29 20:08:16 +000074#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000075
76static struct memberlist code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000077 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
78 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000079 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000080 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000081 {"co_code", T_OBJECT, OFF(co_code), READONLY},
82 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
83 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000084 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Jeremy Hylton64949cb2001-01-25 20:06:59 +000085 {"co_freevars", T_OBJECT, OFF(co_freevars), READONLY},
86 {"co_cellvars", T_OBJECT, OFF(co_cellvars), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000087 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000088 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000089 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
90 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000091 {NULL} /* Sentinel */
92};
93
Guido van Rossum79f25d91997-04-29 20:08:16 +000094static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000095code_getattr(PyCodeObject *co, char *name)
Guido van Rossum3f5da241990-12-20 15:06:42 +000096{
Guido van Rossum79f25d91997-04-29 20:08:16 +000097 return PyMember_Get((char *)co, code_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +000098}
Guido van Rossum10dc2e81990-11-18 17:27:39 +000099
100static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000101code_dealloc(PyCodeObject *co)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000102{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000103 Py_XDECREF(co->co_code);
104 Py_XDECREF(co->co_consts);
105 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +0000106 Py_XDECREF(co->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000107 Py_XDECREF(co->co_freevars);
108 Py_XDECREF(co->co_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000109 Py_XDECREF(co->co_filename);
110 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +0000111 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000112 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000113}
114
Guido van Rossum79f25d91997-04-29 20:08:16 +0000115static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000116code_repr(PyCodeObject *co)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000117{
118 char buf[500];
119 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000120 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000121 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000122
Guido van Rossuma396a882000-04-07 01:21:36 +0000123 if (co->co_firstlineno != 0)
124 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000125 if (co->co_filename && PyString_Check(co->co_filename))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000126 filename = PyString_AS_STRING(co->co_filename);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000127 if (co->co_name && PyString_Check(co->co_name))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000128 name = PyString_AS_STRING(co->co_name);
Fred Drake615ae552000-06-30 16:20:13 +0000129 sprintf(buf, "<code object %.100s at %p, file \"%.300s\", line %d>",
130 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000131 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000132}
133
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000134static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000135code_compare(PyCodeObject *co, PyCodeObject *cp)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000136{
137 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000138 cmp = PyObject_Compare(co->co_name, cp->co_name);
139 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000140 cmp = co->co_argcount - cp->co_argcount;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000141 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000142 cmp = co->co_nlocals - cp->co_nlocals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000143 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000144 cmp = co->co_flags - cp->co_flags;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000145 if (cmp) return cmp;
Guido van Rossumd076c731998-10-07 19:42:25 +0000146 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000147 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000148 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000149 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000150 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000151 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000152 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000153 if (cmp) return cmp;
154 cmp = PyObject_Compare(co->co_freevars, cp->co_freevars);
155 if (cmp) return cmp;
156 cmp = PyObject_Compare(co->co_cellvars, cp->co_cellvars);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000157 return cmp;
158}
159
160static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000161code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000162{
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000163 long h, h0, h1, h2, h3, h4, h5, h6;
Guido van Rossum44679592000-04-10 16:20:31 +0000164 h0 = PyObject_Hash(co->co_name);
165 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000166 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000167 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000168 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000169 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000170 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000171 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000172 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000173 if (h4 == -1) return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000174 h5 = PyObject_Hash(co->co_freevars);
175 if (h5 == -1) return -1;
176 h6 = PyObject_Hash(co->co_cellvars);
177 if (h6 == -1) return -1;
178 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^ h5 ^ h6 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000179 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000180 if (h == -1) h = -2;
181 return h;
182}
183
Jeremy Hylton78891072001-03-01 06:09:34 +0000184/* XXX code objects need to participate in GC? */
185
Guido van Rossum79f25d91997-04-29 20:08:16 +0000186PyTypeObject PyCode_Type = {
187 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000188 0,
189 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000190 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000191 0,
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000192 (destructor)code_dealloc, /*tp_dealloc*/
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000193 0, /*tp_print*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000194 (getattrfunc)code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000195 0, /*tp_setattr*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000196 (cmpfunc)code_compare, /*tp_compare*/
197 (reprfunc)code_repr, /*tp_repr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000198 0, /*tp_as_number*/
199 0, /*tp_as_sequence*/
200 0, /*tp_as_mapping*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000201 (hashfunc)code_hash, /*tp_hash*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000202};
203
Guido van Rossum644a12b1997-04-09 19:24:53 +0000204#define NAME_CHARS \
205 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
206
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000207/* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
208
209static int
210all_name_chars(unsigned char *s)
211{
Guido van Rossumcd90c202001-02-09 15:06:42 +0000212 static char ok_name_char[256];
213 static unsigned char *name_chars = (unsigned char *)NAME_CHARS;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000214
Guido van Rossumcd90c202001-02-09 15:06:42 +0000215 if (ok_name_char[*name_chars] == 0) {
216 unsigned char *p;
217 for (p = name_chars; *p; p++)
218 ok_name_char[*p] = 1;
219 }
220 while (*s) {
221 if (ok_name_char[*s++] == 0)
222 return 0;
223 }
224 return 1;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000225}
226
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000227static int
228intern_strings(PyObject *tuple)
229{
230 int i;
231
232 for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) {
233 PyObject *v = PyTuple_GET_ITEM(tuple, i);
234 if (v == NULL || !PyString_Check(v)) {
235 Py_FatalError("non-string found in code slot");
236 PyErr_BadInternalCall();
237 return -1;
238 }
239 PyString_InternInPlace(&PyTuple_GET_ITEM(tuple, i));
240 }
241 return 0;
242}
243
Guido van Rossum79f25d91997-04-29 20:08:16 +0000244PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000245PyCode_New(int argcount, int nlocals, int stacksize, int flags,
246 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000247 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
248 PyObject *filename, PyObject *name, int firstlineno,
249 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000250{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000251 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000252 int i;
Guido van Rossumd076c731998-10-07 19:42:25 +0000253 PyBufferProcs *pb;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000254 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000255 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000256 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000257 consts == NULL || !PyTuple_Check(consts) ||
258 names == NULL || !PyTuple_Check(names) ||
259 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000260 freevars == NULL || !PyTuple_Check(freevars) ||
261 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000262 name == NULL || !PyString_Check(name) ||
263 filename == NULL || !PyString_Check(filename) ||
264 lnotab == NULL || !PyString_Check(lnotab)) {
265 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000266 return NULL;
267 }
Guido van Rossumd076c731998-10-07 19:42:25 +0000268 pb = code->ob_type->tp_as_buffer;
269 if (pb == NULL ||
270 pb->bf_getreadbuffer == NULL ||
271 pb->bf_getsegcount == NULL ||
272 (*pb->bf_getsegcount)(code, NULL) != 1)
273 {
274 PyErr_BadInternalCall();
275 return NULL;
276 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000277 intern_strings(names);
278 intern_strings(varnames);
279 if (freevars == NULL)
280 freevars = PyTuple_New(0);
281 intern_strings(freevars);
282 if (cellvars == NULL)
283 cellvars = PyTuple_New(0);
284 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000285 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000286 for (i = PyTuple_Size(consts); --i >= 0; ) {
287 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000288 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000289 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000290 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000291 continue;
292 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000293 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000294 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000295 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000296 co->co_argcount = argcount;
297 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000298 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000299 co->co_flags = flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000300 Py_INCREF(code);
Guido van Rossumd076c731998-10-07 19:42:25 +0000301 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000302 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000303 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000304 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000305 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000306 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000307 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000308 Py_INCREF(freevars);
309 co->co_freevars = freevars;
310 Py_INCREF(cellvars);
311 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000312 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000313 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000314 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000315 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000316 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000317 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000318 co->co_lnotab = lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000319 }
320 return co;
321}
322
323
324/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000325
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000326/* The compiler uses two passes to generate bytecodes. The first pass
327 builds the symbol table. The second pass generates the bytecode.
328
329 The first pass uses a single symtable struct. The second pass uses
330 a compiling struct for each code block. The compiling structs
331 share a reference to the symtable.
332
333 The two passes communicate via symtable_load_symbols() and via
334 is_local() and is_global(). The former initializes several slots
335 in the compiling struct: c_varnames, c_locals, c_nlocals,
336 c_argcount, c_globals, and c_flags.
337*/
338
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000339struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000340 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000341 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000342 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000343 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000344 PyObject *c_name_dict; /* inverse of c_names */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000345 PyObject *c_globals; /* dictionary (value=None) */
346 PyObject *c_locals; /* dictionary (value=localID) */
347 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000348 PyObject *c_freevars; /* dictionary (value=None) */
349 PyObject *c_cellvars; /* list */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000350 int c_nlocals; /* index of next local */
351 int c_argcount; /* number of top-level arguments */
352 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000353 int c_nexti; /* index into c_code */
354 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000355 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000356 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000357 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000358 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000359 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000360 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000361 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000362 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000363 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000364 int c_stacklevel; /* Current stack level */
365 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000366 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000367 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000368 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000369 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000370 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000371 int c_nested; /* Is block nested funcdef or lamdef? */
372 int c_closure; /* Is nested w/freevars? */
373 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000374 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000375};
376
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000377static int
378is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000379{
380 if ((v & (USE | DEF_FREE))
381 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
382 return 1;
383 if (v & DEF_FREE_CLASS)
384 return 1;
385 return 0;
386}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000387
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000388static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000389com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000390{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000391 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
392
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000393 if (c == NULL) {
394 /* Error occurred via symtable call to
395 is_constant_false */
396 PyErr_SetString(exc, msg);
397 return;
398 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000399 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000400 if (c->c_lineno < 1 || c->c_interactive) {
401 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000402 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000403 return;
404 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000405 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000406 if (v == NULL)
407 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000408
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000409 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000410 if (line == NULL) {
411 Py_INCREF(Py_None);
412 line = Py_None;
413 }
414 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
415 Py_None, line);
416 if (t == NULL)
417 goto exit;
418 w = Py_BuildValue("(OO)", v, t);
419 if (w == NULL)
420 goto exit;
421 PyErr_SetObject(exc, w);
422 exit:
423 Py_XDECREF(t);
424 Py_XDECREF(v);
425 Py_XDECREF(w);
426 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000427}
428
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000429/* Interface to the block stack */
430
431static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000432block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000433{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000434 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000435 com_error(c, PyExc_SystemError,
436 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000437 }
438 else {
439 c->c_block[c->c_nblocks++] = type;
440 }
441}
442
443static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000444block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000445{
446 if (c->c_nblocks > 0)
447 c->c_nblocks--;
448 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000449 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000450 }
451}
452
Guido van Rossum681d79a1995-07-18 14:51:37 +0000453/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000454
Tim Petersdbd9ba62000-07-09 03:09:57 +0000455static int com_init(struct compiling *, char *);
456static void com_free(struct compiling *);
457static void com_push(struct compiling *, int);
458static void com_pop(struct compiling *, int);
459static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000460static void com_node(struct compiling *, node *);
461static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000462static void com_addbyte(struct compiling *, int);
463static void com_addint(struct compiling *, int);
464static void com_addoparg(struct compiling *, int, int);
465static void com_addfwref(struct compiling *, int, int *);
466static void com_backpatch(struct compiling *, int);
467static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
468static int com_addconst(struct compiling *, PyObject *);
469static int com_addname(struct compiling *, PyObject *);
470static void com_addopname(struct compiling *, int, node *);
471static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000472static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000473static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000474static void com_assign(struct compiling *, node *, int, node *);
475static void com_assign_name(struct compiling *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000476static PyCodeObject *icompile(node *, struct compiling *);
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000477static PyCodeObject *jcompile(node *, char *, struct compiling *,
478 PyCompilerFlags *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000479static PyObject *parsestrplus(node *);
480static PyObject *parsestr(char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000481static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000482
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000483static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000484
485/* symtable operations */
486static int symtable_build(struct compiling *, node *);
487static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000488static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000489static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000490static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000491static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000492static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000493
494static void symtable_node(struct symtable *, node *);
495static void symtable_funcdef(struct symtable *, node *);
496static void symtable_default_args(struct symtable *, node *);
497static void symtable_params(struct symtable *, node *);
498static void symtable_params_fplist(struct symtable *, node *n);
499static void symtable_global(struct symtable *, node *);
500static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000501static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000502static void symtable_list_comprehension(struct symtable *, node *);
503
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000504static int symtable_update_free_vars(struct symtable *);
505static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
506static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
507
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000508/* helper */
509static void
510do_pad(int pad)
511{
512 int i;
513 for (i = 0; i < pad; ++i)
514 fprintf(stderr, " ");
515}
516
517static void
518dump(node *n, int pad, int depth)
519{
520 int i;
521 if (depth == 0)
522 return;
523 do_pad(pad);
524 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
525 if (depth > 0)
526 depth--;
527 for (i = 0; i < NCH(n); ++i)
528 dump(CHILD(n, i), pad + 1, depth);
529}
530
531#define DUMP(N) dump(N, 0, -1)
532
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000533static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000534com_init(struct compiling *c, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000535{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000536 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000537 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
538 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000539 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000540 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000541 goto fail;
542 if ((c->c_const_dict = PyDict_New()) == NULL)
543 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000544 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000545 goto fail;
546 if ((c->c_name_dict = PyDict_New()) == NULL)
547 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000548 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000549 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000550 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
551 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000552 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000553 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000554 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000555 c->c_freevars = NULL;
556 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000557 c->c_nlocals = 0;
558 c->c_argcount = 0;
559 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000560 c->c_nexti = 0;
561 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000562 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000563 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000564 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000565 c->c_begin = 0;
566 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000567 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000568 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000569 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000570 c->c_stacklevel = 0;
571 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000572 c->c_firstlineno = 0;
573 c->c_last_addr = 0;
574 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000575 c->c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000576 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000577 c->c_nested = 0;
578 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000579 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000580 return 1;
581
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000582 fail:
583 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000584 return 0;
585}
586
587static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000588com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000589{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000590 Py_XDECREF(c->c_code);
591 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000592 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000593 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000594 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000595 Py_XDECREF(c->c_globals);
596 Py_XDECREF(c->c_locals);
597 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000598 Py_XDECREF(c->c_freevars);
599 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000600 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +0000601 if (c->c_future)
602 PyMem_Free((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000603}
604
605static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000606com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000607{
608 c->c_stacklevel += n;
609 if (c->c_stacklevel > c->c_maxstacklevel)
610 c->c_maxstacklevel = c->c_stacklevel;
611}
612
613static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000614com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000615{
616 if (c->c_stacklevel < n) {
Guido van Rossum90f827c1998-08-25 18:22:17 +0000617 /* fprintf(stderr,
Guido van Rossum8b993a91997-01-17 21:04:03 +0000618 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
619 c->c_filename, c->c_lineno,
Guido van Rossum90f827c1998-08-25 18:22:17 +0000620 c->c_nexti, c->c_stacklevel, n); */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000621 c->c_stacklevel = 0;
622 }
623 else
624 c->c_stacklevel -= n;
625}
626
627static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000628com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000629{
630 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000631 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000632 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000633 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000634}
635
636static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000637com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000638{
639 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000640 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000641 assert(byte >= 0 && byte <= 255);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000642 if (byte < 0 || byte > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000643 com_error(c, PyExc_SystemError,
644 "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000645 }
646 if (c->c_code == NULL)
647 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000648 len = PyString_Size(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000649 if (c->c_nexti >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000650 if (_PyString_Resize(&c->c_code, len+1000) != 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000651 c->c_errors++;
652 return;
653 }
654 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000655 PyString_AsString(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000656}
657
658static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000659com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000660{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000661 com_addbyte(c, x & 0xff);
662 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000663}
664
665static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000666com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000667{
668 int size;
669 char *p;
670 if (c->c_lnotab == NULL)
671 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000672 size = PyString_Size(c->c_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000673 if (c->c_lnotab_next+2 > size) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000674 if (_PyString_Resize(&c->c_lnotab, size + 1000) < 0) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000675 c->c_errors++;
676 return;
677 }
678 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000679 p = PyString_AsString(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000680 *p++ = addr;
681 *p++ = line;
682 c->c_lnotab_next += 2;
683}
684
685static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000686com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000687{
688 c->c_lineno = lineno;
689 if (c->c_firstlineno == 0) {
690 c->c_firstlineno = c->c_last_line = lineno;
691 }
692 else {
693 int incr_addr = c->c_nexti - c->c_last_addr;
694 int incr_line = lineno - c->c_last_line;
695 while (incr_addr > 0 || incr_line > 0) {
696 int trunc_addr = incr_addr;
697 int trunc_line = incr_line;
698 if (trunc_addr > 255)
699 trunc_addr = 255;
700 if (trunc_line > 255)
701 trunc_line = 255;
702 com_add_lnotab(c, trunc_addr, trunc_line);
703 incr_addr -= trunc_addr;
704 incr_line -= trunc_line;
705 }
706 c->c_last_addr = c->c_nexti;
707 c->c_last_line = lineno;
708 }
709}
710
711static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000712com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000713{
Fred Drakeef8ace32000-08-24 00:32:09 +0000714 int extended_arg = arg >> 16;
Guido van Rossum8e793d91997-03-03 19:13:14 +0000715 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000716 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000717 if (Py_OptimizeFlag)
718 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000719 }
Fred Drakeef8ace32000-08-24 00:32:09 +0000720 if (extended_arg){
721 com_addbyte(c, EXTENDED_ARG);
722 com_addint(c, extended_arg);
723 arg &= 0xffff;
724 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000725 com_addbyte(c, op);
726 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000727}
728
729static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000730com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000731{
732 /* Compile a forward reference for backpatching */
733 int here;
734 int anchor;
735 com_addbyte(c, op);
736 here = c->c_nexti;
737 anchor = *p_anchor;
738 *p_anchor = here;
739 com_addint(c, anchor == 0 ? 0 : here - anchor);
740}
741
742static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000743com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000744{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000745 unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000746 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000747 int dist;
748 int prev;
749 for (;;) {
750 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000751 prev = code[anchor] + (code[anchor+1] << 8);
752 dist = target - (anchor+2);
753 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +0000754 dist >>= 8;
755 code[anchor+1] = dist;
756 dist >>= 8;
757 if (dist) {
758 com_error(c, PyExc_SystemError,
759 "com_backpatch: offset too large");
760 break;
761 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000762 if (!prev)
763 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000764 anchor -= prev;
765 }
766}
767
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000768/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000769
770static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000771com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000772{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000773 PyObject *w, *t, *np=NULL;
774 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000775
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000776 t = Py_BuildValue("(OO)", v, v->ob_type);
777 if (t == NULL)
778 goto fail;
779 w = PyDict_GetItem(dict, t);
780 if (w != NULL) {
781 n = PyInt_AsLong(w);
782 } else {
783 n = PyList_Size(list);
784 np = PyInt_FromLong(n);
785 if (np == NULL)
786 goto fail;
787 if (PyList_Append(list, v) != 0)
788 goto fail;
789 if (PyDict_SetItem(dict, t, np) != 0)
790 goto fail;
791 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000792 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000793 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000794 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000795 fail:
796 Py_XDECREF(np);
797 Py_XDECREF(t);
798 c->c_errors++;
799 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000800}
801
802static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000803com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000804{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000805 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000806}
807
808static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000809com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000810{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000811 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000812}
813
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000814static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000815mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000816{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000817 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000818 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +0000819 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000820 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
821 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000822 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000823 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000824 return 0; /* Don't mangle __extremely_long_names */
825 if (name[nlen-1] == '_' && name[nlen-2] == '_')
826 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000827 /* Strip leading underscores from class name */
828 while (*p == '_')
829 p++;
830 if (*p == '\0')
831 return 0; /* Don't mangle if class is just underscores */
832 plen = strlen(p);
833 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000834 plen = maxlen-nlen-2; /* Truncate class name if too long */
835 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000836 buffer[0] = '_';
837 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000838 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000839 return 1;
840}
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000841
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000842static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000843com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000844{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000845 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000846 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000847 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000848
849 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000850 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000851 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000852 c->c_errors++;
853 i = 255;
854 }
855 else {
856 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000857 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000858 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000859 com_addoparg(c, op, i);
860}
861
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000862#define NAME_LOCAL 0
863#define NAME_GLOBAL 1
864#define NAME_DEFAULT 2
865#define NAME_CLOSURE 3
866
867static int
868com_lookup_arg(PyObject *dict, PyObject *name)
869{
870 PyObject *v = PyDict_GetItem(dict, name);
871 if (v == NULL)
872 return -1;
873 else
874 return PyInt_AS_LONG(v);
875}
876
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000877static void
878com_addop_varname(struct compiling *c, int kind, char *name)
879{
880 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000881 int i, reftype;
882 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000883 int op = STOP_CODE;
884 char buffer[MANGLE_LEN];
885
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000886 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000887 name = buffer;
888 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
889 c->c_errors++;
890 i = 255;
891 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000892 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000893
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000894 reftype = get_ref_type(c, name);
895 switch (reftype) {
896 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000897 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000898 scope = NAME_LOCAL;
899 break;
900 case GLOBAL_EXPLICIT:
901 scope = NAME_GLOBAL;
902 break;
903 case GLOBAL_IMPLICIT:
904 if (c->c_flags & CO_OPTIMIZED)
905 scope = NAME_GLOBAL;
906 break;
907 case FREE:
908 case CELL:
909 scope = NAME_CLOSURE;
910 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000911 }
912
913 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000914 if (scope == NAME_LOCAL)
915 i = com_lookup_arg(c->c_locals, v);
916 else if (reftype == FREE)
917 i = com_lookup_arg(c->c_freevars, v);
918 else if (reftype == CELL)
919 i = com_lookup_arg(c->c_cellvars, v);
920 if (i == -1) {
921 c->c_errors++; /* XXX no exception set */
922 i = 255;
923 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000924 }
925 Py_DECREF(v);
926
927 switch (kind) {
928 case VAR_LOAD:
929 switch (scope) {
930 case NAME_LOCAL:
931 op = LOAD_FAST;
932 break;
933 case NAME_GLOBAL:
934 op = LOAD_GLOBAL;
935 break;
936 case NAME_DEFAULT:
937 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000938 break;
939 case NAME_CLOSURE:
940 op = LOAD_DEREF;
941 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000942 }
943 break;
944 case VAR_STORE:
945 switch (scope) {
946 case NAME_LOCAL:
947 op = STORE_FAST;
948 break;
949 case NAME_GLOBAL:
950 op = STORE_GLOBAL;
951 break;
952 case NAME_DEFAULT:
953 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000954 break;
955 case NAME_CLOSURE:
956 op = STORE_DEREF;
957 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000958 }
959 break;
960 case VAR_DELETE:
961 switch (scope) {
962 case NAME_LOCAL:
963 op = DELETE_FAST;
964 break;
965 case NAME_GLOBAL:
966 op = DELETE_GLOBAL;
967 break;
968 case NAME_DEFAULT:
969 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000970 break;
971 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000972 char buf[500];
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000973 sprintf(buf, DEL_CLOSURE_ERROR, name);
974 com_error(c, PyExc_SyntaxError, buf);
975 i = 255;
976 break;
977 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000978 }
979 break;
980 }
981done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000982 com_addoparg(c, op, i);
983}
984
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000985static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000986com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000987{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000988 char *name;
989 char buffer[1000];
990 /* XXX it is possible to write this code without the 1000
991 chars on the total length of dotted names, I just can't be
992 bothered right now */
993 if (TYPE(n) == STAR)
994 name = "*";
995 else if (TYPE(n) == dotted_name) {
996 char *p = buffer;
997 int i;
998 name = buffer;
999 for (i = 0; i < NCH(n); i += 2) {
1000 char *s = STR(CHILD(n, i));
1001 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001002 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001003 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001004 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001005 break;
1006 }
1007 if (p != buffer)
1008 *p++ = '.';
1009 strcpy(p, s);
1010 p = strchr(p, '\0');
1011 }
1012 }
1013 else {
1014 REQ(n, NAME);
1015 name = STR(n);
1016 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001017 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001018}
1019
Guido van Rossum79f25d91997-04-29 20:08:16 +00001020static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001021parsenumber(struct compiling *co, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001022{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001023 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001024 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001025 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001026#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +00001027 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +00001028 int imflag;
1029#endif
1030
Guido van Rossum282914b1991-04-04 10:42:56 +00001031 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001032 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001033#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001034 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001035#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001036 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001037 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001038 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001039 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001040 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001041 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001042 if (*end == '\0') {
1043 if (errno != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001044 com_error(co, PyExc_OverflowError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001045 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +00001046 return NULL;
1047 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001048 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001049 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001050 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001051#ifndef WITHOUT_COMPLEX
1052 if (imflag) {
1053 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001054 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +00001055 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001056 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001057 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +00001058 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001059 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001060#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001061 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001062 PyFPE_START_PROTECT("atof", return 0)
1063 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001064 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001065 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001066 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001067}
1068
Guido van Rossum79f25d91997-04-29 20:08:16 +00001069static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001070parsestr(char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001071{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001072 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001073 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001074 char *buf;
1075 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001076 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001077 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001078 int first = *s;
1079 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001080 int rawmode = 0;
1081 int unicode = 0;
1082 if (isalpha(quote) || quote == '_') {
1083 if (quote == 'u' || quote == 'U') {
1084 quote = *++s;
1085 unicode = 1;
1086 }
1087 if (quote == 'r' || quote == 'R') {
1088 quote = *++s;
1089 rawmode = 1;
1090 }
1091 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001092 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001093 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001094 return NULL;
1095 }
1096 s++;
1097 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001098 if (len > INT_MAX) {
1099 PyErr_SetString(PyExc_OverflowError, "string to parse is too long");
1100 return NULL;
1101 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001102 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001103 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001104 return NULL;
1105 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001106 if (len >= 4 && s[0] == quote && s[1] == quote) {
1107 s += 2;
1108 len -= 2;
1109 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001110 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001111 return NULL;
1112 }
1113 }
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001114 if (unicode || Py_UnicodeFlag) {
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001115 if (rawmode)
1116 return PyUnicode_DecodeRawUnicodeEscape(
1117 s, len, NULL);
1118 else
1119 return PyUnicode_DecodeUnicodeEscape(
1120 s, len, NULL);
1121 }
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001122 if (rawmode || strchr(s, '\\') == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001123 return PyString_FromStringAndSize(s, len);
1124 v = PyString_FromStringAndSize((char *)NULL, len);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001125 if (v == NULL)
1126 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001127 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001128 end = s + len;
1129 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001130 if (*s != '\\') {
1131 *p++ = *s++;
1132 continue;
1133 }
1134 s++;
1135 switch (*s++) {
1136 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001137 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001138 case '\\': *p++ = '\\'; break;
1139 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +00001140 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001141 case 'b': *p++ = '\b'; break;
1142 case 'f': *p++ = '\014'; break; /* FF */
1143 case 't': *p++ = '\t'; break;
1144 case 'n': *p++ = '\n'; break;
1145 case 'r': *p++ = '\r'; break;
1146 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001147 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
1148 case '0': case '1': case '2': case '3':
1149 case '4': case '5': case '6': case '7':
1150 c = s[-1] - '0';
1151 if ('0' <= *s && *s <= '7') {
1152 c = (c<<3) + *s++ - '0';
1153 if ('0' <= *s && *s <= '7')
1154 c = (c<<3) + *s++ - '0';
1155 }
1156 *p++ = c;
1157 break;
1158 case 'x':
Jeremy Hylton4419ac12001-02-28 22:54:51 +00001159 if (isxdigit(Py_CHARMASK(s[0]))
1160 && isxdigit(Py_CHARMASK(s[1]))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +00001161 unsigned int x = 0;
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001162 c = Py_CHARMASK(*s);
1163 s++;
1164 if (isdigit(c))
1165 x = c - '0';
1166 else if (islower(c))
1167 x = 10 + c - 'a';
1168 else
1169 x = 10 + c - 'A';
1170 x = x << 4;
1171 c = Py_CHARMASK(*s);
1172 s++;
1173 if (isdigit(c))
1174 x += c - '0';
1175 else if (islower(c))
1176 x += 10 + c - 'a';
1177 else
1178 x += 10 + c - 'A';
Guido van Rossumed1100f1997-10-20 23:24:07 +00001179 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001180 break;
1181 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00001182 PyErr_SetString(PyExc_ValueError,
1183 "invalid \\x escape");
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001184 Py_DECREF(v);
1185 return NULL;
1186 default:
1187 *p++ = '\\';
1188 *p++ = s[-1];
1189 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001190 }
1191 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001192 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001193 return v;
1194}
1195
Guido van Rossum79f25d91997-04-29 20:08:16 +00001196static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001197parsestrplus(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001198{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001199 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001200 int i;
1201 REQ(CHILD(n, 0), STRING);
1202 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
1203 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001204 for (i = 1; i < NCH(n); i++) {
1205 PyObject *s;
1206 s = parsestr(STR(CHILD(n, i)));
1207 if (s == NULL)
1208 goto onError;
1209 if (PyString_Check(v) && PyString_Check(s)) {
1210 PyString_ConcatAndDel(&v, s);
1211 if (v == NULL)
1212 goto onError;
1213 }
1214 else {
1215 PyObject *temp;
1216 temp = PyUnicode_Concat(v, s);
1217 Py_DECREF(s);
1218 if (temp == NULL)
1219 goto onError;
1220 Py_DECREF(v);
1221 v = temp;
1222 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001223 }
1224 }
1225 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001226
1227 onError:
1228 Py_XDECREF(v);
1229 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001230}
1231
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001232static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001233com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001234{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001235 PyObject *v;
1236 int anchor = 0;
1237 int save_begin = c->c_begin;
1238
1239 /* list_iter: for v in expr [list_iter] */
1240 com_node(c, CHILD(n, 3)); /* expr */
1241 v = PyInt_FromLong(0L);
1242 if (v == NULL)
1243 c->c_errors++;
1244 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
1245 com_push(c, 1);
1246 Py_XDECREF(v);
1247 c->c_begin = c->c_nexti;
1248 com_addoparg(c, SET_LINENO, n->n_lineno);
1249 com_addfwref(c, FOR_LOOP, &anchor);
1250 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001251 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001252 c->c_loops++;
1253 com_list_iter(c, n, e, t);
1254 c->c_loops--;
1255 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1256 c->c_begin = save_begin;
1257 com_backpatch(c, anchor);
1258 com_pop(c, 2); /* FOR_LOOP has popped these */
1259}
1260
1261static void
1262com_list_if(struct compiling *c, node *n, node *e, char *t)
1263{
1264 int anchor = 0;
1265 int a = 0;
1266 /* list_iter: 'if' test [list_iter] */
1267 com_addoparg(c, SET_LINENO, n->n_lineno);
1268 com_node(c, CHILD(n, 1));
1269 com_addfwref(c, JUMP_IF_FALSE, &a);
1270 com_addbyte(c, POP_TOP);
1271 com_pop(c, 1);
1272 com_list_iter(c, n, e, t);
1273 com_addfwref(c, JUMP_FORWARD, &anchor);
1274 com_backpatch(c, a);
1275 /* We jump here with an extra entry which we now pop */
1276 com_addbyte(c, POP_TOP);
1277 com_backpatch(c, anchor);
1278}
1279
1280static void
1281com_list_iter(struct compiling *c,
1282 node *p, /* parent of list_iter node */
1283 node *e, /* element expression node */
1284 char *t /* name of result list temp local */)
1285{
1286 /* list_iter is the last child in a listmaker, list_for, or list_if */
1287 node *n = CHILD(p, NCH(p)-1);
1288 if (TYPE(n) == list_iter) {
1289 n = CHILD(n, 0);
1290 switch (TYPE(n)) {
1291 case list_for:
1292 com_list_for(c, n, e, t);
1293 break;
1294 case list_if:
1295 com_list_if(c, n, e, t);
1296 break;
1297 default:
1298 com_error(c, PyExc_SystemError,
1299 "invalid list_iter node type");
1300 }
1301 }
1302 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001303 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001304 com_push(c, 1);
1305 com_node(c, e);
1306 com_addoparg(c, CALL_FUNCTION, 1);
1307 com_addbyte(c, POP_TOP);
1308 com_pop(c, 2);
1309 }
1310}
1311
1312static void
1313com_list_comprehension(struct compiling *c, node *n)
1314{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001315 /* listmaker: test list_for */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001316 char tmpname[12];
Tim Peters30814212001-02-17 05:30:26 +00001317 sprintf(tmpname, "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001318 com_addoparg(c, BUILD_LIST, 0);
1319 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1320 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001321 com_addop_name(c, LOAD_ATTR, "append");
1322 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001323 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001324 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001325 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001326 --c->c_tmpname;
1327}
1328
1329static void
1330com_listmaker(struct compiling *c, node *n)
1331{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001332 /* listmaker: test ( list_for | (',' test)* [','] ) */
1333 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001334 com_list_comprehension(c, n);
1335 else {
1336 int len = 0;
1337 int i;
1338 for (i = 0; i < NCH(n); i += 2, len++)
1339 com_node(c, CHILD(n, i));
1340 com_addoparg(c, BUILD_LIST, len);
1341 com_pop(c, len-1);
1342 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001343}
1344
1345static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001346com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001347{
1348 int i;
1349 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1350 for (i = 0; i+2 < NCH(n); i += 4) {
1351 /* We must arrange things just right for STORE_SUBSCR.
1352 It wants the stack to look like (value) (dict) (key) */
1353 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001354 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001355 com_node(c, CHILD(n, i+2)); /* value */
1356 com_addbyte(c, ROT_TWO);
1357 com_node(c, CHILD(n, i)); /* key */
1358 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001359 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001360 }
1361}
1362
1363static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001364com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001365{
1366 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001367 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001368 int i;
1369 REQ(n, atom);
1370 ch = CHILD(n, 0);
1371 switch (TYPE(ch)) {
1372 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001373 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001374 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001375 com_push(c, 1);
1376 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001377 else
1378 com_node(c, CHILD(n, 1));
1379 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001380 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001381 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001382 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001383 com_push(c, 1);
1384 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001385 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001386 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001387 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001388 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001389 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001390 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001391 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001392 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001393 break;
1394 case BACKQUOTE:
1395 com_node(c, CHILD(n, 1));
1396 com_addbyte(c, UNARY_CONVERT);
1397 break;
1398 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001399 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001400 i = 255;
1401 }
1402 else {
1403 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001404 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001405 }
1406 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001407 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001408 break;
1409 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001410 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001411 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001412 c->c_errors++;
1413 i = 255;
1414 }
1415 else {
1416 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001417 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001418 }
1419 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001420 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001421 break;
1422 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001423 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001424 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001425 break;
1426 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001427 com_error(c, PyExc_SystemError,
1428 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001429 }
1430}
1431
1432static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001433com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001434{
1435 if (NCH(n) == 1) {
1436 com_addbyte(c, op);
1437 }
1438 else if (NCH(n) == 2) {
1439 if (TYPE(CHILD(n, 0)) != COLON) {
1440 com_node(c, CHILD(n, 0));
1441 com_addbyte(c, op+1);
1442 }
1443 else {
1444 com_node(c, CHILD(n, 1));
1445 com_addbyte(c, op+2);
1446 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001447 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001448 }
1449 else {
1450 com_node(c, CHILD(n, 0));
1451 com_node(c, CHILD(n, 2));
1452 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001453 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001454 }
1455}
1456
Guido van Rossum635abd21997-01-06 22:56:52 +00001457static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001458com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1459{
1460 if (NCH(n) == 1) {
1461 com_addbyte(c, DUP_TOP);
1462 com_push(c, 1);
1463 com_addbyte(c, SLICE);
1464 com_node(c, augn);
1465 com_addbyte(c, opcode);
1466 com_pop(c, 1);
1467 com_addbyte(c, ROT_TWO);
1468 com_addbyte(c, STORE_SLICE);
1469 com_pop(c, 2);
1470 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1471 com_node(c, CHILD(n, 0));
1472 com_addoparg(c, DUP_TOPX, 2);
1473 com_push(c, 2);
1474 com_addbyte(c, SLICE+1);
1475 com_pop(c, 1);
1476 com_node(c, augn);
1477 com_addbyte(c, opcode);
1478 com_pop(c, 1);
1479 com_addbyte(c, ROT_THREE);
1480 com_addbyte(c, STORE_SLICE+1);
1481 com_pop(c, 3);
1482 } else if (NCH(n) == 2) {
1483 com_node(c, CHILD(n, 1));
1484 com_addoparg(c, DUP_TOPX, 2);
1485 com_push(c, 2);
1486 com_addbyte(c, SLICE+2);
1487 com_pop(c, 1);
1488 com_node(c, augn);
1489 com_addbyte(c, opcode);
1490 com_pop(c, 1);
1491 com_addbyte(c, ROT_THREE);
1492 com_addbyte(c, STORE_SLICE+2);
1493 com_pop(c, 3);
1494 } else {
1495 com_node(c, CHILD(n, 0));
1496 com_node(c, CHILD(n, 2));
1497 com_addoparg(c, DUP_TOPX, 3);
1498 com_push(c, 3);
1499 com_addbyte(c, SLICE+3);
1500 com_pop(c, 2);
1501 com_node(c, augn);
1502 com_addbyte(c, opcode);
1503 com_pop(c, 1);
1504 com_addbyte(c, ROT_FOUR);
1505 com_addbyte(c, STORE_SLICE+3);
1506 com_pop(c, 4);
1507 }
1508}
1509
1510static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001511com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001512{
1513 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001514 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001515 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001516 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001517 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001518 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001519 }
1520 else {
1521 com_node(c, CHILD(n, 0));
1522 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001523 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001524 }
1525 m = n;
1526 do {
1527 m = CHILD(m, 0);
1528 } while (NCH(m) == 1);
1529 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00001530 /* f(lambda x: x[0] = 3) ends up getting parsed with
1531 * LHS test = lambda x: x[0], and RHS test = 3.
1532 * SF bug 132313 points out that complaining about a keyword
1533 * then is very confusing.
1534 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001535 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00001536 TYPE(m) == lambdef ?
1537 "lambda cannot contain assignment" :
1538 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001539 }
1540 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001541 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001542 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001543 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001544 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001545 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001546 else if (*pkeywords == NULL) {
1547 c->c_errors++;
1548 Py_DECREF(v);
1549 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001550 if (PyDict_GetItem(*pkeywords, v) != NULL)
1551 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001552 "duplicate keyword argument");
1553 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001554 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001555 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001556 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001557 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001558 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001559 }
1560 }
1561 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001562}
1563
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001564static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001565com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001566{
1567 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001568 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001569 }
1570 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001571 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001572 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001573 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001574 int star_flag = 0;
1575 int starstar_flag = 0;
1576 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001577 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001578 na = 0;
1579 nk = 0;
1580 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001581 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001582 if (TYPE(ch) == STAR ||
1583 TYPE(ch) == DOUBLESTAR)
1584 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001585 if (ch->n_lineno != lineno) {
1586 lineno = ch->n_lineno;
1587 com_addoparg(c, SET_LINENO, lineno);
1588 }
1589 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001590 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001591 na++;
1592 else
1593 nk++;
1594 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001595 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001596 while (i < NCH(n)) {
1597 node *tok = CHILD(n, i);
1598 node *ch = CHILD(n, i+1);
1599 i += 3;
1600 switch (TYPE(tok)) {
1601 case STAR: star_flag = 1; break;
1602 case DOUBLESTAR: starstar_flag = 1; break;
1603 }
1604 com_node(c, ch);
1605 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001606 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001607 com_error(c, PyExc_SyntaxError,
1608 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001609 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001610 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001611 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001612 star_flag + (starstar_flag << 1);
1613 else
1614 opcode = CALL_FUNCTION;
1615 com_addoparg(c, opcode, na | (nk << 8));
1616 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001617 }
1618}
1619
1620static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001621com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001622{
1623 com_addopname(c, LOAD_ATTR, n);
1624}
1625
1626static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001627com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001628{
1629 int i=0;
1630 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001631 node *ch;
1632
1633 /* first argument */
1634 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001635 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001636 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001637 i++;
1638 }
1639 else {
1640 com_node(c, CHILD(n,i));
1641 i++;
1642 REQ(CHILD(n,i),COLON);
1643 i++;
1644 }
1645 /* second argument */
1646 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1647 com_node(c, CHILD(n,i));
1648 i++;
1649 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001650 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001651 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001652 com_push(c, 1);
1653 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001654 /* remaining arguments */
1655 for (; i < NCH(n); i++) {
1656 ns++;
1657 ch=CHILD(n,i);
1658 REQ(ch, sliceop);
1659 if (NCH(ch) == 1) {
1660 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001661 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001662 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001663 }
1664 else
1665 com_node(c, CHILD(ch,1));
1666 }
1667 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001668 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001669}
1670
1671static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001672com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001673{
1674 node *ch;
1675 REQ(n, subscript);
1676 ch = CHILD(n,0);
1677 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001678 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001679 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001680 com_push(c, 1);
1681 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001682 else {
1683 /* check for slice */
1684 if ((TYPE(ch) == COLON || NCH(n) > 1))
1685 com_sliceobj(c, n);
1686 else {
1687 REQ(ch, test);
1688 com_node(c, ch);
1689 }
1690 }
1691}
1692
1693static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001694com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001695{
1696 int i, op;
1697 REQ(n, subscriptlist);
1698 /* Check to make backward compatible slice behavior for '[i:j]' */
1699 if (NCH(n) == 1) {
1700 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001701 /* 'Basic' slice, should have exactly one colon. */
1702 if ((TYPE(CHILD(sub, 0)) == COLON
1703 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1704 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1705 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001706 switch (assigning) {
1707 case OP_DELETE:
1708 op = DELETE_SLICE;
1709 break;
1710 case OP_ASSIGN:
1711 op = STORE_SLICE;
1712 break;
1713 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001714 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001715 break;
1716 default:
1717 com_augassign_slice(c, sub, assigning, augn);
1718 return;
1719 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001720 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001721 if (op == STORE_SLICE)
1722 com_pop(c, 2);
1723 else if (op == DELETE_SLICE)
1724 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001725 return;
1726 }
1727 }
1728 /* Else normal subscriptlist. Compile each subscript. */
1729 for (i = 0; i < NCH(n); i += 2)
1730 com_subscript(c, CHILD(n, i));
1731 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001732 if (NCH(n) > 1) {
1733 i = (NCH(n)+1) / 2;
1734 com_addoparg(c, BUILD_TUPLE, i);
1735 com_pop(c, i-1);
1736 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001737 switch (assigning) {
1738 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001739 op = DELETE_SUBSCR;
1740 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00001741 break;
1742 default:
1743 case OP_ASSIGN:
1744 op = STORE_SUBSCR;
1745 i = 3;
1746 break;
1747 case OP_APPLY:
1748 op = BINARY_SUBSCR;
1749 i = 1;
1750 break;
1751 }
1752 if (assigning > OP_APPLY) {
1753 com_addoparg(c, DUP_TOPX, 2);
1754 com_push(c, 2);
1755 com_addbyte(c, BINARY_SUBSCR);
1756 com_pop(c, 1);
1757 com_node(c, augn);
1758 com_addbyte(c, assigning);
1759 com_pop(c, 1);
1760 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001761 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001762 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001763 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001764}
1765
1766static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001767com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001768{
1769 REQ(n, trailer);
1770 switch (TYPE(CHILD(n, 0))) {
1771 case LPAR:
1772 com_call_function(c, CHILD(n, 1));
1773 break;
1774 case DOT:
1775 com_select_member(c, CHILD(n, 1));
1776 break;
1777 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00001778 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001779 break;
1780 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001781 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001782 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001783 }
1784}
1785
1786static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001787com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001788{
1789 int i;
1790 REQ(n, power);
1791 com_atom(c, CHILD(n, 0));
1792 for (i = 1; i < NCH(n); i++) {
1793 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1794 com_factor(c, CHILD(n, i+1));
1795 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001796 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001797 break;
1798 }
1799 else
1800 com_apply_trailer(c, CHILD(n, i));
1801 }
1802}
1803
1804static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001805com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001806{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001807 REQ(n, factor);
1808 if (TYPE(CHILD(n, 0)) == PLUS) {
1809 com_factor(c, CHILD(n, 1));
1810 com_addbyte(c, UNARY_POSITIVE);
1811 }
1812 else if (TYPE(CHILD(n, 0)) == MINUS) {
1813 com_factor(c, CHILD(n, 1));
1814 com_addbyte(c, UNARY_NEGATIVE);
1815 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001816 else if (TYPE(CHILD(n, 0)) == TILDE) {
1817 com_factor(c, CHILD(n, 1));
1818 com_addbyte(c, UNARY_INVERT);
1819 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001820 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001821 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001822 }
1823}
1824
1825static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001826com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001827{
1828 int i;
1829 int op;
1830 REQ(n, term);
1831 com_factor(c, CHILD(n, 0));
1832 for (i = 2; i < NCH(n); i += 2) {
1833 com_factor(c, CHILD(n, i));
1834 switch (TYPE(CHILD(n, i-1))) {
1835 case STAR:
1836 op = BINARY_MULTIPLY;
1837 break;
1838 case SLASH:
1839 op = BINARY_DIVIDE;
1840 break;
1841 case PERCENT:
1842 op = BINARY_MODULO;
1843 break;
1844 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001845 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001846 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001847 op = 255;
1848 }
1849 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001850 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001851 }
1852}
1853
1854static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001855com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001856{
1857 int i;
1858 int op;
1859 REQ(n, arith_expr);
1860 com_term(c, CHILD(n, 0));
1861 for (i = 2; i < NCH(n); i += 2) {
1862 com_term(c, CHILD(n, i));
1863 switch (TYPE(CHILD(n, i-1))) {
1864 case PLUS:
1865 op = BINARY_ADD;
1866 break;
1867 case MINUS:
1868 op = BINARY_SUBTRACT;
1869 break;
1870 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001871 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001872 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001873 op = 255;
1874 }
1875 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001876 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001877 }
1878}
1879
1880static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001881com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001882{
1883 int i;
1884 int op;
1885 REQ(n, shift_expr);
1886 com_arith_expr(c, CHILD(n, 0));
1887 for (i = 2; i < NCH(n); i += 2) {
1888 com_arith_expr(c, CHILD(n, i));
1889 switch (TYPE(CHILD(n, i-1))) {
1890 case LEFTSHIFT:
1891 op = BINARY_LSHIFT;
1892 break;
1893 case RIGHTSHIFT:
1894 op = BINARY_RSHIFT;
1895 break;
1896 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001897 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001898 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001899 op = 255;
1900 }
1901 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001902 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001903 }
1904}
1905
1906static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001907com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001908{
1909 int i;
1910 int op;
1911 REQ(n, and_expr);
1912 com_shift_expr(c, CHILD(n, 0));
1913 for (i = 2; i < NCH(n); i += 2) {
1914 com_shift_expr(c, CHILD(n, i));
1915 if (TYPE(CHILD(n, i-1)) == AMPER) {
1916 op = BINARY_AND;
1917 }
1918 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001919 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001920 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001921 op = 255;
1922 }
1923 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001924 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001925 }
1926}
1927
1928static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001929com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001930{
1931 int i;
1932 int op;
1933 REQ(n, xor_expr);
1934 com_and_expr(c, CHILD(n, 0));
1935 for (i = 2; i < NCH(n); i += 2) {
1936 com_and_expr(c, CHILD(n, i));
1937 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1938 op = BINARY_XOR;
1939 }
1940 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001941 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001942 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001943 op = 255;
1944 }
1945 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001946 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001947 }
1948}
1949
1950static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001951com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001952{
1953 int i;
1954 int op;
1955 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001956 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001957 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001958 com_xor_expr(c, CHILD(n, i));
1959 if (TYPE(CHILD(n, i-1)) == VBAR) {
1960 op = BINARY_OR;
1961 }
1962 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001963 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001964 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001965 op = 255;
1966 }
1967 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001968 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001969 }
1970}
1971
1972static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001973cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001974{
1975 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001976 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001977 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1978 if (NCH(n) == 1) {
1979 n = CHILD(n, 0);
1980 switch (TYPE(n)) {
1981 case LESS: return LT;
1982 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001983 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001984 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001985 case LESSEQUAL: return LE;
1986 case GREATEREQUAL: return GE;
1987 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001988 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1989 if (strcmp(STR(n), "is") == 0) return IS;
1990 }
1991 }
1992 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001993 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001994 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1995 return NOT_IN;
1996 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1997 return IS_NOT;
1998 }
1999 }
2000 return BAD;
2001}
2002
2003static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002004com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002005{
2006 int i;
2007 enum cmp_op op;
2008 int anchor;
2009 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2010 com_expr(c, CHILD(n, 0));
2011 if (NCH(n) == 1)
2012 return;
2013
2014 /****************************************************************
2015 The following code is generated for all but the last
2016 comparison in a chain:
2017
2018 label: on stack: opcode: jump to:
2019
2020 a <code to load b>
2021 a, b DUP_TOP
2022 a, b, b ROT_THREE
2023 b, a, b COMPARE_OP
2024 b, 0-or-1 JUMP_IF_FALSE L1
2025 b, 1 POP_TOP
2026 b
2027
2028 We are now ready to repeat this sequence for the next
2029 comparison in the chain.
2030
2031 For the last we generate:
2032
2033 b <code to load c>
2034 b, c COMPARE_OP
2035 0-or-1
2036
2037 If there were any jumps to L1 (i.e., there was more than one
2038 comparison), we generate:
2039
2040 0-or-1 JUMP_FORWARD L2
2041 L1: b, 0 ROT_TWO
2042 0, b POP_TOP
2043 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002044 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002045 ****************************************************************/
2046
2047 anchor = 0;
2048
2049 for (i = 2; i < NCH(n); i += 2) {
2050 com_expr(c, CHILD(n, i));
2051 if (i+2 < NCH(n)) {
2052 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002053 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002054 com_addbyte(c, ROT_THREE);
2055 }
2056 op = cmp_type(CHILD(n, i-1));
2057 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002058 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002059 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002060 }
2061 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002062 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002063 if (i+2 < NCH(n)) {
2064 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2065 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002066 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002067 }
2068 }
2069
2070 if (anchor) {
2071 int anchor2 = 0;
2072 com_addfwref(c, JUMP_FORWARD, &anchor2);
2073 com_backpatch(c, anchor);
2074 com_addbyte(c, ROT_TWO);
2075 com_addbyte(c, POP_TOP);
2076 com_backpatch(c, anchor2);
2077 }
2078}
2079
2080static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002081com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002082{
2083 REQ(n, not_test); /* 'not' not_test | comparison */
2084 if (NCH(n) == 1) {
2085 com_comparison(c, CHILD(n, 0));
2086 }
2087 else {
2088 com_not_test(c, CHILD(n, 1));
2089 com_addbyte(c, UNARY_NOT);
2090 }
2091}
2092
2093static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002094com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002095{
2096 int i;
2097 int anchor;
2098 REQ(n, and_test); /* not_test ('and' not_test)* */
2099 anchor = 0;
2100 i = 0;
2101 for (;;) {
2102 com_not_test(c, CHILD(n, i));
2103 if ((i += 2) >= NCH(n))
2104 break;
2105 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2106 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002107 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002108 }
2109 if (anchor)
2110 com_backpatch(c, anchor);
2111}
2112
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002113static int
2114com_make_closure(struct compiling *c, PyCodeObject *co)
2115{
2116 int i, free = PyTuple_GET_SIZE(co->co_freevars);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002117 /* If the code is compiled with st->st_nested_scopes == 0,
2118 then no variable will ever be added to co_freevars.
2119 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002120 if (free == 0)
2121 return 0;
2122 for (i = 0; i < free; ++i) {
2123 /* Bypass com_addop_varname because it will generate
2124 LOAD_DEREF but LOAD_CLOSURE is needed.
2125 */
2126 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2127 int arg, reftype;
2128
2129 /* Special case: If a class contains a method with a
2130 free variable that has the same name as a method,
2131 the name will be considered free *and* local in the
2132 class. It should be handled by the closure, as
2133 well as by the normal name loookup logic.
2134 */
2135 reftype = get_ref_type(c, PyString_AS_STRING(name));
2136 if (reftype == CELL)
2137 arg = com_lookup_arg(c->c_cellvars, name);
2138 else /* (reftype == FREE) */
2139 arg = com_lookup_arg(c->c_freevars, name);
2140 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002141 fprintf(stderr, "lookup %s in %s %d %d\n"
2142 "freevars of %s: %s\n",
2143 PyObject_REPR(name),
2144 c->c_name,
2145 reftype, arg,
2146 PyString_AS_STRING(co->co_name),
2147 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002148 Py_FatalError("com_make_closure()");
2149 }
2150 com_addoparg(c, LOAD_CLOSURE, arg);
2151
2152 }
2153 com_push(c, free);
2154 return 1;
2155}
2156
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002157static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002158com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002159{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002160 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002161 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002162 PyObject *co;
2163 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002164 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002165 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2166 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002167 co = (PyObject *) icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002168 if (co == NULL) {
2169 c->c_errors++;
2170 return;
2171 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002172 symtable_exit_scope(c->c_symtable);
Tim Peters1e542112001-02-23 22:23:53 +00002173 i = com_addconst(c, co);
2174 closure = com_make_closure(c, (PyCodeObject *)co);
2175 Py_DECREF(co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002176 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002177 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002178 if (closure)
2179 com_addoparg(c, MAKE_CLOSURE, ndefs);
2180 else
2181 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002182 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002183 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002184 else {
2185 int anchor = 0;
2186 int i = 0;
2187 for (;;) {
2188 com_and_test(c, CHILD(n, i));
2189 if ((i += 2) >= NCH(n))
2190 break;
2191 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2192 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002193 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002194 }
2195 if (anchor)
2196 com_backpatch(c, anchor);
2197 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002198}
2199
2200static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002201com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002202{
2203 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002204 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002205 com_node(c, CHILD(n, 0));
2206 }
2207 else {
2208 int i;
2209 int len;
2210 len = (NCH(n) + 1) / 2;
2211 for (i = 0; i < NCH(n); i += 2)
2212 com_node(c, CHILD(n, i));
2213 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002214 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002215 }
2216}
2217
2218
2219/* Begin of assignment compilation */
2220
Thomas Wouters434d0822000-08-24 20:11:32 +00002221
2222static void
2223com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2224{
2225 com_addbyte(c, DUP_TOP);
2226 com_push(c, 1);
2227 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002228 com_node(c, augn);
2229 com_addbyte(c, opcode);
2230 com_pop(c, 1);
2231 com_addbyte(c, ROT_TWO);
2232 com_addopname(c, STORE_ATTR, n);
2233 com_pop(c, 2);
2234}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002235
2236static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002237com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002238{
2239 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002240 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002241}
2242
2243static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002244com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002245{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002246 REQ(n, trailer);
2247 switch (TYPE(CHILD(n, 0))) {
2248 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002249 com_error(c, PyExc_SyntaxError,
2250 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002251 break;
2252 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002253 if (assigning > OP_APPLY)
2254 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2255 else
2256 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002257 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002258 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002259 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002260 break;
2261 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002262 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002263 }
2264}
2265
2266static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002267com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002268{
2269 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002270 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002271 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002272 if (assigning) {
2273 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002274 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002275 com_push(c, i-1);
2276 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002277 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002278 com_assign(c, CHILD(n, i), assigning, NULL);
2279}
2280
2281static void
2282com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2283{
2284 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002285 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002286 com_push(c, 1);
2287 com_node(c, augn);
2288 com_addbyte(c, opcode);
2289 com_pop(c, 1);
2290 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002291}
2292
2293static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002294com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002295{
2296 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002297 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002298 if (assigning)
2299 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002300}
2301
2302static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002303com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002304{
2305 /* Loop to avoid trivial recursion */
2306 for (;;) {
2307 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002308
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002309 case exprlist:
2310 case testlist:
2311 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002312 if (assigning > OP_APPLY) {
2313 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002314 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002315 return;
2316 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002317 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002318 return;
2319 }
2320 n = CHILD(n, 0);
2321 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002322
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002323 case test:
2324 case and_test:
2325 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002326 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002327 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002328 case xor_expr:
2329 case and_expr:
2330 case shift_expr:
2331 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002332 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002333 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002334 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002335 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002336 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002337 return;
2338 }
2339 n = CHILD(n, 0);
2340 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002341
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002342 case power: /* atom trailer* ('**' power)*
2343 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002344 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002345 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002346 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002347 return;
2348 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002349 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002350 int i;
2351 com_node(c, CHILD(n, 0));
2352 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002353 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002354 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002355 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002356 return;
2357 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002358 com_apply_trailer(c, CHILD(n, i));
2359 } /* NB i is still alive */
2360 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002361 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002362 return;
2363 }
2364 n = CHILD(n, 0);
2365 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002366
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002367 case atom:
2368 switch (TYPE(CHILD(n, 0))) {
2369 case LPAR:
2370 n = CHILD(n, 1);
2371 if (TYPE(n) == RPAR) {
2372 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002373 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002374 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002375 return;
2376 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002377 if (assigning > OP_APPLY) {
2378 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002379 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002380 return;
2381 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002382 break;
2383 case LSQB:
2384 n = CHILD(n, 1);
2385 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002386 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002387 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002388 return;
2389 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002390 if (assigning > OP_APPLY) {
2391 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002392 "augmented assign to list not possible");
2393 return;
2394 }
2395 if (NCH(n) > 1
2396 && TYPE(CHILD(n, 1)) == list_for) {
2397 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002398 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002399 return;
2400 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002401 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002402 return;
2403 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002404 if (assigning > OP_APPLY)
2405 com_augassign_name(c, CHILD(n, 0),
2406 assigning, augn);
2407 else
2408 com_assign_name(c, CHILD(n, 0),
2409 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002410 return;
2411 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002412 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002413 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002414 return;
2415 }
2416 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002417
2418 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002419 com_error(c, PyExc_SyntaxError,
2420 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002421 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002422
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002423 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002424 com_error(c, PyExc_SystemError,
2425 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002426 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002427
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002428 }
2429 }
2430}
Guido van Rossum7c531111997-03-11 18:42:21 +00002431
Thomas Wouters434d0822000-08-24 20:11:32 +00002432static void
2433com_augassign(struct compiling *c, node *n)
2434{
2435 int opcode;
2436
2437 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2438 case '+': opcode = INPLACE_ADD; break;
2439 case '-': opcode = INPLACE_SUBTRACT; break;
2440 case '/': opcode = INPLACE_DIVIDE; break;
2441 case '%': opcode = INPLACE_MODULO; break;
2442 case '<': opcode = INPLACE_LSHIFT; break;
2443 case '>': opcode = INPLACE_RSHIFT; break;
2444 case '&': opcode = INPLACE_AND; break;
2445 case '^': opcode = INPLACE_XOR; break;
2446 case '|': opcode = INPLACE_OR; break;
2447 case '*':
2448 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2449 opcode = INPLACE_POWER;
2450 else
2451 opcode = INPLACE_MULTIPLY;
2452 break;
2453 default:
2454 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2455 return;
2456 }
2457 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2458}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002459
2460static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002461com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002462{
Thomas Wouters434d0822000-08-24 20:11:32 +00002463 REQ(n, expr_stmt);
2464 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002465 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002466 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002467 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002468 if (NCH(n) == 1) {
2469 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002470 if (c->c_interactive)
2471 com_addbyte(c, PRINT_EXPR);
2472 else
2473 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002474 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002475 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002476 else if (TYPE(CHILD(n,1)) == augassign)
2477 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002478 else {
2479 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002480 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002481 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002482 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002483 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002484 com_push(c, 1);
2485 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002486 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002487 }
2488 }
2489}
2490
2491static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002492com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002493{
2494 int a = 0, b = 0;
2495 int i;
2496 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2497 /* Generate code like for
2498
2499 if __debug__:
2500 if not <test>:
2501 raise AssertionError [, <message>]
2502
2503 where <message> is the second test, if present.
2504 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002505
Guido van Rossum228d7f31997-04-02 05:24:36 +00002506 if (Py_OptimizeFlag)
2507 return;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002508 com_addop_name(c, LOAD_GLOBAL, "__debug__");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002509 com_push(c, 1);
2510 com_addfwref(c, JUMP_IF_FALSE, &a);
2511 com_addbyte(c, POP_TOP);
2512 com_pop(c, 1);
2513 com_node(c, CHILD(n, 1));
2514 com_addfwref(c, JUMP_IF_TRUE, &b);
2515 com_addbyte(c, POP_TOP);
2516 com_pop(c, 1);
2517 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002518 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002519 com_push(c, 1);
2520 i = NCH(n)/2; /* Either 2 or 4 */
2521 if (i > 1)
2522 com_node(c, CHILD(n, 3));
2523 com_addoparg(c, RAISE_VARARGS, i);
2524 com_pop(c, i);
2525 /* The interpreter does not fall through */
2526 /* All jumps converge here */
2527 com_backpatch(c, a);
2528 com_backpatch(c, b);
2529 com_addbyte(c, POP_TOP);
2530}
2531
2532static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002533com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002534{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002535 int i = 1;
2536 node* stream = NULL;
2537
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002538 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002539
2540 /* are we using the extended print form? */
2541 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2542 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002543 com_node(c, stream);
2544 /* stack: [...] => [... stream] */
2545 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002546 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2547 i = 4;
2548 else
2549 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002550 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002551 for (; i < NCH(n); i += 2) {
2552 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002553 com_addbyte(c, DUP_TOP);
2554 /* stack: [stream] => [stream stream] */
2555 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002556 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002557 /* stack: [stream stream] => [stream stream obj] */
2558 com_addbyte(c, ROT_TWO);
2559 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002560 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002561 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002562 com_pop(c, 2);
2563 }
2564 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002565 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002566 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002567 com_addbyte(c, PRINT_ITEM);
2568 com_pop(c, 1);
2569 }
2570 }
2571 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002572 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002573 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002574 /* must pop the extra stream object off the stack */
2575 com_addbyte(c, POP_TOP);
2576 /* stack: [... stream] => [...] */
2577 com_pop(c, 1);
2578 }
2579 }
2580 else {
2581 if (stream != NULL) {
2582 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002583 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002584 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002585 com_pop(c, 1);
2586 }
2587 else
2588 com_addbyte(c, PRINT_NEWLINE);
2589 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002590}
2591
2592static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002593com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002594{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002595 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002596 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002597 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002598 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002599 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002600 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002601 com_push(c, 1);
2602 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002603 else
2604 com_node(c, CHILD(n, 1));
2605 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002606 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002607}
2608
2609static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002610com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002611{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002612 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002613 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2614 if (NCH(n) > 1) {
2615 com_node(c, CHILD(n, 1));
2616 if (NCH(n) > 3) {
2617 com_node(c, CHILD(n, 3));
2618 if (NCH(n) > 5)
2619 com_node(c, CHILD(n, 5));
2620 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002621 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002622 i = NCH(n)/2;
2623 com_addoparg(c, RAISE_VARARGS, i);
2624 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002625}
2626
2627static void
Thomas Wouters52152252000-08-17 22:55:00 +00002628com_from_import(struct compiling *c, node *n)
2629{
2630 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2631 com_push(c, 1);
2632 if (NCH(n) > 1) {
2633 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2634 com_error(c, PyExc_SyntaxError, "invalid syntax");
2635 return;
2636 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002637 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002638 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002639 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00002640 com_pop(c, 1);
2641}
2642
2643static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002644com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002645{
2646 int i;
2647 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002648 /* 'import' dotted_name (',' dotted_name)* |
2649 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002650 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00002651 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002652 /* 'from' dotted_name 'import' ... */
2653 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002654
2655 if (TYPE(CHILD(n, 3)) == STAR) {
2656 tup = Py_BuildValue("(s)", "*");
2657 } else {
2658 tup = PyTuple_New((NCH(n) - 2)/2);
2659 for (i = 3; i < NCH(n); i += 2) {
2660 PyTuple_SET_ITEM(tup, (i-3)/2,
2661 PyString_FromString(STR(
Jeremy Hylton4419ac12001-02-28 22:54:51 +00002662 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002663 }
2664 }
2665 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00002666 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002667 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002668 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00002669 if (TYPE(CHILD(n, 3)) == STAR)
2670 com_addbyte(c, IMPORT_STAR);
2671 else {
2672 for (i = 3; i < NCH(n); i += 2)
2673 com_from_import(c, CHILD(n, i));
2674 com_addbyte(c, POP_TOP);
2675 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002676 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002677 }
2678 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002679 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002680 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00002681 node *subn = CHILD(n, i);
2682 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002683 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002684 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002685 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00002686 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00002687 int j;
2688 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00002689 com_error(c, PyExc_SyntaxError,
2690 "invalid syntax");
2691 return;
2692 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00002693 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
2694 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002695 CHILD(CHILD(subn, 0),
2696 j));
2697 com_addop_varname(c, VAR_STORE,
2698 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002699 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002700 com_addop_varname(c, VAR_STORE,
2701 STR(CHILD(CHILD(subn, 0),
2702 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002703 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002704 }
2705 }
2706}
2707
2708static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002709com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002710{
2711 REQ(n, exec_stmt);
2712 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2713 com_node(c, CHILD(n, 1));
2714 if (NCH(n) >= 4)
2715 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002716 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002717 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002718 com_push(c, 1);
2719 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002720 if (NCH(n) >= 6)
2721 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002722 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002723 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002724 com_push(c, 1);
2725 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002726 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002727 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002728}
2729
Guido van Rossum7c531111997-03-11 18:42:21 +00002730static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002731is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002732{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002733 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002734 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002735 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00002736
2737 /* Label to avoid tail recursion */
2738 next:
2739 switch (TYPE(n)) {
2740
2741 case suite:
2742 if (NCH(n) == 1) {
2743 n = CHILD(n, 0);
2744 goto next;
2745 }
2746 /* Fall through */
2747 case file_input:
2748 for (i = 0; i < NCH(n); i++) {
2749 node *ch = CHILD(n, i);
2750 if (TYPE(ch) == stmt) {
2751 n = ch;
2752 goto next;
2753 }
2754 }
2755 break;
2756
2757 case stmt:
2758 case simple_stmt:
2759 case small_stmt:
2760 n = CHILD(n, 0);
2761 goto next;
2762
2763 case expr_stmt:
2764 case testlist:
2765 case test:
2766 case and_test:
2767 case not_test:
2768 case comparison:
2769 case expr:
2770 case xor_expr:
2771 case and_expr:
2772 case shift_expr:
2773 case arith_expr:
2774 case term:
2775 case factor:
2776 case power:
2777 case atom:
2778 if (NCH(n) == 1) {
2779 n = CHILD(n, 0);
2780 goto next;
2781 }
2782 break;
2783
2784 case NAME:
2785 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2786 return 1;
2787 break;
2788
2789 case NUMBER:
2790 v = parsenumber(c, STR(n));
2791 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002792 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002793 break;
2794 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002795 i = PyObject_IsTrue(v);
2796 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002797 return i == 0;
2798
2799 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002800 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002801 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002802 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002803 break;
2804 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002805 i = PyObject_IsTrue(v);
2806 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002807 return i == 0;
2808
2809 }
2810 return 0;
2811}
2812
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002813static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002814com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002815{
2816 int i;
2817 int anchor = 0;
2818 REQ(n, if_stmt);
2819 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2820 for (i = 0; i+3 < NCH(n); i+=4) {
2821 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002822 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002823 if (is_constant_false(c, ch))
2824 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002825 if (i > 0)
2826 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002827 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002828 com_addfwref(c, JUMP_IF_FALSE, &a);
2829 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002830 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002831 com_node(c, CHILD(n, i+3));
2832 com_addfwref(c, JUMP_FORWARD, &anchor);
2833 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002834 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002835 com_addbyte(c, POP_TOP);
2836 }
2837 if (i+2 < NCH(n))
2838 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002839 if (anchor)
2840 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002841}
2842
2843static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002844com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002845{
2846 int break_anchor = 0;
2847 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002848 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002849 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2850 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002851 block_push(c, SETUP_LOOP);
2852 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002853 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002854 com_node(c, CHILD(n, 1));
2855 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2856 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002857 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002858 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002859 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002860 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002861 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2862 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002863 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002864 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002865 com_addbyte(c, POP_TOP);
2866 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002867 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002868 if (NCH(n) > 4)
2869 com_node(c, CHILD(n, 6));
2870 com_backpatch(c, break_anchor);
2871}
2872
2873static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002874com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002875{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002876 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002877 int break_anchor = 0;
2878 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002879 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002880 REQ(n, for_stmt);
2881 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2882 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002883 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002884 com_node(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002885 v = PyInt_FromLong(0L);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002886 if (v == NULL)
2887 c->c_errors++;
2888 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002889 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002890 Py_XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002891 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002892 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002893 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002894 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00002895 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002896 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002897 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002898 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002899 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2900 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002901 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002902 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002903 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002904 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002905 if (NCH(n) > 8)
2906 com_node(c, CHILD(n, 8));
2907 com_backpatch(c, break_anchor);
2908}
2909
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002910/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002911
2912 SETUP_FINALLY L
2913 <code for S>
2914 POP_BLOCK
2915 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002916 L: <code for Sf>
2917 END_FINALLY
2918
2919 The special instructions use the block stack. Each block
2920 stack entry contains the instruction that created it (here
2921 SETUP_FINALLY), the level of the value stack at the time the
2922 block stack entry was created, and a label (here L).
2923
2924 SETUP_FINALLY:
2925 Pushes the current value stack level and the label
2926 onto the block stack.
2927 POP_BLOCK:
2928 Pops en entry from the block stack, and pops the value
2929 stack until its level is the same as indicated on the
2930 block stack. (The label is ignored.)
2931 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002932 Pops a variable number of entries from the *value* stack
2933 and re-raises the exception they specify. The number of
2934 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002935
2936 The block stack is unwound when an exception is raised:
2937 when a SETUP_FINALLY entry is found, the exception is pushed
2938 onto the value stack (and the exception condition is cleared),
2939 and the interpreter jumps to the label gotten from the block
2940 stack.
2941
2942 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002943 (The contents of the value stack is shown in [], with the top
2944 at the right; 'tb' is trace-back info, 'val' the exception's
2945 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002946
2947 Value stack Label Instruction Argument
2948 [] SETUP_EXCEPT L1
2949 [] <code for S>
2950 [] POP_BLOCK
2951 [] JUMP_FORWARD L0
2952
Guido van Rossum3f5da241990-12-20 15:06:42 +00002953 [tb, val, exc] L1: DUP )
2954 [tb, val, exc, exc] <evaluate E1> )
2955 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2956 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2957 [tb, val, exc, 1] POP )
2958 [tb, val, exc] POP
2959 [tb, val] <assign to V1> (or POP if no V1)
2960 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002961 [] <code for S1>
2962 JUMP_FORWARD L0
2963
Guido van Rossum3f5da241990-12-20 15:06:42 +00002964 [tb, val, exc, 0] L2: POP
2965 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002966 .............................etc.......................
2967
Guido van Rossum3f5da241990-12-20 15:06:42 +00002968 [tb, val, exc, 0] Ln+1: POP
2969 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002970
2971 [] L0: <next statement>
2972
2973 Of course, parts are not generated if Vi or Ei is not present.
2974*/
2975
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002976static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002977com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002978{
2979 int except_anchor = 0;
2980 int end_anchor = 0;
2981 int else_anchor = 0;
2982 int i;
2983 node *ch;
2984
2985 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2986 block_push(c, SETUP_EXCEPT);
2987 com_node(c, CHILD(n, 2));
2988 com_addbyte(c, POP_BLOCK);
2989 block_pop(c, SETUP_EXCEPT);
2990 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2991 com_backpatch(c, except_anchor);
2992 for (i = 3;
2993 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2994 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002995 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002996 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002997 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002998 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002999 break;
3000 }
3001 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003002 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003003 com_addoparg(c, SET_LINENO, ch->n_lineno);
3004 if (NCH(ch) > 1) {
3005 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003006 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003007 com_node(c, CHILD(ch, 1));
3008 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003009 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003010 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3011 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003012 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003013 }
3014 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003015 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003016 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003017 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003018 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003019 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003020 com_pop(c, 1);
3021 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003022 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003023 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003024 com_node(c, CHILD(n, i+2));
3025 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3026 if (except_anchor) {
3027 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003028 /* We come in with [tb, val, exc, 0] on the
3029 stack; one pop and it's the same as
3030 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003031 com_addbyte(c, POP_TOP);
3032 }
3033 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003034 /* We actually come in here with [tb, val, exc] but the
3035 END_FINALLY will zap those and jump around.
3036 The c_stacklevel does not reflect them so we need not pop
3037 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003038 com_addbyte(c, END_FINALLY);
3039 com_backpatch(c, else_anchor);
3040 if (i < NCH(n))
3041 com_node(c, CHILD(n, i+2));
3042 com_backpatch(c, end_anchor);
3043}
3044
3045static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003046com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003047{
3048 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003049 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003050
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003051 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3052 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003053 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003054 com_addbyte(c, POP_BLOCK);
3055 block_pop(c, SETUP_FINALLY);
3056 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003057 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003058 /* While the generated code pushes only one item,
3059 the try-finally handling can enter here with
3060 up to three items. OK, here are the details:
3061 3 for an exception, 2 for RETURN, 1 for BREAK. */
3062 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003063 com_backpatch(c, finally_anchor);
3064 ch = CHILD(n, NCH(n)-1);
3065 com_addoparg(c, SET_LINENO, ch->n_lineno);
3066 com_node(c, ch);
3067 com_addbyte(c, END_FINALLY);
3068 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003069 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003070}
3071
3072static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003073com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003074{
3075 REQ(n, try_stmt);
3076 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3077 | 'try' ':' suite 'finally' ':' suite */
3078 if (TYPE(CHILD(n, 3)) != except_clause)
3079 com_try_finally(c, n);
3080 else
3081 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003082}
3083
Guido van Rossum8b993a91997-01-17 21:04:03 +00003084static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003085get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003086{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003087 int i;
3088
Guido van Rossum8b993a91997-01-17 21:04:03 +00003089 /* Label to avoid tail recursion */
3090 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003091 switch (TYPE(n)) {
3092
3093 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003094 if (NCH(n) == 1) {
3095 n = CHILD(n, 0);
3096 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003097 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003098 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003099 case file_input:
3100 for (i = 0; i < NCH(n); i++) {
3101 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003102 if (TYPE(ch) == stmt) {
3103 n = ch;
3104 goto next;
3105 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003106 }
3107 break;
3108
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003109 case stmt:
3110 case simple_stmt:
3111 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003112 n = CHILD(n, 0);
3113 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003114
3115 case expr_stmt:
3116 case testlist:
3117 case test:
3118 case and_test:
3119 case not_test:
3120 case comparison:
3121 case expr:
3122 case xor_expr:
3123 case and_expr:
3124 case shift_expr:
3125 case arith_expr:
3126 case term:
3127 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003128 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003129 if (NCH(n) == 1) {
3130 n = CHILD(n, 0);
3131 goto next;
3132 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003133 break;
3134
3135 case atom:
3136 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003137 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003138 break;
3139
3140 }
3141 return NULL;
3142}
3143
Guido van Rossum79f25d91997-04-29 20:08:16 +00003144static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003145get_docstring(node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003146{
Guido van Rossum541563e1999-01-28 15:08:09 +00003147 /* Don't generate doc-strings if run with -OO */
3148 if (Py_OptimizeFlag > 1)
3149 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003150 n = get_rawdocstring(n);
3151 if (n == NULL)
3152 return NULL;
3153 return parsestrplus(n);
3154}
3155
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003156static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003157com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003158{
3159 REQ(n, suite);
3160 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3161 if (NCH(n) == 1) {
3162 com_node(c, CHILD(n, 0));
3163 }
3164 else {
3165 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003166 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003167 node *ch = CHILD(n, i);
3168 if (TYPE(ch) == stmt)
3169 com_node(c, ch);
3170 }
3171 }
3172}
3173
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003174/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003175static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003176com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003177{
3178 int i = c->c_nblocks;
3179 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3180 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3181 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003182 else if (i <= 0) {
3183 /* at the outer level */
3184 com_error(c, PyExc_SyntaxError,
3185 "'continue' not properly in loop");
3186 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003187 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003188 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003189 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003190 if (c->c_block[j] == SETUP_LOOP)
3191 break;
3192 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003193 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003194 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003195 for (; i > j; --i) {
3196 if (c->c_block[i] == SETUP_EXCEPT ||
3197 c->c_block[i] == SETUP_FINALLY) {
3198 com_addoparg(c, CONTINUE_LOOP,
3199 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003200 return;
3201 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003202 if (c->c_block[i] == END_FINALLY) {
3203 com_error(c, PyExc_SyntaxError,
3204 "'continue' not supported inside 'finally' clause");
3205 return;
3206 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003207 }
3208 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003209 com_error(c, PyExc_SyntaxError,
3210 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003211 }
3212 /* XXX Could allow it inside a 'finally' clause
3213 XXX if we could pop the exception still on the stack */
3214}
3215
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003216static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003217com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003218{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003219 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003220 if (TYPE(n) == lambdef) {
3221 /* lambdef: 'lambda' [varargslist] ':' test */
3222 n = CHILD(n, 1);
3223 }
3224 else {
3225 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3226 n = CHILD(n, 2);
3227 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3228 n = CHILD(n, 1);
3229 }
3230 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003231 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003232 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003233 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003234 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3235 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003236 nargs = 0;
3237 ndefs = 0;
3238 for (i = 0; i < nch; i++) {
3239 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003240 if (TYPE(CHILD(n, i)) == STAR ||
3241 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003242 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003243 nargs++;
3244 i++;
3245 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003246 t = RPAR; /* Anything except EQUAL or COMMA */
3247 else
3248 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003249 if (t == EQUAL) {
3250 i++;
3251 ndefs++;
3252 com_node(c, CHILD(n, i));
3253 i++;
3254 if (i >= nch)
3255 break;
3256 t = TYPE(CHILD(n, i));
3257 }
3258 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003259 /* Treat "(a=1, b)" as an error */
3260 if (ndefs)
3261 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003262 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003263 }
3264 if (t != COMMA)
3265 break;
3266 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003267 return ndefs;
3268}
3269
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003270static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003271com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003272{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003273 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003274 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003275 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003276 ndefs = com_argdefs(c, n);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003277 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3278 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003279 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003280 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003281 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003282 c->c_errors++;
3283 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003284 int closure = com_make_closure(c, (PyCodeObject *)co);
3285 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003286 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003287 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003288 if (closure)
3289 com_addoparg(c, MAKE_CLOSURE, ndefs);
3290 else
3291 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003292 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003293 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003294 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003295 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003296 }
3297}
3298
3299static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003300com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003301{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003302 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003303 REQ(n, testlist);
3304 /* testlist: test (',' test)* [','] */
3305 for (i = 0; i < NCH(n); i += 2)
3306 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003307 i = (NCH(n)+1) / 2;
3308 com_addoparg(c, BUILD_TUPLE, i);
3309 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003310}
3311
3312static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003313com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003314{
Guido van Rossum25831651993-05-19 14:50:45 +00003315 int i;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003316 PyObject *co, *v;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003317 char *name;
3318
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003319 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003320 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003321 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003322 c->c_errors++;
3323 return;
3324 }
3325 /* Push the class name on the stack */
3326 i = com_addconst(c, v);
3327 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003328 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003329 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003330 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003331 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003332 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003333 com_push(c, 1);
3334 }
Guido van Rossum25831651993-05-19 14:50:45 +00003335 else
3336 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003337 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003338 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003339 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003340 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003341 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003342 c->c_errors++;
3343 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003344 int closure = com_make_closure(c, (PyCodeObject *)co);
3345 i = com_addconst(c, co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003346 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003347 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003348 if (closure)
3349 com_addoparg(c, MAKE_CLOSURE, 0);
3350 else
3351 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003352 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003353 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003354 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003355 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003356 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003357 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003358}
3359
3360static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003361com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003362{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003363 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003364 if (c->c_errors)
3365 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003366 switch (TYPE(n)) {
3367
3368 /* Definition nodes */
3369
3370 case funcdef:
3371 com_funcdef(c, n);
3372 break;
3373 case classdef:
3374 com_classdef(c, n);
3375 break;
3376
3377 /* Trivial parse tree nodes */
3378
3379 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003380 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003381 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003382 n = CHILD(n, 0);
3383 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003384
3385 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003386 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
3387 com_addoparg(c, SET_LINENO, n->n_lineno);
3388 {
3389 int i;
3390 for (i = 0; i < NCH(n)-1; i += 2)
3391 com_node(c, CHILD(n, i));
3392 }
3393 break;
3394
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003395 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003396 com_addoparg(c, SET_LINENO, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003397 n = CHILD(n, 0);
3398 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003399
3400 /* Statement nodes */
3401
3402 case expr_stmt:
3403 com_expr_stmt(c, n);
3404 break;
3405 case print_stmt:
3406 com_print_stmt(c, n);
3407 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003408 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003409 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003410 break;
3411 case pass_stmt:
3412 break;
3413 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003414 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003415 com_error(c, PyExc_SyntaxError,
3416 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003417 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003418 com_addbyte(c, BREAK_LOOP);
3419 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003420 case continue_stmt:
3421 com_continue_stmt(c, n);
3422 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003423 case return_stmt:
3424 com_return_stmt(c, n);
3425 break;
3426 case raise_stmt:
3427 com_raise_stmt(c, n);
3428 break;
3429 case import_stmt:
3430 com_import_stmt(c, n);
3431 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003432 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003433 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003434 case exec_stmt:
3435 com_exec_stmt(c, n);
3436 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003437 case assert_stmt:
3438 com_assert_stmt(c, n);
3439 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003440 case if_stmt:
3441 com_if_stmt(c, n);
3442 break;
3443 case while_stmt:
3444 com_while_stmt(c, n);
3445 break;
3446 case for_stmt:
3447 com_for_stmt(c, n);
3448 break;
3449 case try_stmt:
3450 com_try_stmt(c, n);
3451 break;
3452 case suite:
3453 com_suite(c, n);
3454 break;
3455
3456 /* Expression nodes */
3457
3458 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003459 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003460 break;
3461 case test:
3462 com_test(c, n);
3463 break;
3464 case and_test:
3465 com_and_test(c, n);
3466 break;
3467 case not_test:
3468 com_not_test(c, n);
3469 break;
3470 case comparison:
3471 com_comparison(c, n);
3472 break;
3473 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003474 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003475 break;
3476 case expr:
3477 com_expr(c, n);
3478 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003479 case xor_expr:
3480 com_xor_expr(c, n);
3481 break;
3482 case and_expr:
3483 com_and_expr(c, n);
3484 break;
3485 case shift_expr:
3486 com_shift_expr(c, n);
3487 break;
3488 case arith_expr:
3489 com_arith_expr(c, n);
3490 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003491 case term:
3492 com_term(c, n);
3493 break;
3494 case factor:
3495 com_factor(c, n);
3496 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003497 case power:
3498 com_power(c, n);
3499 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003500 case atom:
3501 com_atom(c, n);
3502 break;
3503
3504 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003505 com_error(c, PyExc_SystemError,
3506 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003507 }
3508}
3509
Tim Petersdbd9ba62000-07-09 03:09:57 +00003510static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003511
3512static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003513com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003514{
3515 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3516 if (TYPE(CHILD(n, 0)) == LPAR)
3517 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003518 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003519 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003520 com_pop(c, 1);
3521 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003522}
3523
3524static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003525com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003526{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003527 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003528 if (NCH(n) == 1) {
3529 com_fpdef(c, CHILD(n, 0));
3530 }
3531 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003532 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003533 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003534 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003535 for (i = 0; i < NCH(n); i += 2)
3536 com_fpdef(c, CHILD(n, i));
3537 }
3538}
3539
3540static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003541com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003542{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003543 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003544 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003545 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003546 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003547 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003548 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003549 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003550 /* Enter all arguments in table of locals */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003551 for (i = 0, narg = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003552 node *ch = CHILD(n, i);
3553 node *fp;
3554 char *name;
Guido van Rossum50564e81996-01-12 01:13:16 +00003555 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003556 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003557 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3558 fp = CHILD(ch, 0);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00003559 if (TYPE(fp) != NAME) {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003560 name = nbuf;
3561 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003562 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003563 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003564 narg++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003565 /* all name updates handled by symtable */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003566 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003567 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003568 ch = CHILD(n, i);
3569 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003570 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003571 else
3572 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003573 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003574 if (complex) {
3575 /* Generate code for complex arguments only after
3576 having counted the simple arguments */
3577 int ilocal = 0;
3578 for (i = 0; i < nch; i++) {
3579 node *ch = CHILD(n, i);
3580 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003581 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003582 break;
3583 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3584 fp = CHILD(ch, 0);
3585 if (TYPE(fp) != NAME) {
3586 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003587 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003588 com_fpdef(c, ch);
3589 }
3590 ilocal++;
3591 if (++i >= nch)
3592 break;
3593 ch = CHILD(n, i);
3594 if (TYPE(ch) == EQUAL)
3595 i += 2;
3596 else
3597 REQ(ch, COMMA);
3598 }
3599 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003600}
3601
3602static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003603com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003604{
3605 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003606 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003607 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003608 doc = get_docstring(n);
3609 if (doc != NULL) {
3610 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003611 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003612 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003613 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003614 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003615 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003616 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003617 for (i = 0; i < NCH(n); i++) {
3618 node *ch = CHILD(n, i);
3619 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3620 com_node(c, ch);
3621 }
3622}
3623
3624/* Top-level compile-node interface */
3625
3626static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003627compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003628{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003629 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003630 node *ch;
3631 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003632 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003633 doc = get_docstring(CHILD(n, 4));
3634 if (doc != NULL) {
3635 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003636 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003637 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003638 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003639 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003640 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3641 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003642 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003643 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003644 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003645 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003646 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003647 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003648 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003649 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003650 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003651}
3652
3653static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003654compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003655{
Guido van Rossum590baa41993-11-30 13:40:46 +00003656 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003657 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003658 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003659
3660 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003661 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003662 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003663 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003664 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003665 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003666 else
3667 ch = CHILD(n, 2);
3668 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003669 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003670 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003671}
3672
3673static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003674compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003675{
3676 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003677 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003678 REQ(n, classdef);
3679 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3680 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003681 c->c_private = c->c_name;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003682 ch = CHILD(n, NCH(n)-1); /* The suite */
3683 doc = get_docstring(ch);
3684 if (doc != NULL) {
3685 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003686 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003687 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003688 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003689 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003690 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003691 }
3692 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003693 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003694 com_node(c, ch);
3695 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003696 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003697 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003698 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003699}
3700
3701static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003702compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003703{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003704 com_addoparg(c, SET_LINENO, n->n_lineno);
3705
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003706 switch (TYPE(n)) {
3707
Guido van Rossum4c417781991-01-21 16:09:22 +00003708 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003709 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003710 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003711 n = CHILD(n, 0);
3712 if (TYPE(n) != NEWLINE)
3713 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003714 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003715 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003716 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003717 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003718 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003719 break;
3720
Guido van Rossum4c417781991-01-21 16:09:22 +00003721 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003722 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003723 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003724 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003725 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003726 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003727 break;
3728
Guido van Rossum590baa41993-11-30 13:40:46 +00003729 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003730 com_node(c, CHILD(n, 0));
3731 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003732 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003733 break;
3734
Guido van Rossum590baa41993-11-30 13:40:46 +00003735 case lambdef: /* anonymous function definition */
3736 compile_lambdef(c, n);
3737 break;
3738
Guido van Rossum4c417781991-01-21 16:09:22 +00003739 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003740 compile_funcdef(c, n);
3741 break;
3742
Guido van Rossum4c417781991-01-21 16:09:22 +00003743 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003744 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003745 break;
3746
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003747 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003748 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003749 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003750 }
3751}
3752
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003753static PyObject *
3754dict_keys_inorder(PyObject *dict, int offset)
3755{
3756 PyObject *tuple, *k, *v;
3757 int i, pos = 0, size = PyDict_Size(dict);
3758
3759 tuple = PyTuple_New(size);
3760 if (tuple == NULL)
3761 return NULL;
3762 while (PyDict_Next(dict, &pos, &k, &v)) {
3763 i = PyInt_AS_LONG(v);
3764 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00003765 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003766 PyTuple_SET_ITEM(tuple, i - offset, k);
3767 }
3768 return tuple;
3769}
3770
Guido van Rossum79f25d91997-04-29 20:08:16 +00003771PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003772PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003773{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003774 return PyNode_CompileFlags(n, filename, NULL);
3775}
3776
3777PyCodeObject *
3778PyNode_CompileFlags(node *n, char *filename, PyCompilerFlags *flags)
3779{
3780 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003781}
3782
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003783struct symtable *
3784PyNode_CompileSymtable(node *n, char *filename)
3785{
3786 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003787 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003788
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003789 ff = PyNode_Future(n, filename);
3790 if (ff == NULL)
3791 return NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003792 st = symtable_init();
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003793 if (st == NULL)
3794 return NULL;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003795 st->st_future = ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003796 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003797 if (st->st_errors > 0)
3798 goto fail;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003799 symtable_node(st, n);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003800 if (st->st_errors > 0)
3801 goto fail;
3802
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003803 return st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003804 fail:
3805 PyMem_Free((void *)ff);
3806 st->st_future = NULL;
3807 PySymtable_Free(st);
3808 return NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003809}
3810
Guido van Rossum79f25d91997-04-29 20:08:16 +00003811static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003812icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003813{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003814 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003815}
3816
Guido van Rossum79f25d91997-04-29 20:08:16 +00003817static PyCodeObject *
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003818jcompile(node *n, char *filename, struct compiling *base,
3819 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003820{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003821 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003822 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003823 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003824 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003825 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003826 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003827 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003828 /* c_symtable still points to parent's symbols */
3829 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003830 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003831 sc.c_nested = 1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003832 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003833 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00003834 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003835 if (sc.c_future == NULL) {
3836 com_free(&sc);
3837 return NULL;
3838 }
3839 if (flags) {
3840 if (flags->cf_nested_scopes)
3841 sc.c_future->ff_nested_scopes = 1;
3842 else if (sc.c_future->ff_nested_scopes)
3843 flags->cf_nested_scopes = 1;
3844 }
3845 if (symtable_build(&sc, n) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003846 com_free(&sc);
3847 return NULL;
3848 }
3849 }
3850 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003851 if (symtable_load_symbols(&sc) < 0) {
3852 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003853 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003854 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003855 compile_node(&sc, n);
3856 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00003857 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003858 PyObject *consts, *names, *varnames, *filename, *name,
3859 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003860 consts = PyList_AsTuple(sc.c_consts);
3861 names = PyList_AsTuple(sc.c_names);
3862 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003863 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
3864 freevars = dict_keys_inorder(sc.c_freevars,
3865 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003866 filename = PyString_InternFromString(sc.c_filename);
3867 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003868 if (!PyErr_Occurred())
3869 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003870 sc.c_nlocals,
3871 sc.c_maxstacklevel,
3872 sc.c_flags,
3873 sc.c_code,
3874 consts,
3875 names,
3876 varnames,
3877 freevars,
3878 cellvars,
3879 filename,
3880 name,
3881 sc.c_firstlineno,
3882 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003883 Py_XDECREF(consts);
3884 Py_XDECREF(names);
3885 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003886 Py_XDECREF(freevars);
3887 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003888 Py_XDECREF(filename);
3889 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003890 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00003891 else if (!PyErr_Occurred()) {
3892 /* This could happen if someone called PyErr_Clear() after an
3893 error was reported above. That's not supposed to happen,
3894 but I just plugged one case and I'm not sure there can't be
3895 others. In that case, raise SystemError so that at least
3896 it gets reported instead dumping core. */
3897 PyErr_SetString(PyExc_SystemError, "lost syntax error");
3898 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003899 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00003900 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003901 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00003902 sc.c_symtable = NULL;
3903 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003904 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003905 return co;
3906}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003907
3908int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003909PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003910{
3911 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003912 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003913 int line = co->co_firstlineno;
3914 int addr = 0;
3915 while (--size >= 0) {
3916 addr += *p++;
3917 if (addr > addrq)
3918 break;
3919 line += *p++;
3920 }
3921 return line;
3922}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003923
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003924/* The test for LOCAL must come before the test for FREE in order to
3925 handle classes where name is both local and free. The local var is
3926 a method and the free var is a free var referenced within a method.
3927*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003928
3929static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003930get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003931{
3932 PyObject *v;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00003933 if (c->c_symtable->st_nested_scopes) {
3934 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
3935 return CELL;
3936 if (PyDict_GetItemString(c->c_locals, name) != NULL)
3937 return LOCAL;
3938 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
3939 return FREE;
3940 v = PyDict_GetItemString(c->c_globals, name);
3941 if (v) {
3942 if (v == Py_None)
3943 return GLOBAL_EXPLICIT;
3944 else {
3945 return GLOBAL_IMPLICIT;
3946 }
3947 }
3948 } else {
3949 if (PyDict_GetItemString(c->c_locals, name) != NULL)
3950 return LOCAL;
3951 v = PyDict_GetItemString(c->c_globals, name);
3952 if (v) {
3953 if (v == Py_None)
3954 return GLOBAL_EXPLICIT;
3955 else {
3956 return GLOBAL_IMPLICIT;
3957 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003958 }
3959 }
3960 {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003961 char buf[350];
3962 sprintf(buf,
Jeremy Hylton51257732001-03-01 00:42:55 +00003963 "unknown scope for %.100s in %.100s(%s) "
3964 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
Jeremy Hylton483638c2001-02-01 20:20:45 +00003965 name, c->c_name,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003966 PyObject_REPR(c->c_symtable->st_cur->ste_id),
Jeremy Hylton51257732001-03-01 00:42:55 +00003967 c->c_filename,
3968 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
3969 PyObject_REPR(c->c_locals),
3970 PyObject_REPR(c->c_globals)
3971 );
3972
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003973 Py_FatalError(buf);
3974 }
3975 return -1; /* can't get here */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003976}
3977
Guido van Rossum207fda62001-03-02 03:30:41 +00003978/* Helper functions to issue warnings */
3979
3980static int
3981issue_warning(char *msg, char *filename, int lineno)
3982{
3983 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
3984 lineno, NULL, NULL) < 0) {
3985 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
3986 PyErr_SetString(PyExc_SyntaxError, msg);
3987 PyErr_SyntaxLocation(filename, lineno);
3988 }
3989 return -1;
3990 }
3991 return 0;
3992}
Guido van Rossumee34ac12001-02-28 22:08:12 +00003993
Jeremy Hylton4419ac12001-02-28 22:54:51 +00003994static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00003995symtable_warn(struct symtable *st, char *msg)
3996{
Guido van Rossum207fda62001-03-02 03:30:41 +00003997 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00003998 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00003999 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004000 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004001 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004002}
4003
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004004/* Helper function for setting lineno and filename */
4005
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004006static int
4007symtable_build(struct compiling *c, node *n)
4008{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004009 if ((c->c_symtable = symtable_init()) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004010 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004011 c->c_symtable->st_future = c->c_future;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004012 if (c->c_future->ff_nested_scopes)
4013 c->c_symtable->st_nested_scopes = 1;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004014 c->c_symtable->st_filename = c->c_filename;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004015 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
4016 if (c->c_symtable->st_errors > 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004017 return -1;
4018 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004019 if (c->c_symtable->st_errors > 0)
4020 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004021 /* reset for second pass */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004022 c->c_symtable->st_nscopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004023 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004024 return 0;
4025}
4026
4027static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004028symtable_init_compiling_symbols(struct compiling *c)
4029{
4030 PyObject *varnames;
4031
4032 varnames = c->c_symtable->st_cur->ste_varnames;
4033 if (varnames == NULL) {
4034 varnames = PyList_New(0);
4035 if (varnames == NULL)
4036 return -1;
4037 c->c_symtable->st_cur->ste_varnames = varnames;
4038 Py_INCREF(varnames);
4039 } else
4040 Py_INCREF(varnames);
4041 c->c_varnames = varnames;
4042
4043 c->c_globals = PyDict_New();
4044 if (c->c_globals == NULL)
4045 return -1;
4046 c->c_freevars = PyDict_New();
4047 if (c->c_freevars == NULL)
4048 return -1;
4049 c->c_cellvars = PyDict_New();
4050 if (c->c_cellvars == NULL)
4051 return -1;
4052 return 0;
4053}
4054
4055struct symbol_info {
4056 int si_nlocals;
4057 int si_ncells;
4058 int si_nfrees;
4059 int si_nimplicit;
4060};
4061
4062static void
4063symtable_init_info(struct symbol_info *si)
4064{
4065 si->si_nlocals = 0;
4066 si->si_ncells = 0;
4067 si->si_nfrees = 0;
4068 si->si_nimplicit = 0;
4069}
4070
4071static int
4072symtable_resolve_free(struct compiling *c, PyObject *name,
4073 struct symbol_info *si)
4074{
4075 PyObject *dict, *v;
4076
4077 /* Seperate logic for DEF_FREE. If it occurs in a function,
4078 it indicates a local that we must allocate storage for (a
4079 cell var). If it occurs in a class, then the class has a
4080 method and a free variable with the same name.
4081 */
4082
4083 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
4084 v = PyInt_FromLong(si->si_ncells++);
4085 dict = c->c_cellvars;
4086 } else {
4087 v = PyInt_FromLong(si->si_nfrees++);
4088 dict = c->c_freevars;
4089 }
4090 if (v == NULL)
4091 return -1;
4092 if (PyDict_SetItem(dict, name, v) < 0) {
4093 Py_DECREF(v);
4094 return -1;
4095 }
4096 Py_DECREF(v);
4097 return 0;
4098}
4099
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004100/* If a variable is a cell and an argument, make sure that appears in
4101 co_cellvars before any variable to its right in varnames.
4102*/
4103
4104
4105static int
4106symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4107 PyObject *varnames, int flags)
4108{
4109 PyObject *v, *w, *d, *list = NULL;
4110 int i, pos;
4111
4112 if (flags & CO_VARARGS)
4113 argcount++;
4114 if (flags & CO_VARKEYWORDS)
4115 argcount++;
4116 for (i = argcount; --i >= 0; ) {
4117 v = PyList_GET_ITEM(varnames, i);
4118 if (PyDict_GetItem(*cellvars, v)) {
4119 if (list == NULL) {
4120 list = PyList_New(1);
4121 if (list == NULL)
4122 return -1;
4123 PyList_SET_ITEM(list, 0, v);
4124 Py_INCREF(v);
4125 } else
4126 PyList_Insert(list, 0, v);
4127 }
4128 }
4129 if (list == NULL || PyList_GET_SIZE(list) == 0)
4130 return 0;
4131 /* There are cellvars that are also arguments. Create a dict
4132 to replace cellvars and put the args at the front.
4133 */
4134 d = PyDict_New();
4135 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
4136 v = PyInt_FromLong(i);
4137 if (v == NULL)
4138 goto fail;
4139 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
4140 goto fail;
4141 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
4142 goto fail;
4143 }
4144 pos = 0;
4145 i = PyList_GET_SIZE(list);
4146 Py_DECREF(list);
4147 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
4148 w = PyInt_FromLong(i++); /* don't care about the old key */
4149 if (PyDict_SetItem(d, v, w) < 0) {
4150 Py_DECREF(w);
4151 goto fail;
4152 }
4153 Py_DECREF(w);
4154 }
4155 Py_DECREF(*cellvars);
4156 *cellvars = d;
4157 return 1;
4158 fail:
4159 Py_DECREF(d);
4160 return -1;
4161}
4162
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004163static int
4164symtable_freevar_offsets(PyObject *freevars, int offset)
4165{
4166 PyObject *name, *v;
4167 int pos;
4168
4169 /* The cell vars are the first elements of the closure,
4170 followed by the free vars. Update the offsets in
4171 c_freevars to account for number of cellvars. */
4172 pos = 0;
4173 while (PyDict_Next(freevars, &pos, &name, &v)) {
4174 int i = PyInt_AS_LONG(v) + offset;
4175 PyObject *o = PyInt_FromLong(i);
4176 if (o == NULL)
4177 return -1;
4178 if (PyDict_SetItem(freevars, name, o) < 0) {
4179 Py_DECREF(o);
4180 return -1;
4181 }
4182 Py_DECREF(o);
4183 }
4184 return 0;
4185}
4186
4187static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004188symtable_check_unoptimized(struct compiling *c,
4189 PySymtableEntryObject *ste,
4190 struct symbol_info *si)
4191{
4192 char buf[300];
4193
4194 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4195 || (ste->ste_nested && si->si_nimplicit)))
4196 return 0;
4197
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004198#define ILLEGAL_CONTAINS "contains a nested function with free variables"
4199
4200#define ILLEGAL_IS "is a nested function"
4201
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004202#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004203"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004204
4205#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004206"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004207
4208#define ILLEGAL_EXEC_AND_IMPORT_STAR \
4209"function '%.100s' uses import * and bare exec, which are illegal" \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004210"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004211
4212 /* XXX perhaps the linenos for these opt-breaking statements
4213 should be stored so the exception can point to them. */
4214
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004215 if (ste->ste_child_free) {
4216 if (ste->ste_optimized == OPT_IMPORT_STAR)
4217 sprintf(buf, ILLEGAL_IMPORT_STAR,
4218 PyString_AS_STRING(ste->ste_name),
4219 ILLEGAL_CONTAINS);
4220 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
4221 sprintf(buf, ILLEGAL_BARE_EXEC,
4222 PyString_AS_STRING(ste->ste_name),
4223 ILLEGAL_CONTAINS);
4224 else {
4225 sprintf(buf, ILLEGAL_EXEC_AND_IMPORT_STAR,
4226 PyString_AS_STRING(ste->ste_name),
4227 ILLEGAL_CONTAINS);
4228 }
4229 } else {
4230 if (ste->ste_optimized == OPT_IMPORT_STAR)
4231 sprintf(buf, ILLEGAL_IMPORT_STAR,
4232 PyString_AS_STRING(ste->ste_name),
4233 ILLEGAL_IS);
4234 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
4235 sprintf(buf, ILLEGAL_BARE_EXEC,
4236 PyString_AS_STRING(ste->ste_name),
4237 ILLEGAL_IS);
4238 else {
4239 sprintf(buf, ILLEGAL_EXEC_AND_IMPORT_STAR,
4240 PyString_AS_STRING(ste->ste_name),
4241 ILLEGAL_IS);
4242 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004243 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004244
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004245 if (c->c_symtable->st_nested_scopes) {
4246 PyErr_SetString(PyExc_SyntaxError, buf);
4247 PyErr_SyntaxLocation(c->c_symtable->st_filename,
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00004248 ste->ste_opt_lineno);
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004249 return -1;
Guido van Rossum207fda62001-03-02 03:30:41 +00004250 }
4251 else {
4252 return issue_warning(buf, c->c_filename, ste->ste_lineno);
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004253 }
4254 return 0;
4255}
4256
4257static int
4258symtable_check_shadow(struct symtable *st, PyObject *name, int flags)
4259{
4260 char buf[500];
4261 PyObject *children, *v;
Jeremy Hyltonc1761322001-02-28 23:44:45 +00004262 PySymtableEntryObject *child = NULL;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004263 int i;
4264
4265 if (!(flags & DEF_BOUND))
4266 return 0;
4267 /* The semantics of this code will change with nested scopes.
4268 It is defined in the current scope and referenced in a
4269 child scope. Under the old rules, the child will see a
4270 global. Under the new rules, the child will see the
4271 binding in the current scope.
4272 */
4273
4274 /* Find name of child function that has free variable */
4275 children = st->st_cur->ste_children;
4276 for (i = 0; i < PyList_GET_SIZE(children); i++) {
4277 int cflags;
4278 child = (PySymtableEntryObject *)PyList_GET_ITEM(children, i);
4279 v = PyDict_GetItem(child->ste_symbols, name);
4280 if (v == NULL)
4281 continue;
4282 cflags = PyInt_AS_LONG(v);
4283 if (!(cflags & DEF_BOUND))
4284 break;
4285 }
Jeremy Hyltonc1761322001-02-28 23:44:45 +00004286
4287 assert(child != NULL);
4288
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004289 sprintf(buf, "local name '%.100s' in '%.100s' shadows "
4290 "use of '%.100s' as global in nested scope '%.100s'",
4291 PyString_AS_STRING(name),
4292 PyString_AS_STRING(st->st_cur->ste_name),
4293 PyString_AS_STRING(name),
4294 PyString_AS_STRING(child->ste_name)
4295 );
4296
4297 return symtable_warn(st, buf);
4298}
4299
4300static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004301symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4302 struct symbol_info *si)
4303{
Jeremy Hylton061d1062001-03-22 02:32:48 +00004304 if (c->c_future && c->c_future->ff_nested_scopes)
4305 c->c_flags |= CO_NESTED;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004306 if (ste->ste_type != TYPE_MODULE)
4307 c->c_flags |= CO_NEWLOCALS;
4308 if (ste->ste_type == TYPE_FUNCTION) {
4309 c->c_nlocals = si->si_nlocals;
4310 if (ste->ste_optimized == 0)
4311 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004312 else if (ste->ste_optimized != OPT_EXEC)
4313 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004314 }
4315 return 0;
4316}
4317
4318static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004319symtable_load_symbols(struct compiling *c)
4320{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004321 static PyObject *implicit = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004322 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004323 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004324 PyObject *name, *varnames, *v;
4325 int i, flags, pos;
4326 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004327
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004328 if (implicit == NULL) {
4329 implicit = PyInt_FromLong(1);
4330 if (implicit == NULL)
4331 return -1;
4332 }
4333 v = NULL;
4334
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004335 if (symtable_init_compiling_symbols(c) < 0)
4336 goto fail;
4337 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004338 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004339 si.si_nlocals = PyList_GET_SIZE(varnames);
4340 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004341
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004342 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004343 v = PyInt_FromLong(i);
4344 if (PyDict_SetItem(c->c_locals,
4345 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004346 goto fail;
4347 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004348 }
4349
4350 /* XXX The cases below define the rules for whether a name is
4351 local or global. The logic could probably be clearer. */
4352 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004353 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4354 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004355
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004356 if (st->st_nested_scopes == 0
4357 && (flags & (DEF_FREE | DEF_FREE_CLASS))) {
4358 if (symtable_check_shadow(st, name, flags) < 0)
4359 goto fail;
4360 }
4361
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004362 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004363 /* undo the original DEF_FREE */
4364 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004365
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004366 /* Deal with names that need two actions:
4367 1. Cell variables, which are also locals.
4368 2. Free variables in methods that are also class
4369 variables or declared global.
4370 */
4371 if (flags & (DEF_FREE | DEF_FREE_CLASS)) {
4372 if ((ste->ste_type == TYPE_CLASS
4373 && flags != DEF_FREE_CLASS)
4374 || (flags & (DEF_LOCAL | DEF_PARAM)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004375 symtable_resolve_free(c, name, &si);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004376 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004377
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004378 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004379 c->c_argcount--;
4380 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004381 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004382 c->c_argcount--;
4383 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004384 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004385 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004386 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004387 if (flags & DEF_PARAM) {
4388 PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004389 PyString_AS_STRING(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004390 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004391 ste->ste_lineno);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004392 st->st_errors++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004393 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004394 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004395 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4396 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004397 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004398 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004399 if (PyDict_SetItem(c->c_globals, name, implicit) < 0)
4400 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004401 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004402 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004403 if (v == NULL)
4404 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004405 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004406 goto fail;
4407 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004408 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004409 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004410 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004411 } else if (is_free(flags)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004412 if (ste->ste_nested && st->st_nested_scopes) {
4413 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004414 if (v == NULL)
4415 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004416 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004417 goto fail;
4418 Py_DECREF(v);
4419 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004420 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004421 if (PyDict_SetItem(c->c_globals, name,
4422 implicit) < 0)
4423 goto fail;
Jeremy Hylton51257732001-03-01 00:42:55 +00004424 if (st->st_nscopes != 1) {
4425 v = PyInt_FromLong(flags);
4426 if (PyDict_SetItem(st->st_global,
4427 name, v))
4428 goto fail;
4429 Py_DECREF(v);
4430 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004431 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004432 }
4433 }
4434
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004435 if (si.si_ncells > 1) { /* one cell is always in order */
4436 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
4437 c->c_varnames, c->c_flags) < 0)
4438 return -1;
4439 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004440 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4441 return -1;
4442 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004443 fail:
4444 /* is this always the right thing to do? */
4445 Py_XDECREF(v);
4446 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004447}
4448
4449static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004450symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004451{
4452 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004453
4454 st = (struct symtable *)PyMem_Malloc(sizeof(struct symtable));
4455 if (st == NULL)
4456 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004457 st->st_pass = 1;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004458 st->st_nested_scopes = NESTED_SCOPES_DEFAULT;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004459 st->st_filename = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004460 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004461 goto fail;
4462 if ((st->st_symbols = PyDict_New()) == NULL)
4463 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004464 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004465 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004466 st->st_errors = 0;
4467 st->st_tmpname = 0;
4468 st->st_private = NULL;
4469 return st;
4470 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004471 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004472 return NULL;
4473}
4474
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004475void
4476PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004477{
4478 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004479 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004480 Py_XDECREF(st->st_cur);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004481 PyMem_Free((void *)st);
4482}
4483
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004484/* When the compiler exits a scope, it must should update the scope's
4485 free variable information with the list of free variables in its
4486 children.
4487
4488 Variables that are free in children and defined in the current
4489 scope are cellvars.
4490
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004491 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004492 false), free variables in children that are not defined here are
4493 implicit globals.
4494
4495*/
4496
4497static int
4498symtable_update_free_vars(struct symtable *st)
4499{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004500 int i, j, def;
4501 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004502 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004503
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004504 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004505 def = DEF_FREE_CLASS;
4506 else
4507 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004508 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004509 int pos = 0;
4510
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004511 if (list)
4512 PyList_SetSlice(list, 0,
4513 ((PyVarObject*)list)->ob_size, 0);
Barry Warsaw0372af72001-02-23 18:22:59 +00004514 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004515 PyList_GET_ITEM(ste->ste_children, i);
4516 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004517 int flags = PyInt_AS_LONG(o);
4518 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004519 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004520 if (list == NULL) {
4521 list = PyList_New(0);
4522 if (list == NULL)
4523 return -1;
4524 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004525 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004526 if (PyList_Append(list, name) < 0) {
4527 Py_DECREF(list);
4528 return -1;
4529 }
4530 }
4531 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004532 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004533 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00004534 v = PyDict_GetItem(ste->ste_symbols, name);
4535 /* If a name N is declared global in scope A and
4536 referenced in scope B contained (perhaps
4537 indirectly) in A and there are no scopes
4538 with bindings for N between B and A, then N
4539 is global in B.
4540 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004541 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004542 int flags = PyInt_AS_LONG(v);
4543 if (flags & DEF_GLOBAL) {
4544 symtable_undo_free(st, child->ste_id,
4545 name);
4546 continue;
4547 }
4548 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004549 if (ste->ste_nested) {
4550 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004551 name, def) < 0) {
4552 Py_DECREF(list);
4553 return -1;
4554 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004555 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004556 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004557 name) < 0) {
4558 Py_DECREF(list);
4559 return -1;
4560 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004561 }
4562 }
4563 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004564
4565 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004566 return 0;
4567}
4568
4569/* If the current scope is a non-nested class or if name is not
4570 defined in the current, non-nested scope, then it is an implicit
4571 global in all nested scopes.
4572*/
4573
4574static int
4575symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
4576{
4577 PyObject *o;
4578 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004579 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00004580
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004581 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004582 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004583 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004584 if (o == NULL)
4585 return symtable_undo_free(st, child, name);
4586 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00004587
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004588 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004589 return symtable_undo_free(st, child, name);
4590 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004591 return symtable_add_def_o(st, ste->ste_symbols,
4592 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004593}
4594
4595static int
4596symtable_undo_free(struct symtable *st, PyObject *id,
4597 PyObject *name)
4598{
4599 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004600 PyObject *info;
4601 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004602
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004603 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
4604 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004605 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00004606
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004607 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004608 if (info == NULL)
4609 return 0;
4610 v = PyInt_AS_LONG(info);
4611 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004612 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004613 DEF_FREE_GLOBAL) < 0)
4614 return -1;
4615 } else
4616 /* If the name is defined here or declared global,
4617 then the recursion stops. */
4618 return 0;
4619
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004620 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
4621 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00004622 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004623 PyList_GET_ITEM(ste->ste_children, i);
4624 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004625 if (x < 0)
4626 return x;
4627 }
4628 return 0;
4629}
4630
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004631/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
4632 This reference is released when the scope is exited, via the DECREF
4633 in symtable_exit_scope().
4634*/
4635
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004636static int
4637symtable_exit_scope(struct symtable *st)
4638{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004639 int end;
4640
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004641 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004642 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004643 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004644 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004645 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
4646 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004647 if (PySequence_DelItem(st->st_stack, end) < 0)
4648 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004649 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004650}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004651
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004652static void
4653symtable_enter_scope(struct symtable *st, char *name, int type,
4654 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004655{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004656 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004657
4658 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004659 prev = st->st_cur;
4660 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
4661 Py_DECREF(st->st_cur);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004662 st->st_errors++;
4663 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004664 }
4665 }
Barry Warsaw0372af72001-02-23 18:22:59 +00004666 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004667 PySymtableEntry_New(st, name, type, lineno);
4668 if (strcmp(name, TOP) == 0)
4669 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004670 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004671 if (PyList_Append(prev->ste_children,
4672 (PyObject *)st->st_cur) < 0)
4673 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004674 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004675}
4676
4677static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004678symtable_lookup(struct symtable *st, char *name)
4679{
4680 char buffer[MANGLE_LEN];
4681 PyObject *v;
4682 int flags;
4683
4684 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
4685 name = buffer;
4686 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
4687 if (v == NULL) {
4688 if (PyErr_Occurred())
4689 return -1;
4690 else
4691 return 0;
4692 }
4693
4694 flags = PyInt_AS_LONG(v);
4695 return flags;
4696}
4697
4698static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004699symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004700{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004701 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004702 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004703 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004704
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004705 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004706 name = buffer;
4707 if ((s = PyString_InternFromString(name)) == NULL)
4708 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004709 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
4710 Py_DECREF(s);
4711 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004712}
4713
4714/* Must only be called with mangled names */
4715
4716static int
4717symtable_add_def_o(struct symtable *st, PyObject *dict,
4718 PyObject *name, int flag)
4719{
4720 PyObject *o;
4721 int val;
4722
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004723 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004724 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004725 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004726 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00004727 PyString_AsString(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004728 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004729 st->st_cur->ste_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004730 return -1;
4731 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004732 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004733 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004734 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004735 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004736 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004737 Py_DECREF(o);
4738 return -1;
4739 }
4740 Py_DECREF(o);
4741
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004742 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004743 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004744 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004745 } else if (flag & DEF_GLOBAL) {
4746 /* XXX need to update DEF_GLOBAL for other flags too;
4747 perhaps only DEF_FREE_GLOBAL */
4748 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004749 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004750 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004751 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004752 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004753 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004754 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004755 Py_DECREF(o);
4756 return -1;
4757 }
4758 Py_DECREF(o);
4759 }
4760 return 0;
4761}
4762
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004763#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004764
4765static void
4766symtable_node(struct symtable *st, node *n)
4767{
4768 int i, start = 0;
4769
4770 loop:
4771 switch (TYPE(n)) {
4772 case funcdef: {
4773 char *func_name = STR(CHILD(n, 1));
4774 symtable_add_def(st, func_name, DEF_LOCAL);
4775 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004776 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004777 symtable_funcdef(st, n);
4778 symtable_exit_scope(st);
4779 break;
4780 }
4781 case lambdef:
4782 if (NCH(n) == 4)
4783 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004784 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004785 symtable_funcdef(st, n);
4786 symtable_exit_scope(st);
4787 break;
4788 case classdef: {
4789 char *tmp, *class_name = STR(CHILD(n, 1));
4790 symtable_add_def(st, class_name, DEF_LOCAL);
4791 if (TYPE(CHILD(n, 2)) == LPAR) {
4792 node *bases = CHILD(n, 3);
4793 int i;
4794 for (i = 0; i < NCH(bases); i += 2) {
4795 symtable_node(st, CHILD(bases, i));
4796 }
4797 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004798 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004799 tmp = st->st_private;
4800 st->st_private = class_name;
4801 symtable_node(st, CHILD(n, NCH(n) - 1));
4802 st->st_private = tmp;
4803 symtable_exit_scope(st);
4804 break;
4805 }
4806 case if_stmt:
4807 for (i = 0; i + 3 < NCH(n); i += 4) {
4808 if (is_constant_false(NULL, (CHILD(n, i + 1))))
4809 continue;
4810 symtable_node(st, CHILD(n, i + 1));
4811 symtable_node(st, CHILD(n, i + 3));
4812 }
4813 if (i + 2 < NCH(n))
4814 symtable_node(st, CHILD(n, i + 2));
4815 break;
4816 case global_stmt:
4817 symtable_global(st, n);
4818 break;
4819 case import_stmt:
4820 symtable_import(st, n);
4821 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004822 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004823 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004824 symtable_node(st, CHILD(n, 1));
4825 if (NCH(n) > 2)
4826 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00004827 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004828 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00004829 st->st_cur->ste_opt_lineno = n->n_lineno;
4830 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004831 if (NCH(n) > 4)
4832 symtable_node(st, CHILD(n, 5));
4833 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004834
4835 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00004836 case assert_stmt:
4837 if (Py_OptimizeFlag)
4838 return;
4839 if (NCH(n) == 2) {
4840 n = CHILD(n, 1);
4841 goto loop;
4842 } else {
4843 symtable_node(st, CHILD(n, 1));
4844 n = CHILD(n, 3);
4845 goto loop;
4846 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004847 case except_clause:
4848 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004849 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004850 if (NCH(n) > 1) {
4851 n = CHILD(n, 1);
4852 goto loop;
4853 }
4854 break;
4855 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004856 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004857 break;
4858 case expr_stmt:
4859 if (NCH(n) == 1)
4860 n = CHILD(n, 0);
4861 else {
4862 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004863 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004864 symtable_node(st, CHILD(n, 2));
4865 break;
4866 } else {
4867 int i;
4868 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004869 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004870 n = CHILD(n, NCH(n) - 1);
4871 }
4872 }
4873 goto loop;
4874 /* watchout for fall-through logic below */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004875 case argument:
4876 if (NCH(n) == 3) {
4877 n = CHILD(n, 2);
4878 goto loop;
4879 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004880 case listmaker:
4881 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton23b42272001-03-19 20:38:06 +00004882 st->st_tmpname++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004883 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton23b42272001-03-19 20:38:06 +00004884 symtable_node(st, CHILD(n, 0));
4885 st->st_tmpname--;
4886 return;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004887 }
4888 case atom:
4889 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
4890 symtable_add_use(st, STR(CHILD(n, 0)));
4891 break;
4892 }
4893 case for_stmt:
4894 if (TYPE(n) == for_stmt) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004895 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004896 start = 3;
4897 }
4898 default:
4899 if (NCH(n) == 1) {
4900 n = CHILD(n, 0);
4901 goto loop;
4902 }
4903 for (i = start; i < NCH(n); ++i)
4904 if (TYPE(CHILD(n, i)) >= single_input)
4905 symtable_node(st, CHILD(n, i));
4906 }
4907}
4908
4909static void
4910symtable_funcdef(struct symtable *st, node *n)
4911{
4912 node *body;
4913
4914 if (TYPE(n) == lambdef) {
4915 if (NCH(n) == 4)
4916 symtable_params(st, CHILD(n, 1));
4917 } else
4918 symtable_params(st, CHILD(n, 2));
4919 body = CHILD(n, NCH(n) - 1);
4920 symtable_node(st, body);
4921}
4922
4923/* The next two functions parse the argument tuple.
4924 symtable_default_arg() checks for names in the default arguments,
4925 which are references in the defining scope. symtable_params()
4926 parses the parameter names, which are defined in the function's
4927 body.
4928
4929 varargslist:
4930 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
4931 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
4932*/
4933
4934static void
4935symtable_default_args(struct symtable *st, node *n)
4936{
4937 node *c;
4938 int i;
4939
4940 if (TYPE(n) == parameters) {
4941 n = CHILD(n, 1);
4942 if (TYPE(n) == RPAR)
4943 return;
4944 }
4945 REQ(n, varargslist);
4946 for (i = 0; i < NCH(n); i += 2) {
4947 c = CHILD(n, i);
4948 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
4949 break;
4950 }
4951 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
4952 symtable_node(st, CHILD(n, i));
4953 }
4954}
4955
4956static void
4957symtable_params(struct symtable *st, node *n)
4958{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004959 int i, complex = -1, ext = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004960 node *c = NULL;
4961
4962 if (TYPE(n) == parameters) {
4963 n = CHILD(n, 1);
4964 if (TYPE(n) == RPAR)
4965 return;
4966 }
4967 REQ(n, varargslist);
4968 for (i = 0; i < NCH(n); i += 2) {
4969 c = CHILD(n, i);
4970 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
4971 ext = 1;
4972 break;
4973 }
4974 if (TYPE(c) == test) {
4975 continue;
4976 }
4977 if (TYPE(CHILD(c, 0)) == NAME)
4978 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
4979 else {
4980 char nbuf[10];
4981 sprintf(nbuf, ".%d", i);
4982 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004983 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004984 }
4985 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004986 if (ext) {
4987 c = CHILD(n, i);
4988 if (TYPE(c) == STAR) {
4989 i++;
4990 symtable_add_def(st, STR(CHILD(n, i)),
4991 DEF_PARAM | DEF_STAR);
4992 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00004993 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004994 c = NULL;
4995 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004996 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004997 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004998 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004999 i++;
5000 symtable_add_def(st, STR(CHILD(n, i)),
5001 DEF_PARAM | DEF_DOUBLESTAR);
5002 }
5003 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005004 if (complex >= 0) {
5005 int j;
5006 for (j = 0; j <= complex; j++) {
5007 c = CHILD(n, j);
5008 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005009 c = CHILD(n, ++j);
5010 else if (TYPE(c) == EQUAL)
5011 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005012 if (TYPE(CHILD(c, 0)) == LPAR)
5013 symtable_params_fplist(st, CHILD(c, 1));
5014 }
5015 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005016}
5017
5018static void
5019symtable_params_fplist(struct symtable *st, node *n)
5020{
5021 int i;
5022 node *c;
5023
5024 REQ(n, fplist);
5025 for (i = 0; i < NCH(n); i += 2) {
5026 c = CHILD(n, i);
5027 REQ(c, fpdef);
5028 if (NCH(c) == 1)
5029 symtable_add_def(st, STR(CHILD(c, 0)),
5030 DEF_PARAM | DEF_INTUPLE);
5031 else
5032 symtable_params_fplist(st, CHILD(c, 1));
5033 }
5034
5035}
5036
5037static void
5038symtable_global(struct symtable *st, node *n)
5039{
5040 int i;
5041
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005042 /* XXX It might be helpful to warn about module-level global
5043 statements, but it's hard to tell the difference between
5044 module-level and a string passed to exec.
5045 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00005046
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005047 for (i = 1; i < NCH(n); i += 2) {
5048 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005049 int flags;
5050
5051 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005052 if (flags < 0)
5053 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005054 if (flags && flags != DEF_GLOBAL) {
5055 char buf[500];
5056 if (flags & DEF_PARAM) {
5057 PyErr_Format(PyExc_SyntaxError,
5058 "name '%.400s' is local and global",
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005059 name);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005060 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005061 st->st_cur->ste_lineno);
5062 st->st_errors++;
5063 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005064 }
5065 else {
5066 if (flags & DEF_LOCAL)
5067 sprintf(buf, GLOBAL_AFTER_ASSIGN,
5068 name);
5069 else
5070 sprintf(buf, GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005071 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005072 }
5073 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005074 symtable_add_def(st, name, DEF_GLOBAL);
5075 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005076}
5077
5078static void
5079symtable_list_comprehension(struct symtable *st, node *n)
5080{
5081 char tmpname[12];
5082
Jeremy Hylton23b42272001-03-19 20:38:06 +00005083 sprintf(tmpname, "_[%d]", st->st_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005084 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005085 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005086 symtable_node(st, CHILD(n, 3));
5087 if (NCH(n) == 5)
5088 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005089}
5090
5091static void
5092symtable_import(struct symtable *st, node *n)
5093{
5094 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005095 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005096 | 'from' dotted_name 'import'
5097 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00005098 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005099 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005100 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005101 node *dotname = CHILD(n, 1);
5102 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
5103 /* check for bogus imports */
5104 if (n->n_lineno >= st->st_future->ff_last_lineno) {
5105 PyErr_SetString(PyExc_SyntaxError,
5106 LATE_FUTURE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005107 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005108 n->n_lineno);
5109 st->st_errors++;
5110 return;
5111 }
5112 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005113 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005114 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005115 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005116 } else {
5117 for (i = 3; i < NCH(n); i += 2) {
5118 node *c = CHILD(n, i);
5119 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005120 symtable_assign(st, CHILD(c, 2),
5121 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005122 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005123 symtable_assign(st, CHILD(c, 0),
5124 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005125 }
5126 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005127 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005128 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005129 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005130 }
5131 }
5132}
5133
5134static void
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005135symtable_assign(struct symtable *st, node *n, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005136{
5137 node *tmp;
5138 int i;
5139
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005140 loop:
5141 switch (TYPE(n)) {
5142 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005143 /* invalid assignment, e.g. lambda x:x=2. The next
5144 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005145 return;
5146 case power:
5147 if (NCH(n) > 2) {
5148 for (i = 2; i < NCH(n); ++i)
5149 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
5150 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005151 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005152 if (NCH(n) > 1) {
5153 symtable_node(st, CHILD(n, 0));
5154 symtable_node(st, CHILD(n, 1));
5155 } else {
5156 n = CHILD(n, 0);
5157 goto loop;
5158 }
5159 return;
5160 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00005161 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
5162 /* XXX This is an error, but the next pass
5163 will catch it. */
5164 return;
5165 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005166 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005167 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005168 }
5169 return;
5170 case exprlist:
5171 case testlist:
5172 if (NCH(n) == 1) {
5173 n = CHILD(n, 0);
5174 goto loop;
5175 }
5176 else {
5177 int i;
5178 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005179 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005180 return;
5181 }
5182 goto loop;
5183 case atom:
5184 tmp = CHILD(n, 0);
5185 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
5186 n = CHILD(n, 1);
5187 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00005188 } else if (TYPE(tmp) == NAME) {
Jeremy Hyltona830b382001-04-09 16:07:59 +00005189 if (strcmp(STR(tmp), "__debug__") == 0)
5190 symtable_warn(st, ASSIGN_DEBUG);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005191 symtable_add_def(st, STR(tmp), DEF_LOCAL | flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00005192 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005193 return;
5194 case dotted_as_name:
5195 if (NCH(n) == 3)
5196 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005197 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005198 else
5199 symtable_add_def(st,
5200 STR(CHILD(CHILD(n,
5201 0), 0)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005202 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005203 return;
5204 case dotted_name:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005205 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005206 return;
5207 case NAME:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005208 symtable_add_def(st, STR(n), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005209 return;
5210 default:
5211 if (NCH(n) == 0)
5212 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00005213 if (NCH(n) == 1) {
5214 n = CHILD(n, 0);
5215 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005216 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00005217 /* Should only occur for errors like x + 1 = 1,
5218 which will be caught in the next pass. */
5219 for (i = 0; i < NCH(n); ++i)
5220 if (TYPE(CHILD(n, i)) >= single_input)
5221 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005222 }
5223}