blob: 843cf098e842838a7ee2e27669dc1e19d2082364 [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
Tim Peters2a7f3842001-06-09 09:26:21 +0000339/* All about c_lnotab.
340
341c_lnotab is an array of unsigned bytes disguised as a Python string. In -O
342mode, SET_LINENO opcodes aren't generated, and bytecode offsets are mapped
343to source code line #s (when needed for tracebacks) via c_lnotab instead.
344The array is conceptually a list of
345 (bytecode offset increment, line number increment)
346pairs. The details are important and delicate, best illustrated by example:
347
348 byte code offset source code line number
349 0 1
350 6 2
351 50 7
352 350 307
353 361 308
354
355The first trick is that these numbers aren't stored, only the increments
356from one row to the next (this doesn't really work, but it's a start):
357
358 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
359
360The second trick is that an unsigned byte can't hold negative values, or
361values larger than 255, so (a) there's a deep assumption that byte code
362offsets and their corresponding line #s both increase monotonically, and (b)
363if at least one column jumps by more than 255 from one row to the next, more
364than one pair is written to the table. In case #b, there's no way to know
365from looking at the table later how many were written. That's the delicate
366part. A user of c_lnotab desiring to find the source line number
367corresponding to a bytecode address A should do something like this
368
369 lineno = addr = 0
370 for addr_incr, line_incr in c_lnotab:
371 addr += addr_incr
372 if addr > A:
373 return lineno
374 lineno += line_incr
375
376In order for this to work, when the addr field increments by more than 255,
377the line # increment in each pair generated must be 0 until the remaining addr
378increment is < 256. So, in the example above, com_set_lineno should not (as
379was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
380255, 0, 45, 255, 0, 45.
381*/
382
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000383struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000384 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000385 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000386 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000387 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000388 PyObject *c_name_dict; /* inverse of c_names */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000389 PyObject *c_globals; /* dictionary (value=None) */
390 PyObject *c_locals; /* dictionary (value=localID) */
391 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000392 PyObject *c_freevars; /* dictionary (value=None) */
393 PyObject *c_cellvars; /* list */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000394 int c_nlocals; /* index of next local */
395 int c_argcount; /* number of top-level arguments */
396 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000397 int c_nexti; /* index into c_code */
398 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000399 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000400 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000401 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000402 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000403 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000404 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000405 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000406 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000407 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000408 int c_stacklevel; /* Current stack level */
409 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000410 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000411 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000412 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000413 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000414 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000415 int c_nested; /* Is block nested funcdef or lamdef? */
416 int c_closure; /* Is nested w/freevars? */
417 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000418 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000419};
420
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000421static int
422is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000423{
424 if ((v & (USE | DEF_FREE))
425 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
426 return 1;
427 if (v & DEF_FREE_CLASS)
428 return 1;
429 return 0;
430}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000431
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000432static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000433com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000434{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000435 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
436
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000437 if (c == NULL) {
438 /* Error occurred via symtable call to
439 is_constant_false */
440 PyErr_SetString(exc, msg);
441 return;
442 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000443 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000444 if (c->c_lineno < 1 || c->c_interactive) {
445 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000446 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000447 return;
448 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000449 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000450 if (v == NULL)
451 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000452
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000453 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000454 if (line == NULL) {
455 Py_INCREF(Py_None);
456 line = Py_None;
457 }
458 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
459 Py_None, line);
460 if (t == NULL)
461 goto exit;
462 w = Py_BuildValue("(OO)", v, t);
463 if (w == NULL)
464 goto exit;
465 PyErr_SetObject(exc, w);
466 exit:
467 Py_XDECREF(t);
468 Py_XDECREF(v);
469 Py_XDECREF(w);
470 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000471}
472
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000473/* Interface to the block stack */
474
475static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000476block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000477{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000478 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000479 com_error(c, PyExc_SystemError,
480 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000481 }
482 else {
483 c->c_block[c->c_nblocks++] = type;
484 }
485}
486
487static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000488block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000489{
490 if (c->c_nblocks > 0)
491 c->c_nblocks--;
492 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000493 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000494 }
495}
496
Guido van Rossum681d79a1995-07-18 14:51:37 +0000497/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000498
Tim Petersdbd9ba62000-07-09 03:09:57 +0000499static int com_init(struct compiling *, char *);
500static void com_free(struct compiling *);
501static void com_push(struct compiling *, int);
502static void com_pop(struct compiling *, int);
503static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000504static void com_node(struct compiling *, node *);
505static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000506static void com_addbyte(struct compiling *, int);
507static void com_addint(struct compiling *, int);
508static void com_addoparg(struct compiling *, int, int);
509static void com_addfwref(struct compiling *, int, int *);
510static void com_backpatch(struct compiling *, int);
511static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
512static int com_addconst(struct compiling *, PyObject *);
513static int com_addname(struct compiling *, PyObject *);
514static void com_addopname(struct compiling *, int, node *);
515static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000516static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000517static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000518static void com_assign(struct compiling *, node *, int, node *);
519static void com_assign_name(struct compiling *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000520static PyCodeObject *icompile(node *, struct compiling *);
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000521static PyCodeObject *jcompile(node *, char *, struct compiling *,
522 PyCompilerFlags *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000523static PyObject *parsestrplus(node *);
524static PyObject *parsestr(char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000525static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000526
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000527static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000528
529/* symtable operations */
530static int symtable_build(struct compiling *, node *);
531static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000532static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000533static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000534static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000535static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000536static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000537
538static void symtable_node(struct symtable *, node *);
539static void symtable_funcdef(struct symtable *, node *);
540static void symtable_default_args(struct symtable *, node *);
541static void symtable_params(struct symtable *, node *);
542static void symtable_params_fplist(struct symtable *, node *n);
543static void symtable_global(struct symtable *, node *);
544static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000545static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000546static void symtable_list_comprehension(struct symtable *, node *);
547
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000548static int symtable_update_free_vars(struct symtable *);
549static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
550static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
551
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000552/* helper */
553static void
554do_pad(int pad)
555{
556 int i;
557 for (i = 0; i < pad; ++i)
558 fprintf(stderr, " ");
559}
560
561static void
562dump(node *n, int pad, int depth)
563{
564 int i;
565 if (depth == 0)
566 return;
567 do_pad(pad);
568 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
569 if (depth > 0)
570 depth--;
571 for (i = 0; i < NCH(n); ++i)
572 dump(CHILD(n, i), pad + 1, depth);
573}
574
575#define DUMP(N) dump(N, 0, -1)
576
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000577static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000578com_init(struct compiling *c, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000579{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000580 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000581 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
582 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000583 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000584 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000585 goto fail;
586 if ((c->c_const_dict = PyDict_New()) == NULL)
587 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000588 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000589 goto fail;
590 if ((c->c_name_dict = PyDict_New()) == NULL)
591 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000592 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000593 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000594 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
595 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000596 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000597 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000598 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000599 c->c_freevars = NULL;
600 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000601 c->c_nlocals = 0;
602 c->c_argcount = 0;
603 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000604 c->c_nexti = 0;
605 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000606 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000607 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000608 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000609 c->c_begin = 0;
610 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000611 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000612 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000613 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000614 c->c_stacklevel = 0;
615 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000616 c->c_firstlineno = 0;
617 c->c_last_addr = 0;
618 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000619 c->c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000620 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000621 c->c_nested = 0;
622 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000623 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000624 return 1;
625
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000626 fail:
627 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000628 return 0;
629}
630
631static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000632com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000633{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000634 Py_XDECREF(c->c_code);
635 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000636 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000637 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000638 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000639 Py_XDECREF(c->c_globals);
640 Py_XDECREF(c->c_locals);
641 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000642 Py_XDECREF(c->c_freevars);
643 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000644 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +0000645 if (c->c_future)
646 PyMem_Free((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000647}
648
649static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000650com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000651{
652 c->c_stacklevel += n;
653 if (c->c_stacklevel > c->c_maxstacklevel)
654 c->c_maxstacklevel = c->c_stacklevel;
655}
656
657static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000658com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000659{
660 if (c->c_stacklevel < n) {
Guido van Rossum90f827c1998-08-25 18:22:17 +0000661 /* fprintf(stderr,
Guido van Rossum8b993a91997-01-17 21:04:03 +0000662 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
663 c->c_filename, c->c_lineno,
Guido van Rossum90f827c1998-08-25 18:22:17 +0000664 c->c_nexti, c->c_stacklevel, n); */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000665 c->c_stacklevel = 0;
666 }
667 else
668 c->c_stacklevel -= n;
669}
670
671static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000672com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000673{
674 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000675 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000676 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000677 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000678}
679
680static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000681com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000682{
683 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000684 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000685 assert(byte >= 0 && byte <= 255);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000686 if (byte < 0 || byte > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000687 com_error(c, PyExc_SystemError,
688 "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000689 }
690 if (c->c_code == NULL)
691 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000692 len = PyString_Size(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000693 if (c->c_nexti >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000694 if (_PyString_Resize(&c->c_code, len+1000) != 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000695 c->c_errors++;
696 return;
697 }
698 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000699 PyString_AsString(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000700}
701
702static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000703com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000704{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000705 com_addbyte(c, x & 0xff);
706 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000707}
708
709static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000710com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000711{
712 int size;
713 char *p;
714 if (c->c_lnotab == NULL)
715 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000716 size = PyString_Size(c->c_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000717 if (c->c_lnotab_next+2 > size) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000718 if (_PyString_Resize(&c->c_lnotab, size + 1000) < 0) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000719 c->c_errors++;
720 return;
721 }
722 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000723 p = PyString_AsString(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000724 *p++ = addr;
725 *p++ = line;
726 c->c_lnotab_next += 2;
727}
728
729static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000730com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000731{
732 c->c_lineno = lineno;
733 if (c->c_firstlineno == 0) {
734 c->c_firstlineno = c->c_last_line = lineno;
735 }
736 else {
737 int incr_addr = c->c_nexti - c->c_last_addr;
738 int incr_line = lineno - c->c_last_line;
Tim Peters2a7f3842001-06-09 09:26:21 +0000739 while (incr_addr > 255) {
740 com_add_lnotab(c, 255, 0);
741 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000742 }
Tim Peters2a7f3842001-06-09 09:26:21 +0000743 while (incr_line > 255) {
744 com_add_lnotab(c, incr_addr, 255);
745 incr_line -=255;
746 incr_addr = 0;
747 }
748 if (incr_addr > 0 || incr_line > 0)
749 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000750 c->c_last_addr = c->c_nexti;
751 c->c_last_line = lineno;
752 }
753}
754
755static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000756com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000757{
Fred Drakeef8ace32000-08-24 00:32:09 +0000758 int extended_arg = arg >> 16;
Guido van Rossum8e793d91997-03-03 19:13:14 +0000759 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000760 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000761 if (Py_OptimizeFlag)
762 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000763 }
Fred Drakeef8ace32000-08-24 00:32:09 +0000764 if (extended_arg){
765 com_addbyte(c, EXTENDED_ARG);
766 com_addint(c, extended_arg);
767 arg &= 0xffff;
768 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000769 com_addbyte(c, op);
770 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000771}
772
773static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000774com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000775{
776 /* Compile a forward reference for backpatching */
777 int here;
778 int anchor;
779 com_addbyte(c, op);
780 here = c->c_nexti;
781 anchor = *p_anchor;
782 *p_anchor = here;
783 com_addint(c, anchor == 0 ? 0 : here - anchor);
784}
785
786static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000787com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000788{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000789 unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000790 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000791 int dist;
792 int prev;
793 for (;;) {
794 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000795 prev = code[anchor] + (code[anchor+1] << 8);
796 dist = target - (anchor+2);
797 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +0000798 dist >>= 8;
799 code[anchor+1] = dist;
800 dist >>= 8;
801 if (dist) {
802 com_error(c, PyExc_SystemError,
803 "com_backpatch: offset too large");
804 break;
805 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000806 if (!prev)
807 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000808 anchor -= prev;
809 }
810}
811
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000812/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000813
814static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000815com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000816{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000817 PyObject *w, *t, *np=NULL;
818 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000819
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000820 t = Py_BuildValue("(OO)", v, v->ob_type);
821 if (t == NULL)
822 goto fail;
823 w = PyDict_GetItem(dict, t);
824 if (w != NULL) {
825 n = PyInt_AsLong(w);
826 } else {
827 n = PyList_Size(list);
828 np = PyInt_FromLong(n);
829 if (np == NULL)
830 goto fail;
831 if (PyList_Append(list, v) != 0)
832 goto fail;
833 if (PyDict_SetItem(dict, t, np) != 0)
834 goto fail;
835 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000836 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000837 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000838 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000839 fail:
840 Py_XDECREF(np);
841 Py_XDECREF(t);
842 c->c_errors++;
843 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000844}
845
846static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000847com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000848{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000849 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000850}
851
852static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000853com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000854{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000855 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000856}
857
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000858static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000859mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000860{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000861 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000862 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +0000863 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000864 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
865 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000866 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000867 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000868 return 0; /* Don't mangle __extremely_long_names */
869 if (name[nlen-1] == '_' && name[nlen-2] == '_')
870 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000871 /* Strip leading underscores from class name */
872 while (*p == '_')
873 p++;
874 if (*p == '\0')
875 return 0; /* Don't mangle if class is just underscores */
876 plen = strlen(p);
877 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000878 plen = maxlen-nlen-2; /* Truncate class name if too long */
879 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000880 buffer[0] = '_';
881 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000882 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000883 return 1;
884}
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000885
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000886static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000887com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000888{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000889 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000890 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000891 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000892
893 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000894 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000895 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000896 c->c_errors++;
897 i = 255;
898 }
899 else {
900 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000901 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000902 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000903 com_addoparg(c, op, i);
904}
905
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000906#define NAME_LOCAL 0
907#define NAME_GLOBAL 1
908#define NAME_DEFAULT 2
909#define NAME_CLOSURE 3
910
911static int
912com_lookup_arg(PyObject *dict, PyObject *name)
913{
914 PyObject *v = PyDict_GetItem(dict, name);
915 if (v == NULL)
916 return -1;
917 else
918 return PyInt_AS_LONG(v);
919}
920
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000921static void
922com_addop_varname(struct compiling *c, int kind, char *name)
923{
924 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000925 int i, reftype;
926 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000927 int op = STOP_CODE;
928 char buffer[MANGLE_LEN];
929
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000930 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000931 name = buffer;
932 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
933 c->c_errors++;
934 i = 255;
935 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000936 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000937
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000938 reftype = get_ref_type(c, name);
939 switch (reftype) {
940 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000941 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000942 scope = NAME_LOCAL;
943 break;
944 case GLOBAL_EXPLICIT:
945 scope = NAME_GLOBAL;
946 break;
947 case GLOBAL_IMPLICIT:
948 if (c->c_flags & CO_OPTIMIZED)
949 scope = NAME_GLOBAL;
950 break;
951 case FREE:
952 case CELL:
953 scope = NAME_CLOSURE;
954 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000955 }
956
957 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000958 if (scope == NAME_LOCAL)
959 i = com_lookup_arg(c->c_locals, v);
960 else if (reftype == FREE)
961 i = com_lookup_arg(c->c_freevars, v);
962 else if (reftype == CELL)
963 i = com_lookup_arg(c->c_cellvars, v);
964 if (i == -1) {
965 c->c_errors++; /* XXX no exception set */
966 i = 255;
967 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000968 }
969 Py_DECREF(v);
970
971 switch (kind) {
972 case VAR_LOAD:
973 switch (scope) {
974 case NAME_LOCAL:
975 op = LOAD_FAST;
976 break;
977 case NAME_GLOBAL:
978 op = LOAD_GLOBAL;
979 break;
980 case NAME_DEFAULT:
981 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000982 break;
983 case NAME_CLOSURE:
984 op = LOAD_DEREF;
985 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000986 }
987 break;
988 case VAR_STORE:
989 switch (scope) {
990 case NAME_LOCAL:
991 op = STORE_FAST;
992 break;
993 case NAME_GLOBAL:
994 op = STORE_GLOBAL;
995 break;
996 case NAME_DEFAULT:
997 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000998 break;
999 case NAME_CLOSURE:
1000 op = STORE_DEREF;
1001 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001002 }
1003 break;
1004 case VAR_DELETE:
1005 switch (scope) {
1006 case NAME_LOCAL:
1007 op = DELETE_FAST;
1008 break;
1009 case NAME_GLOBAL:
1010 op = DELETE_GLOBAL;
1011 break;
1012 case NAME_DEFAULT:
1013 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001014 break;
1015 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001016 char buf[500];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001017 sprintf(buf, DEL_CLOSURE_ERROR, name);
1018 com_error(c, PyExc_SyntaxError, buf);
1019 i = 255;
1020 break;
1021 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001022 }
1023 break;
1024 }
1025done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001026 com_addoparg(c, op, i);
1027}
1028
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001029static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001030com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001031{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001032 char *name;
1033 char buffer[1000];
1034 /* XXX it is possible to write this code without the 1000
1035 chars on the total length of dotted names, I just can't be
1036 bothered right now */
1037 if (TYPE(n) == STAR)
1038 name = "*";
1039 else if (TYPE(n) == dotted_name) {
1040 char *p = buffer;
1041 int i;
1042 name = buffer;
1043 for (i = 0; i < NCH(n); i += 2) {
1044 char *s = STR(CHILD(n, i));
1045 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001046 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001047 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001048 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001049 break;
1050 }
1051 if (p != buffer)
1052 *p++ = '.';
1053 strcpy(p, s);
1054 p = strchr(p, '\0');
1055 }
1056 }
1057 else {
1058 REQ(n, NAME);
1059 name = STR(n);
1060 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001061 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001062}
1063
Guido van Rossum79f25d91997-04-29 20:08:16 +00001064static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001065parsenumber(struct compiling *co, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001066{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001067 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001068 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001069 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001070#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +00001071 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +00001072 int imflag;
1073#endif
1074
Guido van Rossum282914b1991-04-04 10:42:56 +00001075 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001076 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001077#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001078 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001079#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001080 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001081 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001082 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001083 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001084 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001085 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001086 if (*end == '\0') {
1087 if (errno != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001088 com_error(co, PyExc_OverflowError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001089 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +00001090 return NULL;
1091 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001092 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001093 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001094 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001095#ifndef WITHOUT_COMPLEX
1096 if (imflag) {
1097 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001098 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +00001099 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001100 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001101 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +00001102 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001103 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001104#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001105 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001106 PyFPE_START_PROTECT("atof", return 0)
1107 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001108 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001109 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001110 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001111}
1112
Guido van Rossum79f25d91997-04-29 20:08:16 +00001113static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001114parsestr(char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001115{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001116 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001117 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001118 char *buf;
1119 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001120 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001121 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001122 int first = *s;
1123 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001124 int rawmode = 0;
1125 int unicode = 0;
1126 if (isalpha(quote) || quote == '_') {
1127 if (quote == 'u' || quote == 'U') {
1128 quote = *++s;
1129 unicode = 1;
1130 }
1131 if (quote == 'r' || quote == 'R') {
1132 quote = *++s;
1133 rawmode = 1;
1134 }
1135 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001136 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001137 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001138 return NULL;
1139 }
1140 s++;
1141 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001142 if (len > INT_MAX) {
1143 PyErr_SetString(PyExc_OverflowError, "string to parse is too long");
1144 return NULL;
1145 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001146 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001147 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001148 return NULL;
1149 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001150 if (len >= 4 && s[0] == quote && s[1] == quote) {
1151 s += 2;
1152 len -= 2;
1153 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001154 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001155 return NULL;
1156 }
1157 }
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001158 if (unicode || Py_UnicodeFlag) {
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001159 if (rawmode)
1160 return PyUnicode_DecodeRawUnicodeEscape(
1161 s, len, NULL);
1162 else
1163 return PyUnicode_DecodeUnicodeEscape(
1164 s, len, NULL);
1165 }
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001166 if (rawmode || strchr(s, '\\') == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001167 return PyString_FromStringAndSize(s, len);
1168 v = PyString_FromStringAndSize((char *)NULL, len);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001169 if (v == NULL)
1170 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001171 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001172 end = s + len;
1173 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001174 if (*s != '\\') {
1175 *p++ = *s++;
1176 continue;
1177 }
1178 s++;
1179 switch (*s++) {
1180 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001181 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001182 case '\\': *p++ = '\\'; break;
1183 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +00001184 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001185 case 'b': *p++ = '\b'; break;
1186 case 'f': *p++ = '\014'; break; /* FF */
1187 case 't': *p++ = '\t'; break;
1188 case 'n': *p++ = '\n'; break;
1189 case 'r': *p++ = '\r'; break;
1190 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001191 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
1192 case '0': case '1': case '2': case '3':
1193 case '4': case '5': case '6': case '7':
1194 c = s[-1] - '0';
1195 if ('0' <= *s && *s <= '7') {
1196 c = (c<<3) + *s++ - '0';
1197 if ('0' <= *s && *s <= '7')
1198 c = (c<<3) + *s++ - '0';
1199 }
1200 *p++ = c;
1201 break;
1202 case 'x':
Jeremy Hylton4419ac12001-02-28 22:54:51 +00001203 if (isxdigit(Py_CHARMASK(s[0]))
1204 && isxdigit(Py_CHARMASK(s[1]))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +00001205 unsigned int x = 0;
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001206 c = Py_CHARMASK(*s);
1207 s++;
1208 if (isdigit(c))
1209 x = c - '0';
1210 else if (islower(c))
1211 x = 10 + c - 'a';
1212 else
1213 x = 10 + c - 'A';
1214 x = x << 4;
1215 c = Py_CHARMASK(*s);
1216 s++;
1217 if (isdigit(c))
1218 x += c - '0';
1219 else if (islower(c))
1220 x += 10 + c - 'a';
1221 else
1222 x += 10 + c - 'A';
Guido van Rossumed1100f1997-10-20 23:24:07 +00001223 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001224 break;
1225 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00001226 PyErr_SetString(PyExc_ValueError,
1227 "invalid \\x escape");
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001228 Py_DECREF(v);
1229 return NULL;
1230 default:
1231 *p++ = '\\';
1232 *p++ = s[-1];
1233 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001234 }
1235 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001236 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001237 return v;
1238}
1239
Guido van Rossum79f25d91997-04-29 20:08:16 +00001240static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001241parsestrplus(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001242{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001243 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001244 int i;
1245 REQ(CHILD(n, 0), STRING);
1246 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
1247 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001248 for (i = 1; i < NCH(n); i++) {
1249 PyObject *s;
1250 s = parsestr(STR(CHILD(n, i)));
1251 if (s == NULL)
1252 goto onError;
1253 if (PyString_Check(v) && PyString_Check(s)) {
1254 PyString_ConcatAndDel(&v, s);
1255 if (v == NULL)
1256 goto onError;
1257 }
1258 else {
1259 PyObject *temp;
1260 temp = PyUnicode_Concat(v, s);
1261 Py_DECREF(s);
1262 if (temp == NULL)
1263 goto onError;
1264 Py_DECREF(v);
1265 v = temp;
1266 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001267 }
1268 }
1269 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001270
1271 onError:
1272 Py_XDECREF(v);
1273 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001274}
1275
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001276static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001277com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001278{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001279 int anchor = 0;
1280 int save_begin = c->c_begin;
1281
1282 /* list_iter: for v in expr [list_iter] */
1283 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001284 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001285 c->c_begin = c->c_nexti;
1286 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001287 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001288 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001289 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001290 c->c_loops++;
1291 com_list_iter(c, n, e, t);
1292 c->c_loops--;
1293 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1294 c->c_begin = save_begin;
1295 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001296 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001297}
1298
1299static void
1300com_list_if(struct compiling *c, node *n, node *e, char *t)
1301{
1302 int anchor = 0;
1303 int a = 0;
1304 /* list_iter: 'if' test [list_iter] */
1305 com_addoparg(c, SET_LINENO, n->n_lineno);
1306 com_node(c, CHILD(n, 1));
1307 com_addfwref(c, JUMP_IF_FALSE, &a);
1308 com_addbyte(c, POP_TOP);
1309 com_pop(c, 1);
1310 com_list_iter(c, n, e, t);
1311 com_addfwref(c, JUMP_FORWARD, &anchor);
1312 com_backpatch(c, a);
1313 /* We jump here with an extra entry which we now pop */
1314 com_addbyte(c, POP_TOP);
1315 com_backpatch(c, anchor);
1316}
1317
1318static void
1319com_list_iter(struct compiling *c,
1320 node *p, /* parent of list_iter node */
1321 node *e, /* element expression node */
1322 char *t /* name of result list temp local */)
1323{
1324 /* list_iter is the last child in a listmaker, list_for, or list_if */
1325 node *n = CHILD(p, NCH(p)-1);
1326 if (TYPE(n) == list_iter) {
1327 n = CHILD(n, 0);
1328 switch (TYPE(n)) {
1329 case list_for:
1330 com_list_for(c, n, e, t);
1331 break;
1332 case list_if:
1333 com_list_if(c, n, e, t);
1334 break;
1335 default:
1336 com_error(c, PyExc_SystemError,
1337 "invalid list_iter node type");
1338 }
1339 }
1340 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001341 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001342 com_push(c, 1);
1343 com_node(c, e);
1344 com_addoparg(c, CALL_FUNCTION, 1);
1345 com_addbyte(c, POP_TOP);
1346 com_pop(c, 2);
1347 }
1348}
1349
1350static void
1351com_list_comprehension(struct compiling *c, node *n)
1352{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001353 /* listmaker: test list_for */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001354 char tmpname[12];
Tim Peters30814212001-02-17 05:30:26 +00001355 sprintf(tmpname, "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001356 com_addoparg(c, BUILD_LIST, 0);
1357 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1358 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001359 com_addop_name(c, LOAD_ATTR, "append");
1360 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001361 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001362 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001363 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001364 --c->c_tmpname;
1365}
1366
1367static void
1368com_listmaker(struct compiling *c, node *n)
1369{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001370 /* listmaker: test ( list_for | (',' test)* [','] ) */
1371 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001372 com_list_comprehension(c, n);
1373 else {
1374 int len = 0;
1375 int i;
1376 for (i = 0; i < NCH(n); i += 2, len++)
1377 com_node(c, CHILD(n, i));
1378 com_addoparg(c, BUILD_LIST, len);
1379 com_pop(c, len-1);
1380 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001381}
1382
1383static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001384com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001385{
1386 int i;
1387 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1388 for (i = 0; i+2 < NCH(n); i += 4) {
1389 /* We must arrange things just right for STORE_SUBSCR.
1390 It wants the stack to look like (value) (dict) (key) */
1391 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001392 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001393 com_node(c, CHILD(n, i+2)); /* value */
1394 com_addbyte(c, ROT_TWO);
1395 com_node(c, CHILD(n, i)); /* key */
1396 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001397 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001398 }
1399}
1400
1401static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001402com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001403{
1404 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001405 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001406 int i;
1407 REQ(n, atom);
1408 ch = CHILD(n, 0);
1409 switch (TYPE(ch)) {
1410 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001411 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001412 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001413 com_push(c, 1);
1414 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001415 else
1416 com_node(c, CHILD(n, 1));
1417 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001418 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001419 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001420 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001421 com_push(c, 1);
1422 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001423 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001424 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001425 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001426 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001427 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001428 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001429 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001430 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001431 break;
1432 case BACKQUOTE:
1433 com_node(c, CHILD(n, 1));
1434 com_addbyte(c, UNARY_CONVERT);
1435 break;
1436 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001437 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001438 i = 255;
1439 }
1440 else {
1441 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001442 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001443 }
1444 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001445 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001446 break;
1447 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001448 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001449 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001450 c->c_errors++;
1451 i = 255;
1452 }
1453 else {
1454 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001455 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001456 }
1457 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001458 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001459 break;
1460 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001461 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001462 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001463 break;
1464 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001465 com_error(c, PyExc_SystemError,
1466 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001467 }
1468}
1469
1470static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001471com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001472{
1473 if (NCH(n) == 1) {
1474 com_addbyte(c, op);
1475 }
1476 else if (NCH(n) == 2) {
1477 if (TYPE(CHILD(n, 0)) != COLON) {
1478 com_node(c, CHILD(n, 0));
1479 com_addbyte(c, op+1);
1480 }
1481 else {
1482 com_node(c, CHILD(n, 1));
1483 com_addbyte(c, op+2);
1484 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001485 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001486 }
1487 else {
1488 com_node(c, CHILD(n, 0));
1489 com_node(c, CHILD(n, 2));
1490 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001491 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001492 }
1493}
1494
Guido van Rossum635abd21997-01-06 22:56:52 +00001495static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001496com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1497{
1498 if (NCH(n) == 1) {
1499 com_addbyte(c, DUP_TOP);
1500 com_push(c, 1);
1501 com_addbyte(c, SLICE);
1502 com_node(c, augn);
1503 com_addbyte(c, opcode);
1504 com_pop(c, 1);
1505 com_addbyte(c, ROT_TWO);
1506 com_addbyte(c, STORE_SLICE);
1507 com_pop(c, 2);
1508 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1509 com_node(c, CHILD(n, 0));
1510 com_addoparg(c, DUP_TOPX, 2);
1511 com_push(c, 2);
1512 com_addbyte(c, SLICE+1);
1513 com_pop(c, 1);
1514 com_node(c, augn);
1515 com_addbyte(c, opcode);
1516 com_pop(c, 1);
1517 com_addbyte(c, ROT_THREE);
1518 com_addbyte(c, STORE_SLICE+1);
1519 com_pop(c, 3);
1520 } else if (NCH(n) == 2) {
1521 com_node(c, CHILD(n, 1));
1522 com_addoparg(c, DUP_TOPX, 2);
1523 com_push(c, 2);
1524 com_addbyte(c, SLICE+2);
1525 com_pop(c, 1);
1526 com_node(c, augn);
1527 com_addbyte(c, opcode);
1528 com_pop(c, 1);
1529 com_addbyte(c, ROT_THREE);
1530 com_addbyte(c, STORE_SLICE+2);
1531 com_pop(c, 3);
1532 } else {
1533 com_node(c, CHILD(n, 0));
1534 com_node(c, CHILD(n, 2));
1535 com_addoparg(c, DUP_TOPX, 3);
1536 com_push(c, 3);
1537 com_addbyte(c, SLICE+3);
1538 com_pop(c, 2);
1539 com_node(c, augn);
1540 com_addbyte(c, opcode);
1541 com_pop(c, 1);
1542 com_addbyte(c, ROT_FOUR);
1543 com_addbyte(c, STORE_SLICE+3);
1544 com_pop(c, 4);
1545 }
1546}
1547
1548static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001549com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001550{
1551 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001552 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001553 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001554 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001555 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001556 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001557 }
1558 else {
1559 com_node(c, CHILD(n, 0));
1560 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001561 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001562 }
1563 m = n;
1564 do {
1565 m = CHILD(m, 0);
1566 } while (NCH(m) == 1);
1567 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00001568 /* f(lambda x: x[0] = 3) ends up getting parsed with
1569 * LHS test = lambda x: x[0], and RHS test = 3.
1570 * SF bug 132313 points out that complaining about a keyword
1571 * then is very confusing.
1572 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001573 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00001574 TYPE(m) == lambdef ?
1575 "lambda cannot contain assignment" :
1576 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001577 }
1578 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001579 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001580 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001581 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001582 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001583 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001584 else if (*pkeywords == NULL) {
1585 c->c_errors++;
1586 Py_DECREF(v);
1587 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001588 if (PyDict_GetItem(*pkeywords, v) != NULL)
1589 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001590 "duplicate keyword argument");
1591 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001592 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001593 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001594 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001595 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001596 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001597 }
1598 }
1599 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001600}
1601
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001602static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001603com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001604{
1605 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001606 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001607 }
1608 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001609 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001610 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001611 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001612 int star_flag = 0;
1613 int starstar_flag = 0;
1614 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001615 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001616 na = 0;
1617 nk = 0;
1618 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001619 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001620 if (TYPE(ch) == STAR ||
1621 TYPE(ch) == DOUBLESTAR)
1622 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001623 if (ch->n_lineno != lineno) {
1624 lineno = ch->n_lineno;
1625 com_addoparg(c, SET_LINENO, lineno);
1626 }
1627 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001628 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001629 na++;
1630 else
1631 nk++;
1632 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001633 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001634 while (i < NCH(n)) {
1635 node *tok = CHILD(n, i);
1636 node *ch = CHILD(n, i+1);
1637 i += 3;
1638 switch (TYPE(tok)) {
1639 case STAR: star_flag = 1; break;
1640 case DOUBLESTAR: starstar_flag = 1; break;
1641 }
1642 com_node(c, ch);
1643 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001644 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001645 com_error(c, PyExc_SyntaxError,
1646 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001647 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001648 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001649 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001650 star_flag + (starstar_flag << 1);
1651 else
1652 opcode = CALL_FUNCTION;
1653 com_addoparg(c, opcode, na | (nk << 8));
1654 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001655 }
1656}
1657
1658static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001659com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001660{
1661 com_addopname(c, LOAD_ATTR, n);
1662}
1663
1664static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001665com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001666{
1667 int i=0;
1668 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001669 node *ch;
1670
1671 /* first argument */
1672 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001673 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001674 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001675 i++;
1676 }
1677 else {
1678 com_node(c, CHILD(n,i));
1679 i++;
1680 REQ(CHILD(n,i),COLON);
1681 i++;
1682 }
1683 /* second argument */
1684 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1685 com_node(c, CHILD(n,i));
1686 i++;
1687 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001688 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001689 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001690 com_push(c, 1);
1691 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001692 /* remaining arguments */
1693 for (; i < NCH(n); i++) {
1694 ns++;
1695 ch=CHILD(n,i);
1696 REQ(ch, sliceop);
1697 if (NCH(ch) == 1) {
1698 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001699 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001700 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001701 }
1702 else
1703 com_node(c, CHILD(ch,1));
1704 }
1705 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001706 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001707}
1708
1709static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001710com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001711{
1712 node *ch;
1713 REQ(n, subscript);
1714 ch = CHILD(n,0);
1715 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001716 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001717 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001718 com_push(c, 1);
1719 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001720 else {
1721 /* check for slice */
1722 if ((TYPE(ch) == COLON || NCH(n) > 1))
1723 com_sliceobj(c, n);
1724 else {
1725 REQ(ch, test);
1726 com_node(c, ch);
1727 }
1728 }
1729}
1730
1731static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001732com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001733{
1734 int i, op;
1735 REQ(n, subscriptlist);
1736 /* Check to make backward compatible slice behavior for '[i:j]' */
1737 if (NCH(n) == 1) {
1738 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001739 /* 'Basic' slice, should have exactly one colon. */
1740 if ((TYPE(CHILD(sub, 0)) == COLON
1741 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1742 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1743 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001744 switch (assigning) {
1745 case OP_DELETE:
1746 op = DELETE_SLICE;
1747 break;
1748 case OP_ASSIGN:
1749 op = STORE_SLICE;
1750 break;
1751 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001752 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001753 break;
1754 default:
1755 com_augassign_slice(c, sub, assigning, augn);
1756 return;
1757 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001758 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001759 if (op == STORE_SLICE)
1760 com_pop(c, 2);
1761 else if (op == DELETE_SLICE)
1762 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001763 return;
1764 }
1765 }
1766 /* Else normal subscriptlist. Compile each subscript. */
1767 for (i = 0; i < NCH(n); i += 2)
1768 com_subscript(c, CHILD(n, i));
1769 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001770 if (NCH(n) > 1) {
1771 i = (NCH(n)+1) / 2;
1772 com_addoparg(c, BUILD_TUPLE, i);
1773 com_pop(c, i-1);
1774 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001775 switch (assigning) {
1776 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001777 op = DELETE_SUBSCR;
1778 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00001779 break;
1780 default:
1781 case OP_ASSIGN:
1782 op = STORE_SUBSCR;
1783 i = 3;
1784 break;
1785 case OP_APPLY:
1786 op = BINARY_SUBSCR;
1787 i = 1;
1788 break;
1789 }
1790 if (assigning > OP_APPLY) {
1791 com_addoparg(c, DUP_TOPX, 2);
1792 com_push(c, 2);
1793 com_addbyte(c, BINARY_SUBSCR);
1794 com_pop(c, 1);
1795 com_node(c, augn);
1796 com_addbyte(c, assigning);
1797 com_pop(c, 1);
1798 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001799 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001800 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001801 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001802}
1803
1804static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001805com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001806{
1807 REQ(n, trailer);
1808 switch (TYPE(CHILD(n, 0))) {
1809 case LPAR:
1810 com_call_function(c, CHILD(n, 1));
1811 break;
1812 case DOT:
1813 com_select_member(c, CHILD(n, 1));
1814 break;
1815 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00001816 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001817 break;
1818 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001819 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001820 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001821 }
1822}
1823
1824static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001825com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001826{
1827 int i;
1828 REQ(n, power);
1829 com_atom(c, CHILD(n, 0));
1830 for (i = 1; i < NCH(n); i++) {
1831 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1832 com_factor(c, CHILD(n, i+1));
1833 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001834 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001835 break;
1836 }
1837 else
1838 com_apply_trailer(c, CHILD(n, i));
1839 }
1840}
1841
1842static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001843com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001844{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001845 REQ(n, factor);
1846 if (TYPE(CHILD(n, 0)) == PLUS) {
1847 com_factor(c, CHILD(n, 1));
1848 com_addbyte(c, UNARY_POSITIVE);
1849 }
1850 else if (TYPE(CHILD(n, 0)) == MINUS) {
1851 com_factor(c, CHILD(n, 1));
1852 com_addbyte(c, UNARY_NEGATIVE);
1853 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001854 else if (TYPE(CHILD(n, 0)) == TILDE) {
1855 com_factor(c, CHILD(n, 1));
1856 com_addbyte(c, UNARY_INVERT);
1857 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001858 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001859 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001860 }
1861}
1862
1863static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001864com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001865{
1866 int i;
1867 int op;
1868 REQ(n, term);
1869 com_factor(c, CHILD(n, 0));
1870 for (i = 2; i < NCH(n); i += 2) {
1871 com_factor(c, CHILD(n, i));
1872 switch (TYPE(CHILD(n, i-1))) {
1873 case STAR:
1874 op = BINARY_MULTIPLY;
1875 break;
1876 case SLASH:
1877 op = BINARY_DIVIDE;
1878 break;
1879 case PERCENT:
1880 op = BINARY_MODULO;
1881 break;
1882 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001883 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001884 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001885 op = 255;
1886 }
1887 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001888 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001889 }
1890}
1891
1892static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001893com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001894{
1895 int i;
1896 int op;
1897 REQ(n, arith_expr);
1898 com_term(c, CHILD(n, 0));
1899 for (i = 2; i < NCH(n); i += 2) {
1900 com_term(c, CHILD(n, i));
1901 switch (TYPE(CHILD(n, i-1))) {
1902 case PLUS:
1903 op = BINARY_ADD;
1904 break;
1905 case MINUS:
1906 op = BINARY_SUBTRACT;
1907 break;
1908 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001909 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001910 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001911 op = 255;
1912 }
1913 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001914 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001915 }
1916}
1917
1918static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001919com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001920{
1921 int i;
1922 int op;
1923 REQ(n, shift_expr);
1924 com_arith_expr(c, CHILD(n, 0));
1925 for (i = 2; i < NCH(n); i += 2) {
1926 com_arith_expr(c, CHILD(n, i));
1927 switch (TYPE(CHILD(n, i-1))) {
1928 case LEFTSHIFT:
1929 op = BINARY_LSHIFT;
1930 break;
1931 case RIGHTSHIFT:
1932 op = BINARY_RSHIFT;
1933 break;
1934 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001935 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001936 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001937 op = 255;
1938 }
1939 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001940 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001941 }
1942}
1943
1944static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001945com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001946{
1947 int i;
1948 int op;
1949 REQ(n, and_expr);
1950 com_shift_expr(c, CHILD(n, 0));
1951 for (i = 2; i < NCH(n); i += 2) {
1952 com_shift_expr(c, CHILD(n, i));
1953 if (TYPE(CHILD(n, i-1)) == AMPER) {
1954 op = BINARY_AND;
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_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001959 op = 255;
1960 }
1961 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001962 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001963 }
1964}
1965
1966static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001967com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001968{
1969 int i;
1970 int op;
1971 REQ(n, xor_expr);
1972 com_and_expr(c, CHILD(n, 0));
1973 for (i = 2; i < NCH(n); i += 2) {
1974 com_and_expr(c, CHILD(n, i));
1975 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1976 op = BINARY_XOR;
1977 }
1978 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001979 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001980 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001981 op = 255;
1982 }
1983 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001984 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001985 }
1986}
1987
1988static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001989com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001990{
1991 int i;
1992 int op;
1993 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001994 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001995 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001996 com_xor_expr(c, CHILD(n, i));
1997 if (TYPE(CHILD(n, i-1)) == VBAR) {
1998 op = BINARY_OR;
1999 }
2000 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002001 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002002 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002003 op = 255;
2004 }
2005 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002006 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002007 }
2008}
2009
2010static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002011cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002012{
2013 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00002014 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002015 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2016 if (NCH(n) == 1) {
2017 n = CHILD(n, 0);
2018 switch (TYPE(n)) {
2019 case LESS: return LT;
2020 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00002021 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002022 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00002023 case LESSEQUAL: return LE;
2024 case GREATEREQUAL: return GE;
2025 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002026 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
2027 if (strcmp(STR(n), "is") == 0) return IS;
2028 }
2029 }
2030 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002031 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002032 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
2033 return NOT_IN;
2034 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
2035 return IS_NOT;
2036 }
2037 }
2038 return BAD;
2039}
2040
2041static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002042com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002043{
2044 int i;
2045 enum cmp_op op;
2046 int anchor;
2047 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2048 com_expr(c, CHILD(n, 0));
2049 if (NCH(n) == 1)
2050 return;
2051
2052 /****************************************************************
2053 The following code is generated for all but the last
2054 comparison in a chain:
2055
2056 label: on stack: opcode: jump to:
2057
2058 a <code to load b>
2059 a, b DUP_TOP
2060 a, b, b ROT_THREE
2061 b, a, b COMPARE_OP
2062 b, 0-or-1 JUMP_IF_FALSE L1
2063 b, 1 POP_TOP
2064 b
2065
2066 We are now ready to repeat this sequence for the next
2067 comparison in the chain.
2068
2069 For the last we generate:
2070
2071 b <code to load c>
2072 b, c COMPARE_OP
2073 0-or-1
2074
2075 If there were any jumps to L1 (i.e., there was more than one
2076 comparison), we generate:
2077
2078 0-or-1 JUMP_FORWARD L2
2079 L1: b, 0 ROT_TWO
2080 0, b POP_TOP
2081 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002082 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002083 ****************************************************************/
2084
2085 anchor = 0;
2086
2087 for (i = 2; i < NCH(n); i += 2) {
2088 com_expr(c, CHILD(n, i));
2089 if (i+2 < NCH(n)) {
2090 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002091 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002092 com_addbyte(c, ROT_THREE);
2093 }
2094 op = cmp_type(CHILD(n, i-1));
2095 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002096 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002097 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002098 }
2099 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002100 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002101 if (i+2 < NCH(n)) {
2102 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2103 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002104 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002105 }
2106 }
2107
2108 if (anchor) {
2109 int anchor2 = 0;
2110 com_addfwref(c, JUMP_FORWARD, &anchor2);
2111 com_backpatch(c, anchor);
2112 com_addbyte(c, ROT_TWO);
2113 com_addbyte(c, POP_TOP);
2114 com_backpatch(c, anchor2);
2115 }
2116}
2117
2118static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002119com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002120{
2121 REQ(n, not_test); /* 'not' not_test | comparison */
2122 if (NCH(n) == 1) {
2123 com_comparison(c, CHILD(n, 0));
2124 }
2125 else {
2126 com_not_test(c, CHILD(n, 1));
2127 com_addbyte(c, UNARY_NOT);
2128 }
2129}
2130
2131static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002132com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002133{
2134 int i;
2135 int anchor;
2136 REQ(n, and_test); /* not_test ('and' not_test)* */
2137 anchor = 0;
2138 i = 0;
2139 for (;;) {
2140 com_not_test(c, CHILD(n, i));
2141 if ((i += 2) >= NCH(n))
2142 break;
2143 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2144 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002145 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002146 }
2147 if (anchor)
2148 com_backpatch(c, anchor);
2149}
2150
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002151static int
2152com_make_closure(struct compiling *c, PyCodeObject *co)
2153{
2154 int i, free = PyTuple_GET_SIZE(co->co_freevars);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002155 /* If the code is compiled with st->st_nested_scopes == 0,
2156 then no variable will ever be added to co_freevars.
2157 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002158 if (free == 0)
2159 return 0;
2160 for (i = 0; i < free; ++i) {
2161 /* Bypass com_addop_varname because it will generate
2162 LOAD_DEREF but LOAD_CLOSURE is needed.
2163 */
2164 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2165 int arg, reftype;
2166
2167 /* Special case: If a class contains a method with a
2168 free variable that has the same name as a method,
2169 the name will be considered free *and* local in the
2170 class. It should be handled by the closure, as
2171 well as by the normal name loookup logic.
2172 */
2173 reftype = get_ref_type(c, PyString_AS_STRING(name));
2174 if (reftype == CELL)
2175 arg = com_lookup_arg(c->c_cellvars, name);
2176 else /* (reftype == FREE) */
2177 arg = com_lookup_arg(c->c_freevars, name);
2178 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002179 fprintf(stderr, "lookup %s in %s %d %d\n"
2180 "freevars of %s: %s\n",
2181 PyObject_REPR(name),
2182 c->c_name,
2183 reftype, arg,
2184 PyString_AS_STRING(co->co_name),
2185 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002186 Py_FatalError("com_make_closure()");
2187 }
2188 com_addoparg(c, LOAD_CLOSURE, arg);
2189
2190 }
2191 com_push(c, free);
2192 return 1;
2193}
2194
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002195static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002196com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002197{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002198 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002199 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002200 PyObject *co;
2201 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002202 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002203 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2204 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002205 co = (PyObject *) icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002206 if (co == NULL) {
2207 c->c_errors++;
2208 return;
2209 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002210 symtable_exit_scope(c->c_symtable);
Tim Peters1e542112001-02-23 22:23:53 +00002211 i = com_addconst(c, co);
2212 closure = com_make_closure(c, (PyCodeObject *)co);
2213 Py_DECREF(co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002214 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002215 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002216 if (closure)
2217 com_addoparg(c, MAKE_CLOSURE, ndefs);
2218 else
2219 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002220 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002221 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002222 else {
2223 int anchor = 0;
2224 int i = 0;
2225 for (;;) {
2226 com_and_test(c, CHILD(n, i));
2227 if ((i += 2) >= NCH(n))
2228 break;
2229 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2230 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002231 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002232 }
2233 if (anchor)
2234 com_backpatch(c, anchor);
2235 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002236}
2237
2238static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002239com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002240{
2241 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002242 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002243 com_node(c, CHILD(n, 0));
2244 }
2245 else {
2246 int i;
2247 int len;
2248 len = (NCH(n) + 1) / 2;
2249 for (i = 0; i < NCH(n); i += 2)
2250 com_node(c, CHILD(n, i));
2251 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002252 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002253 }
2254}
2255
2256
2257/* Begin of assignment compilation */
2258
Thomas Wouters434d0822000-08-24 20:11:32 +00002259
2260static void
2261com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2262{
2263 com_addbyte(c, DUP_TOP);
2264 com_push(c, 1);
2265 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002266 com_node(c, augn);
2267 com_addbyte(c, opcode);
2268 com_pop(c, 1);
2269 com_addbyte(c, ROT_TWO);
2270 com_addopname(c, STORE_ATTR, n);
2271 com_pop(c, 2);
2272}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002273
2274static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002275com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002276{
2277 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002278 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002279}
2280
2281static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002282com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002283{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002284 REQ(n, trailer);
2285 switch (TYPE(CHILD(n, 0))) {
2286 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002287 com_error(c, PyExc_SyntaxError,
2288 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002289 break;
2290 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002291 if (assigning > OP_APPLY)
2292 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2293 else
2294 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002295 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002296 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002297 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002298 break;
2299 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002300 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002301 }
2302}
2303
2304static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002305com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002306{
2307 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002308 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002309 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002310 if (assigning) {
2311 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002312 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002313 com_push(c, i-1);
2314 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002315 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002316 com_assign(c, CHILD(n, i), assigning, NULL);
2317}
2318
2319static void
2320com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2321{
2322 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002323 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002324 com_push(c, 1);
2325 com_node(c, augn);
2326 com_addbyte(c, opcode);
2327 com_pop(c, 1);
2328 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002329}
2330
2331static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002332com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002333{
2334 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002335 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002336 if (assigning)
2337 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002338}
2339
2340static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002341com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002342{
2343 /* Loop to avoid trivial recursion */
2344 for (;;) {
2345 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002346
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002347 case exprlist:
2348 case testlist:
2349 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002350 if (assigning > OP_APPLY) {
2351 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002352 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002353 return;
2354 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002355 com_assign_sequence(c, n, assigning);
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 test:
2362 case and_test:
2363 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002364 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002365 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002366 case xor_expr:
2367 case and_expr:
2368 case shift_expr:
2369 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002370 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002371 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002372 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002373 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002374 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002375 return;
2376 }
2377 n = CHILD(n, 0);
2378 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002379
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002380 case power: /* atom trailer* ('**' power)*
2381 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002382 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002383 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002384 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002385 return;
2386 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002387 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002388 int i;
2389 com_node(c, CHILD(n, 0));
2390 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002391 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002392 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002393 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002394 return;
2395 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002396 com_apply_trailer(c, CHILD(n, i));
2397 } /* NB i is still alive */
2398 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002399 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002400 return;
2401 }
2402 n = CHILD(n, 0);
2403 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002404
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002405 case atom:
2406 switch (TYPE(CHILD(n, 0))) {
2407 case LPAR:
2408 n = CHILD(n, 1);
2409 if (TYPE(n) == RPAR) {
2410 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002411 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002412 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002413 return;
2414 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002415 if (assigning > OP_APPLY) {
2416 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002417 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002418 return;
2419 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002420 break;
2421 case LSQB:
2422 n = CHILD(n, 1);
2423 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002424 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002425 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002426 return;
2427 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002428 if (assigning > OP_APPLY) {
2429 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002430 "augmented assign to list not possible");
2431 return;
2432 }
2433 if (NCH(n) > 1
2434 && TYPE(CHILD(n, 1)) == list_for) {
2435 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002436 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002437 return;
2438 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002439 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002440 return;
2441 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002442 if (assigning > OP_APPLY)
2443 com_augassign_name(c, CHILD(n, 0),
2444 assigning, augn);
2445 else
2446 com_assign_name(c, CHILD(n, 0),
2447 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002448 return;
2449 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002450 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002451 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002452 return;
2453 }
2454 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002455
2456 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002457 com_error(c, PyExc_SyntaxError,
2458 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002459 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002460
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002461 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002462 com_error(c, PyExc_SystemError,
2463 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002464 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002465
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002466 }
2467 }
2468}
Guido van Rossum7c531111997-03-11 18:42:21 +00002469
Thomas Wouters434d0822000-08-24 20:11:32 +00002470static void
2471com_augassign(struct compiling *c, node *n)
2472{
2473 int opcode;
2474
2475 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2476 case '+': opcode = INPLACE_ADD; break;
2477 case '-': opcode = INPLACE_SUBTRACT; break;
2478 case '/': opcode = INPLACE_DIVIDE; break;
2479 case '%': opcode = INPLACE_MODULO; break;
2480 case '<': opcode = INPLACE_LSHIFT; break;
2481 case '>': opcode = INPLACE_RSHIFT; break;
2482 case '&': opcode = INPLACE_AND; break;
2483 case '^': opcode = INPLACE_XOR; break;
2484 case '|': opcode = INPLACE_OR; break;
2485 case '*':
2486 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2487 opcode = INPLACE_POWER;
2488 else
2489 opcode = INPLACE_MULTIPLY;
2490 break;
2491 default:
2492 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2493 return;
2494 }
2495 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2496}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002497
2498static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002499com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002500{
Thomas Wouters434d0822000-08-24 20:11:32 +00002501 REQ(n, expr_stmt);
2502 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002503 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002504 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002505 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002506 if (NCH(n) == 1) {
2507 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002508 if (c->c_interactive)
2509 com_addbyte(c, PRINT_EXPR);
2510 else
2511 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002512 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002513 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002514 else if (TYPE(CHILD(n,1)) == augassign)
2515 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002516 else {
2517 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002518 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002519 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002520 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002521 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002522 com_push(c, 1);
2523 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002524 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002525 }
2526 }
2527}
2528
2529static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002530com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002531{
2532 int a = 0, b = 0;
2533 int i;
2534 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2535 /* Generate code like for
2536
2537 if __debug__:
2538 if not <test>:
2539 raise AssertionError [, <message>]
2540
2541 where <message> is the second test, if present.
2542 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002543
Guido van Rossum228d7f31997-04-02 05:24:36 +00002544 if (Py_OptimizeFlag)
2545 return;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002546 com_addop_name(c, LOAD_GLOBAL, "__debug__");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002547 com_push(c, 1);
2548 com_addfwref(c, JUMP_IF_FALSE, &a);
2549 com_addbyte(c, POP_TOP);
2550 com_pop(c, 1);
2551 com_node(c, CHILD(n, 1));
2552 com_addfwref(c, JUMP_IF_TRUE, &b);
2553 com_addbyte(c, POP_TOP);
2554 com_pop(c, 1);
2555 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002556 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002557 com_push(c, 1);
2558 i = NCH(n)/2; /* Either 2 or 4 */
2559 if (i > 1)
2560 com_node(c, CHILD(n, 3));
2561 com_addoparg(c, RAISE_VARARGS, i);
2562 com_pop(c, i);
2563 /* The interpreter does not fall through */
2564 /* All jumps converge here */
2565 com_backpatch(c, a);
2566 com_backpatch(c, b);
2567 com_addbyte(c, POP_TOP);
2568}
2569
2570static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002571com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002572{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002573 int i = 1;
2574 node* stream = NULL;
2575
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002576 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002577
2578 /* are we using the extended print form? */
2579 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2580 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002581 com_node(c, stream);
2582 /* stack: [...] => [... stream] */
2583 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002584 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2585 i = 4;
2586 else
2587 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002588 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002589 for (; i < NCH(n); i += 2) {
2590 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002591 com_addbyte(c, DUP_TOP);
2592 /* stack: [stream] => [stream stream] */
2593 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002594 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002595 /* stack: [stream stream] => [stream stream obj] */
2596 com_addbyte(c, ROT_TWO);
2597 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002598 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002599 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002600 com_pop(c, 2);
2601 }
2602 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002603 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002604 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002605 com_addbyte(c, PRINT_ITEM);
2606 com_pop(c, 1);
2607 }
2608 }
2609 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002610 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002611 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002612 /* must pop the extra stream object off the stack */
2613 com_addbyte(c, POP_TOP);
2614 /* stack: [... stream] => [...] */
2615 com_pop(c, 1);
2616 }
2617 }
2618 else {
2619 if (stream != NULL) {
2620 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002621 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002622 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002623 com_pop(c, 1);
2624 }
2625 else
2626 com_addbyte(c, PRINT_NEWLINE);
2627 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002628}
2629
2630static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002631com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002632{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002633 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002634 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002635 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002636 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002637 if (c->c_flags & CO_GENERATOR) {
2638 if (NCH(n) > 1) {
2639 com_error(c, PyExc_SyntaxError,
2640 "'return' with argument inside generator");
2641 }
2642 com_addoparg(c, LOAD_CONST,
2643 com_addconst(c, PyExc_StopIteration));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002644 com_push(c, 1);
Tim Peters5ca576e2001-06-18 22:08:13 +00002645 com_addoparg(c, RAISE_VARARGS, 1);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002646 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002647 else {
2648 if (NCH(n) < 2) {
2649 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
2650 com_push(c, 1);
2651 }
2652 else
2653 com_node(c, CHILD(n, 1));
2654 com_addbyte(c, RETURN_VALUE);
2655 }
2656 com_pop(c, 1);
2657}
2658
2659static void
2660com_yield_stmt(struct compiling *c, node *n)
2661{
Tim Peters95c80f82001-06-23 02:07:08 +00002662 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00002663 REQ(n, yield_stmt); /* 'yield' testlist */
2664 if (!c->c_infunction) {
2665 com_error(c, PyExc_SyntaxError, "'yield' outside function");
2666 }
Tim Peters95c80f82001-06-23 02:07:08 +00002667
2668 for (i = 0; i < c->c_nblocks; ++i) {
2669 if (c->c_block[i] == SETUP_FINALLY) {
2670 com_error(c, PyExc_SyntaxError,
2671 "'yield' not allowed in a 'try' block "
2672 "with a 'finally' clause");
2673 return;
2674 }
2675 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002676 com_node(c, CHILD(n, 1));
2677 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002678 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002679}
2680
2681static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002682com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002683{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002684 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002685 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2686 if (NCH(n) > 1) {
2687 com_node(c, CHILD(n, 1));
2688 if (NCH(n) > 3) {
2689 com_node(c, CHILD(n, 3));
2690 if (NCH(n) > 5)
2691 com_node(c, CHILD(n, 5));
2692 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002693 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002694 i = NCH(n)/2;
2695 com_addoparg(c, RAISE_VARARGS, i);
2696 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002697}
2698
2699static void
Thomas Wouters52152252000-08-17 22:55:00 +00002700com_from_import(struct compiling *c, node *n)
2701{
2702 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2703 com_push(c, 1);
2704 if (NCH(n) > 1) {
2705 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2706 com_error(c, PyExc_SyntaxError, "invalid syntax");
2707 return;
2708 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002709 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002710 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002711 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00002712 com_pop(c, 1);
2713}
2714
2715static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002716com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002717{
2718 int i;
2719 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002720 /* 'import' dotted_name (',' dotted_name)* |
2721 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002722 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00002723 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002724 /* 'from' dotted_name 'import' ... */
2725 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002726
2727 if (TYPE(CHILD(n, 3)) == STAR) {
2728 tup = Py_BuildValue("(s)", "*");
2729 } else {
2730 tup = PyTuple_New((NCH(n) - 2)/2);
2731 for (i = 3; i < NCH(n); i += 2) {
2732 PyTuple_SET_ITEM(tup, (i-3)/2,
2733 PyString_FromString(STR(
Jeremy Hylton4419ac12001-02-28 22:54:51 +00002734 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002735 }
2736 }
2737 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00002738 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002739 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002740 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00002741 if (TYPE(CHILD(n, 3)) == STAR)
2742 com_addbyte(c, IMPORT_STAR);
2743 else {
2744 for (i = 3; i < NCH(n); i += 2)
2745 com_from_import(c, CHILD(n, i));
2746 com_addbyte(c, POP_TOP);
2747 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002748 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002749 }
2750 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002751 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002752 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00002753 node *subn = CHILD(n, i);
2754 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002755 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002756 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002757 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00002758 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00002759 int j;
2760 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00002761 com_error(c, PyExc_SyntaxError,
2762 "invalid syntax");
2763 return;
2764 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00002765 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
2766 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002767 CHILD(CHILD(subn, 0),
2768 j));
2769 com_addop_varname(c, VAR_STORE,
2770 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002771 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002772 com_addop_varname(c, VAR_STORE,
2773 STR(CHILD(CHILD(subn, 0),
2774 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002775 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002776 }
2777 }
2778}
2779
2780static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002781com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002782{
2783 REQ(n, exec_stmt);
2784 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2785 com_node(c, CHILD(n, 1));
2786 if (NCH(n) >= 4)
2787 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002788 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002789 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002790 com_push(c, 1);
2791 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002792 if (NCH(n) >= 6)
2793 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002794 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002795 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002796 com_push(c, 1);
2797 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002798 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002799 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002800}
2801
Guido van Rossum7c531111997-03-11 18:42:21 +00002802static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002803is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002804{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002805 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002806 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002807 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00002808
2809 /* Label to avoid tail recursion */
2810 next:
2811 switch (TYPE(n)) {
2812
2813 case suite:
2814 if (NCH(n) == 1) {
2815 n = CHILD(n, 0);
2816 goto next;
2817 }
2818 /* Fall through */
2819 case file_input:
2820 for (i = 0; i < NCH(n); i++) {
2821 node *ch = CHILD(n, i);
2822 if (TYPE(ch) == stmt) {
2823 n = ch;
2824 goto next;
2825 }
2826 }
2827 break;
2828
2829 case stmt:
2830 case simple_stmt:
2831 case small_stmt:
2832 n = CHILD(n, 0);
2833 goto next;
2834
2835 case expr_stmt:
2836 case testlist:
2837 case test:
2838 case and_test:
2839 case not_test:
2840 case comparison:
2841 case expr:
2842 case xor_expr:
2843 case and_expr:
2844 case shift_expr:
2845 case arith_expr:
2846 case term:
2847 case factor:
2848 case power:
2849 case atom:
2850 if (NCH(n) == 1) {
2851 n = CHILD(n, 0);
2852 goto next;
2853 }
2854 break;
2855
2856 case NAME:
2857 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2858 return 1;
2859 break;
2860
2861 case NUMBER:
2862 v = parsenumber(c, STR(n));
2863 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002864 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002865 break;
2866 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002867 i = PyObject_IsTrue(v);
2868 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002869 return i == 0;
2870
2871 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002872 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002873 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002874 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002875 break;
2876 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002877 i = PyObject_IsTrue(v);
2878 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002879 return i == 0;
2880
2881 }
2882 return 0;
2883}
2884
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002885static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002886com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002887{
2888 int i;
2889 int anchor = 0;
2890 REQ(n, if_stmt);
2891 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2892 for (i = 0; i+3 < NCH(n); i+=4) {
2893 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002894 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002895 if (is_constant_false(c, ch))
2896 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002897 if (i > 0)
2898 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002899 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002900 com_addfwref(c, JUMP_IF_FALSE, &a);
2901 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002902 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002903 com_node(c, CHILD(n, i+3));
2904 com_addfwref(c, JUMP_FORWARD, &anchor);
2905 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002906 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002907 com_addbyte(c, POP_TOP);
2908 }
2909 if (i+2 < NCH(n))
2910 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002911 if (anchor)
2912 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002913}
2914
2915static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002916com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002917{
2918 int break_anchor = 0;
2919 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002920 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002921 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2922 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002923 block_push(c, SETUP_LOOP);
2924 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002925 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002926 com_node(c, CHILD(n, 1));
2927 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2928 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002929 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002930 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002931 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002932 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002933 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2934 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002935 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002936 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002937 com_addbyte(c, POP_TOP);
2938 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002939 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002940 if (NCH(n) > 4)
2941 com_node(c, CHILD(n, 6));
2942 com_backpatch(c, break_anchor);
2943}
2944
2945static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002946com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002947{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002948 int break_anchor = 0;
2949 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002950 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002951 REQ(n, for_stmt);
2952 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2953 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002954 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002955 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002956 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002957 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002958 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002959 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002960 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00002961 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002962 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002963 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002964 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002965 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2966 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002967 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002968 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002969 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002970 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002971 if (NCH(n) > 8)
2972 com_node(c, CHILD(n, 8));
2973 com_backpatch(c, break_anchor);
2974}
2975
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002976/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002977
2978 SETUP_FINALLY L
2979 <code for S>
2980 POP_BLOCK
2981 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002982 L: <code for Sf>
2983 END_FINALLY
2984
2985 The special instructions use the block stack. Each block
2986 stack entry contains the instruction that created it (here
2987 SETUP_FINALLY), the level of the value stack at the time the
2988 block stack entry was created, and a label (here L).
2989
2990 SETUP_FINALLY:
2991 Pushes the current value stack level and the label
2992 onto the block stack.
2993 POP_BLOCK:
2994 Pops en entry from the block stack, and pops the value
2995 stack until its level is the same as indicated on the
2996 block stack. (The label is ignored.)
2997 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002998 Pops a variable number of entries from the *value* stack
2999 and re-raises the exception they specify. The number of
3000 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003001
3002 The block stack is unwound when an exception is raised:
3003 when a SETUP_FINALLY entry is found, the exception is pushed
3004 onto the value stack (and the exception condition is cleared),
3005 and the interpreter jumps to the label gotten from the block
3006 stack.
3007
3008 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003009 (The contents of the value stack is shown in [], with the top
3010 at the right; 'tb' is trace-back info, 'val' the exception's
3011 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003012
3013 Value stack Label Instruction Argument
3014 [] SETUP_EXCEPT L1
3015 [] <code for S>
3016 [] POP_BLOCK
3017 [] JUMP_FORWARD L0
3018
Guido van Rossum3f5da241990-12-20 15:06:42 +00003019 [tb, val, exc] L1: DUP )
3020 [tb, val, exc, exc] <evaluate E1> )
3021 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3022 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3023 [tb, val, exc, 1] POP )
3024 [tb, val, exc] POP
3025 [tb, val] <assign to V1> (or POP if no V1)
3026 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003027 [] <code for S1>
3028 JUMP_FORWARD L0
3029
Guido van Rossum3f5da241990-12-20 15:06:42 +00003030 [tb, val, exc, 0] L2: POP
3031 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003032 .............................etc.......................
3033
Guido van Rossum3f5da241990-12-20 15:06:42 +00003034 [tb, val, exc, 0] Ln+1: POP
3035 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003036
3037 [] L0: <next statement>
3038
3039 Of course, parts are not generated if Vi or Ei is not present.
3040*/
3041
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003042static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003043com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003044{
3045 int except_anchor = 0;
3046 int end_anchor = 0;
3047 int else_anchor = 0;
3048 int i;
3049 node *ch;
3050
3051 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3052 block_push(c, SETUP_EXCEPT);
3053 com_node(c, CHILD(n, 2));
3054 com_addbyte(c, POP_BLOCK);
3055 block_pop(c, SETUP_EXCEPT);
3056 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3057 com_backpatch(c, except_anchor);
3058 for (i = 3;
3059 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3060 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003061 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003062 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003063 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003064 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003065 break;
3066 }
3067 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003068 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003069 com_addoparg(c, SET_LINENO, ch->n_lineno);
3070 if (NCH(ch) > 1) {
3071 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003072 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003073 com_node(c, CHILD(ch, 1));
3074 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003075 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003076 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3077 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003078 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003079 }
3080 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003081 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003082 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003083 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003084 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003085 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003086 com_pop(c, 1);
3087 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003088 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003089 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003090 com_node(c, CHILD(n, i+2));
3091 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3092 if (except_anchor) {
3093 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003094 /* We come in with [tb, val, exc, 0] on the
3095 stack; one pop and it's the same as
3096 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003097 com_addbyte(c, POP_TOP);
3098 }
3099 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003100 /* We actually come in here with [tb, val, exc] but the
3101 END_FINALLY will zap those and jump around.
3102 The c_stacklevel does not reflect them so we need not pop
3103 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003104 com_addbyte(c, END_FINALLY);
3105 com_backpatch(c, else_anchor);
3106 if (i < NCH(n))
3107 com_node(c, CHILD(n, i+2));
3108 com_backpatch(c, end_anchor);
3109}
3110
3111static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003112com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003113{
3114 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003115 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003116
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003117 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3118 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003119 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003120 com_addbyte(c, POP_BLOCK);
3121 block_pop(c, SETUP_FINALLY);
3122 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003123 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003124 /* While the generated code pushes only one item,
3125 the try-finally handling can enter here with
3126 up to three items. OK, here are the details:
3127 3 for an exception, 2 for RETURN, 1 for BREAK. */
3128 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003129 com_backpatch(c, finally_anchor);
3130 ch = CHILD(n, NCH(n)-1);
3131 com_addoparg(c, SET_LINENO, ch->n_lineno);
3132 com_node(c, ch);
3133 com_addbyte(c, END_FINALLY);
3134 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003135 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003136}
3137
3138static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003139com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003140{
3141 REQ(n, try_stmt);
3142 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3143 | 'try' ':' suite 'finally' ':' suite */
3144 if (TYPE(CHILD(n, 3)) != except_clause)
3145 com_try_finally(c, n);
3146 else
3147 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003148}
3149
Guido van Rossum8b993a91997-01-17 21:04:03 +00003150static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003151get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003152{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003153 int i;
3154
Guido van Rossum8b993a91997-01-17 21:04:03 +00003155 /* Label to avoid tail recursion */
3156 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003157 switch (TYPE(n)) {
3158
3159 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003160 if (NCH(n) == 1) {
3161 n = CHILD(n, 0);
3162 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003163 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003164 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003165 case file_input:
3166 for (i = 0; i < NCH(n); i++) {
3167 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003168 if (TYPE(ch) == stmt) {
3169 n = ch;
3170 goto next;
3171 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003172 }
3173 break;
3174
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003175 case stmt:
3176 case simple_stmt:
3177 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003178 n = CHILD(n, 0);
3179 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003180
3181 case expr_stmt:
3182 case testlist:
3183 case test:
3184 case and_test:
3185 case not_test:
3186 case comparison:
3187 case expr:
3188 case xor_expr:
3189 case and_expr:
3190 case shift_expr:
3191 case arith_expr:
3192 case term:
3193 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003194 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003195 if (NCH(n) == 1) {
3196 n = CHILD(n, 0);
3197 goto next;
3198 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003199 break;
3200
3201 case atom:
3202 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003203 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003204 break;
3205
3206 }
3207 return NULL;
3208}
3209
Guido van Rossum79f25d91997-04-29 20:08:16 +00003210static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003211get_docstring(node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003212{
Guido van Rossum541563e1999-01-28 15:08:09 +00003213 /* Don't generate doc-strings if run with -OO */
3214 if (Py_OptimizeFlag > 1)
3215 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003216 n = get_rawdocstring(n);
3217 if (n == NULL)
3218 return NULL;
3219 return parsestrplus(n);
3220}
3221
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003222static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003223com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003224{
3225 REQ(n, suite);
3226 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3227 if (NCH(n) == 1) {
3228 com_node(c, CHILD(n, 0));
3229 }
3230 else {
3231 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003232 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003233 node *ch = CHILD(n, i);
3234 if (TYPE(ch) == stmt)
3235 com_node(c, ch);
3236 }
3237 }
3238}
3239
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003240/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003241static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003242com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003243{
3244 int i = c->c_nblocks;
3245 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3246 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3247 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003248 else if (i <= 0) {
3249 /* at the outer level */
3250 com_error(c, PyExc_SyntaxError,
3251 "'continue' not properly in loop");
3252 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003253 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003254 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003255 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003256 if (c->c_block[j] == SETUP_LOOP)
3257 break;
3258 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003259 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003260 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003261 for (; i > j; --i) {
3262 if (c->c_block[i] == SETUP_EXCEPT ||
3263 c->c_block[i] == SETUP_FINALLY) {
3264 com_addoparg(c, CONTINUE_LOOP,
3265 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003266 return;
3267 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003268 if (c->c_block[i] == END_FINALLY) {
3269 com_error(c, PyExc_SyntaxError,
3270 "'continue' not supported inside 'finally' clause");
3271 return;
3272 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003273 }
3274 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003275 com_error(c, PyExc_SyntaxError,
3276 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003277 }
3278 /* XXX Could allow it inside a 'finally' clause
3279 XXX if we could pop the exception still on the stack */
3280}
3281
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003282static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003283com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003284{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003285 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003286 if (TYPE(n) == lambdef) {
3287 /* lambdef: 'lambda' [varargslist] ':' test */
3288 n = CHILD(n, 1);
3289 }
3290 else {
3291 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3292 n = CHILD(n, 2);
3293 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3294 n = CHILD(n, 1);
3295 }
3296 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003297 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003298 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003299 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003300 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3301 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003302 nargs = 0;
3303 ndefs = 0;
3304 for (i = 0; i < nch; i++) {
3305 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003306 if (TYPE(CHILD(n, i)) == STAR ||
3307 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003308 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003309 nargs++;
3310 i++;
3311 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003312 t = RPAR; /* Anything except EQUAL or COMMA */
3313 else
3314 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003315 if (t == EQUAL) {
3316 i++;
3317 ndefs++;
3318 com_node(c, CHILD(n, i));
3319 i++;
3320 if (i >= nch)
3321 break;
3322 t = TYPE(CHILD(n, i));
3323 }
3324 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003325 /* Treat "(a=1, b)" as an error */
3326 if (ndefs)
3327 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003328 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003329 }
3330 if (t != COMMA)
3331 break;
3332 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003333 return ndefs;
3334}
3335
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003336static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003337com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003338{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003339 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003340 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003341 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003342 ndefs = com_argdefs(c, n);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003343 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3344 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003345 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003346 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003347 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003348 c->c_errors++;
3349 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003350 int closure = com_make_closure(c, (PyCodeObject *)co);
3351 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003352 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003353 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003354 if (closure)
3355 com_addoparg(c, MAKE_CLOSURE, ndefs);
3356 else
3357 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003358 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003359 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003360 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003361 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003362 }
3363}
3364
3365static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003366com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003367{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003368 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003369 REQ(n, testlist);
3370 /* testlist: test (',' test)* [','] */
3371 for (i = 0; i < NCH(n); i += 2)
3372 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003373 i = (NCH(n)+1) / 2;
3374 com_addoparg(c, BUILD_TUPLE, i);
3375 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003376}
3377
3378static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003379com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003380{
Guido van Rossum25831651993-05-19 14:50:45 +00003381 int i;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003382 PyObject *co, *v;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003383 char *name;
3384
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003385 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003386 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003387 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003388 c->c_errors++;
3389 return;
3390 }
3391 /* Push the class name on the stack */
3392 i = com_addconst(c, v);
3393 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003394 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003395 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003396 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003397 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003398 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003399 com_push(c, 1);
3400 }
Guido van Rossum25831651993-05-19 14:50:45 +00003401 else
3402 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003403 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003404 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003405 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003406 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003407 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003408 c->c_errors++;
3409 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003410 int closure = com_make_closure(c, (PyCodeObject *)co);
3411 i = com_addconst(c, co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003412 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003413 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003414 if (closure)
3415 com_addoparg(c, MAKE_CLOSURE, 0);
3416 else
3417 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003418 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003419 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003420 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003421 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003422 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003423 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003424}
3425
3426static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003427com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003428{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003429 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003430 if (c->c_errors)
3431 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003432 switch (TYPE(n)) {
3433
3434 /* Definition nodes */
3435
3436 case funcdef:
3437 com_funcdef(c, n);
3438 break;
3439 case classdef:
3440 com_classdef(c, n);
3441 break;
3442
3443 /* Trivial parse tree nodes */
3444
3445 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003446 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003447 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003448 n = CHILD(n, 0);
3449 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003450
3451 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003452 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
3453 com_addoparg(c, SET_LINENO, n->n_lineno);
3454 {
3455 int i;
3456 for (i = 0; i < NCH(n)-1; i += 2)
3457 com_node(c, CHILD(n, i));
3458 }
3459 break;
3460
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003461 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003462 com_addoparg(c, SET_LINENO, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003463 n = CHILD(n, 0);
3464 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003465
3466 /* Statement nodes */
3467
3468 case expr_stmt:
3469 com_expr_stmt(c, n);
3470 break;
3471 case print_stmt:
3472 com_print_stmt(c, n);
3473 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003474 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003475 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003476 break;
3477 case pass_stmt:
3478 break;
3479 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003480 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003481 com_error(c, PyExc_SyntaxError,
3482 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003483 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003484 com_addbyte(c, BREAK_LOOP);
3485 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003486 case continue_stmt:
3487 com_continue_stmt(c, n);
3488 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003489 case return_stmt:
3490 com_return_stmt(c, n);
3491 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00003492 case yield_stmt:
3493 com_yield_stmt(c, n);
3494 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003495 case raise_stmt:
3496 com_raise_stmt(c, n);
3497 break;
3498 case import_stmt:
3499 com_import_stmt(c, n);
3500 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003501 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003502 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003503 case exec_stmt:
3504 com_exec_stmt(c, n);
3505 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003506 case assert_stmt:
3507 com_assert_stmt(c, n);
3508 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003509 case if_stmt:
3510 com_if_stmt(c, n);
3511 break;
3512 case while_stmt:
3513 com_while_stmt(c, n);
3514 break;
3515 case for_stmt:
3516 com_for_stmt(c, n);
3517 break;
3518 case try_stmt:
3519 com_try_stmt(c, n);
3520 break;
3521 case suite:
3522 com_suite(c, n);
3523 break;
3524
3525 /* Expression nodes */
3526
3527 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003528 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003529 break;
3530 case test:
3531 com_test(c, n);
3532 break;
3533 case and_test:
3534 com_and_test(c, n);
3535 break;
3536 case not_test:
3537 com_not_test(c, n);
3538 break;
3539 case comparison:
3540 com_comparison(c, n);
3541 break;
3542 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003543 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003544 break;
3545 case expr:
3546 com_expr(c, n);
3547 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003548 case xor_expr:
3549 com_xor_expr(c, n);
3550 break;
3551 case and_expr:
3552 com_and_expr(c, n);
3553 break;
3554 case shift_expr:
3555 com_shift_expr(c, n);
3556 break;
3557 case arith_expr:
3558 com_arith_expr(c, n);
3559 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003560 case term:
3561 com_term(c, n);
3562 break;
3563 case factor:
3564 com_factor(c, n);
3565 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003566 case power:
3567 com_power(c, n);
3568 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003569 case atom:
3570 com_atom(c, n);
3571 break;
3572
3573 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003574 com_error(c, PyExc_SystemError,
3575 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003576 }
3577}
3578
Tim Petersdbd9ba62000-07-09 03:09:57 +00003579static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003580
3581static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003582com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003583{
3584 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3585 if (TYPE(CHILD(n, 0)) == LPAR)
3586 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003587 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003588 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003589 com_pop(c, 1);
3590 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003591}
3592
3593static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003594com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003595{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003596 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003597 if (NCH(n) == 1) {
3598 com_fpdef(c, CHILD(n, 0));
3599 }
3600 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003601 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003602 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003603 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003604 for (i = 0; i < NCH(n); i += 2)
3605 com_fpdef(c, CHILD(n, i));
3606 }
3607}
3608
3609static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003610com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003611{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003612 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003613 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003614 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003615 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003616 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003617 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003618 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003619 /* Enter all arguments in table of locals */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003620 for (i = 0, narg = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003621 node *ch = CHILD(n, i);
3622 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003623 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003624 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003625 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3626 fp = CHILD(ch, 0);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00003627 if (TYPE(fp) != NAME) {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003628 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003629 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003630 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003631 narg++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003632 /* all name updates handled by symtable */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003633 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003634 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003635 ch = CHILD(n, i);
3636 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003637 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003638 else
3639 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003640 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003641 if (complex) {
3642 /* Generate code for complex arguments only after
3643 having counted the simple arguments */
3644 int ilocal = 0;
3645 for (i = 0; i < nch; i++) {
3646 node *ch = CHILD(n, i);
3647 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003648 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003649 break;
3650 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3651 fp = CHILD(ch, 0);
3652 if (TYPE(fp) != NAME) {
3653 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003654 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003655 com_fpdef(c, ch);
3656 }
3657 ilocal++;
3658 if (++i >= nch)
3659 break;
3660 ch = CHILD(n, i);
3661 if (TYPE(ch) == EQUAL)
3662 i += 2;
3663 else
3664 REQ(ch, COMMA);
3665 }
3666 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003667}
3668
3669static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003670com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003671{
3672 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003673 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003674 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003675 doc = get_docstring(n);
3676 if (doc != NULL) {
3677 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003678 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003679 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003680 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003681 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003682 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003683 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003684 for (i = 0; i < NCH(n); i++) {
3685 node *ch = CHILD(n, i);
3686 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3687 com_node(c, ch);
3688 }
3689}
3690
3691/* Top-level compile-node interface */
3692
3693static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003694compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003695{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003696 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003697 node *ch;
3698 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003699 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003700 doc = get_docstring(CHILD(n, 4));
3701 if (doc != NULL) {
3702 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003703 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003704 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003705 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003706 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003707 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3708 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003709 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003710 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003711 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003712 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003713 c->c_infunction = 0;
Tim Peters5ca576e2001-06-18 22:08:13 +00003714 if (c->c_flags & CO_GENERATOR) {
3715 com_addoparg(c, LOAD_CONST,
3716 com_addconst(c, PyExc_StopIteration));
3717 com_push(c, 1);
3718 com_addoparg(c, RAISE_VARARGS, 1);
3719 com_pop(c, 1);
3720 }
3721 else {
3722 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
3723 com_push(c, 1);
3724 com_addbyte(c, RETURN_VALUE);
3725 com_pop(c, 1);
3726 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003727}
3728
3729static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003730compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003731{
Guido van Rossum590baa41993-11-30 13:40:46 +00003732 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003733 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003734 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003735
3736 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003737 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003738 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003739 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003740 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003741 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003742 else
3743 ch = CHILD(n, 2);
3744 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003745 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003746 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003747}
3748
3749static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003750compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003751{
3752 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003753 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003754 REQ(n, classdef);
3755 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3756 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003757 c->c_private = c->c_name;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003758 ch = CHILD(n, NCH(n)-1); /* The suite */
3759 doc = get_docstring(ch);
3760 if (doc != NULL) {
3761 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003762 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003763 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003764 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003765 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003766 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003767 }
3768 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003769 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003770 com_node(c, ch);
3771 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003772 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003773 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003774 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003775}
3776
3777static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003778compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003779{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003780 com_addoparg(c, SET_LINENO, n->n_lineno);
3781
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003782 switch (TYPE(n)) {
3783
Guido van Rossum4c417781991-01-21 16:09:22 +00003784 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003785 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003786 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003787 n = CHILD(n, 0);
3788 if (TYPE(n) != NEWLINE)
3789 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003790 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003791 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003792 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003793 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003794 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003795 break;
3796
Guido van Rossum4c417781991-01-21 16:09:22 +00003797 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003798 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003799 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003800 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003801 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003802 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003803 break;
3804
Guido van Rossum590baa41993-11-30 13:40:46 +00003805 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003806 com_node(c, CHILD(n, 0));
3807 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003808 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003809 break;
3810
Guido van Rossum590baa41993-11-30 13:40:46 +00003811 case lambdef: /* anonymous function definition */
3812 compile_lambdef(c, n);
3813 break;
3814
Guido van Rossum4c417781991-01-21 16:09:22 +00003815 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003816 compile_funcdef(c, n);
3817 break;
3818
Guido van Rossum4c417781991-01-21 16:09:22 +00003819 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003820 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003821 break;
3822
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003823 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003824 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003825 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003826 }
3827}
3828
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003829static PyObject *
3830dict_keys_inorder(PyObject *dict, int offset)
3831{
3832 PyObject *tuple, *k, *v;
3833 int i, pos = 0, size = PyDict_Size(dict);
3834
3835 tuple = PyTuple_New(size);
3836 if (tuple == NULL)
3837 return NULL;
3838 while (PyDict_Next(dict, &pos, &k, &v)) {
3839 i = PyInt_AS_LONG(v);
3840 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00003841 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003842 PyTuple_SET_ITEM(tuple, i - offset, k);
3843 }
3844 return tuple;
3845}
3846
Guido van Rossum79f25d91997-04-29 20:08:16 +00003847PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003848PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003849{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003850 return PyNode_CompileFlags(n, filename, NULL);
3851}
3852
3853PyCodeObject *
3854PyNode_CompileFlags(node *n, char *filename, PyCompilerFlags *flags)
3855{
3856 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003857}
3858
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003859struct symtable *
3860PyNode_CompileSymtable(node *n, char *filename)
3861{
3862 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003863 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003864
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003865 ff = PyNode_Future(n, filename);
3866 if (ff == NULL)
3867 return NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003868 st = symtable_init();
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003869 if (st == NULL)
3870 return NULL;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003871 st->st_future = ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003872 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003873 if (st->st_errors > 0)
3874 goto fail;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003875 symtable_node(st, n);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003876 if (st->st_errors > 0)
3877 goto fail;
3878
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003879 return st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003880 fail:
3881 PyMem_Free((void *)ff);
3882 st->st_future = NULL;
3883 PySymtable_Free(st);
3884 return NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003885}
3886
Guido van Rossum79f25d91997-04-29 20:08:16 +00003887static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003888icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003889{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003890 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003891}
3892
Guido van Rossum79f25d91997-04-29 20:08:16 +00003893static PyCodeObject *
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003894jcompile(node *n, char *filename, struct compiling *base,
3895 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003896{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003897 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003898 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003899 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003900 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003901 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003902 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003903 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003904 /* c_symtable still points to parent's symbols */
3905 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003906 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003907 sc.c_nested = 1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003908 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003909 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00003910 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003911 if (sc.c_future == NULL) {
3912 com_free(&sc);
3913 return NULL;
3914 }
3915 if (flags) {
3916 if (flags->cf_nested_scopes)
3917 sc.c_future->ff_nested_scopes = 1;
3918 else if (sc.c_future->ff_nested_scopes)
3919 flags->cf_nested_scopes = 1;
3920 }
3921 if (symtable_build(&sc, n) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003922 com_free(&sc);
3923 return NULL;
3924 }
3925 }
3926 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003927 if (symtable_load_symbols(&sc) < 0) {
3928 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003929 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003930 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003931 compile_node(&sc, n);
3932 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00003933 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003934 PyObject *consts, *names, *varnames, *filename, *name,
3935 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003936 consts = PyList_AsTuple(sc.c_consts);
3937 names = PyList_AsTuple(sc.c_names);
3938 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003939 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
3940 freevars = dict_keys_inorder(sc.c_freevars,
3941 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003942 filename = PyString_InternFromString(sc.c_filename);
3943 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003944 if (!PyErr_Occurred())
3945 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003946 sc.c_nlocals,
3947 sc.c_maxstacklevel,
3948 sc.c_flags,
3949 sc.c_code,
3950 consts,
3951 names,
3952 varnames,
3953 freevars,
3954 cellvars,
3955 filename,
3956 name,
3957 sc.c_firstlineno,
3958 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003959 Py_XDECREF(consts);
3960 Py_XDECREF(names);
3961 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003962 Py_XDECREF(freevars);
3963 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003964 Py_XDECREF(filename);
3965 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003966 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00003967 else if (!PyErr_Occurred()) {
3968 /* This could happen if someone called PyErr_Clear() after an
3969 error was reported above. That's not supposed to happen,
3970 but I just plugged one case and I'm not sure there can't be
3971 others. In that case, raise SystemError so that at least
3972 it gets reported instead dumping core. */
3973 PyErr_SetString(PyExc_SystemError, "lost syntax error");
3974 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003975 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00003976 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003977 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00003978 sc.c_symtable = NULL;
3979 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003980 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003981 return co;
3982}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003983
3984int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003985PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003986{
3987 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003988 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003989 int line = co->co_firstlineno;
3990 int addr = 0;
3991 while (--size >= 0) {
3992 addr += *p++;
3993 if (addr > addrq)
3994 break;
3995 line += *p++;
3996 }
3997 return line;
3998}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003999
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004000/* The test for LOCAL must come before the test for FREE in order to
4001 handle classes where name is both local and free. The local var is
4002 a method and the free var is a free var referenced within a method.
4003*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004004
4005static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004006get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004007{
4008 PyObject *v;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004009 if (c->c_symtable->st_nested_scopes) {
4010 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4011 return CELL;
4012 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4013 return LOCAL;
4014 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4015 return FREE;
4016 v = PyDict_GetItemString(c->c_globals, name);
4017 if (v) {
4018 if (v == Py_None)
4019 return GLOBAL_EXPLICIT;
4020 else {
4021 return GLOBAL_IMPLICIT;
4022 }
4023 }
4024 } else {
4025 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4026 return LOCAL;
4027 v = PyDict_GetItemString(c->c_globals, name);
4028 if (v) {
4029 if (v == Py_None)
4030 return GLOBAL_EXPLICIT;
4031 else {
4032 return GLOBAL_IMPLICIT;
4033 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004034 }
4035 }
4036 {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004037 char buf[350];
4038 sprintf(buf,
Jeremy Hylton51257732001-03-01 00:42:55 +00004039 "unknown scope for %.100s in %.100s(%s) "
4040 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
Jeremy Hylton483638c2001-02-01 20:20:45 +00004041 name, c->c_name,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004042 PyObject_REPR(c->c_symtable->st_cur->ste_id),
Jeremy Hylton51257732001-03-01 00:42:55 +00004043 c->c_filename,
4044 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4045 PyObject_REPR(c->c_locals),
4046 PyObject_REPR(c->c_globals)
4047 );
4048
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004049 Py_FatalError(buf);
4050 }
4051 return -1; /* can't get here */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004052}
4053
Guido van Rossum207fda62001-03-02 03:30:41 +00004054/* Helper functions to issue warnings */
4055
4056static int
4057issue_warning(char *msg, char *filename, int lineno)
4058{
4059 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4060 lineno, NULL, NULL) < 0) {
4061 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4062 PyErr_SetString(PyExc_SyntaxError, msg);
4063 PyErr_SyntaxLocation(filename, lineno);
4064 }
4065 return -1;
4066 }
4067 return 0;
4068}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004069
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004070static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004071symtable_warn(struct symtable *st, char *msg)
4072{
Guido van Rossum207fda62001-03-02 03:30:41 +00004073 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004074 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004075 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004076 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004077 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004078}
4079
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004080/* Helper function for setting lineno and filename */
4081
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004082static int
4083symtable_build(struct compiling *c, node *n)
4084{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004085 if ((c->c_symtable = symtable_init()) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004086 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004087 c->c_symtable->st_future = c->c_future;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004088 if (c->c_future->ff_nested_scopes)
4089 c->c_symtable->st_nested_scopes = 1;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004090 c->c_symtable->st_filename = c->c_filename;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004091 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
4092 if (c->c_symtable->st_errors > 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004093 return -1;
4094 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004095 if (c->c_symtable->st_errors > 0)
4096 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004097 /* reset for second pass */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004098 c->c_symtable->st_nscopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004099 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004100 return 0;
4101}
4102
4103static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004104symtable_init_compiling_symbols(struct compiling *c)
4105{
4106 PyObject *varnames;
4107
4108 varnames = c->c_symtable->st_cur->ste_varnames;
4109 if (varnames == NULL) {
4110 varnames = PyList_New(0);
4111 if (varnames == NULL)
4112 return -1;
4113 c->c_symtable->st_cur->ste_varnames = varnames;
4114 Py_INCREF(varnames);
4115 } else
4116 Py_INCREF(varnames);
4117 c->c_varnames = varnames;
4118
4119 c->c_globals = PyDict_New();
4120 if (c->c_globals == NULL)
4121 return -1;
4122 c->c_freevars = PyDict_New();
4123 if (c->c_freevars == NULL)
4124 return -1;
4125 c->c_cellvars = PyDict_New();
4126 if (c->c_cellvars == NULL)
4127 return -1;
4128 return 0;
4129}
4130
4131struct symbol_info {
4132 int si_nlocals;
4133 int si_ncells;
4134 int si_nfrees;
4135 int si_nimplicit;
4136};
4137
4138static void
4139symtable_init_info(struct symbol_info *si)
4140{
4141 si->si_nlocals = 0;
4142 si->si_ncells = 0;
4143 si->si_nfrees = 0;
4144 si->si_nimplicit = 0;
4145}
4146
4147static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004148symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004149 struct symbol_info *si)
4150{
4151 PyObject *dict, *v;
4152
4153 /* Seperate logic for DEF_FREE. If it occurs in a function,
4154 it indicates a local that we must allocate storage for (a
4155 cell var). If it occurs in a class, then the class has a
4156 method and a free variable with the same name.
4157 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004158 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004159 /* If it isn't declared locally, it can't be a cell. */
4160 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4161 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004162 v = PyInt_FromLong(si->si_ncells++);
4163 dict = c->c_cellvars;
4164 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004165 /* If it is free anyway, then there is no need to do
4166 anything here.
4167 */
4168 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00004169 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004170 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004171 v = PyInt_FromLong(si->si_nfrees++);
4172 dict = c->c_freevars;
4173 }
4174 if (v == NULL)
4175 return -1;
4176 if (PyDict_SetItem(dict, name, v) < 0) {
4177 Py_DECREF(v);
4178 return -1;
4179 }
4180 Py_DECREF(v);
4181 return 0;
4182}
4183
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004184/* If a variable is a cell and an argument, make sure that appears in
4185 co_cellvars before any variable to its right in varnames.
4186*/
4187
4188
4189static int
4190symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4191 PyObject *varnames, int flags)
4192{
4193 PyObject *v, *w, *d, *list = NULL;
4194 int i, pos;
4195
4196 if (flags & CO_VARARGS)
4197 argcount++;
4198 if (flags & CO_VARKEYWORDS)
4199 argcount++;
4200 for (i = argcount; --i >= 0; ) {
4201 v = PyList_GET_ITEM(varnames, i);
4202 if (PyDict_GetItem(*cellvars, v)) {
4203 if (list == NULL) {
4204 list = PyList_New(1);
4205 if (list == NULL)
4206 return -1;
4207 PyList_SET_ITEM(list, 0, v);
4208 Py_INCREF(v);
4209 } else
4210 PyList_Insert(list, 0, v);
4211 }
4212 }
4213 if (list == NULL || PyList_GET_SIZE(list) == 0)
4214 return 0;
4215 /* There are cellvars that are also arguments. Create a dict
4216 to replace cellvars and put the args at the front.
4217 */
4218 d = PyDict_New();
4219 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
4220 v = PyInt_FromLong(i);
4221 if (v == NULL)
4222 goto fail;
4223 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
4224 goto fail;
4225 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
4226 goto fail;
4227 }
4228 pos = 0;
4229 i = PyList_GET_SIZE(list);
4230 Py_DECREF(list);
4231 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
4232 w = PyInt_FromLong(i++); /* don't care about the old key */
4233 if (PyDict_SetItem(d, v, w) < 0) {
4234 Py_DECREF(w);
4235 goto fail;
4236 }
4237 Py_DECREF(w);
4238 }
4239 Py_DECREF(*cellvars);
4240 *cellvars = d;
4241 return 1;
4242 fail:
4243 Py_DECREF(d);
4244 return -1;
4245}
4246
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004247static int
4248symtable_freevar_offsets(PyObject *freevars, int offset)
4249{
4250 PyObject *name, *v;
4251 int pos;
4252
4253 /* The cell vars are the first elements of the closure,
4254 followed by the free vars. Update the offsets in
4255 c_freevars to account for number of cellvars. */
4256 pos = 0;
4257 while (PyDict_Next(freevars, &pos, &name, &v)) {
4258 int i = PyInt_AS_LONG(v) + offset;
4259 PyObject *o = PyInt_FromLong(i);
4260 if (o == NULL)
4261 return -1;
4262 if (PyDict_SetItem(freevars, name, o) < 0) {
4263 Py_DECREF(o);
4264 return -1;
4265 }
4266 Py_DECREF(o);
4267 }
4268 return 0;
4269}
4270
4271static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004272symtable_check_unoptimized(struct compiling *c,
4273 PySymtableEntryObject *ste,
4274 struct symbol_info *si)
4275{
4276 char buf[300];
4277
4278 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4279 || (ste->ste_nested && si->si_nimplicit)))
4280 return 0;
4281
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004282#define ILLEGAL_CONTAINS "contains a nested function with free variables"
4283
4284#define ILLEGAL_IS "is a nested function"
4285
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004286#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004287"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004288
4289#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004290"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004291
4292#define ILLEGAL_EXEC_AND_IMPORT_STAR \
4293"function '%.100s' uses import * and bare exec, which are illegal" \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004294"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004295
4296 /* XXX perhaps the linenos for these opt-breaking statements
4297 should be stored so the exception can point to them. */
4298
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004299 if (ste->ste_child_free) {
4300 if (ste->ste_optimized == OPT_IMPORT_STAR)
4301 sprintf(buf, ILLEGAL_IMPORT_STAR,
4302 PyString_AS_STRING(ste->ste_name),
4303 ILLEGAL_CONTAINS);
4304 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
4305 sprintf(buf, ILLEGAL_BARE_EXEC,
4306 PyString_AS_STRING(ste->ste_name),
4307 ILLEGAL_CONTAINS);
4308 else {
4309 sprintf(buf, ILLEGAL_EXEC_AND_IMPORT_STAR,
4310 PyString_AS_STRING(ste->ste_name),
4311 ILLEGAL_CONTAINS);
4312 }
4313 } else {
4314 if (ste->ste_optimized == OPT_IMPORT_STAR)
4315 sprintf(buf, ILLEGAL_IMPORT_STAR,
4316 PyString_AS_STRING(ste->ste_name),
4317 ILLEGAL_IS);
4318 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
4319 sprintf(buf, ILLEGAL_BARE_EXEC,
4320 PyString_AS_STRING(ste->ste_name),
4321 ILLEGAL_IS);
4322 else {
4323 sprintf(buf, ILLEGAL_EXEC_AND_IMPORT_STAR,
4324 PyString_AS_STRING(ste->ste_name),
4325 ILLEGAL_IS);
4326 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004327 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004328
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004329 if (c->c_symtable->st_nested_scopes) {
4330 PyErr_SetString(PyExc_SyntaxError, buf);
4331 PyErr_SyntaxLocation(c->c_symtable->st_filename,
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00004332 ste->ste_opt_lineno);
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004333 return -1;
Guido van Rossum207fda62001-03-02 03:30:41 +00004334 }
4335 else {
4336 return issue_warning(buf, c->c_filename, ste->ste_lineno);
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004337 }
4338 return 0;
4339}
4340
4341static int
4342symtable_check_shadow(struct symtable *st, PyObject *name, int flags)
4343{
4344 char buf[500];
4345 PyObject *children, *v;
Jeremy Hyltonc1761322001-02-28 23:44:45 +00004346 PySymtableEntryObject *child = NULL;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004347 int i;
4348
4349 if (!(flags & DEF_BOUND))
4350 return 0;
Jeremy Hylton9c901052001-05-08 04:12:34 +00004351
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004352 /* The semantics of this code will change with nested scopes.
4353 It is defined in the current scope and referenced in a
4354 child scope. Under the old rules, the child will see a
4355 global. Under the new rules, the child will see the
4356 binding in the current scope.
4357 */
4358
4359 /* Find name of child function that has free variable */
4360 children = st->st_cur->ste_children;
4361 for (i = 0; i < PyList_GET_SIZE(children); i++) {
4362 int cflags;
4363 child = (PySymtableEntryObject *)PyList_GET_ITEM(children, i);
4364 v = PyDict_GetItem(child->ste_symbols, name);
4365 if (v == NULL)
4366 continue;
4367 cflags = PyInt_AS_LONG(v);
4368 if (!(cflags & DEF_BOUND))
4369 break;
4370 }
Jeremy Hyltonc1761322001-02-28 23:44:45 +00004371
4372 assert(child != NULL);
4373
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004374 sprintf(buf, "local name '%.100s' in '%.100s' shadows "
4375 "use of '%.100s' as global in nested scope '%.100s'",
4376 PyString_AS_STRING(name),
4377 PyString_AS_STRING(st->st_cur->ste_name),
4378 PyString_AS_STRING(name),
4379 PyString_AS_STRING(child->ste_name)
4380 );
4381
4382 return symtable_warn(st, buf);
4383}
4384
4385static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004386symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4387 struct symbol_info *si)
4388{
Jeremy Hylton061d1062001-03-22 02:32:48 +00004389 if (c->c_future && c->c_future->ff_nested_scopes)
4390 c->c_flags |= CO_NESTED;
Tim Peters5ca576e2001-06-18 22:08:13 +00004391 if (ste->ste_generator)
4392 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004393 if (ste->ste_type != TYPE_MODULE)
4394 c->c_flags |= CO_NEWLOCALS;
4395 if (ste->ste_type == TYPE_FUNCTION) {
4396 c->c_nlocals = si->si_nlocals;
4397 if (ste->ste_optimized == 0)
4398 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004399 else if (ste->ste_optimized != OPT_EXEC)
4400 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004401 }
4402 return 0;
4403}
4404
4405static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004406symtable_load_symbols(struct compiling *c)
4407{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004408 static PyObject *implicit = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004409 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004410 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004411 PyObject *name, *varnames, *v;
4412 int i, flags, pos;
4413 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004414
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004415 if (implicit == NULL) {
4416 implicit = PyInt_FromLong(1);
4417 if (implicit == NULL)
4418 return -1;
4419 }
4420 v = NULL;
4421
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004422 if (symtable_init_compiling_symbols(c) < 0)
4423 goto fail;
4424 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004425 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004426 si.si_nlocals = PyList_GET_SIZE(varnames);
4427 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004428
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004429 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004430 v = PyInt_FromLong(i);
4431 if (PyDict_SetItem(c->c_locals,
4432 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004433 goto fail;
4434 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004435 }
4436
4437 /* XXX The cases below define the rules for whether a name is
4438 local or global. The logic could probably be clearer. */
4439 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004440 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4441 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004442
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004443 if (st->st_nested_scopes == 0
4444 && (flags & (DEF_FREE | DEF_FREE_CLASS))) {
4445 if (symtable_check_shadow(st, name, flags) < 0)
4446 goto fail;
4447 }
4448
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004449 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004450 /* undo the original DEF_FREE */
4451 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004452
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004453 /* Deal with names that need two actions:
4454 1. Cell variables, which are also locals.
4455 2. Free variables in methods that are also class
4456 variables or declared global.
4457 */
Jeremy Hylton9c901052001-05-08 04:12:34 +00004458 if (st->st_nested_scopes) {
4459 if (flags & (DEF_FREE | DEF_FREE_CLASS)) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004460 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton9c901052001-05-08 04:12:34 +00004461 }
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004462 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004463
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004464 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004465 c->c_argcount--;
4466 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004467 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004468 c->c_argcount--;
4469 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004470 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004471 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004472 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004473 if (flags & DEF_PARAM) {
4474 PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004475 PyString_AS_STRING(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004476 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004477 ste->ste_lineno);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004478 st->st_errors++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004479 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004480 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004481 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4482 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004483 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004484 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004485 if (PyDict_SetItem(c->c_globals, name, implicit) < 0)
4486 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004487 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004488 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004489 if (v == NULL)
4490 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004491 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004492 goto fail;
4493 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004494 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004495 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004496 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004497 } else if (is_free(flags)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004498 if (ste->ste_nested && st->st_nested_scopes) {
4499 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004500 if (v == NULL)
4501 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004502 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004503 goto fail;
4504 Py_DECREF(v);
4505 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004506 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004507 if (PyDict_SetItem(c->c_globals, name,
4508 implicit) < 0)
4509 goto fail;
Jeremy Hylton51257732001-03-01 00:42:55 +00004510 if (st->st_nscopes != 1) {
4511 v = PyInt_FromLong(flags);
4512 if (PyDict_SetItem(st->st_global,
4513 name, v))
4514 goto fail;
4515 Py_DECREF(v);
4516 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004517 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004518 }
4519 }
4520
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004521 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
4522
Jeremy Hylton9c901052001-05-08 04:12:34 +00004523 if (st->st_nested_scopes == 0)
4524 assert(si.si_nfrees == 0);
4525
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004526 if (si.si_ncells > 1) { /* one cell is always in order */
4527 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
4528 c->c_varnames, c->c_flags) < 0)
4529 return -1;
4530 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004531 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4532 return -1;
4533 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004534 fail:
4535 /* is this always the right thing to do? */
4536 Py_XDECREF(v);
4537 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004538}
4539
4540static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004541symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004542{
4543 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004544
4545 st = (struct symtable *)PyMem_Malloc(sizeof(struct symtable));
4546 if (st == NULL)
4547 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004548 st->st_pass = 1;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004549 st->st_nested_scopes = NESTED_SCOPES_DEFAULT;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004550 st->st_filename = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004551 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004552 goto fail;
4553 if ((st->st_symbols = PyDict_New()) == NULL)
4554 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004555 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004556 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004557 st->st_errors = 0;
4558 st->st_tmpname = 0;
4559 st->st_private = NULL;
4560 return st;
4561 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004562 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004563 return NULL;
4564}
4565
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004566void
4567PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004568{
4569 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004570 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004571 Py_XDECREF(st->st_cur);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004572 PyMem_Free((void *)st);
4573}
4574
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004575/* When the compiler exits a scope, it must should update the scope's
4576 free variable information with the list of free variables in its
4577 children.
4578
4579 Variables that are free in children and defined in the current
4580 scope are cellvars.
4581
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004582 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004583 false), free variables in children that are not defined here are
4584 implicit globals.
4585
4586*/
4587
4588static int
4589symtable_update_free_vars(struct symtable *st)
4590{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004591 int i, j, def;
4592 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004593 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004594
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004595 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004596 def = DEF_FREE_CLASS;
4597 else
4598 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004599 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004600 int pos = 0;
4601
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004602 if (list)
4603 PyList_SetSlice(list, 0,
4604 ((PyVarObject*)list)->ob_size, 0);
Barry Warsaw0372af72001-02-23 18:22:59 +00004605 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004606 PyList_GET_ITEM(ste->ste_children, i);
4607 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004608 int flags = PyInt_AS_LONG(o);
4609 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004610 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004611 if (list == NULL) {
4612 list = PyList_New(0);
4613 if (list == NULL)
4614 return -1;
4615 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004616 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004617 if (PyList_Append(list, name) < 0) {
4618 Py_DECREF(list);
4619 return -1;
4620 }
4621 }
4622 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004623 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004624 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00004625 v = PyDict_GetItem(ste->ste_symbols, name);
4626 /* If a name N is declared global in scope A and
4627 referenced in scope B contained (perhaps
4628 indirectly) in A and there are no scopes
4629 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00004630 is global in B. Unless A is a class scope,
4631 because class scopes are not considered for
4632 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00004633 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004634 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004635 int flags = PyInt_AS_LONG(v);
4636 if (flags & DEF_GLOBAL) {
4637 symtable_undo_free(st, child->ste_id,
4638 name);
4639 continue;
4640 }
4641 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004642 if (ste->ste_nested) {
4643 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004644 name, def) < 0) {
4645 Py_DECREF(list);
4646 return -1;
4647 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004648 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004649 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004650 name) < 0) {
4651 Py_DECREF(list);
4652 return -1;
4653 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004654 }
4655 }
4656 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004657
4658 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004659 return 0;
4660}
4661
4662/* If the current scope is a non-nested class or if name is not
4663 defined in the current, non-nested scope, then it is an implicit
4664 global in all nested scopes.
4665*/
4666
4667static int
4668symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
4669{
4670 PyObject *o;
4671 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004672 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00004673
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004674 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004675 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004676 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004677 if (o == NULL)
4678 return symtable_undo_free(st, child, name);
4679 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00004680
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004681 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004682 return symtable_undo_free(st, child, name);
4683 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004684 return symtable_add_def_o(st, ste->ste_symbols,
4685 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004686}
4687
4688static int
4689symtable_undo_free(struct symtable *st, PyObject *id,
4690 PyObject *name)
4691{
4692 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004693 PyObject *info;
4694 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004695
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004696 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
4697 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004698 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00004699
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004700 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004701 if (info == NULL)
4702 return 0;
4703 v = PyInt_AS_LONG(info);
4704 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004705 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004706 DEF_FREE_GLOBAL) < 0)
4707 return -1;
4708 } else
4709 /* If the name is defined here or declared global,
4710 then the recursion stops. */
4711 return 0;
4712
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004713 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
4714 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00004715 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004716 PyList_GET_ITEM(ste->ste_children, i);
4717 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004718 if (x < 0)
4719 return x;
4720 }
4721 return 0;
4722}
4723
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004724/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
4725 This reference is released when the scope is exited, via the DECREF
4726 in symtable_exit_scope().
4727*/
4728
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004729static int
4730symtable_exit_scope(struct symtable *st)
4731{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004732 int end;
4733
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004734 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004735 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004736 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004737 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004738 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
4739 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004740 if (PySequence_DelItem(st->st_stack, end) < 0)
4741 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004742 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004743}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004744
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004745static void
4746symtable_enter_scope(struct symtable *st, char *name, int type,
4747 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004748{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004749 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004750
4751 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004752 prev = st->st_cur;
4753 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
4754 Py_DECREF(st->st_cur);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004755 st->st_errors++;
4756 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004757 }
4758 }
Barry Warsaw0372af72001-02-23 18:22:59 +00004759 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004760 PySymtableEntry_New(st, name, type, lineno);
4761 if (strcmp(name, TOP) == 0)
4762 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004763 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004764 if (PyList_Append(prev->ste_children,
4765 (PyObject *)st->st_cur) < 0)
4766 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004767 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004768}
4769
4770static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004771symtable_lookup(struct symtable *st, char *name)
4772{
4773 char buffer[MANGLE_LEN];
4774 PyObject *v;
4775 int flags;
4776
4777 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
4778 name = buffer;
4779 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
4780 if (v == NULL) {
4781 if (PyErr_Occurred())
4782 return -1;
4783 else
4784 return 0;
4785 }
4786
4787 flags = PyInt_AS_LONG(v);
4788 return flags;
4789}
4790
4791static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004792symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004793{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004794 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004795 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004796 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004797
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004798 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004799 name = buffer;
4800 if ((s = PyString_InternFromString(name)) == NULL)
4801 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004802 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
4803 Py_DECREF(s);
4804 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004805}
4806
4807/* Must only be called with mangled names */
4808
4809static int
4810symtable_add_def_o(struct symtable *st, PyObject *dict,
4811 PyObject *name, int flag)
4812{
4813 PyObject *o;
4814 int val;
4815
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004816 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004817 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004818 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004819 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00004820 PyString_AsString(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004821 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004822 st->st_cur->ste_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004823 return -1;
4824 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004825 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004826 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004827 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004828 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004829 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004830 Py_DECREF(o);
4831 return -1;
4832 }
4833 Py_DECREF(o);
4834
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004835 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004836 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004837 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004838 } else if (flag & DEF_GLOBAL) {
4839 /* XXX need to update DEF_GLOBAL for other flags too;
4840 perhaps only DEF_FREE_GLOBAL */
4841 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004842 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004843 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004844 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004845 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004846 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004847 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004848 Py_DECREF(o);
4849 return -1;
4850 }
4851 Py_DECREF(o);
4852 }
4853 return 0;
4854}
4855
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004856#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004857
4858static void
4859symtable_node(struct symtable *st, node *n)
4860{
4861 int i, start = 0;
4862
4863 loop:
4864 switch (TYPE(n)) {
4865 case funcdef: {
4866 char *func_name = STR(CHILD(n, 1));
4867 symtable_add_def(st, func_name, DEF_LOCAL);
4868 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004869 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004870 symtable_funcdef(st, n);
4871 symtable_exit_scope(st);
4872 break;
4873 }
4874 case lambdef:
4875 if (NCH(n) == 4)
4876 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004877 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004878 symtable_funcdef(st, n);
4879 symtable_exit_scope(st);
4880 break;
4881 case classdef: {
4882 char *tmp, *class_name = STR(CHILD(n, 1));
4883 symtable_add_def(st, class_name, DEF_LOCAL);
4884 if (TYPE(CHILD(n, 2)) == LPAR) {
4885 node *bases = CHILD(n, 3);
4886 int i;
4887 for (i = 0; i < NCH(bases); i += 2) {
4888 symtable_node(st, CHILD(bases, i));
4889 }
4890 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004891 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004892 tmp = st->st_private;
4893 st->st_private = class_name;
4894 symtable_node(st, CHILD(n, NCH(n) - 1));
4895 st->st_private = tmp;
4896 symtable_exit_scope(st);
4897 break;
4898 }
4899 case if_stmt:
4900 for (i = 0; i + 3 < NCH(n); i += 4) {
4901 if (is_constant_false(NULL, (CHILD(n, i + 1))))
4902 continue;
4903 symtable_node(st, CHILD(n, i + 1));
4904 symtable_node(st, CHILD(n, i + 3));
4905 }
4906 if (i + 2 < NCH(n))
4907 symtable_node(st, CHILD(n, i + 2));
4908 break;
4909 case global_stmt:
4910 symtable_global(st, n);
4911 break;
4912 case import_stmt:
4913 symtable_import(st, n);
4914 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004915 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004916 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004917 symtable_node(st, CHILD(n, 1));
4918 if (NCH(n) > 2)
4919 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00004920 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004921 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00004922 st->st_cur->ste_opt_lineno = n->n_lineno;
4923 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004924 if (NCH(n) > 4)
4925 symtable_node(st, CHILD(n, 5));
4926 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004927
4928 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00004929 case assert_stmt:
4930 if (Py_OptimizeFlag)
4931 return;
4932 if (NCH(n) == 2) {
4933 n = CHILD(n, 1);
4934 goto loop;
4935 } else {
4936 symtable_node(st, CHILD(n, 1));
4937 n = CHILD(n, 3);
4938 goto loop;
4939 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004940 case except_clause:
4941 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004942 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004943 if (NCH(n) > 1) {
4944 n = CHILD(n, 1);
4945 goto loop;
4946 }
4947 break;
4948 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004949 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004950 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00004951 case yield_stmt:
4952 st->st_cur->ste_generator = 1;
4953 n = CHILD(n, 1);
4954 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004955 case expr_stmt:
4956 if (NCH(n) == 1)
4957 n = CHILD(n, 0);
4958 else {
4959 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004960 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004961 symtable_node(st, CHILD(n, 2));
4962 break;
4963 } else {
4964 int i;
4965 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004966 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004967 n = CHILD(n, NCH(n) - 1);
4968 }
4969 }
4970 goto loop;
4971 /* watchout for fall-through logic below */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004972 case argument:
4973 if (NCH(n) == 3) {
4974 n = CHILD(n, 2);
4975 goto loop;
4976 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004977 case listmaker:
4978 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton23b42272001-03-19 20:38:06 +00004979 st->st_tmpname++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004980 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton23b42272001-03-19 20:38:06 +00004981 symtable_node(st, CHILD(n, 0));
4982 st->st_tmpname--;
4983 return;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004984 }
4985 case atom:
4986 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
4987 symtable_add_use(st, STR(CHILD(n, 0)));
4988 break;
4989 }
4990 case for_stmt:
4991 if (TYPE(n) == for_stmt) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004992 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004993 start = 3;
4994 }
4995 default:
4996 if (NCH(n) == 1) {
4997 n = CHILD(n, 0);
4998 goto loop;
4999 }
5000 for (i = start; i < NCH(n); ++i)
5001 if (TYPE(CHILD(n, i)) >= single_input)
5002 symtable_node(st, CHILD(n, i));
5003 }
5004}
5005
5006static void
5007symtable_funcdef(struct symtable *st, node *n)
5008{
5009 node *body;
5010
5011 if (TYPE(n) == lambdef) {
5012 if (NCH(n) == 4)
5013 symtable_params(st, CHILD(n, 1));
5014 } else
5015 symtable_params(st, CHILD(n, 2));
5016 body = CHILD(n, NCH(n) - 1);
5017 symtable_node(st, body);
5018}
5019
5020/* The next two functions parse the argument tuple.
5021 symtable_default_arg() checks for names in the default arguments,
5022 which are references in the defining scope. symtable_params()
5023 parses the parameter names, which are defined in the function's
5024 body.
5025
5026 varargslist:
5027 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5028 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5029*/
5030
5031static void
5032symtable_default_args(struct symtable *st, node *n)
5033{
5034 node *c;
5035 int i;
5036
5037 if (TYPE(n) == parameters) {
5038 n = CHILD(n, 1);
5039 if (TYPE(n) == RPAR)
5040 return;
5041 }
5042 REQ(n, varargslist);
5043 for (i = 0; i < NCH(n); i += 2) {
5044 c = CHILD(n, i);
5045 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5046 break;
5047 }
5048 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5049 symtable_node(st, CHILD(n, i));
5050 }
5051}
5052
5053static void
5054symtable_params(struct symtable *st, node *n)
5055{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005056 int i, complex = -1, ext = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005057 node *c = NULL;
5058
5059 if (TYPE(n) == parameters) {
5060 n = CHILD(n, 1);
5061 if (TYPE(n) == RPAR)
5062 return;
5063 }
5064 REQ(n, varargslist);
5065 for (i = 0; i < NCH(n); i += 2) {
5066 c = CHILD(n, i);
5067 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5068 ext = 1;
5069 break;
5070 }
5071 if (TYPE(c) == test) {
5072 continue;
5073 }
5074 if (TYPE(CHILD(c, 0)) == NAME)
5075 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
5076 else {
5077 char nbuf[10];
5078 sprintf(nbuf, ".%d", i);
5079 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005080 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005081 }
5082 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005083 if (ext) {
5084 c = CHILD(n, i);
5085 if (TYPE(c) == STAR) {
5086 i++;
5087 symtable_add_def(st, STR(CHILD(n, i)),
5088 DEF_PARAM | DEF_STAR);
5089 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00005090 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005091 c = NULL;
5092 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005093 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005094 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005095 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005096 i++;
5097 symtable_add_def(st, STR(CHILD(n, i)),
5098 DEF_PARAM | DEF_DOUBLESTAR);
5099 }
5100 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005101 if (complex >= 0) {
5102 int j;
5103 for (j = 0; j <= complex; j++) {
5104 c = CHILD(n, j);
5105 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005106 c = CHILD(n, ++j);
5107 else if (TYPE(c) == EQUAL)
5108 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005109 if (TYPE(CHILD(c, 0)) == LPAR)
5110 symtable_params_fplist(st, CHILD(c, 1));
5111 }
5112 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005113}
5114
5115static void
5116symtable_params_fplist(struct symtable *st, node *n)
5117{
5118 int i;
5119 node *c;
5120
5121 REQ(n, fplist);
5122 for (i = 0; i < NCH(n); i += 2) {
5123 c = CHILD(n, i);
5124 REQ(c, fpdef);
5125 if (NCH(c) == 1)
5126 symtable_add_def(st, STR(CHILD(c, 0)),
5127 DEF_PARAM | DEF_INTUPLE);
5128 else
5129 symtable_params_fplist(st, CHILD(c, 1));
5130 }
5131
5132}
5133
5134static void
5135symtable_global(struct symtable *st, node *n)
5136{
5137 int i;
5138
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005139 /* XXX It might be helpful to warn about module-level global
5140 statements, but it's hard to tell the difference between
5141 module-level and a string passed to exec.
5142 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00005143
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005144 for (i = 1; i < NCH(n); i += 2) {
5145 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005146 int flags;
5147
5148 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005149 if (flags < 0)
5150 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005151 if (flags && flags != DEF_GLOBAL) {
5152 char buf[500];
5153 if (flags & DEF_PARAM) {
5154 PyErr_Format(PyExc_SyntaxError,
5155 "name '%.400s' is local and global",
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005156 name);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005157 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005158 st->st_cur->ste_lineno);
5159 st->st_errors++;
5160 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005161 }
5162 else {
5163 if (flags & DEF_LOCAL)
5164 sprintf(buf, GLOBAL_AFTER_ASSIGN,
5165 name);
5166 else
5167 sprintf(buf, GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005168 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005169 }
5170 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005171 symtable_add_def(st, name, DEF_GLOBAL);
5172 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005173}
5174
5175static void
5176symtable_list_comprehension(struct symtable *st, node *n)
5177{
5178 char tmpname[12];
5179
Jeremy Hylton23b42272001-03-19 20:38:06 +00005180 sprintf(tmpname, "_[%d]", st->st_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005181 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005182 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005183 symtable_node(st, CHILD(n, 3));
5184 if (NCH(n) == 5)
5185 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005186}
5187
5188static void
5189symtable_import(struct symtable *st, node *n)
5190{
5191 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005192 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005193 | 'from' dotted_name 'import'
5194 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00005195 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005196 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005197 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005198 node *dotname = CHILD(n, 1);
5199 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
5200 /* check for bogus imports */
5201 if (n->n_lineno >= st->st_future->ff_last_lineno) {
5202 PyErr_SetString(PyExc_SyntaxError,
5203 LATE_FUTURE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005204 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005205 n->n_lineno);
5206 st->st_errors++;
5207 return;
5208 }
5209 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005210 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005211 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005212 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005213 } else {
5214 for (i = 3; i < NCH(n); i += 2) {
5215 node *c = CHILD(n, i);
5216 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005217 symtable_assign(st, CHILD(c, 2),
5218 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005219 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005220 symtable_assign(st, CHILD(c, 0),
5221 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005222 }
5223 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005224 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005225 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005226 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005227 }
5228 }
5229}
5230
5231static void
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005232symtable_assign(struct symtable *st, node *n, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005233{
5234 node *tmp;
5235 int i;
5236
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005237 loop:
5238 switch (TYPE(n)) {
5239 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005240 /* invalid assignment, e.g. lambda x:x=2. The next
5241 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005242 return;
5243 case power:
5244 if (NCH(n) > 2) {
5245 for (i = 2; i < NCH(n); ++i)
5246 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
5247 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005248 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005249 if (NCH(n) > 1) {
5250 symtable_node(st, CHILD(n, 0));
5251 symtable_node(st, CHILD(n, 1));
5252 } else {
5253 n = CHILD(n, 0);
5254 goto loop;
5255 }
5256 return;
5257 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00005258 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
5259 /* XXX This is an error, but the next pass
5260 will catch it. */
5261 return;
5262 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005263 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005264 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005265 }
5266 return;
5267 case exprlist:
5268 case testlist:
5269 if (NCH(n) == 1) {
5270 n = CHILD(n, 0);
5271 goto loop;
5272 }
5273 else {
5274 int i;
5275 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005276 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005277 return;
5278 }
5279 goto loop;
5280 case atom:
5281 tmp = CHILD(n, 0);
5282 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
5283 n = CHILD(n, 1);
5284 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00005285 } else if (TYPE(tmp) == NAME) {
Jeremy Hyltona830b382001-04-09 16:07:59 +00005286 if (strcmp(STR(tmp), "__debug__") == 0)
5287 symtable_warn(st, ASSIGN_DEBUG);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005288 symtable_add_def(st, STR(tmp), DEF_LOCAL | flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00005289 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005290 return;
5291 case dotted_as_name:
5292 if (NCH(n) == 3)
5293 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005294 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005295 else
5296 symtable_add_def(st,
5297 STR(CHILD(CHILD(n,
5298 0), 0)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005299 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005300 return;
5301 case dotted_name:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005302 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005303 return;
5304 case NAME:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005305 symtable_add_def(st, STR(n), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005306 return;
5307 default:
5308 if (NCH(n) == 0)
5309 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00005310 if (NCH(n) == 1) {
5311 n = CHILD(n, 0);
5312 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005313 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00005314 /* Should only occur for errors like x + 1 = 1,
5315 which will be caught in the next pass. */
5316 for (i = 0; i < NCH(n); ++i)
5317 if (TYPE(CHILD(n, i)) >= single_input)
5318 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005319 }
5320}