blob: ec3de2604eab7d593235638b9867f8e1a9d66b1c [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 int anchor = 0;
1236 int save_begin = c->c_begin;
1237
1238 /* list_iter: for v in expr [list_iter] */
1239 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001240 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001241 c->c_begin = c->c_nexti;
1242 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001243 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001244 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001245 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001246 c->c_loops++;
1247 com_list_iter(c, n, e, t);
1248 c->c_loops--;
1249 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1250 c->c_begin = save_begin;
1251 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001252 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001253}
1254
1255static void
1256com_list_if(struct compiling *c, node *n, node *e, char *t)
1257{
1258 int anchor = 0;
1259 int a = 0;
1260 /* list_iter: 'if' test [list_iter] */
1261 com_addoparg(c, SET_LINENO, n->n_lineno);
1262 com_node(c, CHILD(n, 1));
1263 com_addfwref(c, JUMP_IF_FALSE, &a);
1264 com_addbyte(c, POP_TOP);
1265 com_pop(c, 1);
1266 com_list_iter(c, n, e, t);
1267 com_addfwref(c, JUMP_FORWARD, &anchor);
1268 com_backpatch(c, a);
1269 /* We jump here with an extra entry which we now pop */
1270 com_addbyte(c, POP_TOP);
1271 com_backpatch(c, anchor);
1272}
1273
1274static void
1275com_list_iter(struct compiling *c,
1276 node *p, /* parent of list_iter node */
1277 node *e, /* element expression node */
1278 char *t /* name of result list temp local */)
1279{
1280 /* list_iter is the last child in a listmaker, list_for, or list_if */
1281 node *n = CHILD(p, NCH(p)-1);
1282 if (TYPE(n) == list_iter) {
1283 n = CHILD(n, 0);
1284 switch (TYPE(n)) {
1285 case list_for:
1286 com_list_for(c, n, e, t);
1287 break;
1288 case list_if:
1289 com_list_if(c, n, e, t);
1290 break;
1291 default:
1292 com_error(c, PyExc_SystemError,
1293 "invalid list_iter node type");
1294 }
1295 }
1296 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001297 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001298 com_push(c, 1);
1299 com_node(c, e);
1300 com_addoparg(c, CALL_FUNCTION, 1);
1301 com_addbyte(c, POP_TOP);
1302 com_pop(c, 2);
1303 }
1304}
1305
1306static void
1307com_list_comprehension(struct compiling *c, node *n)
1308{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001309 /* listmaker: test list_for */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001310 char tmpname[12];
Tim Peters30814212001-02-17 05:30:26 +00001311 sprintf(tmpname, "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001312 com_addoparg(c, BUILD_LIST, 0);
1313 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1314 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001315 com_addop_name(c, LOAD_ATTR, "append");
1316 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001317 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001318 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001319 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001320 --c->c_tmpname;
1321}
1322
1323static void
1324com_listmaker(struct compiling *c, node *n)
1325{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001326 /* listmaker: test ( list_for | (',' test)* [','] ) */
1327 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001328 com_list_comprehension(c, n);
1329 else {
1330 int len = 0;
1331 int i;
1332 for (i = 0; i < NCH(n); i += 2, len++)
1333 com_node(c, CHILD(n, i));
1334 com_addoparg(c, BUILD_LIST, len);
1335 com_pop(c, len-1);
1336 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001337}
1338
1339static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001340com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001341{
1342 int i;
1343 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1344 for (i = 0; i+2 < NCH(n); i += 4) {
1345 /* We must arrange things just right for STORE_SUBSCR.
1346 It wants the stack to look like (value) (dict) (key) */
1347 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001348 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001349 com_node(c, CHILD(n, i+2)); /* value */
1350 com_addbyte(c, ROT_TWO);
1351 com_node(c, CHILD(n, i)); /* key */
1352 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001353 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001354 }
1355}
1356
1357static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001358com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001359{
1360 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001361 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001362 int i;
1363 REQ(n, atom);
1364 ch = CHILD(n, 0);
1365 switch (TYPE(ch)) {
1366 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001367 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001368 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001369 com_push(c, 1);
1370 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001371 else
1372 com_node(c, CHILD(n, 1));
1373 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001374 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001375 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001376 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001377 com_push(c, 1);
1378 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001379 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001380 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001381 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001382 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001383 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001384 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001385 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001386 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001387 break;
1388 case BACKQUOTE:
1389 com_node(c, CHILD(n, 1));
1390 com_addbyte(c, UNARY_CONVERT);
1391 break;
1392 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001393 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001394 i = 255;
1395 }
1396 else {
1397 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001398 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001399 }
1400 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001401 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001402 break;
1403 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001404 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001405 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001406 c->c_errors++;
1407 i = 255;
1408 }
1409 else {
1410 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001411 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001412 }
1413 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001414 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001415 break;
1416 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001417 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001418 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001419 break;
1420 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001421 com_error(c, PyExc_SystemError,
1422 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001423 }
1424}
1425
1426static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001427com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001428{
1429 if (NCH(n) == 1) {
1430 com_addbyte(c, op);
1431 }
1432 else if (NCH(n) == 2) {
1433 if (TYPE(CHILD(n, 0)) != COLON) {
1434 com_node(c, CHILD(n, 0));
1435 com_addbyte(c, op+1);
1436 }
1437 else {
1438 com_node(c, CHILD(n, 1));
1439 com_addbyte(c, op+2);
1440 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001441 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001442 }
1443 else {
1444 com_node(c, CHILD(n, 0));
1445 com_node(c, CHILD(n, 2));
1446 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001447 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001448 }
1449}
1450
Guido van Rossum635abd21997-01-06 22:56:52 +00001451static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001452com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1453{
1454 if (NCH(n) == 1) {
1455 com_addbyte(c, DUP_TOP);
1456 com_push(c, 1);
1457 com_addbyte(c, SLICE);
1458 com_node(c, augn);
1459 com_addbyte(c, opcode);
1460 com_pop(c, 1);
1461 com_addbyte(c, ROT_TWO);
1462 com_addbyte(c, STORE_SLICE);
1463 com_pop(c, 2);
1464 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1465 com_node(c, CHILD(n, 0));
1466 com_addoparg(c, DUP_TOPX, 2);
1467 com_push(c, 2);
1468 com_addbyte(c, SLICE+1);
1469 com_pop(c, 1);
1470 com_node(c, augn);
1471 com_addbyte(c, opcode);
1472 com_pop(c, 1);
1473 com_addbyte(c, ROT_THREE);
1474 com_addbyte(c, STORE_SLICE+1);
1475 com_pop(c, 3);
1476 } else if (NCH(n) == 2) {
1477 com_node(c, CHILD(n, 1));
1478 com_addoparg(c, DUP_TOPX, 2);
1479 com_push(c, 2);
1480 com_addbyte(c, SLICE+2);
1481 com_pop(c, 1);
1482 com_node(c, augn);
1483 com_addbyte(c, opcode);
1484 com_pop(c, 1);
1485 com_addbyte(c, ROT_THREE);
1486 com_addbyte(c, STORE_SLICE+2);
1487 com_pop(c, 3);
1488 } else {
1489 com_node(c, CHILD(n, 0));
1490 com_node(c, CHILD(n, 2));
1491 com_addoparg(c, DUP_TOPX, 3);
1492 com_push(c, 3);
1493 com_addbyte(c, SLICE+3);
1494 com_pop(c, 2);
1495 com_node(c, augn);
1496 com_addbyte(c, opcode);
1497 com_pop(c, 1);
1498 com_addbyte(c, ROT_FOUR);
1499 com_addbyte(c, STORE_SLICE+3);
1500 com_pop(c, 4);
1501 }
1502}
1503
1504static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001505com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001506{
1507 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001508 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001509 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001510 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001511 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001512 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001513 }
1514 else {
1515 com_node(c, CHILD(n, 0));
1516 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001517 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001518 }
1519 m = n;
1520 do {
1521 m = CHILD(m, 0);
1522 } while (NCH(m) == 1);
1523 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00001524 /* f(lambda x: x[0] = 3) ends up getting parsed with
1525 * LHS test = lambda x: x[0], and RHS test = 3.
1526 * SF bug 132313 points out that complaining about a keyword
1527 * then is very confusing.
1528 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001529 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00001530 TYPE(m) == lambdef ?
1531 "lambda cannot contain assignment" :
1532 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001533 }
1534 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001535 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001536 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001537 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001538 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001539 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001540 else if (*pkeywords == NULL) {
1541 c->c_errors++;
1542 Py_DECREF(v);
1543 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001544 if (PyDict_GetItem(*pkeywords, v) != NULL)
1545 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001546 "duplicate keyword argument");
1547 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001548 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001549 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001550 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001551 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001552 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001553 }
1554 }
1555 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001556}
1557
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001558static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001559com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001560{
1561 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001562 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001563 }
1564 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001565 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001566 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001567 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001568 int star_flag = 0;
1569 int starstar_flag = 0;
1570 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001571 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001572 na = 0;
1573 nk = 0;
1574 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001575 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001576 if (TYPE(ch) == STAR ||
1577 TYPE(ch) == DOUBLESTAR)
1578 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001579 if (ch->n_lineno != lineno) {
1580 lineno = ch->n_lineno;
1581 com_addoparg(c, SET_LINENO, lineno);
1582 }
1583 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001584 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001585 na++;
1586 else
1587 nk++;
1588 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001589 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001590 while (i < NCH(n)) {
1591 node *tok = CHILD(n, i);
1592 node *ch = CHILD(n, i+1);
1593 i += 3;
1594 switch (TYPE(tok)) {
1595 case STAR: star_flag = 1; break;
1596 case DOUBLESTAR: starstar_flag = 1; break;
1597 }
1598 com_node(c, ch);
1599 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001600 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001601 com_error(c, PyExc_SyntaxError,
1602 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001603 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001604 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001605 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001606 star_flag + (starstar_flag << 1);
1607 else
1608 opcode = CALL_FUNCTION;
1609 com_addoparg(c, opcode, na | (nk << 8));
1610 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001611 }
1612}
1613
1614static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001615com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001616{
1617 com_addopname(c, LOAD_ATTR, n);
1618}
1619
1620static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001621com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001622{
1623 int i=0;
1624 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001625 node *ch;
1626
1627 /* first argument */
1628 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001629 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001630 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001631 i++;
1632 }
1633 else {
1634 com_node(c, CHILD(n,i));
1635 i++;
1636 REQ(CHILD(n,i),COLON);
1637 i++;
1638 }
1639 /* second argument */
1640 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1641 com_node(c, CHILD(n,i));
1642 i++;
1643 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001644 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001645 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001646 com_push(c, 1);
1647 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001648 /* remaining arguments */
1649 for (; i < NCH(n); i++) {
1650 ns++;
1651 ch=CHILD(n,i);
1652 REQ(ch, sliceop);
1653 if (NCH(ch) == 1) {
1654 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001655 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001656 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001657 }
1658 else
1659 com_node(c, CHILD(ch,1));
1660 }
1661 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001662 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001663}
1664
1665static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001666com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001667{
1668 node *ch;
1669 REQ(n, subscript);
1670 ch = CHILD(n,0);
1671 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001672 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001673 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001674 com_push(c, 1);
1675 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001676 else {
1677 /* check for slice */
1678 if ((TYPE(ch) == COLON || NCH(n) > 1))
1679 com_sliceobj(c, n);
1680 else {
1681 REQ(ch, test);
1682 com_node(c, ch);
1683 }
1684 }
1685}
1686
1687static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001688com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001689{
1690 int i, op;
1691 REQ(n, subscriptlist);
1692 /* Check to make backward compatible slice behavior for '[i:j]' */
1693 if (NCH(n) == 1) {
1694 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001695 /* 'Basic' slice, should have exactly one colon. */
1696 if ((TYPE(CHILD(sub, 0)) == COLON
1697 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1698 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1699 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001700 switch (assigning) {
1701 case OP_DELETE:
1702 op = DELETE_SLICE;
1703 break;
1704 case OP_ASSIGN:
1705 op = STORE_SLICE;
1706 break;
1707 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001708 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001709 break;
1710 default:
1711 com_augassign_slice(c, sub, assigning, augn);
1712 return;
1713 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001714 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001715 if (op == STORE_SLICE)
1716 com_pop(c, 2);
1717 else if (op == DELETE_SLICE)
1718 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001719 return;
1720 }
1721 }
1722 /* Else normal subscriptlist. Compile each subscript. */
1723 for (i = 0; i < NCH(n); i += 2)
1724 com_subscript(c, CHILD(n, i));
1725 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001726 if (NCH(n) > 1) {
1727 i = (NCH(n)+1) / 2;
1728 com_addoparg(c, BUILD_TUPLE, i);
1729 com_pop(c, i-1);
1730 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001731 switch (assigning) {
1732 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001733 op = DELETE_SUBSCR;
1734 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00001735 break;
1736 default:
1737 case OP_ASSIGN:
1738 op = STORE_SUBSCR;
1739 i = 3;
1740 break;
1741 case OP_APPLY:
1742 op = BINARY_SUBSCR;
1743 i = 1;
1744 break;
1745 }
1746 if (assigning > OP_APPLY) {
1747 com_addoparg(c, DUP_TOPX, 2);
1748 com_push(c, 2);
1749 com_addbyte(c, BINARY_SUBSCR);
1750 com_pop(c, 1);
1751 com_node(c, augn);
1752 com_addbyte(c, assigning);
1753 com_pop(c, 1);
1754 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001755 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001756 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001757 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001758}
1759
1760static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001761com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001762{
1763 REQ(n, trailer);
1764 switch (TYPE(CHILD(n, 0))) {
1765 case LPAR:
1766 com_call_function(c, CHILD(n, 1));
1767 break;
1768 case DOT:
1769 com_select_member(c, CHILD(n, 1));
1770 break;
1771 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00001772 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001773 break;
1774 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001775 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001776 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001777 }
1778}
1779
1780static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001781com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001782{
1783 int i;
1784 REQ(n, power);
1785 com_atom(c, CHILD(n, 0));
1786 for (i = 1; i < NCH(n); i++) {
1787 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1788 com_factor(c, CHILD(n, i+1));
1789 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001790 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001791 break;
1792 }
1793 else
1794 com_apply_trailer(c, CHILD(n, i));
1795 }
1796}
1797
1798static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001799com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001800{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001801 REQ(n, factor);
1802 if (TYPE(CHILD(n, 0)) == PLUS) {
1803 com_factor(c, CHILD(n, 1));
1804 com_addbyte(c, UNARY_POSITIVE);
1805 }
1806 else if (TYPE(CHILD(n, 0)) == MINUS) {
1807 com_factor(c, CHILD(n, 1));
1808 com_addbyte(c, UNARY_NEGATIVE);
1809 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001810 else if (TYPE(CHILD(n, 0)) == TILDE) {
1811 com_factor(c, CHILD(n, 1));
1812 com_addbyte(c, UNARY_INVERT);
1813 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001814 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001815 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001816 }
1817}
1818
1819static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001820com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001821{
1822 int i;
1823 int op;
1824 REQ(n, term);
1825 com_factor(c, CHILD(n, 0));
1826 for (i = 2; i < NCH(n); i += 2) {
1827 com_factor(c, CHILD(n, i));
1828 switch (TYPE(CHILD(n, i-1))) {
1829 case STAR:
1830 op = BINARY_MULTIPLY;
1831 break;
1832 case SLASH:
1833 op = BINARY_DIVIDE;
1834 break;
1835 case PERCENT:
1836 op = BINARY_MODULO;
1837 break;
1838 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001839 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001840 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001841 op = 255;
1842 }
1843 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001844 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001845 }
1846}
1847
1848static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001849com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001850{
1851 int i;
1852 int op;
1853 REQ(n, arith_expr);
1854 com_term(c, CHILD(n, 0));
1855 for (i = 2; i < NCH(n); i += 2) {
1856 com_term(c, CHILD(n, i));
1857 switch (TYPE(CHILD(n, i-1))) {
1858 case PLUS:
1859 op = BINARY_ADD;
1860 break;
1861 case MINUS:
1862 op = BINARY_SUBTRACT;
1863 break;
1864 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001865 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001866 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001867 op = 255;
1868 }
1869 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001870 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001871 }
1872}
1873
1874static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001875com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001876{
1877 int i;
1878 int op;
1879 REQ(n, shift_expr);
1880 com_arith_expr(c, CHILD(n, 0));
1881 for (i = 2; i < NCH(n); i += 2) {
1882 com_arith_expr(c, CHILD(n, i));
1883 switch (TYPE(CHILD(n, i-1))) {
1884 case LEFTSHIFT:
1885 op = BINARY_LSHIFT;
1886 break;
1887 case RIGHTSHIFT:
1888 op = BINARY_RSHIFT;
1889 break;
1890 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001891 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001892 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001893 op = 255;
1894 }
1895 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001896 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001897 }
1898}
1899
1900static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001901com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001902{
1903 int i;
1904 int op;
1905 REQ(n, and_expr);
1906 com_shift_expr(c, CHILD(n, 0));
1907 for (i = 2; i < NCH(n); i += 2) {
1908 com_shift_expr(c, CHILD(n, i));
1909 if (TYPE(CHILD(n, i-1)) == AMPER) {
1910 op = BINARY_AND;
1911 }
1912 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001913 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001914 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001915 op = 255;
1916 }
1917 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001918 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001919 }
1920}
1921
1922static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001923com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001924{
1925 int i;
1926 int op;
1927 REQ(n, xor_expr);
1928 com_and_expr(c, CHILD(n, 0));
1929 for (i = 2; i < NCH(n); i += 2) {
1930 com_and_expr(c, CHILD(n, i));
1931 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1932 op = BINARY_XOR;
1933 }
1934 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001935 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001936 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001937 op = 255;
1938 }
1939 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001940 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001941 }
1942}
1943
1944static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001945com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001946{
1947 int i;
1948 int op;
1949 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001950 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001951 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001952 com_xor_expr(c, CHILD(n, i));
1953 if (TYPE(CHILD(n, i-1)) == VBAR) {
1954 op = BINARY_OR;
1955 }
1956 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001957 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001958 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001959 op = 255;
1960 }
1961 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001962 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001963 }
1964}
1965
1966static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001967cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001968{
1969 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001970 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001971 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1972 if (NCH(n) == 1) {
1973 n = CHILD(n, 0);
1974 switch (TYPE(n)) {
1975 case LESS: return LT;
1976 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001977 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001978 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001979 case LESSEQUAL: return LE;
1980 case GREATEREQUAL: return GE;
1981 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001982 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1983 if (strcmp(STR(n), "is") == 0) return IS;
1984 }
1985 }
1986 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001987 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001988 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1989 return NOT_IN;
1990 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1991 return IS_NOT;
1992 }
1993 }
1994 return BAD;
1995}
1996
1997static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001998com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001999{
2000 int i;
2001 enum cmp_op op;
2002 int anchor;
2003 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2004 com_expr(c, CHILD(n, 0));
2005 if (NCH(n) == 1)
2006 return;
2007
2008 /****************************************************************
2009 The following code is generated for all but the last
2010 comparison in a chain:
2011
2012 label: on stack: opcode: jump to:
2013
2014 a <code to load b>
2015 a, b DUP_TOP
2016 a, b, b ROT_THREE
2017 b, a, b COMPARE_OP
2018 b, 0-or-1 JUMP_IF_FALSE L1
2019 b, 1 POP_TOP
2020 b
2021
2022 We are now ready to repeat this sequence for the next
2023 comparison in the chain.
2024
2025 For the last we generate:
2026
2027 b <code to load c>
2028 b, c COMPARE_OP
2029 0-or-1
2030
2031 If there were any jumps to L1 (i.e., there was more than one
2032 comparison), we generate:
2033
2034 0-or-1 JUMP_FORWARD L2
2035 L1: b, 0 ROT_TWO
2036 0, b POP_TOP
2037 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002038 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002039 ****************************************************************/
2040
2041 anchor = 0;
2042
2043 for (i = 2; i < NCH(n); i += 2) {
2044 com_expr(c, CHILD(n, i));
2045 if (i+2 < NCH(n)) {
2046 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002047 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002048 com_addbyte(c, ROT_THREE);
2049 }
2050 op = cmp_type(CHILD(n, i-1));
2051 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002052 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002053 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002054 }
2055 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002056 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002057 if (i+2 < NCH(n)) {
2058 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2059 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002060 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002061 }
2062 }
2063
2064 if (anchor) {
2065 int anchor2 = 0;
2066 com_addfwref(c, JUMP_FORWARD, &anchor2);
2067 com_backpatch(c, anchor);
2068 com_addbyte(c, ROT_TWO);
2069 com_addbyte(c, POP_TOP);
2070 com_backpatch(c, anchor2);
2071 }
2072}
2073
2074static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002075com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002076{
2077 REQ(n, not_test); /* 'not' not_test | comparison */
2078 if (NCH(n) == 1) {
2079 com_comparison(c, CHILD(n, 0));
2080 }
2081 else {
2082 com_not_test(c, CHILD(n, 1));
2083 com_addbyte(c, UNARY_NOT);
2084 }
2085}
2086
2087static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002088com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002089{
2090 int i;
2091 int anchor;
2092 REQ(n, and_test); /* not_test ('and' not_test)* */
2093 anchor = 0;
2094 i = 0;
2095 for (;;) {
2096 com_not_test(c, CHILD(n, i));
2097 if ((i += 2) >= NCH(n))
2098 break;
2099 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2100 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002101 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002102 }
2103 if (anchor)
2104 com_backpatch(c, anchor);
2105}
2106
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002107static int
2108com_make_closure(struct compiling *c, PyCodeObject *co)
2109{
2110 int i, free = PyTuple_GET_SIZE(co->co_freevars);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002111 /* If the code is compiled with st->st_nested_scopes == 0,
2112 then no variable will ever be added to co_freevars.
2113 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002114 if (free == 0)
2115 return 0;
2116 for (i = 0; i < free; ++i) {
2117 /* Bypass com_addop_varname because it will generate
2118 LOAD_DEREF but LOAD_CLOSURE is needed.
2119 */
2120 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2121 int arg, reftype;
2122
2123 /* Special case: If a class contains a method with a
2124 free variable that has the same name as a method,
2125 the name will be considered free *and* local in the
2126 class. It should be handled by the closure, as
2127 well as by the normal name loookup logic.
2128 */
2129 reftype = get_ref_type(c, PyString_AS_STRING(name));
2130 if (reftype == CELL)
2131 arg = com_lookup_arg(c->c_cellvars, name);
2132 else /* (reftype == FREE) */
2133 arg = com_lookup_arg(c->c_freevars, name);
2134 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002135 fprintf(stderr, "lookup %s in %s %d %d\n"
2136 "freevars of %s: %s\n",
2137 PyObject_REPR(name),
2138 c->c_name,
2139 reftype, arg,
2140 PyString_AS_STRING(co->co_name),
2141 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002142 Py_FatalError("com_make_closure()");
2143 }
2144 com_addoparg(c, LOAD_CLOSURE, arg);
2145
2146 }
2147 com_push(c, free);
2148 return 1;
2149}
2150
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002151static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002152com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002153{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002154 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002155 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002156 PyObject *co;
2157 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002158 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002159 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2160 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002161 co = (PyObject *) icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002162 if (co == NULL) {
2163 c->c_errors++;
2164 return;
2165 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002166 symtable_exit_scope(c->c_symtable);
Tim Peters1e542112001-02-23 22:23:53 +00002167 i = com_addconst(c, co);
2168 closure = com_make_closure(c, (PyCodeObject *)co);
2169 Py_DECREF(co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002170 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002171 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002172 if (closure)
2173 com_addoparg(c, MAKE_CLOSURE, ndefs);
2174 else
2175 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002176 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002177 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002178 else {
2179 int anchor = 0;
2180 int i = 0;
2181 for (;;) {
2182 com_and_test(c, CHILD(n, i));
2183 if ((i += 2) >= NCH(n))
2184 break;
2185 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2186 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002187 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002188 }
2189 if (anchor)
2190 com_backpatch(c, anchor);
2191 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002192}
2193
2194static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002195com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002196{
2197 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002198 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002199 com_node(c, CHILD(n, 0));
2200 }
2201 else {
2202 int i;
2203 int len;
2204 len = (NCH(n) + 1) / 2;
2205 for (i = 0; i < NCH(n); i += 2)
2206 com_node(c, CHILD(n, i));
2207 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002208 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002209 }
2210}
2211
2212
2213/* Begin of assignment compilation */
2214
Thomas Wouters434d0822000-08-24 20:11:32 +00002215
2216static void
2217com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2218{
2219 com_addbyte(c, DUP_TOP);
2220 com_push(c, 1);
2221 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002222 com_node(c, augn);
2223 com_addbyte(c, opcode);
2224 com_pop(c, 1);
2225 com_addbyte(c, ROT_TWO);
2226 com_addopname(c, STORE_ATTR, n);
2227 com_pop(c, 2);
2228}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002229
2230static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002231com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002232{
2233 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002234 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002235}
2236
2237static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002238com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002239{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002240 REQ(n, trailer);
2241 switch (TYPE(CHILD(n, 0))) {
2242 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002243 com_error(c, PyExc_SyntaxError,
2244 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002245 break;
2246 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002247 if (assigning > OP_APPLY)
2248 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2249 else
2250 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002251 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002252 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002253 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002254 break;
2255 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002256 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002257 }
2258}
2259
2260static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002261com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002262{
2263 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002264 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002265 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002266 if (assigning) {
2267 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002268 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002269 com_push(c, i-1);
2270 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002271 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002272 com_assign(c, CHILD(n, i), assigning, NULL);
2273}
2274
2275static void
2276com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2277{
2278 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002279 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002280 com_push(c, 1);
2281 com_node(c, augn);
2282 com_addbyte(c, opcode);
2283 com_pop(c, 1);
2284 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002285}
2286
2287static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002288com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002289{
2290 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002291 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002292 if (assigning)
2293 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002294}
2295
2296static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002297com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002298{
2299 /* Loop to avoid trivial recursion */
2300 for (;;) {
2301 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002302
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002303 case exprlist:
2304 case testlist:
2305 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002306 if (assigning > OP_APPLY) {
2307 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002308 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002309 return;
2310 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002311 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002312 return;
2313 }
2314 n = CHILD(n, 0);
2315 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002316
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002317 case test:
2318 case and_test:
2319 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002320 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002321 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002322 case xor_expr:
2323 case and_expr:
2324 case shift_expr:
2325 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002326 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002327 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002328 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002329 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002330 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002331 return;
2332 }
2333 n = CHILD(n, 0);
2334 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002335
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002336 case power: /* atom trailer* ('**' power)*
2337 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002338 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002339 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002340 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002341 return;
2342 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002343 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002344 int i;
2345 com_node(c, CHILD(n, 0));
2346 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002347 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002348 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002349 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002350 return;
2351 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002352 com_apply_trailer(c, CHILD(n, i));
2353 } /* NB i is still alive */
2354 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002355 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002356 return;
2357 }
2358 n = CHILD(n, 0);
2359 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002360
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002361 case atom:
2362 switch (TYPE(CHILD(n, 0))) {
2363 case LPAR:
2364 n = CHILD(n, 1);
2365 if (TYPE(n) == RPAR) {
2366 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002367 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002368 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002369 return;
2370 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002371 if (assigning > OP_APPLY) {
2372 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002373 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002374 return;
2375 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002376 break;
2377 case LSQB:
2378 n = CHILD(n, 1);
2379 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002380 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002381 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002382 return;
2383 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002384 if (assigning > OP_APPLY) {
2385 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002386 "augmented assign to list not possible");
2387 return;
2388 }
2389 if (NCH(n) > 1
2390 && TYPE(CHILD(n, 1)) == list_for) {
2391 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002392 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002393 return;
2394 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002395 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002396 return;
2397 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002398 if (assigning > OP_APPLY)
2399 com_augassign_name(c, CHILD(n, 0),
2400 assigning, augn);
2401 else
2402 com_assign_name(c, CHILD(n, 0),
2403 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002404 return;
2405 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002406 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002407 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002408 return;
2409 }
2410 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002411
2412 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002413 com_error(c, PyExc_SyntaxError,
2414 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002415 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002416
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002417 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002418 com_error(c, PyExc_SystemError,
2419 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002420 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002421
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002422 }
2423 }
2424}
Guido van Rossum7c531111997-03-11 18:42:21 +00002425
Thomas Wouters434d0822000-08-24 20:11:32 +00002426static void
2427com_augassign(struct compiling *c, node *n)
2428{
2429 int opcode;
2430
2431 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2432 case '+': opcode = INPLACE_ADD; break;
2433 case '-': opcode = INPLACE_SUBTRACT; break;
2434 case '/': opcode = INPLACE_DIVIDE; break;
2435 case '%': opcode = INPLACE_MODULO; break;
2436 case '<': opcode = INPLACE_LSHIFT; break;
2437 case '>': opcode = INPLACE_RSHIFT; break;
2438 case '&': opcode = INPLACE_AND; break;
2439 case '^': opcode = INPLACE_XOR; break;
2440 case '|': opcode = INPLACE_OR; break;
2441 case '*':
2442 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2443 opcode = INPLACE_POWER;
2444 else
2445 opcode = INPLACE_MULTIPLY;
2446 break;
2447 default:
2448 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2449 return;
2450 }
2451 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2452}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002453
2454static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002455com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002456{
Thomas Wouters434d0822000-08-24 20:11:32 +00002457 REQ(n, expr_stmt);
2458 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002459 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002460 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002461 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002462 if (NCH(n) == 1) {
2463 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002464 if (c->c_interactive)
2465 com_addbyte(c, PRINT_EXPR);
2466 else
2467 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002468 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002469 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002470 else if (TYPE(CHILD(n,1)) == augassign)
2471 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002472 else {
2473 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002474 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002475 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002476 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002477 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002478 com_push(c, 1);
2479 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002480 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002481 }
2482 }
2483}
2484
2485static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002486com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002487{
2488 int a = 0, b = 0;
2489 int i;
2490 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2491 /* Generate code like for
2492
2493 if __debug__:
2494 if not <test>:
2495 raise AssertionError [, <message>]
2496
2497 where <message> is the second test, if present.
2498 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002499
Guido van Rossum228d7f31997-04-02 05:24:36 +00002500 if (Py_OptimizeFlag)
2501 return;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002502 com_addop_name(c, LOAD_GLOBAL, "__debug__");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002503 com_push(c, 1);
2504 com_addfwref(c, JUMP_IF_FALSE, &a);
2505 com_addbyte(c, POP_TOP);
2506 com_pop(c, 1);
2507 com_node(c, CHILD(n, 1));
2508 com_addfwref(c, JUMP_IF_TRUE, &b);
2509 com_addbyte(c, POP_TOP);
2510 com_pop(c, 1);
2511 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002512 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002513 com_push(c, 1);
2514 i = NCH(n)/2; /* Either 2 or 4 */
2515 if (i > 1)
2516 com_node(c, CHILD(n, 3));
2517 com_addoparg(c, RAISE_VARARGS, i);
2518 com_pop(c, i);
2519 /* The interpreter does not fall through */
2520 /* All jumps converge here */
2521 com_backpatch(c, a);
2522 com_backpatch(c, b);
2523 com_addbyte(c, POP_TOP);
2524}
2525
2526static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002527com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002528{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002529 int i = 1;
2530 node* stream = NULL;
2531
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002532 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002533
2534 /* are we using the extended print form? */
2535 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2536 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002537 com_node(c, stream);
2538 /* stack: [...] => [... stream] */
2539 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002540 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2541 i = 4;
2542 else
2543 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002544 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002545 for (; i < NCH(n); i += 2) {
2546 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002547 com_addbyte(c, DUP_TOP);
2548 /* stack: [stream] => [stream stream] */
2549 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002550 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002551 /* stack: [stream stream] => [stream stream obj] */
2552 com_addbyte(c, ROT_TWO);
2553 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002554 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002555 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002556 com_pop(c, 2);
2557 }
2558 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002559 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002560 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002561 com_addbyte(c, PRINT_ITEM);
2562 com_pop(c, 1);
2563 }
2564 }
2565 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002566 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002567 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002568 /* must pop the extra stream object off the stack */
2569 com_addbyte(c, POP_TOP);
2570 /* stack: [... stream] => [...] */
2571 com_pop(c, 1);
2572 }
2573 }
2574 else {
2575 if (stream != NULL) {
2576 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002577 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002578 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002579 com_pop(c, 1);
2580 }
2581 else
2582 com_addbyte(c, PRINT_NEWLINE);
2583 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002584}
2585
2586static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002587com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002588{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002589 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002590 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002591 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002592 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002593 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002594 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002595 com_push(c, 1);
2596 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002597 else
2598 com_node(c, CHILD(n, 1));
2599 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002600 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002601}
2602
2603static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002604com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002605{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002606 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002607 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2608 if (NCH(n) > 1) {
2609 com_node(c, CHILD(n, 1));
2610 if (NCH(n) > 3) {
2611 com_node(c, CHILD(n, 3));
2612 if (NCH(n) > 5)
2613 com_node(c, CHILD(n, 5));
2614 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002615 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002616 i = NCH(n)/2;
2617 com_addoparg(c, RAISE_VARARGS, i);
2618 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002619}
2620
2621static void
Thomas Wouters52152252000-08-17 22:55:00 +00002622com_from_import(struct compiling *c, node *n)
2623{
2624 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2625 com_push(c, 1);
2626 if (NCH(n) > 1) {
2627 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2628 com_error(c, PyExc_SyntaxError, "invalid syntax");
2629 return;
2630 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002631 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002632 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002633 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00002634 com_pop(c, 1);
2635}
2636
2637static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002638com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002639{
2640 int i;
2641 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002642 /* 'import' dotted_name (',' dotted_name)* |
2643 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002644 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00002645 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002646 /* 'from' dotted_name 'import' ... */
2647 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002648
2649 if (TYPE(CHILD(n, 3)) == STAR) {
2650 tup = Py_BuildValue("(s)", "*");
2651 } else {
2652 tup = PyTuple_New((NCH(n) - 2)/2);
2653 for (i = 3; i < NCH(n); i += 2) {
2654 PyTuple_SET_ITEM(tup, (i-3)/2,
2655 PyString_FromString(STR(
Jeremy Hylton4419ac12001-02-28 22:54:51 +00002656 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002657 }
2658 }
2659 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00002660 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002661 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002662 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00002663 if (TYPE(CHILD(n, 3)) == STAR)
2664 com_addbyte(c, IMPORT_STAR);
2665 else {
2666 for (i = 3; i < NCH(n); i += 2)
2667 com_from_import(c, CHILD(n, i));
2668 com_addbyte(c, POP_TOP);
2669 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002670 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002671 }
2672 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002673 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002674 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00002675 node *subn = CHILD(n, i);
2676 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002677 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002678 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002679 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00002680 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00002681 int j;
2682 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00002683 com_error(c, PyExc_SyntaxError,
2684 "invalid syntax");
2685 return;
2686 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00002687 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
2688 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002689 CHILD(CHILD(subn, 0),
2690 j));
2691 com_addop_varname(c, VAR_STORE,
2692 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002693 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002694 com_addop_varname(c, VAR_STORE,
2695 STR(CHILD(CHILD(subn, 0),
2696 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002697 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002698 }
2699 }
2700}
2701
2702static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002703com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002704{
2705 REQ(n, exec_stmt);
2706 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2707 com_node(c, CHILD(n, 1));
2708 if (NCH(n) >= 4)
2709 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002710 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002711 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002712 com_push(c, 1);
2713 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002714 if (NCH(n) >= 6)
2715 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002716 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002717 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002718 com_push(c, 1);
2719 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002720 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002721 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002722}
2723
Guido van Rossum7c531111997-03-11 18:42:21 +00002724static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002725is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002726{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002727 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002728 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002729 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00002730
2731 /* Label to avoid tail recursion */
2732 next:
2733 switch (TYPE(n)) {
2734
2735 case suite:
2736 if (NCH(n) == 1) {
2737 n = CHILD(n, 0);
2738 goto next;
2739 }
2740 /* Fall through */
2741 case file_input:
2742 for (i = 0; i < NCH(n); i++) {
2743 node *ch = CHILD(n, i);
2744 if (TYPE(ch) == stmt) {
2745 n = ch;
2746 goto next;
2747 }
2748 }
2749 break;
2750
2751 case stmt:
2752 case simple_stmt:
2753 case small_stmt:
2754 n = CHILD(n, 0);
2755 goto next;
2756
2757 case expr_stmt:
2758 case testlist:
2759 case test:
2760 case and_test:
2761 case not_test:
2762 case comparison:
2763 case expr:
2764 case xor_expr:
2765 case and_expr:
2766 case shift_expr:
2767 case arith_expr:
2768 case term:
2769 case factor:
2770 case power:
2771 case atom:
2772 if (NCH(n) == 1) {
2773 n = CHILD(n, 0);
2774 goto next;
2775 }
2776 break;
2777
2778 case NAME:
2779 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2780 return 1;
2781 break;
2782
2783 case NUMBER:
2784 v = parsenumber(c, STR(n));
2785 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002786 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002787 break;
2788 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002789 i = PyObject_IsTrue(v);
2790 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002791 return i == 0;
2792
2793 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002794 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002795 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002796 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002797 break;
2798 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002799 i = PyObject_IsTrue(v);
2800 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002801 return i == 0;
2802
2803 }
2804 return 0;
2805}
2806
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002807static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002808com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002809{
2810 int i;
2811 int anchor = 0;
2812 REQ(n, if_stmt);
2813 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2814 for (i = 0; i+3 < NCH(n); i+=4) {
2815 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002816 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002817 if (is_constant_false(c, ch))
2818 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002819 if (i > 0)
2820 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002821 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002822 com_addfwref(c, JUMP_IF_FALSE, &a);
2823 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002824 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002825 com_node(c, CHILD(n, i+3));
2826 com_addfwref(c, JUMP_FORWARD, &anchor);
2827 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002828 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002829 com_addbyte(c, POP_TOP);
2830 }
2831 if (i+2 < NCH(n))
2832 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002833 if (anchor)
2834 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002835}
2836
2837static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002838com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002839{
2840 int break_anchor = 0;
2841 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002842 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002843 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2844 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002845 block_push(c, SETUP_LOOP);
2846 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002847 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002848 com_node(c, CHILD(n, 1));
2849 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2850 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002851 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002852 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002853 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002854 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002855 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2856 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002857 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002858 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002859 com_addbyte(c, POP_TOP);
2860 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002861 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002862 if (NCH(n) > 4)
2863 com_node(c, CHILD(n, 6));
2864 com_backpatch(c, break_anchor);
2865}
2866
2867static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002868com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002869{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002870 int break_anchor = 0;
2871 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002872 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002873 REQ(n, for_stmt);
2874 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2875 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002876 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002877 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002878 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002879 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002880 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002881 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002882 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00002883 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002884 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002885 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002886 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002887 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2888 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002889 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002890 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002891 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002892 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002893 if (NCH(n) > 8)
2894 com_node(c, CHILD(n, 8));
2895 com_backpatch(c, break_anchor);
2896}
2897
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002898/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002899
2900 SETUP_FINALLY L
2901 <code for S>
2902 POP_BLOCK
2903 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002904 L: <code for Sf>
2905 END_FINALLY
2906
2907 The special instructions use the block stack. Each block
2908 stack entry contains the instruction that created it (here
2909 SETUP_FINALLY), the level of the value stack at the time the
2910 block stack entry was created, and a label (here L).
2911
2912 SETUP_FINALLY:
2913 Pushes the current value stack level and the label
2914 onto the block stack.
2915 POP_BLOCK:
2916 Pops en entry from the block stack, and pops the value
2917 stack until its level is the same as indicated on the
2918 block stack. (The label is ignored.)
2919 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002920 Pops a variable number of entries from the *value* stack
2921 and re-raises the exception they specify. The number of
2922 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002923
2924 The block stack is unwound when an exception is raised:
2925 when a SETUP_FINALLY entry is found, the exception is pushed
2926 onto the value stack (and the exception condition is cleared),
2927 and the interpreter jumps to the label gotten from the block
2928 stack.
2929
2930 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002931 (The contents of the value stack is shown in [], with the top
2932 at the right; 'tb' is trace-back info, 'val' the exception's
2933 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002934
2935 Value stack Label Instruction Argument
2936 [] SETUP_EXCEPT L1
2937 [] <code for S>
2938 [] POP_BLOCK
2939 [] JUMP_FORWARD L0
2940
Guido van Rossum3f5da241990-12-20 15:06:42 +00002941 [tb, val, exc] L1: DUP )
2942 [tb, val, exc, exc] <evaluate E1> )
2943 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2944 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2945 [tb, val, exc, 1] POP )
2946 [tb, val, exc] POP
2947 [tb, val] <assign to V1> (or POP if no V1)
2948 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002949 [] <code for S1>
2950 JUMP_FORWARD L0
2951
Guido van Rossum3f5da241990-12-20 15:06:42 +00002952 [tb, val, exc, 0] L2: POP
2953 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002954 .............................etc.......................
2955
Guido van Rossum3f5da241990-12-20 15:06:42 +00002956 [tb, val, exc, 0] Ln+1: POP
2957 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002958
2959 [] L0: <next statement>
2960
2961 Of course, parts are not generated if Vi or Ei is not present.
2962*/
2963
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002964static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002965com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002966{
2967 int except_anchor = 0;
2968 int end_anchor = 0;
2969 int else_anchor = 0;
2970 int i;
2971 node *ch;
2972
2973 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2974 block_push(c, SETUP_EXCEPT);
2975 com_node(c, CHILD(n, 2));
2976 com_addbyte(c, POP_BLOCK);
2977 block_pop(c, SETUP_EXCEPT);
2978 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2979 com_backpatch(c, except_anchor);
2980 for (i = 3;
2981 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2982 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002983 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002984 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002985 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002986 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002987 break;
2988 }
2989 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00002990 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002991 com_addoparg(c, SET_LINENO, ch->n_lineno);
2992 if (NCH(ch) > 1) {
2993 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002994 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002995 com_node(c, CHILD(ch, 1));
2996 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002997 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002998 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
2999 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003000 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003001 }
3002 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003003 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003004 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003005 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003006 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003007 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003008 com_pop(c, 1);
3009 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003010 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003011 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003012 com_node(c, CHILD(n, i+2));
3013 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3014 if (except_anchor) {
3015 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003016 /* We come in with [tb, val, exc, 0] on the
3017 stack; one pop and it's the same as
3018 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003019 com_addbyte(c, POP_TOP);
3020 }
3021 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003022 /* We actually come in here with [tb, val, exc] but the
3023 END_FINALLY will zap those and jump around.
3024 The c_stacklevel does not reflect them so we need not pop
3025 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003026 com_addbyte(c, END_FINALLY);
3027 com_backpatch(c, else_anchor);
3028 if (i < NCH(n))
3029 com_node(c, CHILD(n, i+2));
3030 com_backpatch(c, end_anchor);
3031}
3032
3033static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003034com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003035{
3036 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003037 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003038
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003039 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3040 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003041 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003042 com_addbyte(c, POP_BLOCK);
3043 block_pop(c, SETUP_FINALLY);
3044 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003045 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003046 /* While the generated code pushes only one item,
3047 the try-finally handling can enter here with
3048 up to three items. OK, here are the details:
3049 3 for an exception, 2 for RETURN, 1 for BREAK. */
3050 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003051 com_backpatch(c, finally_anchor);
3052 ch = CHILD(n, NCH(n)-1);
3053 com_addoparg(c, SET_LINENO, ch->n_lineno);
3054 com_node(c, ch);
3055 com_addbyte(c, END_FINALLY);
3056 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003057 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003058}
3059
3060static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003061com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003062{
3063 REQ(n, try_stmt);
3064 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3065 | 'try' ':' suite 'finally' ':' suite */
3066 if (TYPE(CHILD(n, 3)) != except_clause)
3067 com_try_finally(c, n);
3068 else
3069 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003070}
3071
Guido van Rossum8b993a91997-01-17 21:04:03 +00003072static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003073get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003074{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003075 int i;
3076
Guido van Rossum8b993a91997-01-17 21:04:03 +00003077 /* Label to avoid tail recursion */
3078 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003079 switch (TYPE(n)) {
3080
3081 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003082 if (NCH(n) == 1) {
3083 n = CHILD(n, 0);
3084 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003085 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003086 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003087 case file_input:
3088 for (i = 0; i < NCH(n); i++) {
3089 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003090 if (TYPE(ch) == stmt) {
3091 n = ch;
3092 goto next;
3093 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003094 }
3095 break;
3096
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003097 case stmt:
3098 case simple_stmt:
3099 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003100 n = CHILD(n, 0);
3101 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003102
3103 case expr_stmt:
3104 case testlist:
3105 case test:
3106 case and_test:
3107 case not_test:
3108 case comparison:
3109 case expr:
3110 case xor_expr:
3111 case and_expr:
3112 case shift_expr:
3113 case arith_expr:
3114 case term:
3115 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003116 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003117 if (NCH(n) == 1) {
3118 n = CHILD(n, 0);
3119 goto next;
3120 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003121 break;
3122
3123 case atom:
3124 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003125 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003126 break;
3127
3128 }
3129 return NULL;
3130}
3131
Guido van Rossum79f25d91997-04-29 20:08:16 +00003132static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003133get_docstring(node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003134{
Guido van Rossum541563e1999-01-28 15:08:09 +00003135 /* Don't generate doc-strings if run with -OO */
3136 if (Py_OptimizeFlag > 1)
3137 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003138 n = get_rawdocstring(n);
3139 if (n == NULL)
3140 return NULL;
3141 return parsestrplus(n);
3142}
3143
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003144static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003145com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003146{
3147 REQ(n, suite);
3148 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3149 if (NCH(n) == 1) {
3150 com_node(c, CHILD(n, 0));
3151 }
3152 else {
3153 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003154 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003155 node *ch = CHILD(n, i);
3156 if (TYPE(ch) == stmt)
3157 com_node(c, ch);
3158 }
3159 }
3160}
3161
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003162/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003163static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003164com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003165{
3166 int i = c->c_nblocks;
3167 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3168 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3169 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003170 else if (i <= 0) {
3171 /* at the outer level */
3172 com_error(c, PyExc_SyntaxError,
3173 "'continue' not properly in loop");
3174 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003175 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003176 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003177 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003178 if (c->c_block[j] == SETUP_LOOP)
3179 break;
3180 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003181 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003182 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003183 for (; i > j; --i) {
3184 if (c->c_block[i] == SETUP_EXCEPT ||
3185 c->c_block[i] == SETUP_FINALLY) {
3186 com_addoparg(c, CONTINUE_LOOP,
3187 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003188 return;
3189 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003190 if (c->c_block[i] == END_FINALLY) {
3191 com_error(c, PyExc_SyntaxError,
3192 "'continue' not supported inside 'finally' clause");
3193 return;
3194 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003195 }
3196 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003197 com_error(c, PyExc_SyntaxError,
3198 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003199 }
3200 /* XXX Could allow it inside a 'finally' clause
3201 XXX if we could pop the exception still on the stack */
3202}
3203
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003204static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003205com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003206{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003207 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003208 if (TYPE(n) == lambdef) {
3209 /* lambdef: 'lambda' [varargslist] ':' test */
3210 n = CHILD(n, 1);
3211 }
3212 else {
3213 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3214 n = CHILD(n, 2);
3215 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3216 n = CHILD(n, 1);
3217 }
3218 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003219 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003220 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003221 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003222 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3223 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003224 nargs = 0;
3225 ndefs = 0;
3226 for (i = 0; i < nch; i++) {
3227 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003228 if (TYPE(CHILD(n, i)) == STAR ||
3229 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003230 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003231 nargs++;
3232 i++;
3233 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003234 t = RPAR; /* Anything except EQUAL or COMMA */
3235 else
3236 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003237 if (t == EQUAL) {
3238 i++;
3239 ndefs++;
3240 com_node(c, CHILD(n, i));
3241 i++;
3242 if (i >= nch)
3243 break;
3244 t = TYPE(CHILD(n, i));
3245 }
3246 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003247 /* Treat "(a=1, b)" as an error */
3248 if (ndefs)
3249 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003250 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003251 }
3252 if (t != COMMA)
3253 break;
3254 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003255 return ndefs;
3256}
3257
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003258static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003259com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003260{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003261 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003262 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003263 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003264 ndefs = com_argdefs(c, n);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003265 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3266 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003267 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003268 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003269 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003270 c->c_errors++;
3271 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003272 int closure = com_make_closure(c, (PyCodeObject *)co);
3273 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003274 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003275 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003276 if (closure)
3277 com_addoparg(c, MAKE_CLOSURE, ndefs);
3278 else
3279 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003280 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003281 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003282 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003283 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003284 }
3285}
3286
3287static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003288com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003289{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003290 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003291 REQ(n, testlist);
3292 /* testlist: test (',' test)* [','] */
3293 for (i = 0; i < NCH(n); i += 2)
3294 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003295 i = (NCH(n)+1) / 2;
3296 com_addoparg(c, BUILD_TUPLE, i);
3297 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003298}
3299
3300static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003301com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003302{
Guido van Rossum25831651993-05-19 14:50:45 +00003303 int i;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003304 PyObject *co, *v;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003305 char *name;
3306
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003307 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003308 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003309 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003310 c->c_errors++;
3311 return;
3312 }
3313 /* Push the class name on the stack */
3314 i = com_addconst(c, v);
3315 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003316 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003317 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003318 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003319 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003320 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003321 com_push(c, 1);
3322 }
Guido van Rossum25831651993-05-19 14:50:45 +00003323 else
3324 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003325 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003326 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003327 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003328 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003329 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003330 c->c_errors++;
3331 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003332 int closure = com_make_closure(c, (PyCodeObject *)co);
3333 i = com_addconst(c, co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003334 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003335 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003336 if (closure)
3337 com_addoparg(c, MAKE_CLOSURE, 0);
3338 else
3339 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003340 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003341 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003342 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003343 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003344 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003345 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003346}
3347
3348static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003349com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003350{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003351 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003352 if (c->c_errors)
3353 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003354 switch (TYPE(n)) {
3355
3356 /* Definition nodes */
3357
3358 case funcdef:
3359 com_funcdef(c, n);
3360 break;
3361 case classdef:
3362 com_classdef(c, n);
3363 break;
3364
3365 /* Trivial parse tree nodes */
3366
3367 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003368 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003369 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003370 n = CHILD(n, 0);
3371 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003372
3373 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003374 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
3375 com_addoparg(c, SET_LINENO, n->n_lineno);
3376 {
3377 int i;
3378 for (i = 0; i < NCH(n)-1; i += 2)
3379 com_node(c, CHILD(n, i));
3380 }
3381 break;
3382
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003383 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003384 com_addoparg(c, SET_LINENO, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003385 n = CHILD(n, 0);
3386 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003387
3388 /* Statement nodes */
3389
3390 case expr_stmt:
3391 com_expr_stmt(c, n);
3392 break;
3393 case print_stmt:
3394 com_print_stmt(c, n);
3395 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003396 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003397 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003398 break;
3399 case pass_stmt:
3400 break;
3401 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003402 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003403 com_error(c, PyExc_SyntaxError,
3404 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003405 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003406 com_addbyte(c, BREAK_LOOP);
3407 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003408 case continue_stmt:
3409 com_continue_stmt(c, n);
3410 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003411 case return_stmt:
3412 com_return_stmt(c, n);
3413 break;
3414 case raise_stmt:
3415 com_raise_stmt(c, n);
3416 break;
3417 case import_stmt:
3418 com_import_stmt(c, n);
3419 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003420 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003421 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003422 case exec_stmt:
3423 com_exec_stmt(c, n);
3424 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003425 case assert_stmt:
3426 com_assert_stmt(c, n);
3427 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003428 case if_stmt:
3429 com_if_stmt(c, n);
3430 break;
3431 case while_stmt:
3432 com_while_stmt(c, n);
3433 break;
3434 case for_stmt:
3435 com_for_stmt(c, n);
3436 break;
3437 case try_stmt:
3438 com_try_stmt(c, n);
3439 break;
3440 case suite:
3441 com_suite(c, n);
3442 break;
3443
3444 /* Expression nodes */
3445
3446 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003447 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003448 break;
3449 case test:
3450 com_test(c, n);
3451 break;
3452 case and_test:
3453 com_and_test(c, n);
3454 break;
3455 case not_test:
3456 com_not_test(c, n);
3457 break;
3458 case comparison:
3459 com_comparison(c, n);
3460 break;
3461 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003462 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003463 break;
3464 case expr:
3465 com_expr(c, n);
3466 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003467 case xor_expr:
3468 com_xor_expr(c, n);
3469 break;
3470 case and_expr:
3471 com_and_expr(c, n);
3472 break;
3473 case shift_expr:
3474 com_shift_expr(c, n);
3475 break;
3476 case arith_expr:
3477 com_arith_expr(c, n);
3478 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003479 case term:
3480 com_term(c, n);
3481 break;
3482 case factor:
3483 com_factor(c, n);
3484 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003485 case power:
3486 com_power(c, n);
3487 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003488 case atom:
3489 com_atom(c, n);
3490 break;
3491
3492 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003493 com_error(c, PyExc_SystemError,
3494 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003495 }
3496}
3497
Tim Petersdbd9ba62000-07-09 03:09:57 +00003498static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003499
3500static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003501com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003502{
3503 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3504 if (TYPE(CHILD(n, 0)) == LPAR)
3505 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003506 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003507 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003508 com_pop(c, 1);
3509 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003510}
3511
3512static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003513com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003514{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003515 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003516 if (NCH(n) == 1) {
3517 com_fpdef(c, CHILD(n, 0));
3518 }
3519 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003520 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003521 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003522 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003523 for (i = 0; i < NCH(n); i += 2)
3524 com_fpdef(c, CHILD(n, i));
3525 }
3526}
3527
3528static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003529com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003530{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003531 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003532 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003533 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003534 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003535 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003536 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003537 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003538 /* Enter all arguments in table of locals */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003539 for (i = 0, narg = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003540 node *ch = CHILD(n, i);
3541 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003542 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003543 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003544 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3545 fp = CHILD(ch, 0);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00003546 if (TYPE(fp) != NAME) {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003547 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003548 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003549 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003550 narg++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003551 /* all name updates handled by symtable */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003552 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003553 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003554 ch = CHILD(n, i);
3555 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003556 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003557 else
3558 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003559 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003560 if (complex) {
3561 /* Generate code for complex arguments only after
3562 having counted the simple arguments */
3563 int ilocal = 0;
3564 for (i = 0; i < nch; i++) {
3565 node *ch = CHILD(n, i);
3566 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003567 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003568 break;
3569 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3570 fp = CHILD(ch, 0);
3571 if (TYPE(fp) != NAME) {
3572 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003573 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003574 com_fpdef(c, ch);
3575 }
3576 ilocal++;
3577 if (++i >= nch)
3578 break;
3579 ch = CHILD(n, i);
3580 if (TYPE(ch) == EQUAL)
3581 i += 2;
3582 else
3583 REQ(ch, COMMA);
3584 }
3585 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003586}
3587
3588static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003589com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003590{
3591 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003592 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003593 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003594 doc = get_docstring(n);
3595 if (doc != NULL) {
3596 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003597 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003598 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003599 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003600 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003601 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003602 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003603 for (i = 0; i < NCH(n); i++) {
3604 node *ch = CHILD(n, i);
3605 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3606 com_node(c, ch);
3607 }
3608}
3609
3610/* Top-level compile-node interface */
3611
3612static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003613compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003614{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003615 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003616 node *ch;
3617 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003618 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003619 doc = get_docstring(CHILD(n, 4));
3620 if (doc != NULL) {
3621 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003622 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003623 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003624 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003625 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003626 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3627 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003628 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003629 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003630 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003631 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003632 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003633 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003634 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003635 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003636 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003637}
3638
3639static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003640compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003641{
Guido van Rossum590baa41993-11-30 13:40:46 +00003642 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003643 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003644 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003645
3646 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003647 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003648 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003649 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003650 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003651 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003652 else
3653 ch = CHILD(n, 2);
3654 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003655 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003656 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003657}
3658
3659static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003660compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003661{
3662 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003663 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003664 REQ(n, classdef);
3665 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3666 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003667 c->c_private = c->c_name;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003668 ch = CHILD(n, NCH(n)-1); /* The suite */
3669 doc = get_docstring(ch);
3670 if (doc != NULL) {
3671 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003672 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003673 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003674 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003675 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003676 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003677 }
3678 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003679 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003680 com_node(c, ch);
3681 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003682 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003683 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003684 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003685}
3686
3687static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003688compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003689{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003690 com_addoparg(c, SET_LINENO, n->n_lineno);
3691
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003692 switch (TYPE(n)) {
3693
Guido van Rossum4c417781991-01-21 16:09:22 +00003694 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003695 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003696 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003697 n = CHILD(n, 0);
3698 if (TYPE(n) != NEWLINE)
3699 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003700 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003701 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003702 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003703 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003704 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003705 break;
3706
Guido van Rossum4c417781991-01-21 16:09:22 +00003707 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003708 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003709 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003710 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003711 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003712 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003713 break;
3714
Guido van Rossum590baa41993-11-30 13:40:46 +00003715 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003716 com_node(c, CHILD(n, 0));
3717 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003718 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003719 break;
3720
Guido van Rossum590baa41993-11-30 13:40:46 +00003721 case lambdef: /* anonymous function definition */
3722 compile_lambdef(c, n);
3723 break;
3724
Guido van Rossum4c417781991-01-21 16:09:22 +00003725 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003726 compile_funcdef(c, n);
3727 break;
3728
Guido van Rossum4c417781991-01-21 16:09:22 +00003729 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003730 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003731 break;
3732
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003733 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003734 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003735 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003736 }
3737}
3738
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003739static PyObject *
3740dict_keys_inorder(PyObject *dict, int offset)
3741{
3742 PyObject *tuple, *k, *v;
3743 int i, pos = 0, size = PyDict_Size(dict);
3744
3745 tuple = PyTuple_New(size);
3746 if (tuple == NULL)
3747 return NULL;
3748 while (PyDict_Next(dict, &pos, &k, &v)) {
3749 i = PyInt_AS_LONG(v);
3750 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00003751 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003752 PyTuple_SET_ITEM(tuple, i - offset, k);
3753 }
3754 return tuple;
3755}
3756
Guido van Rossum79f25d91997-04-29 20:08:16 +00003757PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003758PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003759{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003760 return PyNode_CompileFlags(n, filename, NULL);
3761}
3762
3763PyCodeObject *
3764PyNode_CompileFlags(node *n, char *filename, PyCompilerFlags *flags)
3765{
3766 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003767}
3768
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003769struct symtable *
3770PyNode_CompileSymtable(node *n, char *filename)
3771{
3772 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003773 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003774
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003775 ff = PyNode_Future(n, filename);
3776 if (ff == NULL)
3777 return NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003778 st = symtable_init();
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003779 if (st == NULL)
3780 return NULL;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003781 st->st_future = ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003782 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003783 if (st->st_errors > 0)
3784 goto fail;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003785 symtable_node(st, n);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003786 if (st->st_errors > 0)
3787 goto fail;
3788
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003789 return st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003790 fail:
3791 PyMem_Free((void *)ff);
3792 st->st_future = NULL;
3793 PySymtable_Free(st);
3794 return NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003795}
3796
Guido van Rossum79f25d91997-04-29 20:08:16 +00003797static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003798icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003799{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003800 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003801}
3802
Guido van Rossum79f25d91997-04-29 20:08:16 +00003803static PyCodeObject *
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003804jcompile(node *n, char *filename, struct compiling *base,
3805 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003806{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003807 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003808 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003809 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003810 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003811 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003812 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003813 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003814 /* c_symtable still points to parent's symbols */
3815 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003816 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003817 sc.c_nested = 1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003818 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003819 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00003820 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003821 if (sc.c_future == NULL) {
3822 com_free(&sc);
3823 return NULL;
3824 }
3825 if (flags) {
3826 if (flags->cf_nested_scopes)
3827 sc.c_future->ff_nested_scopes = 1;
3828 else if (sc.c_future->ff_nested_scopes)
3829 flags->cf_nested_scopes = 1;
3830 }
3831 if (symtable_build(&sc, n) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003832 com_free(&sc);
3833 return NULL;
3834 }
3835 }
3836 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003837 if (symtable_load_symbols(&sc) < 0) {
3838 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003839 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003840 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003841 compile_node(&sc, n);
3842 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00003843 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003844 PyObject *consts, *names, *varnames, *filename, *name,
3845 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003846 consts = PyList_AsTuple(sc.c_consts);
3847 names = PyList_AsTuple(sc.c_names);
3848 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003849 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
3850 freevars = dict_keys_inorder(sc.c_freevars,
3851 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003852 filename = PyString_InternFromString(sc.c_filename);
3853 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003854 if (!PyErr_Occurred())
3855 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003856 sc.c_nlocals,
3857 sc.c_maxstacklevel,
3858 sc.c_flags,
3859 sc.c_code,
3860 consts,
3861 names,
3862 varnames,
3863 freevars,
3864 cellvars,
3865 filename,
3866 name,
3867 sc.c_firstlineno,
3868 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003869 Py_XDECREF(consts);
3870 Py_XDECREF(names);
3871 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003872 Py_XDECREF(freevars);
3873 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003874 Py_XDECREF(filename);
3875 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003876 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00003877 else if (!PyErr_Occurred()) {
3878 /* This could happen if someone called PyErr_Clear() after an
3879 error was reported above. That's not supposed to happen,
3880 but I just plugged one case and I'm not sure there can't be
3881 others. In that case, raise SystemError so that at least
3882 it gets reported instead dumping core. */
3883 PyErr_SetString(PyExc_SystemError, "lost syntax error");
3884 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003885 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00003886 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003887 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00003888 sc.c_symtable = NULL;
3889 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003890 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003891 return co;
3892}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003893
3894int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003895PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003896{
3897 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003898 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003899 int line = co->co_firstlineno;
3900 int addr = 0;
3901 while (--size >= 0) {
3902 addr += *p++;
3903 if (addr > addrq)
3904 break;
3905 line += *p++;
3906 }
3907 return line;
3908}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003909
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003910/* The test for LOCAL must come before the test for FREE in order to
3911 handle classes where name is both local and free. The local var is
3912 a method and the free var is a free var referenced within a method.
3913*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003914
3915static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003916get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003917{
3918 PyObject *v;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00003919 if (c->c_symtable->st_nested_scopes) {
3920 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
3921 return CELL;
3922 if (PyDict_GetItemString(c->c_locals, name) != NULL)
3923 return LOCAL;
3924 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
3925 return FREE;
3926 v = PyDict_GetItemString(c->c_globals, name);
3927 if (v) {
3928 if (v == Py_None)
3929 return GLOBAL_EXPLICIT;
3930 else {
3931 return GLOBAL_IMPLICIT;
3932 }
3933 }
3934 } else {
3935 if (PyDict_GetItemString(c->c_locals, name) != NULL)
3936 return LOCAL;
3937 v = PyDict_GetItemString(c->c_globals, name);
3938 if (v) {
3939 if (v == Py_None)
3940 return GLOBAL_EXPLICIT;
3941 else {
3942 return GLOBAL_IMPLICIT;
3943 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003944 }
3945 }
3946 {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003947 char buf[350];
3948 sprintf(buf,
Jeremy Hylton51257732001-03-01 00:42:55 +00003949 "unknown scope for %.100s in %.100s(%s) "
3950 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
Jeremy Hylton483638c2001-02-01 20:20:45 +00003951 name, c->c_name,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003952 PyObject_REPR(c->c_symtable->st_cur->ste_id),
Jeremy Hylton51257732001-03-01 00:42:55 +00003953 c->c_filename,
3954 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
3955 PyObject_REPR(c->c_locals),
3956 PyObject_REPR(c->c_globals)
3957 );
3958
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003959 Py_FatalError(buf);
3960 }
3961 return -1; /* can't get here */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003962}
3963
Guido van Rossum207fda62001-03-02 03:30:41 +00003964/* Helper functions to issue warnings */
3965
3966static int
3967issue_warning(char *msg, char *filename, int lineno)
3968{
3969 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
3970 lineno, NULL, NULL) < 0) {
3971 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
3972 PyErr_SetString(PyExc_SyntaxError, msg);
3973 PyErr_SyntaxLocation(filename, lineno);
3974 }
3975 return -1;
3976 }
3977 return 0;
3978}
Guido van Rossumee34ac12001-02-28 22:08:12 +00003979
Jeremy Hylton4419ac12001-02-28 22:54:51 +00003980static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00003981symtable_warn(struct symtable *st, char *msg)
3982{
Guido van Rossum207fda62001-03-02 03:30:41 +00003983 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00003984 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00003985 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00003986 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00003987 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00003988}
3989
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00003990/* Helper function for setting lineno and filename */
3991
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003992static int
3993symtable_build(struct compiling *c, node *n)
3994{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003995 if ((c->c_symtable = symtable_init()) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003996 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00003997 c->c_symtable->st_future = c->c_future;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00003998 if (c->c_future->ff_nested_scopes)
3999 c->c_symtable->st_nested_scopes = 1;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004000 c->c_symtable->st_filename = c->c_filename;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004001 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
4002 if (c->c_symtable->st_errors > 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004003 return -1;
4004 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004005 if (c->c_symtable->st_errors > 0)
4006 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004007 /* reset for second pass */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004008 c->c_symtable->st_nscopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004009 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004010 return 0;
4011}
4012
4013static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004014symtable_init_compiling_symbols(struct compiling *c)
4015{
4016 PyObject *varnames;
4017
4018 varnames = c->c_symtable->st_cur->ste_varnames;
4019 if (varnames == NULL) {
4020 varnames = PyList_New(0);
4021 if (varnames == NULL)
4022 return -1;
4023 c->c_symtable->st_cur->ste_varnames = varnames;
4024 Py_INCREF(varnames);
4025 } else
4026 Py_INCREF(varnames);
4027 c->c_varnames = varnames;
4028
4029 c->c_globals = PyDict_New();
4030 if (c->c_globals == NULL)
4031 return -1;
4032 c->c_freevars = PyDict_New();
4033 if (c->c_freevars == NULL)
4034 return -1;
4035 c->c_cellvars = PyDict_New();
4036 if (c->c_cellvars == NULL)
4037 return -1;
4038 return 0;
4039}
4040
4041struct symbol_info {
4042 int si_nlocals;
4043 int si_ncells;
4044 int si_nfrees;
4045 int si_nimplicit;
4046};
4047
4048static void
4049symtable_init_info(struct symbol_info *si)
4050{
4051 si->si_nlocals = 0;
4052 si->si_ncells = 0;
4053 si->si_nfrees = 0;
4054 si->si_nimplicit = 0;
4055}
4056
4057static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004058symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004059 struct symbol_info *si)
4060{
4061 PyObject *dict, *v;
4062
4063 /* Seperate logic for DEF_FREE. If it occurs in a function,
4064 it indicates a local that we must allocate storage for (a
4065 cell var). If it occurs in a class, then the class has a
4066 method and a free variable with the same name.
4067 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004068 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004069 /* If it isn't declared locally, it can't be a cell. */
4070 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4071 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004072 v = PyInt_FromLong(si->si_ncells++);
4073 dict = c->c_cellvars;
4074 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004075 /* If it is free anyway, then there is no need to do
4076 anything here.
4077 */
4078 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00004079 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004080 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004081 v = PyInt_FromLong(si->si_nfrees++);
4082 dict = c->c_freevars;
4083 }
4084 if (v == NULL)
4085 return -1;
4086 if (PyDict_SetItem(dict, name, v) < 0) {
4087 Py_DECREF(v);
4088 return -1;
4089 }
4090 Py_DECREF(v);
4091 return 0;
4092}
4093
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004094/* If a variable is a cell and an argument, make sure that appears in
4095 co_cellvars before any variable to its right in varnames.
4096*/
4097
4098
4099static int
4100symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4101 PyObject *varnames, int flags)
4102{
4103 PyObject *v, *w, *d, *list = NULL;
4104 int i, pos;
4105
4106 if (flags & CO_VARARGS)
4107 argcount++;
4108 if (flags & CO_VARKEYWORDS)
4109 argcount++;
4110 for (i = argcount; --i >= 0; ) {
4111 v = PyList_GET_ITEM(varnames, i);
4112 if (PyDict_GetItem(*cellvars, v)) {
4113 if (list == NULL) {
4114 list = PyList_New(1);
4115 if (list == NULL)
4116 return -1;
4117 PyList_SET_ITEM(list, 0, v);
4118 Py_INCREF(v);
4119 } else
4120 PyList_Insert(list, 0, v);
4121 }
4122 }
4123 if (list == NULL || PyList_GET_SIZE(list) == 0)
4124 return 0;
4125 /* There are cellvars that are also arguments. Create a dict
4126 to replace cellvars and put the args at the front.
4127 */
4128 d = PyDict_New();
4129 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
4130 v = PyInt_FromLong(i);
4131 if (v == NULL)
4132 goto fail;
4133 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
4134 goto fail;
4135 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
4136 goto fail;
4137 }
4138 pos = 0;
4139 i = PyList_GET_SIZE(list);
4140 Py_DECREF(list);
4141 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
4142 w = PyInt_FromLong(i++); /* don't care about the old key */
4143 if (PyDict_SetItem(d, v, w) < 0) {
4144 Py_DECREF(w);
4145 goto fail;
4146 }
4147 Py_DECREF(w);
4148 }
4149 Py_DECREF(*cellvars);
4150 *cellvars = d;
4151 return 1;
4152 fail:
4153 Py_DECREF(d);
4154 return -1;
4155}
4156
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004157static int
4158symtable_freevar_offsets(PyObject *freevars, int offset)
4159{
4160 PyObject *name, *v;
4161 int pos;
4162
4163 /* The cell vars are the first elements of the closure,
4164 followed by the free vars. Update the offsets in
4165 c_freevars to account for number of cellvars. */
4166 pos = 0;
4167 while (PyDict_Next(freevars, &pos, &name, &v)) {
4168 int i = PyInt_AS_LONG(v) + offset;
4169 PyObject *o = PyInt_FromLong(i);
4170 if (o == NULL)
4171 return -1;
4172 if (PyDict_SetItem(freevars, name, o) < 0) {
4173 Py_DECREF(o);
4174 return -1;
4175 }
4176 Py_DECREF(o);
4177 }
4178 return 0;
4179}
4180
4181static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004182symtable_check_unoptimized(struct compiling *c,
4183 PySymtableEntryObject *ste,
4184 struct symbol_info *si)
4185{
4186 char buf[300];
4187
4188 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4189 || (ste->ste_nested && si->si_nimplicit)))
4190 return 0;
4191
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004192#define ILLEGAL_CONTAINS "contains a nested function with free variables"
4193
4194#define ILLEGAL_IS "is a nested function"
4195
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004196#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004197"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004198
4199#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004200"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004201
4202#define ILLEGAL_EXEC_AND_IMPORT_STAR \
4203"function '%.100s' uses import * and bare exec, which are illegal" \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004204"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004205
4206 /* XXX perhaps the linenos for these opt-breaking statements
4207 should be stored so the exception can point to them. */
4208
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004209 if (ste->ste_child_free) {
4210 if (ste->ste_optimized == OPT_IMPORT_STAR)
4211 sprintf(buf, ILLEGAL_IMPORT_STAR,
4212 PyString_AS_STRING(ste->ste_name),
4213 ILLEGAL_CONTAINS);
4214 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
4215 sprintf(buf, ILLEGAL_BARE_EXEC,
4216 PyString_AS_STRING(ste->ste_name),
4217 ILLEGAL_CONTAINS);
4218 else {
4219 sprintf(buf, ILLEGAL_EXEC_AND_IMPORT_STAR,
4220 PyString_AS_STRING(ste->ste_name),
4221 ILLEGAL_CONTAINS);
4222 }
4223 } else {
4224 if (ste->ste_optimized == OPT_IMPORT_STAR)
4225 sprintf(buf, ILLEGAL_IMPORT_STAR,
4226 PyString_AS_STRING(ste->ste_name),
4227 ILLEGAL_IS);
4228 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
4229 sprintf(buf, ILLEGAL_BARE_EXEC,
4230 PyString_AS_STRING(ste->ste_name),
4231 ILLEGAL_IS);
4232 else {
4233 sprintf(buf, ILLEGAL_EXEC_AND_IMPORT_STAR,
4234 PyString_AS_STRING(ste->ste_name),
4235 ILLEGAL_IS);
4236 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004237 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004238
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004239 if (c->c_symtable->st_nested_scopes) {
4240 PyErr_SetString(PyExc_SyntaxError, buf);
4241 PyErr_SyntaxLocation(c->c_symtable->st_filename,
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00004242 ste->ste_opt_lineno);
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004243 return -1;
Guido van Rossum207fda62001-03-02 03:30:41 +00004244 }
4245 else {
4246 return issue_warning(buf, c->c_filename, ste->ste_lineno);
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004247 }
4248 return 0;
4249}
4250
4251static int
4252symtable_check_shadow(struct symtable *st, PyObject *name, int flags)
4253{
4254 char buf[500];
4255 PyObject *children, *v;
Jeremy Hyltonc1761322001-02-28 23:44:45 +00004256 PySymtableEntryObject *child = NULL;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004257 int i;
4258
4259 if (!(flags & DEF_BOUND))
4260 return 0;
Jeremy Hylton9c901052001-05-08 04:12:34 +00004261
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004262 /* The semantics of this code will change with nested scopes.
4263 It is defined in the current scope and referenced in a
4264 child scope. Under the old rules, the child will see a
4265 global. Under the new rules, the child will see the
4266 binding in the current scope.
4267 */
4268
4269 /* Find name of child function that has free variable */
4270 children = st->st_cur->ste_children;
4271 for (i = 0; i < PyList_GET_SIZE(children); i++) {
4272 int cflags;
4273 child = (PySymtableEntryObject *)PyList_GET_ITEM(children, i);
4274 v = PyDict_GetItem(child->ste_symbols, name);
4275 if (v == NULL)
4276 continue;
4277 cflags = PyInt_AS_LONG(v);
4278 if (!(cflags & DEF_BOUND))
4279 break;
4280 }
Jeremy Hyltonc1761322001-02-28 23:44:45 +00004281
4282 assert(child != NULL);
4283
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004284 sprintf(buf, "local name '%.100s' in '%.100s' shadows "
4285 "use of '%.100s' as global in nested scope '%.100s'",
4286 PyString_AS_STRING(name),
4287 PyString_AS_STRING(st->st_cur->ste_name),
4288 PyString_AS_STRING(name),
4289 PyString_AS_STRING(child->ste_name)
4290 );
4291
4292 return symtable_warn(st, buf);
4293}
4294
4295static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004296symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4297 struct symbol_info *si)
4298{
Jeremy Hylton061d1062001-03-22 02:32:48 +00004299 if (c->c_future && c->c_future->ff_nested_scopes)
4300 c->c_flags |= CO_NESTED;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004301 if (ste->ste_type != TYPE_MODULE)
4302 c->c_flags |= CO_NEWLOCALS;
4303 if (ste->ste_type == TYPE_FUNCTION) {
4304 c->c_nlocals = si->si_nlocals;
4305 if (ste->ste_optimized == 0)
4306 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004307 else if (ste->ste_optimized != OPT_EXEC)
4308 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004309 }
4310 return 0;
4311}
4312
4313static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004314symtable_load_symbols(struct compiling *c)
4315{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004316 static PyObject *implicit = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004317 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004318 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004319 PyObject *name, *varnames, *v;
4320 int i, flags, pos;
4321 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004322
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004323 if (implicit == NULL) {
4324 implicit = PyInt_FromLong(1);
4325 if (implicit == NULL)
4326 return -1;
4327 }
4328 v = NULL;
4329
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004330 if (symtable_init_compiling_symbols(c) < 0)
4331 goto fail;
4332 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004333 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004334 si.si_nlocals = PyList_GET_SIZE(varnames);
4335 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004336
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004337 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004338 v = PyInt_FromLong(i);
4339 if (PyDict_SetItem(c->c_locals,
4340 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004341 goto fail;
4342 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004343 }
4344
4345 /* XXX The cases below define the rules for whether a name is
4346 local or global. The logic could probably be clearer. */
4347 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004348 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4349 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004350
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004351 if (st->st_nested_scopes == 0
4352 && (flags & (DEF_FREE | DEF_FREE_CLASS))) {
4353 if (symtable_check_shadow(st, name, flags) < 0)
4354 goto fail;
4355 }
4356
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004357 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004358 /* undo the original DEF_FREE */
4359 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004360
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004361 /* Deal with names that need two actions:
4362 1. Cell variables, which are also locals.
4363 2. Free variables in methods that are also class
4364 variables or declared global.
4365 */
Jeremy Hylton9c901052001-05-08 04:12:34 +00004366 if (st->st_nested_scopes) {
4367 if (flags & (DEF_FREE | DEF_FREE_CLASS)) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004368 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton9c901052001-05-08 04:12:34 +00004369 }
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004370 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004371
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004372 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004373 c->c_argcount--;
4374 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004375 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004376 c->c_argcount--;
4377 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004378 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004379 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004380 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004381 if (flags & DEF_PARAM) {
4382 PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004383 PyString_AS_STRING(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004384 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004385 ste->ste_lineno);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004386 st->st_errors++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004387 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004388 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004389 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4390 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004391 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004392 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004393 if (PyDict_SetItem(c->c_globals, name, implicit) < 0)
4394 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004395 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004396 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004397 if (v == NULL)
4398 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004399 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004400 goto fail;
4401 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004402 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004403 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004404 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004405 } else if (is_free(flags)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004406 if (ste->ste_nested && st->st_nested_scopes) {
4407 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004408 if (v == NULL)
4409 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004410 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004411 goto fail;
4412 Py_DECREF(v);
4413 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004414 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004415 if (PyDict_SetItem(c->c_globals, name,
4416 implicit) < 0)
4417 goto fail;
Jeremy Hylton51257732001-03-01 00:42:55 +00004418 if (st->st_nscopes != 1) {
4419 v = PyInt_FromLong(flags);
4420 if (PyDict_SetItem(st->st_global,
4421 name, v))
4422 goto fail;
4423 Py_DECREF(v);
4424 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004425 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004426 }
4427 }
4428
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004429 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
4430
Jeremy Hylton9c901052001-05-08 04:12:34 +00004431 if (st->st_nested_scopes == 0)
4432 assert(si.si_nfrees == 0);
4433
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004434 if (si.si_ncells > 1) { /* one cell is always in order */
4435 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
4436 c->c_varnames, c->c_flags) < 0)
4437 return -1;
4438 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004439 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4440 return -1;
4441 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004442 fail:
4443 /* is this always the right thing to do? */
4444 Py_XDECREF(v);
4445 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004446}
4447
4448static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004449symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004450{
4451 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004452
4453 st = (struct symtable *)PyMem_Malloc(sizeof(struct symtable));
4454 if (st == NULL)
4455 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004456 st->st_pass = 1;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004457 st->st_nested_scopes = NESTED_SCOPES_DEFAULT;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004458 st->st_filename = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004459 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004460 goto fail;
4461 if ((st->st_symbols = PyDict_New()) == NULL)
4462 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004463 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004464 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004465 st->st_errors = 0;
4466 st->st_tmpname = 0;
4467 st->st_private = NULL;
4468 return st;
4469 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004470 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004471 return NULL;
4472}
4473
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004474void
4475PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004476{
4477 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004478 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004479 Py_XDECREF(st->st_cur);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004480 PyMem_Free((void *)st);
4481}
4482
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004483/* When the compiler exits a scope, it must should update the scope's
4484 free variable information with the list of free variables in its
4485 children.
4486
4487 Variables that are free in children and defined in the current
4488 scope are cellvars.
4489
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004490 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004491 false), free variables in children that are not defined here are
4492 implicit globals.
4493
4494*/
4495
4496static int
4497symtable_update_free_vars(struct symtable *st)
4498{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004499 int i, j, def;
4500 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004501 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004502
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004503 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004504 def = DEF_FREE_CLASS;
4505 else
4506 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004507 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004508 int pos = 0;
4509
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004510 if (list)
4511 PyList_SetSlice(list, 0,
4512 ((PyVarObject*)list)->ob_size, 0);
Barry Warsaw0372af72001-02-23 18:22:59 +00004513 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004514 PyList_GET_ITEM(ste->ste_children, i);
4515 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004516 int flags = PyInt_AS_LONG(o);
4517 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004518 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004519 if (list == NULL) {
4520 list = PyList_New(0);
4521 if (list == NULL)
4522 return -1;
4523 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004524 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004525 if (PyList_Append(list, name) < 0) {
4526 Py_DECREF(list);
4527 return -1;
4528 }
4529 }
4530 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004531 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004532 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00004533 v = PyDict_GetItem(ste->ste_symbols, name);
4534 /* If a name N is declared global in scope A and
4535 referenced in scope B contained (perhaps
4536 indirectly) in A and there are no scopes
4537 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00004538 is global in B. Unless A is a class scope,
4539 because class scopes are not considered for
4540 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00004541 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004542 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004543 int flags = PyInt_AS_LONG(v);
4544 if (flags & DEF_GLOBAL) {
4545 symtable_undo_free(st, child->ste_id,
4546 name);
4547 continue;
4548 }
4549 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004550 if (ste->ste_nested) {
4551 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004552 name, def) < 0) {
4553 Py_DECREF(list);
4554 return -1;
4555 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004556 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004557 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004558 name) < 0) {
4559 Py_DECREF(list);
4560 return -1;
4561 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004562 }
4563 }
4564 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004565
4566 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004567 return 0;
4568}
4569
4570/* If the current scope is a non-nested class or if name is not
4571 defined in the current, non-nested scope, then it is an implicit
4572 global in all nested scopes.
4573*/
4574
4575static int
4576symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
4577{
4578 PyObject *o;
4579 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004580 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00004581
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004582 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004583 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004584 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004585 if (o == NULL)
4586 return symtable_undo_free(st, child, name);
4587 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00004588
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004589 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004590 return symtable_undo_free(st, child, name);
4591 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004592 return symtable_add_def_o(st, ste->ste_symbols,
4593 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004594}
4595
4596static int
4597symtable_undo_free(struct symtable *st, PyObject *id,
4598 PyObject *name)
4599{
4600 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004601 PyObject *info;
4602 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004603
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004604 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
4605 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004606 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00004607
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004608 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004609 if (info == NULL)
4610 return 0;
4611 v = PyInt_AS_LONG(info);
4612 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004613 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004614 DEF_FREE_GLOBAL) < 0)
4615 return -1;
4616 } else
4617 /* If the name is defined here or declared global,
4618 then the recursion stops. */
4619 return 0;
4620
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004621 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
4622 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00004623 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004624 PyList_GET_ITEM(ste->ste_children, i);
4625 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004626 if (x < 0)
4627 return x;
4628 }
4629 return 0;
4630}
4631
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004632/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
4633 This reference is released when the scope is exited, via the DECREF
4634 in symtable_exit_scope().
4635*/
4636
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004637static int
4638symtable_exit_scope(struct symtable *st)
4639{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004640 int end;
4641
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004642 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004643 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004644 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004645 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004646 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
4647 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004648 if (PySequence_DelItem(st->st_stack, end) < 0)
4649 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004650 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004651}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004652
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004653static void
4654symtable_enter_scope(struct symtable *st, char *name, int type,
4655 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004656{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004657 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004658
4659 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004660 prev = st->st_cur;
4661 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
4662 Py_DECREF(st->st_cur);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004663 st->st_errors++;
4664 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004665 }
4666 }
Barry Warsaw0372af72001-02-23 18:22:59 +00004667 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004668 PySymtableEntry_New(st, name, type, lineno);
4669 if (strcmp(name, TOP) == 0)
4670 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004671 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004672 if (PyList_Append(prev->ste_children,
4673 (PyObject *)st->st_cur) < 0)
4674 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004675 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004676}
4677
4678static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004679symtable_lookup(struct symtable *st, char *name)
4680{
4681 char buffer[MANGLE_LEN];
4682 PyObject *v;
4683 int flags;
4684
4685 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
4686 name = buffer;
4687 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
4688 if (v == NULL) {
4689 if (PyErr_Occurred())
4690 return -1;
4691 else
4692 return 0;
4693 }
4694
4695 flags = PyInt_AS_LONG(v);
4696 return flags;
4697}
4698
4699static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004700symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004701{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004702 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004703 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004704 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004705
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004706 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004707 name = buffer;
4708 if ((s = PyString_InternFromString(name)) == NULL)
4709 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004710 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
4711 Py_DECREF(s);
4712 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004713}
4714
4715/* Must only be called with mangled names */
4716
4717static int
4718symtable_add_def_o(struct symtable *st, PyObject *dict,
4719 PyObject *name, int flag)
4720{
4721 PyObject *o;
4722 int val;
4723
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004724 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004725 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004726 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004727 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00004728 PyString_AsString(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004729 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004730 st->st_cur->ste_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004731 return -1;
4732 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004733 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004734 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004735 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004736 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004737 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004738 Py_DECREF(o);
4739 return -1;
4740 }
4741 Py_DECREF(o);
4742
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004743 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004744 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004745 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004746 } else if (flag & DEF_GLOBAL) {
4747 /* XXX need to update DEF_GLOBAL for other flags too;
4748 perhaps only DEF_FREE_GLOBAL */
4749 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004750 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004751 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004752 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004753 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004754 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004755 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004756 Py_DECREF(o);
4757 return -1;
4758 }
4759 Py_DECREF(o);
4760 }
4761 return 0;
4762}
4763
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004764#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004765
4766static void
4767symtable_node(struct symtable *st, node *n)
4768{
4769 int i, start = 0;
4770
4771 loop:
4772 switch (TYPE(n)) {
4773 case funcdef: {
4774 char *func_name = STR(CHILD(n, 1));
4775 symtable_add_def(st, func_name, DEF_LOCAL);
4776 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004777 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004778 symtable_funcdef(st, n);
4779 symtable_exit_scope(st);
4780 break;
4781 }
4782 case lambdef:
4783 if (NCH(n) == 4)
4784 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004785 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004786 symtable_funcdef(st, n);
4787 symtable_exit_scope(st);
4788 break;
4789 case classdef: {
4790 char *tmp, *class_name = STR(CHILD(n, 1));
4791 symtable_add_def(st, class_name, DEF_LOCAL);
4792 if (TYPE(CHILD(n, 2)) == LPAR) {
4793 node *bases = CHILD(n, 3);
4794 int i;
4795 for (i = 0; i < NCH(bases); i += 2) {
4796 symtable_node(st, CHILD(bases, i));
4797 }
4798 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004799 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004800 tmp = st->st_private;
4801 st->st_private = class_name;
4802 symtable_node(st, CHILD(n, NCH(n) - 1));
4803 st->st_private = tmp;
4804 symtable_exit_scope(st);
4805 break;
4806 }
4807 case if_stmt:
4808 for (i = 0; i + 3 < NCH(n); i += 4) {
4809 if (is_constant_false(NULL, (CHILD(n, i + 1))))
4810 continue;
4811 symtable_node(st, CHILD(n, i + 1));
4812 symtable_node(st, CHILD(n, i + 3));
4813 }
4814 if (i + 2 < NCH(n))
4815 symtable_node(st, CHILD(n, i + 2));
4816 break;
4817 case global_stmt:
4818 symtable_global(st, n);
4819 break;
4820 case import_stmt:
4821 symtable_import(st, n);
4822 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004823 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004824 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004825 symtable_node(st, CHILD(n, 1));
4826 if (NCH(n) > 2)
4827 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00004828 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004829 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00004830 st->st_cur->ste_opt_lineno = n->n_lineno;
4831 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004832 if (NCH(n) > 4)
4833 symtable_node(st, CHILD(n, 5));
4834 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004835
4836 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00004837 case assert_stmt:
4838 if (Py_OptimizeFlag)
4839 return;
4840 if (NCH(n) == 2) {
4841 n = CHILD(n, 1);
4842 goto loop;
4843 } else {
4844 symtable_node(st, CHILD(n, 1));
4845 n = CHILD(n, 3);
4846 goto loop;
4847 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004848 case except_clause:
4849 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004850 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004851 if (NCH(n) > 1) {
4852 n = CHILD(n, 1);
4853 goto loop;
4854 }
4855 break;
4856 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004857 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004858 break;
4859 case expr_stmt:
4860 if (NCH(n) == 1)
4861 n = CHILD(n, 0);
4862 else {
4863 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004864 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004865 symtable_node(st, CHILD(n, 2));
4866 break;
4867 } else {
4868 int i;
4869 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004870 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004871 n = CHILD(n, NCH(n) - 1);
4872 }
4873 }
4874 goto loop;
4875 /* watchout for fall-through logic below */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004876 case argument:
4877 if (NCH(n) == 3) {
4878 n = CHILD(n, 2);
4879 goto loop;
4880 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004881 case listmaker:
4882 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton23b42272001-03-19 20:38:06 +00004883 st->st_tmpname++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004884 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton23b42272001-03-19 20:38:06 +00004885 symtable_node(st, CHILD(n, 0));
4886 st->st_tmpname--;
4887 return;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004888 }
4889 case atom:
4890 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
4891 symtable_add_use(st, STR(CHILD(n, 0)));
4892 break;
4893 }
4894 case for_stmt:
4895 if (TYPE(n) == for_stmt) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004896 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004897 start = 3;
4898 }
4899 default:
4900 if (NCH(n) == 1) {
4901 n = CHILD(n, 0);
4902 goto loop;
4903 }
4904 for (i = start; i < NCH(n); ++i)
4905 if (TYPE(CHILD(n, i)) >= single_input)
4906 symtable_node(st, CHILD(n, i));
4907 }
4908}
4909
4910static void
4911symtable_funcdef(struct symtable *st, node *n)
4912{
4913 node *body;
4914
4915 if (TYPE(n) == lambdef) {
4916 if (NCH(n) == 4)
4917 symtable_params(st, CHILD(n, 1));
4918 } else
4919 symtable_params(st, CHILD(n, 2));
4920 body = CHILD(n, NCH(n) - 1);
4921 symtable_node(st, body);
4922}
4923
4924/* The next two functions parse the argument tuple.
4925 symtable_default_arg() checks for names in the default arguments,
4926 which are references in the defining scope. symtable_params()
4927 parses the parameter names, which are defined in the function's
4928 body.
4929
4930 varargslist:
4931 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
4932 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
4933*/
4934
4935static void
4936symtable_default_args(struct symtable *st, node *n)
4937{
4938 node *c;
4939 int i;
4940
4941 if (TYPE(n) == parameters) {
4942 n = CHILD(n, 1);
4943 if (TYPE(n) == RPAR)
4944 return;
4945 }
4946 REQ(n, varargslist);
4947 for (i = 0; i < NCH(n); i += 2) {
4948 c = CHILD(n, i);
4949 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
4950 break;
4951 }
4952 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
4953 symtable_node(st, CHILD(n, i));
4954 }
4955}
4956
4957static void
4958symtable_params(struct symtable *st, node *n)
4959{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004960 int i, complex = -1, ext = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004961 node *c = NULL;
4962
4963 if (TYPE(n) == parameters) {
4964 n = CHILD(n, 1);
4965 if (TYPE(n) == RPAR)
4966 return;
4967 }
4968 REQ(n, varargslist);
4969 for (i = 0; i < NCH(n); i += 2) {
4970 c = CHILD(n, i);
4971 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
4972 ext = 1;
4973 break;
4974 }
4975 if (TYPE(c) == test) {
4976 continue;
4977 }
4978 if (TYPE(CHILD(c, 0)) == NAME)
4979 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
4980 else {
4981 char nbuf[10];
4982 sprintf(nbuf, ".%d", i);
4983 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004984 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004985 }
4986 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004987 if (ext) {
4988 c = CHILD(n, i);
4989 if (TYPE(c) == STAR) {
4990 i++;
4991 symtable_add_def(st, STR(CHILD(n, i)),
4992 DEF_PARAM | DEF_STAR);
4993 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00004994 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004995 c = NULL;
4996 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004997 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004998 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004999 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005000 i++;
5001 symtable_add_def(st, STR(CHILD(n, i)),
5002 DEF_PARAM | DEF_DOUBLESTAR);
5003 }
5004 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005005 if (complex >= 0) {
5006 int j;
5007 for (j = 0; j <= complex; j++) {
5008 c = CHILD(n, j);
5009 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005010 c = CHILD(n, ++j);
5011 else if (TYPE(c) == EQUAL)
5012 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005013 if (TYPE(CHILD(c, 0)) == LPAR)
5014 symtable_params_fplist(st, CHILD(c, 1));
5015 }
5016 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005017}
5018
5019static void
5020symtable_params_fplist(struct symtable *st, node *n)
5021{
5022 int i;
5023 node *c;
5024
5025 REQ(n, fplist);
5026 for (i = 0; i < NCH(n); i += 2) {
5027 c = CHILD(n, i);
5028 REQ(c, fpdef);
5029 if (NCH(c) == 1)
5030 symtable_add_def(st, STR(CHILD(c, 0)),
5031 DEF_PARAM | DEF_INTUPLE);
5032 else
5033 symtable_params_fplist(st, CHILD(c, 1));
5034 }
5035
5036}
5037
5038static void
5039symtable_global(struct symtable *st, node *n)
5040{
5041 int i;
5042
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005043 /* XXX It might be helpful to warn about module-level global
5044 statements, but it's hard to tell the difference between
5045 module-level and a string passed to exec.
5046 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00005047
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005048 for (i = 1; i < NCH(n); i += 2) {
5049 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005050 int flags;
5051
5052 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005053 if (flags < 0)
5054 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005055 if (flags && flags != DEF_GLOBAL) {
5056 char buf[500];
5057 if (flags & DEF_PARAM) {
5058 PyErr_Format(PyExc_SyntaxError,
5059 "name '%.400s' is local and global",
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005060 name);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005061 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005062 st->st_cur->ste_lineno);
5063 st->st_errors++;
5064 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005065 }
5066 else {
5067 if (flags & DEF_LOCAL)
5068 sprintf(buf, GLOBAL_AFTER_ASSIGN,
5069 name);
5070 else
5071 sprintf(buf, GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005072 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005073 }
5074 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005075 symtable_add_def(st, name, DEF_GLOBAL);
5076 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005077}
5078
5079static void
5080symtable_list_comprehension(struct symtable *st, node *n)
5081{
5082 char tmpname[12];
5083
Jeremy Hylton23b42272001-03-19 20:38:06 +00005084 sprintf(tmpname, "_[%d]", st->st_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005085 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005086 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005087 symtable_node(st, CHILD(n, 3));
5088 if (NCH(n) == 5)
5089 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005090}
5091
5092static void
5093symtable_import(struct symtable *st, node *n)
5094{
5095 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005096 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005097 | 'from' dotted_name 'import'
5098 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00005099 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005100 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005101 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005102 node *dotname = CHILD(n, 1);
5103 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
5104 /* check for bogus imports */
5105 if (n->n_lineno >= st->st_future->ff_last_lineno) {
5106 PyErr_SetString(PyExc_SyntaxError,
5107 LATE_FUTURE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005108 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005109 n->n_lineno);
5110 st->st_errors++;
5111 return;
5112 }
5113 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005114 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005115 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005116 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005117 } else {
5118 for (i = 3; i < NCH(n); i += 2) {
5119 node *c = CHILD(n, i);
5120 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005121 symtable_assign(st, CHILD(c, 2),
5122 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005123 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005124 symtable_assign(st, CHILD(c, 0),
5125 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005126 }
5127 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005128 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005129 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005130 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005131 }
5132 }
5133}
5134
5135static void
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005136symtable_assign(struct symtable *st, node *n, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005137{
5138 node *tmp;
5139 int i;
5140
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005141 loop:
5142 switch (TYPE(n)) {
5143 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005144 /* invalid assignment, e.g. lambda x:x=2. The next
5145 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005146 return;
5147 case power:
5148 if (NCH(n) > 2) {
5149 for (i = 2; i < NCH(n); ++i)
5150 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
5151 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005152 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005153 if (NCH(n) > 1) {
5154 symtable_node(st, CHILD(n, 0));
5155 symtable_node(st, CHILD(n, 1));
5156 } else {
5157 n = CHILD(n, 0);
5158 goto loop;
5159 }
5160 return;
5161 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00005162 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
5163 /* XXX This is an error, but the next pass
5164 will catch it. */
5165 return;
5166 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005167 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005168 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005169 }
5170 return;
5171 case exprlist:
5172 case testlist:
5173 if (NCH(n) == 1) {
5174 n = CHILD(n, 0);
5175 goto loop;
5176 }
5177 else {
5178 int i;
5179 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005180 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005181 return;
5182 }
5183 goto loop;
5184 case atom:
5185 tmp = CHILD(n, 0);
5186 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
5187 n = CHILD(n, 1);
5188 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00005189 } else if (TYPE(tmp) == NAME) {
Jeremy Hyltona830b382001-04-09 16:07:59 +00005190 if (strcmp(STR(tmp), "__debug__") == 0)
5191 symtable_warn(st, ASSIGN_DEBUG);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005192 symtable_add_def(st, STR(tmp), DEF_LOCAL | flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00005193 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005194 return;
5195 case dotted_as_name:
5196 if (NCH(n) == 3)
5197 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005198 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005199 else
5200 symtable_add_def(st,
5201 STR(CHILD(CHILD(n,
5202 0), 0)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005203 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005204 return;
5205 case dotted_name:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005206 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005207 return;
5208 case NAME:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005209 symtable_add_def(st, STR(n), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005210 return;
5211 default:
5212 if (NCH(n) == 0)
5213 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00005214 if (NCH(n) == 1) {
5215 n = CHILD(n, 0);
5216 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005217 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00005218 /* Should only occur for errors like x + 1 = 1,
5219 which will be caught in the next pass. */
5220 for (i = 0; i < NCH(n); ++i)
5221 if (TYPE(CHILD(n, i)) >= single_input)
5222 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005223 }
5224}