blob: 1fb85e752ea0113be8bc651cc29a4f059f00ee36 [file] [log] [blame]
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001/* Compile an expression node to intermediate code */
2
Guido van Rossum3f5da241990-12-20 15:06:42 +00003/* XXX TO DO:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004 XXX add __doc__ attribute == co_doc to code object attributes?
5 XXX (it's currently the first item of the co_const tuple)
Guido van Rossum3f5da241990-12-20 15:06:42 +00006 XXX Generate simple jump for break/return outside 'try...finally'
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00007 XXX Allow 'continue' inside finally clause of try-finally
Guido van Rossum8b993a91997-01-17 21:04:03 +00008 XXX New opcode for loading the initial index for a for loop
Guido van Rossum681d79a1995-07-18 14:51:37 +00009 XXX other JAR tricks?
Guido van Rossum3f5da241990-12-20 15:06:42 +000010*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +000011
Guido van Rossum79f25d91997-04-29 20:08:16 +000012#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000013
Guido van Rossum10dc2e81990-11-18 17:27:39 +000014#include "node.h"
15#include "token.h"
16#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000017#include "compile.h"
Jeremy Hylton4b38da62001-02-02 18:19:15 +000018#include "symtable.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000019#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000020#include "structmember.h"
21
22#include <ctype.h>
Guido van Rossum282914b1991-04-04 10:42:56 +000023
Guido van Rossumb05a5c71997-05-07 17:46:13 +000024/* Three symbols from graminit.h are also defined in Python.h, with
25 Py_ prefixes to their names. Python.h can't include graminit.h
26 (which defines too many confusing symbols), but we can check here
27 that they haven't changed (which is very unlikely, but possible). */
28#if Py_single_input != single_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000029 #error "single_input has changed -- update Py_single_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000030#endif
31#if Py_file_input != file_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000032 #error "file_input has changed -- update Py_file_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000033#endif
34#if Py_eval_input != eval_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000035 #error "eval_input has changed -- update Py_eval_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000036#endif
37
Guido van Rossum8e793d91997-03-03 19:13:14 +000038int Py_OptimizeFlag = 0;
39
Guido van Rossum8861b741996-07-30 16:49:37 +000040#define OP_DELETE 0
41#define OP_ASSIGN 1
42#define OP_APPLY 2
43
Jeremy Hyltone36f7782001-01-19 03:21:30 +000044#define VAR_LOAD 0
45#define VAR_STORE 1
46#define VAR_DELETE 2
47
Jeremy Hylton64949cb2001-01-25 20:06:59 +000048#define DEL_CLOSURE_ERROR \
Jeremy Hyltoneab156f2001-01-30 01:24:43 +000049"can not delete variable '%.400s' referenced in nested scope"
50
51#define DUPLICATE_ARGUMENT \
52"duplicate argument '%s' in function definition"
53
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000054#define ILLEGAL_DYNAMIC_SCOPE \
55"%.100s: exec or 'import *' makes names ambiguous in nested scope"
Jeremy Hyltoneab156f2001-01-30 01:24:43 +000056
Jeremy Hylton29906ee2001-02-27 04:23:34 +000057#define GLOBAL_AFTER_ASSIGN \
58"name '%.400s' is assigned to before global declaration"
59
60#define GLOBAL_AFTER_USE \
61"name '%.400s' is used prior to global declaration"
62
63#define LOCAL_GLOBAL \
64"name '%.400s' is a function paramter and declared global"
65
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +000066#define LATE_FUTURE \
67"from __future__ imports must occur at the beginning of the file"
68
Jeremy Hylton897b8212001-03-23 14:08:38 +000069#define ASSIGN_DEBUG \
70"can not assign to __debug__"
71
Jeremy Hyltone36f7782001-01-19 03:21:30 +000072#define MANGLE_LEN 256
73
Guido van Rossum79f25d91997-04-29 20:08:16 +000074#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000075
76static struct memberlist code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000077 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
78 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000079 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000080 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000081 {"co_code", T_OBJECT, OFF(co_code), READONLY},
82 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
83 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000084 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Jeremy Hylton64949cb2001-01-25 20:06:59 +000085 {"co_freevars", T_OBJECT, OFF(co_freevars), READONLY},
86 {"co_cellvars", T_OBJECT, OFF(co_cellvars), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000087 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000088 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000089 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
90 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000091 {NULL} /* Sentinel */
92};
93
Guido van Rossum79f25d91997-04-29 20:08:16 +000094static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000095code_getattr(PyCodeObject *co, char *name)
Guido van Rossum3f5da241990-12-20 15:06:42 +000096{
Guido van Rossum79f25d91997-04-29 20:08:16 +000097 return PyMember_Get((char *)co, code_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +000098}
Guido van Rossum10dc2e81990-11-18 17:27:39 +000099
100static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000101code_dealloc(PyCodeObject *co)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000102{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000103 Py_XDECREF(co->co_code);
104 Py_XDECREF(co->co_consts);
105 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +0000106 Py_XDECREF(co->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000107 Py_XDECREF(co->co_freevars);
108 Py_XDECREF(co->co_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000109 Py_XDECREF(co->co_filename);
110 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +0000111 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000112 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000113}
114
Guido van Rossum79f25d91997-04-29 20:08:16 +0000115static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000116code_repr(PyCodeObject *co)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000117{
118 char buf[500];
119 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000120 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000121 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000122
Guido van Rossuma396a882000-04-07 01:21:36 +0000123 if (co->co_firstlineno != 0)
124 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000125 if (co->co_filename && PyString_Check(co->co_filename))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000126 filename = PyString_AS_STRING(co->co_filename);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000127 if (co->co_name && PyString_Check(co->co_name))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000128 name = PyString_AS_STRING(co->co_name);
Fred Drake615ae552000-06-30 16:20:13 +0000129 sprintf(buf, "<code object %.100s at %p, file \"%.300s\", line %d>",
130 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000131 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000132}
133
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000134static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000135code_compare(PyCodeObject *co, PyCodeObject *cp)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000136{
137 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000138 cmp = PyObject_Compare(co->co_name, cp->co_name);
139 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000140 cmp = co->co_argcount - cp->co_argcount;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000141 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000142 cmp = co->co_nlocals - cp->co_nlocals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000143 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000144 cmp = co->co_flags - cp->co_flags;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000145 if (cmp) return cmp;
Guido van Rossumd076c731998-10-07 19:42:25 +0000146 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000147 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000148 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000149 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000150 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000151 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000152 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000153 if (cmp) return cmp;
154 cmp = PyObject_Compare(co->co_freevars, cp->co_freevars);
155 if (cmp) return cmp;
156 cmp = PyObject_Compare(co->co_cellvars, cp->co_cellvars);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000157 return cmp;
158}
159
160static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000161code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000162{
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000163 long h, h0, h1, h2, h3, h4, h5, h6;
Guido van Rossum44679592000-04-10 16:20:31 +0000164 h0 = PyObject_Hash(co->co_name);
165 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000166 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000167 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000168 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000169 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000170 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000171 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000172 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000173 if (h4 == -1) return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000174 h5 = PyObject_Hash(co->co_freevars);
175 if (h5 == -1) return -1;
176 h6 = PyObject_Hash(co->co_cellvars);
177 if (h6 == -1) return -1;
178 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^ h5 ^ h6 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000179 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000180 if (h == -1) h = -2;
181 return h;
182}
183
Jeremy Hylton78891072001-03-01 06:09:34 +0000184/* XXX code objects need to participate in GC? */
185
Guido van Rossum79f25d91997-04-29 20:08:16 +0000186PyTypeObject PyCode_Type = {
187 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000188 0,
189 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000190 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000191 0,
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000192 (destructor)code_dealloc, /*tp_dealloc*/
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000193 0, /*tp_print*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000194 (getattrfunc)code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000195 0, /*tp_setattr*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000196 (cmpfunc)code_compare, /*tp_compare*/
197 (reprfunc)code_repr, /*tp_repr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000198 0, /*tp_as_number*/
199 0, /*tp_as_sequence*/
200 0, /*tp_as_mapping*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000201 (hashfunc)code_hash, /*tp_hash*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000202};
203
Guido van Rossum644a12b1997-04-09 19:24:53 +0000204#define NAME_CHARS \
205 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
206
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000207/* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
208
209static int
210all_name_chars(unsigned char *s)
211{
Guido van Rossumcd90c202001-02-09 15:06:42 +0000212 static char ok_name_char[256];
213 static unsigned char *name_chars = (unsigned char *)NAME_CHARS;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000214
Guido van Rossumcd90c202001-02-09 15:06:42 +0000215 if (ok_name_char[*name_chars] == 0) {
216 unsigned char *p;
217 for (p = name_chars; *p; p++)
218 ok_name_char[*p] = 1;
219 }
220 while (*s) {
221 if (ok_name_char[*s++] == 0)
222 return 0;
223 }
224 return 1;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000225}
226
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000227static int
228intern_strings(PyObject *tuple)
229{
230 int i;
231
232 for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) {
233 PyObject *v = PyTuple_GET_ITEM(tuple, i);
234 if (v == NULL || !PyString_Check(v)) {
235 Py_FatalError("non-string found in code slot");
236 PyErr_BadInternalCall();
237 return -1;
238 }
239 PyString_InternInPlace(&PyTuple_GET_ITEM(tuple, i));
240 }
241 return 0;
242}
243
Guido van Rossum79f25d91997-04-29 20:08:16 +0000244PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000245PyCode_New(int argcount, int nlocals, int stacksize, int flags,
246 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000247 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
248 PyObject *filename, PyObject *name, int firstlineno,
249 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000250{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000251 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000252 int i;
Guido van Rossumd076c731998-10-07 19:42:25 +0000253 PyBufferProcs *pb;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000254 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000255 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000256 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000257 consts == NULL || !PyTuple_Check(consts) ||
258 names == NULL || !PyTuple_Check(names) ||
259 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000260 freevars == NULL || !PyTuple_Check(freevars) ||
261 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000262 name == NULL || !PyString_Check(name) ||
263 filename == NULL || !PyString_Check(filename) ||
264 lnotab == NULL || !PyString_Check(lnotab)) {
265 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000266 return NULL;
267 }
Guido van Rossumd076c731998-10-07 19:42:25 +0000268 pb = code->ob_type->tp_as_buffer;
269 if (pb == NULL ||
270 pb->bf_getreadbuffer == NULL ||
271 pb->bf_getsegcount == NULL ||
272 (*pb->bf_getsegcount)(code, NULL) != 1)
273 {
274 PyErr_BadInternalCall();
275 return NULL;
276 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000277 intern_strings(names);
278 intern_strings(varnames);
279 if (freevars == NULL)
280 freevars = PyTuple_New(0);
281 intern_strings(freevars);
282 if (cellvars == NULL)
283 cellvars = PyTuple_New(0);
284 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000285 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000286 for (i = PyTuple_Size(consts); --i >= 0; ) {
287 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000288 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000289 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000290 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000291 continue;
292 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000293 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000294 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000295 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000296 co->co_argcount = argcount;
297 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000298 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000299 co->co_flags = flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000300 Py_INCREF(code);
Guido van Rossumd076c731998-10-07 19:42:25 +0000301 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000302 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000303 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000304 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000305 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000306 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000307 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000308 Py_INCREF(freevars);
309 co->co_freevars = freevars;
310 Py_INCREF(cellvars);
311 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000312 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000313 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000314 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000315 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000316 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000317 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000318 co->co_lnotab = lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000319 }
320 return co;
321}
322
323
324/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000325
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000326/* The compiler uses two passes to generate bytecodes. The first pass
327 builds the symbol table. The second pass generates the bytecode.
328
329 The first pass uses a single symtable struct. The second pass uses
330 a compiling struct for each code block. The compiling structs
331 share a reference to the symtable.
332
333 The two passes communicate via symtable_load_symbols() and via
334 is_local() and is_global(). The former initializes several slots
335 in the compiling struct: c_varnames, c_locals, c_nlocals,
336 c_argcount, c_globals, and c_flags.
337*/
338
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000339struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000340 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000341 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000342 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000343 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000344 PyObject *c_name_dict; /* inverse of c_names */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000345 PyObject *c_globals; /* dictionary (value=None) */
346 PyObject *c_locals; /* dictionary (value=localID) */
347 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000348 PyObject *c_freevars; /* dictionary (value=None) */
349 PyObject *c_cellvars; /* list */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000350 int c_nlocals; /* index of next local */
351 int c_argcount; /* number of top-level arguments */
352 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000353 int c_nexti; /* index into c_code */
354 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000355 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000356 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000357 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000358 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000359 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000360 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000361 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000362 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000363 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000364 int c_stacklevel; /* Current stack level */
365 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000366 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000367 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000368 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000369 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000370 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000371 int c_nested; /* Is block nested funcdef or lamdef? */
372 int c_closure; /* Is nested w/freevars? */
373 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000374 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000375};
376
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000377int is_free(int v)
378{
379 if ((v & (USE | DEF_FREE))
380 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
381 return 1;
382 if (v & DEF_FREE_CLASS)
383 return 1;
384 return 0;
385}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000386
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000387static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000388com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000389{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000390 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
391
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000392 if (c == NULL) {
393 /* Error occurred via symtable call to
394 is_constant_false */
395 PyErr_SetString(exc, msg);
396 return;
397 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000398 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000399 if (c->c_lineno < 1 || c->c_interactive) {
400 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000401 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000402 return;
403 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000404 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000405 if (v == NULL)
406 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000407
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000408 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000409 if (line == NULL) {
410 Py_INCREF(Py_None);
411 line = Py_None;
412 }
413 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
414 Py_None, line);
415 if (t == NULL)
416 goto exit;
417 w = Py_BuildValue("(OO)", v, t);
418 if (w == NULL)
419 goto exit;
420 PyErr_SetObject(exc, w);
421 exit:
422 Py_XDECREF(t);
423 Py_XDECREF(v);
424 Py_XDECREF(w);
425 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000426}
427
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000428/* Interface to the block stack */
429
430static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000431block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000432{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000433 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000434 com_error(c, PyExc_SystemError,
435 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000436 }
437 else {
438 c->c_block[c->c_nblocks++] = type;
439 }
440}
441
442static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000443block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000444{
445 if (c->c_nblocks > 0)
446 c->c_nblocks--;
447 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000448 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000449 }
450}
451
Guido van Rossum681d79a1995-07-18 14:51:37 +0000452/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000453
Tim Petersdbd9ba62000-07-09 03:09:57 +0000454static int com_init(struct compiling *, char *);
455static void com_free(struct compiling *);
456static void com_push(struct compiling *, int);
457static void com_pop(struct compiling *, int);
458static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000459static void com_node(struct compiling *, node *);
460static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000461static void com_addbyte(struct compiling *, int);
462static void com_addint(struct compiling *, int);
463static void com_addoparg(struct compiling *, int, int);
464static void com_addfwref(struct compiling *, int, int *);
465static void com_backpatch(struct compiling *, int);
466static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
467static int com_addconst(struct compiling *, PyObject *);
468static int com_addname(struct compiling *, PyObject *);
469static void com_addopname(struct compiling *, int, node *);
470static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000471static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000472static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000473static void com_assign(struct compiling *, node *, int, node *);
474static void com_assign_name(struct compiling *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000475static PyCodeObject *icompile(node *, struct compiling *);
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000476static PyCodeObject *jcompile(node *, char *, struct compiling *,
477 PyCompilerFlags *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000478static PyObject *parsestrplus(node *);
479static PyObject *parsestr(char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000480static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000481
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000482static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000483
484/* symtable operations */
485static int symtable_build(struct compiling *, node *);
486static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000487static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000488static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000489static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000490static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000491static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000492
493static void symtable_node(struct symtable *, node *);
494static void symtable_funcdef(struct symtable *, node *);
495static void symtable_default_args(struct symtable *, node *);
496static void symtable_params(struct symtable *, node *);
497static void symtable_params_fplist(struct symtable *, node *n);
498static void symtable_global(struct symtable *, node *);
499static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000500static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000501static void symtable_list_comprehension(struct symtable *, node *);
502
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000503static int symtable_update_free_vars(struct symtable *);
504static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
505static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
506
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000507/* helper */
508static void
509do_pad(int pad)
510{
511 int i;
512 for (i = 0; i < pad; ++i)
513 fprintf(stderr, " ");
514}
515
516static void
517dump(node *n, int pad, int depth)
518{
519 int i;
520 if (depth == 0)
521 return;
522 do_pad(pad);
523 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
524 if (depth > 0)
525 depth--;
526 for (i = 0; i < NCH(n); ++i)
527 dump(CHILD(n, i), pad + 1, depth);
528}
529
530#define DUMP(N) dump(N, 0, -1)
531
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000532static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000533com_init(struct compiling *c, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000534{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000535 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000536 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
537 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000538 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000539 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000540 goto fail;
541 if ((c->c_const_dict = PyDict_New()) == NULL)
542 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000543 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000544 goto fail;
545 if ((c->c_name_dict = PyDict_New()) == NULL)
546 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000547 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000548 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000549 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
550 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000551 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000552 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000553 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000554 c->c_freevars = NULL;
555 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000556 c->c_nlocals = 0;
557 c->c_argcount = 0;
558 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000559 c->c_nexti = 0;
560 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000561 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000562 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000563 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000564 c->c_begin = 0;
565 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000566 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000567 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000568 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000569 c->c_stacklevel = 0;
570 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000571 c->c_firstlineno = 0;
572 c->c_last_addr = 0;
573 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000574 c->c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000575 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000576 c->c_nested = 0;
577 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000578 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000579 return 1;
580
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000581 fail:
582 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000583 return 0;
584}
585
586static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000587com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000588{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000589 Py_XDECREF(c->c_code);
590 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000591 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000592 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000593 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000594 Py_XDECREF(c->c_globals);
595 Py_XDECREF(c->c_locals);
596 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000597 Py_XDECREF(c->c_freevars);
598 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000599 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +0000600 if (c->c_future)
601 PyMem_Free((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000602}
603
604static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000605com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000606{
607 c->c_stacklevel += n;
608 if (c->c_stacklevel > c->c_maxstacklevel)
609 c->c_maxstacklevel = c->c_stacklevel;
610}
611
612static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000613com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000614{
615 if (c->c_stacklevel < n) {
Guido van Rossum90f827c1998-08-25 18:22:17 +0000616 /* fprintf(stderr,
Guido van Rossum8b993a91997-01-17 21:04:03 +0000617 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
618 c->c_filename, c->c_lineno,
Guido van Rossum90f827c1998-08-25 18:22:17 +0000619 c->c_nexti, c->c_stacklevel, n); */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000620 c->c_stacklevel = 0;
621 }
622 else
623 c->c_stacklevel -= n;
624}
625
626static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000627com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000628{
629 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000630 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000631 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000632 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000633}
634
635static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000636com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000637{
638 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000639 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000640 assert(byte >= 0 && byte <= 255);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000641 if (byte < 0 || byte > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000642 com_error(c, PyExc_SystemError,
643 "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000644 }
645 if (c->c_code == NULL)
646 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000647 len = PyString_Size(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000648 if (c->c_nexti >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000649 if (_PyString_Resize(&c->c_code, len+1000) != 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000650 c->c_errors++;
651 return;
652 }
653 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000654 PyString_AsString(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000655}
656
657static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000658com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000659{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000660 com_addbyte(c, x & 0xff);
661 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000662}
663
664static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000665com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000666{
667 int size;
668 char *p;
669 if (c->c_lnotab == NULL)
670 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000671 size = PyString_Size(c->c_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000672 if (c->c_lnotab_next+2 > size) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000673 if (_PyString_Resize(&c->c_lnotab, size + 1000) < 0) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000674 c->c_errors++;
675 return;
676 }
677 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000678 p = PyString_AsString(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000679 *p++ = addr;
680 *p++ = line;
681 c->c_lnotab_next += 2;
682}
683
684static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000685com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000686{
687 c->c_lineno = lineno;
688 if (c->c_firstlineno == 0) {
689 c->c_firstlineno = c->c_last_line = lineno;
690 }
691 else {
692 int incr_addr = c->c_nexti - c->c_last_addr;
693 int incr_line = lineno - c->c_last_line;
694 while (incr_addr > 0 || incr_line > 0) {
695 int trunc_addr = incr_addr;
696 int trunc_line = incr_line;
697 if (trunc_addr > 255)
698 trunc_addr = 255;
699 if (trunc_line > 255)
700 trunc_line = 255;
701 com_add_lnotab(c, trunc_addr, trunc_line);
702 incr_addr -= trunc_addr;
703 incr_line -= trunc_line;
704 }
705 c->c_last_addr = c->c_nexti;
706 c->c_last_line = lineno;
707 }
708}
709
710static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000711com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000712{
Fred Drakeef8ace32000-08-24 00:32:09 +0000713 int extended_arg = arg >> 16;
Guido van Rossum8e793d91997-03-03 19:13:14 +0000714 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000715 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000716 if (Py_OptimizeFlag)
717 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000718 }
Fred Drakeef8ace32000-08-24 00:32:09 +0000719 if (extended_arg){
720 com_addbyte(c, EXTENDED_ARG);
721 com_addint(c, extended_arg);
722 arg &= 0xffff;
723 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000724 com_addbyte(c, op);
725 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000726}
727
728static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000729com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000730{
731 /* Compile a forward reference for backpatching */
732 int here;
733 int anchor;
734 com_addbyte(c, op);
735 here = c->c_nexti;
736 anchor = *p_anchor;
737 *p_anchor = here;
738 com_addint(c, anchor == 0 ? 0 : here - anchor);
739}
740
741static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000742com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000743{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000744 unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000745 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000746 int dist;
747 int prev;
748 for (;;) {
749 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000750 prev = code[anchor] + (code[anchor+1] << 8);
751 dist = target - (anchor+2);
752 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +0000753 dist >>= 8;
754 code[anchor+1] = dist;
755 dist >>= 8;
756 if (dist) {
757 com_error(c, PyExc_SystemError,
758 "com_backpatch: offset too large");
759 break;
760 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000761 if (!prev)
762 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000763 anchor -= prev;
764 }
765}
766
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000767/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000768
769static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000770com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000771{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000772 PyObject *w, *t, *np=NULL;
773 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000774
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000775 t = Py_BuildValue("(OO)", v, v->ob_type);
776 if (t == NULL)
777 goto fail;
778 w = PyDict_GetItem(dict, t);
779 if (w != NULL) {
780 n = PyInt_AsLong(w);
781 } else {
782 n = PyList_Size(list);
783 np = PyInt_FromLong(n);
784 if (np == NULL)
785 goto fail;
786 if (PyList_Append(list, v) != 0)
787 goto fail;
788 if (PyDict_SetItem(dict, t, np) != 0)
789 goto fail;
790 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000791 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000792 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000793 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000794 fail:
795 Py_XDECREF(np);
796 Py_XDECREF(t);
797 c->c_errors++;
798 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000799}
800
801static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000802com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000803{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000804 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000805}
806
807static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000808com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000809{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000810 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000811}
812
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000813static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000814mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000815{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000816 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000817 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +0000818 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000819 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
820 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000821 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000822 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000823 return 0; /* Don't mangle __extremely_long_names */
824 if (name[nlen-1] == '_' && name[nlen-2] == '_')
825 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000826 /* Strip leading underscores from class name */
827 while (*p == '_')
828 p++;
829 if (*p == '\0')
830 return 0; /* Don't mangle if class is just underscores */
831 plen = strlen(p);
832 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000833 plen = maxlen-nlen-2; /* Truncate class name if too long */
834 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000835 buffer[0] = '_';
836 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000837 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000838 return 1;
839}
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000840
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000841static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000842com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000843{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000844 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000845 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000846 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000847
848 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000849 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000850 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000851 c->c_errors++;
852 i = 255;
853 }
854 else {
855 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000856 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000857 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000858 com_addoparg(c, op, i);
859}
860
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000861#define NAME_LOCAL 0
862#define NAME_GLOBAL 1
863#define NAME_DEFAULT 2
864#define NAME_CLOSURE 3
865
866static int
867com_lookup_arg(PyObject *dict, PyObject *name)
868{
869 PyObject *v = PyDict_GetItem(dict, name);
870 if (v == NULL)
871 return -1;
872 else
873 return PyInt_AS_LONG(v);
874}
875
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000876static void
877com_addop_varname(struct compiling *c, int kind, char *name)
878{
879 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000880 int i, reftype;
881 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000882 int op = STOP_CODE;
883 char buffer[MANGLE_LEN];
884
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000885 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000886 name = buffer;
887 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
888 c->c_errors++;
889 i = 255;
890 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000891 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000892
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000893 reftype = get_ref_type(c, name);
894 switch (reftype) {
895 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000896 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000897 scope = NAME_LOCAL;
898 break;
899 case GLOBAL_EXPLICIT:
900 scope = NAME_GLOBAL;
901 break;
902 case GLOBAL_IMPLICIT:
903 if (c->c_flags & CO_OPTIMIZED)
904 scope = NAME_GLOBAL;
905 break;
906 case FREE:
907 case CELL:
908 scope = NAME_CLOSURE;
909 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000910 }
911
912 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000913 if (scope == NAME_LOCAL)
914 i = com_lookup_arg(c->c_locals, v);
915 else if (reftype == FREE)
916 i = com_lookup_arg(c->c_freevars, v);
917 else if (reftype == CELL)
918 i = com_lookup_arg(c->c_cellvars, v);
919 if (i == -1) {
920 c->c_errors++; /* XXX no exception set */
921 i = 255;
922 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000923 }
924 Py_DECREF(v);
925
926 switch (kind) {
927 case VAR_LOAD:
928 switch (scope) {
929 case NAME_LOCAL:
930 op = LOAD_FAST;
931 break;
932 case NAME_GLOBAL:
933 op = LOAD_GLOBAL;
934 break;
935 case NAME_DEFAULT:
936 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000937 break;
938 case NAME_CLOSURE:
939 op = LOAD_DEREF;
940 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000941 }
942 break;
943 case VAR_STORE:
944 switch (scope) {
945 case NAME_LOCAL:
946 op = STORE_FAST;
947 break;
948 case NAME_GLOBAL:
949 op = STORE_GLOBAL;
950 break;
951 case NAME_DEFAULT:
952 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000953 break;
954 case NAME_CLOSURE:
955 op = STORE_DEREF;
956 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000957 }
958 break;
959 case VAR_DELETE:
960 switch (scope) {
961 case NAME_LOCAL:
962 op = DELETE_FAST;
963 break;
964 case NAME_GLOBAL:
965 op = DELETE_GLOBAL;
966 break;
967 case NAME_DEFAULT:
968 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000969 break;
970 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000971 char buf[500];
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000972 sprintf(buf, DEL_CLOSURE_ERROR, name);
973 com_error(c, PyExc_SyntaxError, buf);
974 i = 255;
975 break;
976 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000977 }
978 break;
979 }
980done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000981 com_addoparg(c, op, i);
982}
983
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000984static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000985com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000986{
Guido van Rossum1f4fa501995-01-07 12:41:23 +0000987 char *name;
988 char buffer[1000];
989 /* XXX it is possible to write this code without the 1000
990 chars on the total length of dotted names, I just can't be
991 bothered right now */
992 if (TYPE(n) == STAR)
993 name = "*";
994 else if (TYPE(n) == dotted_name) {
995 char *p = buffer;
996 int i;
997 name = buffer;
998 for (i = 0; i < NCH(n); i += 2) {
999 char *s = STR(CHILD(n, i));
1000 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001001 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001002 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001003 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001004 break;
1005 }
1006 if (p != buffer)
1007 *p++ = '.';
1008 strcpy(p, s);
1009 p = strchr(p, '\0');
1010 }
1011 }
1012 else {
1013 REQ(n, NAME);
1014 name = STR(n);
1015 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001016 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001017}
1018
Guido van Rossum79f25d91997-04-29 20:08:16 +00001019static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001020parsenumber(struct compiling *co, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001021{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001022 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001023 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001024 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001025#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +00001026 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +00001027 int imflag;
1028#endif
1029
Guido van Rossum282914b1991-04-04 10:42:56 +00001030 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001031 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001032#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001033 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001034#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001035 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001036 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001037 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001038 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001039 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001040 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001041 if (*end == '\0') {
1042 if (errno != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001043 com_error(co, PyExc_OverflowError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001044 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +00001045 return NULL;
1046 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001047 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001048 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001049 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001050#ifndef WITHOUT_COMPLEX
1051 if (imflag) {
1052 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001053 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +00001054 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001055 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001056 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +00001057 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001058 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001059#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001060 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001061 PyFPE_START_PROTECT("atof", return 0)
1062 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001063 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001064 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001065 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001066}
1067
Guido van Rossum79f25d91997-04-29 20:08:16 +00001068static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001069parsestr(char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001070{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001071 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001072 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001073 char *buf;
1074 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001075 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001076 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001077 int first = *s;
1078 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001079 int rawmode = 0;
1080 int unicode = 0;
1081 if (isalpha(quote) || quote == '_') {
1082 if (quote == 'u' || quote == 'U') {
1083 quote = *++s;
1084 unicode = 1;
1085 }
1086 if (quote == 'r' || quote == 'R') {
1087 quote = *++s;
1088 rawmode = 1;
1089 }
1090 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001091 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001092 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001093 return NULL;
1094 }
1095 s++;
1096 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001097 if (len > INT_MAX) {
1098 PyErr_SetString(PyExc_OverflowError, "string to parse is too long");
1099 return NULL;
1100 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001101 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001102 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001103 return NULL;
1104 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001105 if (len >= 4 && s[0] == quote && s[1] == quote) {
1106 s += 2;
1107 len -= 2;
1108 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001109 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001110 return NULL;
1111 }
1112 }
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001113 if (unicode || Py_UnicodeFlag) {
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001114 if (rawmode)
1115 return PyUnicode_DecodeRawUnicodeEscape(
1116 s, len, NULL);
1117 else
1118 return PyUnicode_DecodeUnicodeEscape(
1119 s, len, NULL);
1120 }
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001121 if (rawmode || strchr(s, '\\') == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001122 return PyString_FromStringAndSize(s, len);
1123 v = PyString_FromStringAndSize((char *)NULL, len);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001124 if (v == NULL)
1125 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001126 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001127 end = s + len;
1128 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001129 if (*s != '\\') {
1130 *p++ = *s++;
1131 continue;
1132 }
1133 s++;
1134 switch (*s++) {
1135 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001136 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001137 case '\\': *p++ = '\\'; break;
1138 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +00001139 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001140 case 'b': *p++ = '\b'; break;
1141 case 'f': *p++ = '\014'; break; /* FF */
1142 case 't': *p++ = '\t'; break;
1143 case 'n': *p++ = '\n'; break;
1144 case 'r': *p++ = '\r'; break;
1145 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001146 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
1147 case '0': case '1': case '2': case '3':
1148 case '4': case '5': case '6': case '7':
1149 c = s[-1] - '0';
1150 if ('0' <= *s && *s <= '7') {
1151 c = (c<<3) + *s++ - '0';
1152 if ('0' <= *s && *s <= '7')
1153 c = (c<<3) + *s++ - '0';
1154 }
1155 *p++ = c;
1156 break;
1157 case 'x':
Jeremy Hylton4419ac12001-02-28 22:54:51 +00001158 if (isxdigit(Py_CHARMASK(s[0]))
1159 && isxdigit(Py_CHARMASK(s[1]))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +00001160 unsigned int x = 0;
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001161 c = Py_CHARMASK(*s);
1162 s++;
1163 if (isdigit(c))
1164 x = c - '0';
1165 else if (islower(c))
1166 x = 10 + c - 'a';
1167 else
1168 x = 10 + c - 'A';
1169 x = x << 4;
1170 c = Py_CHARMASK(*s);
1171 s++;
1172 if (isdigit(c))
1173 x += c - '0';
1174 else if (islower(c))
1175 x += 10 + c - 'a';
1176 else
1177 x += 10 + c - 'A';
Guido van Rossumed1100f1997-10-20 23:24:07 +00001178 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001179 break;
1180 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00001181 PyErr_SetString(PyExc_ValueError,
1182 "invalid \\x escape");
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001183 Py_DECREF(v);
1184 return NULL;
1185 default:
1186 *p++ = '\\';
1187 *p++ = s[-1];
1188 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001189 }
1190 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001191 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001192 return v;
1193}
1194
Guido van Rossum79f25d91997-04-29 20:08:16 +00001195static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001196parsestrplus(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001197{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001198 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001199 int i;
1200 REQ(CHILD(n, 0), STRING);
1201 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
1202 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001203 for (i = 1; i < NCH(n); i++) {
1204 PyObject *s;
1205 s = parsestr(STR(CHILD(n, i)));
1206 if (s == NULL)
1207 goto onError;
1208 if (PyString_Check(v) && PyString_Check(s)) {
1209 PyString_ConcatAndDel(&v, s);
1210 if (v == NULL)
1211 goto onError;
1212 }
1213 else {
1214 PyObject *temp;
1215 temp = PyUnicode_Concat(v, s);
1216 Py_DECREF(s);
1217 if (temp == NULL)
1218 goto onError;
1219 Py_DECREF(v);
1220 v = temp;
1221 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001222 }
1223 }
1224 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001225
1226 onError:
1227 Py_XDECREF(v);
1228 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001229}
1230
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001231static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001232com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001233{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001234 PyObject *v;
1235 int anchor = 0;
1236 int save_begin = c->c_begin;
1237
1238 /* list_iter: for v in expr [list_iter] */
1239 com_node(c, CHILD(n, 3)); /* expr */
1240 v = PyInt_FromLong(0L);
1241 if (v == NULL)
1242 c->c_errors++;
1243 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
1244 com_push(c, 1);
1245 Py_XDECREF(v);
1246 c->c_begin = c->c_nexti;
1247 com_addoparg(c, SET_LINENO, n->n_lineno);
1248 com_addfwref(c, FOR_LOOP, &anchor);
1249 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001250 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001251 c->c_loops++;
1252 com_list_iter(c, n, e, t);
1253 c->c_loops--;
1254 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1255 c->c_begin = save_begin;
1256 com_backpatch(c, anchor);
1257 com_pop(c, 2); /* FOR_LOOP has popped these */
1258}
1259
1260static void
1261com_list_if(struct compiling *c, node *n, node *e, char *t)
1262{
1263 int anchor = 0;
1264 int a = 0;
1265 /* list_iter: 'if' test [list_iter] */
1266 com_addoparg(c, SET_LINENO, n->n_lineno);
1267 com_node(c, CHILD(n, 1));
1268 com_addfwref(c, JUMP_IF_FALSE, &a);
1269 com_addbyte(c, POP_TOP);
1270 com_pop(c, 1);
1271 com_list_iter(c, n, e, t);
1272 com_addfwref(c, JUMP_FORWARD, &anchor);
1273 com_backpatch(c, a);
1274 /* We jump here with an extra entry which we now pop */
1275 com_addbyte(c, POP_TOP);
1276 com_backpatch(c, anchor);
1277}
1278
1279static void
1280com_list_iter(struct compiling *c,
1281 node *p, /* parent of list_iter node */
1282 node *e, /* element expression node */
1283 char *t /* name of result list temp local */)
1284{
1285 /* list_iter is the last child in a listmaker, list_for, or list_if */
1286 node *n = CHILD(p, NCH(p)-1);
1287 if (TYPE(n) == list_iter) {
1288 n = CHILD(n, 0);
1289 switch (TYPE(n)) {
1290 case list_for:
1291 com_list_for(c, n, e, t);
1292 break;
1293 case list_if:
1294 com_list_if(c, n, e, t);
1295 break;
1296 default:
1297 com_error(c, PyExc_SystemError,
1298 "invalid list_iter node type");
1299 }
1300 }
1301 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001302 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001303 com_push(c, 1);
1304 com_node(c, e);
1305 com_addoparg(c, CALL_FUNCTION, 1);
1306 com_addbyte(c, POP_TOP);
1307 com_pop(c, 2);
1308 }
1309}
1310
1311static void
1312com_list_comprehension(struct compiling *c, node *n)
1313{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001314 /* listmaker: test list_for */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001315 char tmpname[12];
Tim Peters30814212001-02-17 05:30:26 +00001316 sprintf(tmpname, "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001317 com_addoparg(c, BUILD_LIST, 0);
1318 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1319 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001320 com_addop_name(c, LOAD_ATTR, "append");
1321 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001322 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001323 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001324 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001325 --c->c_tmpname;
1326}
1327
1328static void
1329com_listmaker(struct compiling *c, node *n)
1330{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001331 /* listmaker: test ( list_for | (',' test)* [','] ) */
1332 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001333 com_list_comprehension(c, n);
1334 else {
1335 int len = 0;
1336 int i;
1337 for (i = 0; i < NCH(n); i += 2, len++)
1338 com_node(c, CHILD(n, i));
1339 com_addoparg(c, BUILD_LIST, len);
1340 com_pop(c, len-1);
1341 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001342}
1343
1344static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001345com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001346{
1347 int i;
1348 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1349 for (i = 0; i+2 < NCH(n); i += 4) {
1350 /* We must arrange things just right for STORE_SUBSCR.
1351 It wants the stack to look like (value) (dict) (key) */
1352 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001353 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001354 com_node(c, CHILD(n, i+2)); /* value */
1355 com_addbyte(c, ROT_TWO);
1356 com_node(c, CHILD(n, i)); /* key */
1357 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001358 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001359 }
1360}
1361
1362static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001363com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001364{
1365 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001366 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001367 int i;
1368 REQ(n, atom);
1369 ch = CHILD(n, 0);
1370 switch (TYPE(ch)) {
1371 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001372 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001373 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001374 com_push(c, 1);
1375 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001376 else
1377 com_node(c, CHILD(n, 1));
1378 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001379 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001380 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001381 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001382 com_push(c, 1);
1383 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001384 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001385 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001386 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001387 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001388 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001389 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001390 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001391 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001392 break;
1393 case BACKQUOTE:
1394 com_node(c, CHILD(n, 1));
1395 com_addbyte(c, UNARY_CONVERT);
1396 break;
1397 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001398 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001399 i = 255;
1400 }
1401 else {
1402 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001403 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001404 }
1405 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001406 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001407 break;
1408 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001409 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001410 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001411 c->c_errors++;
1412 i = 255;
1413 }
1414 else {
1415 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001416 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001417 }
1418 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001419 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001420 break;
1421 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001422 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001423 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001424 break;
1425 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001426 com_error(c, PyExc_SystemError,
1427 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001428 }
1429}
1430
1431static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001432com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001433{
1434 if (NCH(n) == 1) {
1435 com_addbyte(c, op);
1436 }
1437 else if (NCH(n) == 2) {
1438 if (TYPE(CHILD(n, 0)) != COLON) {
1439 com_node(c, CHILD(n, 0));
1440 com_addbyte(c, op+1);
1441 }
1442 else {
1443 com_node(c, CHILD(n, 1));
1444 com_addbyte(c, op+2);
1445 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001446 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001447 }
1448 else {
1449 com_node(c, CHILD(n, 0));
1450 com_node(c, CHILD(n, 2));
1451 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001452 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001453 }
1454}
1455
Guido van Rossum635abd21997-01-06 22:56:52 +00001456static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001457com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1458{
1459 if (NCH(n) == 1) {
1460 com_addbyte(c, DUP_TOP);
1461 com_push(c, 1);
1462 com_addbyte(c, SLICE);
1463 com_node(c, augn);
1464 com_addbyte(c, opcode);
1465 com_pop(c, 1);
1466 com_addbyte(c, ROT_TWO);
1467 com_addbyte(c, STORE_SLICE);
1468 com_pop(c, 2);
1469 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1470 com_node(c, CHILD(n, 0));
1471 com_addoparg(c, DUP_TOPX, 2);
1472 com_push(c, 2);
1473 com_addbyte(c, SLICE+1);
1474 com_pop(c, 1);
1475 com_node(c, augn);
1476 com_addbyte(c, opcode);
1477 com_pop(c, 1);
1478 com_addbyte(c, ROT_THREE);
1479 com_addbyte(c, STORE_SLICE+1);
1480 com_pop(c, 3);
1481 } else if (NCH(n) == 2) {
1482 com_node(c, CHILD(n, 1));
1483 com_addoparg(c, DUP_TOPX, 2);
1484 com_push(c, 2);
1485 com_addbyte(c, SLICE+2);
1486 com_pop(c, 1);
1487 com_node(c, augn);
1488 com_addbyte(c, opcode);
1489 com_pop(c, 1);
1490 com_addbyte(c, ROT_THREE);
1491 com_addbyte(c, STORE_SLICE+2);
1492 com_pop(c, 3);
1493 } else {
1494 com_node(c, CHILD(n, 0));
1495 com_node(c, CHILD(n, 2));
1496 com_addoparg(c, DUP_TOPX, 3);
1497 com_push(c, 3);
1498 com_addbyte(c, SLICE+3);
1499 com_pop(c, 2);
1500 com_node(c, augn);
1501 com_addbyte(c, opcode);
1502 com_pop(c, 1);
1503 com_addbyte(c, ROT_FOUR);
1504 com_addbyte(c, STORE_SLICE+3);
1505 com_pop(c, 4);
1506 }
1507}
1508
1509static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001510com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001511{
1512 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001513 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001514 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001515 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001516 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001517 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001518 }
1519 else {
1520 com_node(c, CHILD(n, 0));
1521 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001522 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001523 }
1524 m = n;
1525 do {
1526 m = CHILD(m, 0);
1527 } while (NCH(m) == 1);
1528 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00001529 /* f(lambda x: x[0] = 3) ends up getting parsed with
1530 * LHS test = lambda x: x[0], and RHS test = 3.
1531 * SF bug 132313 points out that complaining about a keyword
1532 * then is very confusing.
1533 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001534 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00001535 TYPE(m) == lambdef ?
1536 "lambda cannot contain assignment" :
1537 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001538 }
1539 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001540 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001541 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001542 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001543 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001544 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001545 else if (*pkeywords == NULL) {
1546 c->c_errors++;
1547 Py_DECREF(v);
1548 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001549 if (PyDict_GetItem(*pkeywords, v) != NULL)
1550 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001551 "duplicate keyword argument");
1552 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001553 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001554 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001555 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001556 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001557 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001558 }
1559 }
1560 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001561}
1562
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001563static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001564com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001565{
1566 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001567 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001568 }
1569 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001570 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001571 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001572 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001573 int star_flag = 0;
1574 int starstar_flag = 0;
1575 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001576 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001577 na = 0;
1578 nk = 0;
1579 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001580 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001581 if (TYPE(ch) == STAR ||
1582 TYPE(ch) == DOUBLESTAR)
1583 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001584 if (ch->n_lineno != lineno) {
1585 lineno = ch->n_lineno;
1586 com_addoparg(c, SET_LINENO, lineno);
1587 }
1588 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001589 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001590 na++;
1591 else
1592 nk++;
1593 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001594 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001595 while (i < NCH(n)) {
1596 node *tok = CHILD(n, i);
1597 node *ch = CHILD(n, i+1);
1598 i += 3;
1599 switch (TYPE(tok)) {
1600 case STAR: star_flag = 1; break;
1601 case DOUBLESTAR: starstar_flag = 1; break;
1602 }
1603 com_node(c, ch);
1604 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001605 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001606 com_error(c, PyExc_SyntaxError,
1607 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001608 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001609 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001610 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001611 star_flag + (starstar_flag << 1);
1612 else
1613 opcode = CALL_FUNCTION;
1614 com_addoparg(c, opcode, na | (nk << 8));
1615 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001616 }
1617}
1618
1619static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001620com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001621{
1622 com_addopname(c, LOAD_ATTR, n);
1623}
1624
1625static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001626com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001627{
1628 int i=0;
1629 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001630 node *ch;
1631
1632 /* first argument */
1633 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001634 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001635 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001636 i++;
1637 }
1638 else {
1639 com_node(c, CHILD(n,i));
1640 i++;
1641 REQ(CHILD(n,i),COLON);
1642 i++;
1643 }
1644 /* second argument */
1645 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1646 com_node(c, CHILD(n,i));
1647 i++;
1648 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001649 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001650 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001651 com_push(c, 1);
1652 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001653 /* remaining arguments */
1654 for (; i < NCH(n); i++) {
1655 ns++;
1656 ch=CHILD(n,i);
1657 REQ(ch, sliceop);
1658 if (NCH(ch) == 1) {
1659 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001660 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001661 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001662 }
1663 else
1664 com_node(c, CHILD(ch,1));
1665 }
1666 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001667 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001668}
1669
1670static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001671com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001672{
1673 node *ch;
1674 REQ(n, subscript);
1675 ch = CHILD(n,0);
1676 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001677 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001678 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001679 com_push(c, 1);
1680 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001681 else {
1682 /* check for slice */
1683 if ((TYPE(ch) == COLON || NCH(n) > 1))
1684 com_sliceobj(c, n);
1685 else {
1686 REQ(ch, test);
1687 com_node(c, ch);
1688 }
1689 }
1690}
1691
1692static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001693com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001694{
1695 int i, op;
1696 REQ(n, subscriptlist);
1697 /* Check to make backward compatible slice behavior for '[i:j]' */
1698 if (NCH(n) == 1) {
1699 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001700 /* 'Basic' slice, should have exactly one colon. */
1701 if ((TYPE(CHILD(sub, 0)) == COLON
1702 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1703 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1704 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001705 switch (assigning) {
1706 case OP_DELETE:
1707 op = DELETE_SLICE;
1708 break;
1709 case OP_ASSIGN:
1710 op = STORE_SLICE;
1711 break;
1712 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001713 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001714 break;
1715 default:
1716 com_augassign_slice(c, sub, assigning, augn);
1717 return;
1718 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001719 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001720 if (op == STORE_SLICE)
1721 com_pop(c, 2);
1722 else if (op == DELETE_SLICE)
1723 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001724 return;
1725 }
1726 }
1727 /* Else normal subscriptlist. Compile each subscript. */
1728 for (i = 0; i < NCH(n); i += 2)
1729 com_subscript(c, CHILD(n, i));
1730 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001731 if (NCH(n) > 1) {
1732 i = (NCH(n)+1) / 2;
1733 com_addoparg(c, BUILD_TUPLE, i);
1734 com_pop(c, i-1);
1735 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001736 switch (assigning) {
1737 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001738 op = DELETE_SUBSCR;
1739 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00001740 break;
1741 default:
1742 case OP_ASSIGN:
1743 op = STORE_SUBSCR;
1744 i = 3;
1745 break;
1746 case OP_APPLY:
1747 op = BINARY_SUBSCR;
1748 i = 1;
1749 break;
1750 }
1751 if (assigning > OP_APPLY) {
1752 com_addoparg(c, DUP_TOPX, 2);
1753 com_push(c, 2);
1754 com_addbyte(c, BINARY_SUBSCR);
1755 com_pop(c, 1);
1756 com_node(c, augn);
1757 com_addbyte(c, assigning);
1758 com_pop(c, 1);
1759 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001760 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001761 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001762 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001763}
1764
1765static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001766com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001767{
1768 REQ(n, trailer);
1769 switch (TYPE(CHILD(n, 0))) {
1770 case LPAR:
1771 com_call_function(c, CHILD(n, 1));
1772 break;
1773 case DOT:
1774 com_select_member(c, CHILD(n, 1));
1775 break;
1776 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00001777 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001778 break;
1779 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001780 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001781 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001782 }
1783}
1784
1785static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001786com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001787{
1788 int i;
1789 REQ(n, power);
1790 com_atom(c, CHILD(n, 0));
1791 for (i = 1; i < NCH(n); i++) {
1792 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1793 com_factor(c, CHILD(n, i+1));
1794 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001795 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001796 break;
1797 }
1798 else
1799 com_apply_trailer(c, CHILD(n, i));
1800 }
1801}
1802
1803static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001804com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001805{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001806 REQ(n, factor);
1807 if (TYPE(CHILD(n, 0)) == PLUS) {
1808 com_factor(c, CHILD(n, 1));
1809 com_addbyte(c, UNARY_POSITIVE);
1810 }
1811 else if (TYPE(CHILD(n, 0)) == MINUS) {
1812 com_factor(c, CHILD(n, 1));
1813 com_addbyte(c, UNARY_NEGATIVE);
1814 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001815 else if (TYPE(CHILD(n, 0)) == TILDE) {
1816 com_factor(c, CHILD(n, 1));
1817 com_addbyte(c, UNARY_INVERT);
1818 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001819 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001820 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001821 }
1822}
1823
1824static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001825com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001826{
1827 int i;
1828 int op;
1829 REQ(n, term);
1830 com_factor(c, CHILD(n, 0));
1831 for (i = 2; i < NCH(n); i += 2) {
1832 com_factor(c, CHILD(n, i));
1833 switch (TYPE(CHILD(n, i-1))) {
1834 case STAR:
1835 op = BINARY_MULTIPLY;
1836 break;
1837 case SLASH:
1838 op = BINARY_DIVIDE;
1839 break;
1840 case PERCENT:
1841 op = BINARY_MODULO;
1842 break;
1843 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001844 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001845 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001846 op = 255;
1847 }
1848 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001849 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001850 }
1851}
1852
1853static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001854com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001855{
1856 int i;
1857 int op;
1858 REQ(n, arith_expr);
1859 com_term(c, CHILD(n, 0));
1860 for (i = 2; i < NCH(n); i += 2) {
1861 com_term(c, CHILD(n, i));
1862 switch (TYPE(CHILD(n, i-1))) {
1863 case PLUS:
1864 op = BINARY_ADD;
1865 break;
1866 case MINUS:
1867 op = BINARY_SUBTRACT;
1868 break;
1869 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001870 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001871 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001872 op = 255;
1873 }
1874 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001875 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001876 }
1877}
1878
1879static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001880com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001881{
1882 int i;
1883 int op;
1884 REQ(n, shift_expr);
1885 com_arith_expr(c, CHILD(n, 0));
1886 for (i = 2; i < NCH(n); i += 2) {
1887 com_arith_expr(c, CHILD(n, i));
1888 switch (TYPE(CHILD(n, i-1))) {
1889 case LEFTSHIFT:
1890 op = BINARY_LSHIFT;
1891 break;
1892 case RIGHTSHIFT:
1893 op = BINARY_RSHIFT;
1894 break;
1895 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001896 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001897 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001898 op = 255;
1899 }
1900 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001901 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001902 }
1903}
1904
1905static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001906com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001907{
1908 int i;
1909 int op;
1910 REQ(n, and_expr);
1911 com_shift_expr(c, CHILD(n, 0));
1912 for (i = 2; i < NCH(n); i += 2) {
1913 com_shift_expr(c, CHILD(n, i));
1914 if (TYPE(CHILD(n, i-1)) == AMPER) {
1915 op = BINARY_AND;
1916 }
1917 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001918 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001919 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001920 op = 255;
1921 }
1922 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001923 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001924 }
1925}
1926
1927static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001928com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001929{
1930 int i;
1931 int op;
1932 REQ(n, xor_expr);
1933 com_and_expr(c, CHILD(n, 0));
1934 for (i = 2; i < NCH(n); i += 2) {
1935 com_and_expr(c, CHILD(n, i));
1936 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1937 op = BINARY_XOR;
1938 }
1939 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001940 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001941 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001942 op = 255;
1943 }
1944 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001945 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001946 }
1947}
1948
1949static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001950com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001951{
1952 int i;
1953 int op;
1954 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001955 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001956 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001957 com_xor_expr(c, CHILD(n, i));
1958 if (TYPE(CHILD(n, i-1)) == VBAR) {
1959 op = BINARY_OR;
1960 }
1961 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001962 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001963 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001964 op = 255;
1965 }
1966 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001967 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001968 }
1969}
1970
1971static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001972cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001973{
1974 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00001975 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001976 | 'in' | 'not' 'in' | 'is' | 'is' not' */
1977 if (NCH(n) == 1) {
1978 n = CHILD(n, 0);
1979 switch (TYPE(n)) {
1980 case LESS: return LT;
1981 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001982 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001983 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00001984 case LESSEQUAL: return LE;
1985 case GREATEREQUAL: return GE;
1986 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001987 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
1988 if (strcmp(STR(n), "is") == 0) return IS;
1989 }
1990 }
1991 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001992 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001993 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1994 return NOT_IN;
1995 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1996 return IS_NOT;
1997 }
1998 }
1999 return BAD;
2000}
2001
2002static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002003com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002004{
2005 int i;
2006 enum cmp_op op;
2007 int anchor;
2008 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2009 com_expr(c, CHILD(n, 0));
2010 if (NCH(n) == 1)
2011 return;
2012
2013 /****************************************************************
2014 The following code is generated for all but the last
2015 comparison in a chain:
2016
2017 label: on stack: opcode: jump to:
2018
2019 a <code to load b>
2020 a, b DUP_TOP
2021 a, b, b ROT_THREE
2022 b, a, b COMPARE_OP
2023 b, 0-or-1 JUMP_IF_FALSE L1
2024 b, 1 POP_TOP
2025 b
2026
2027 We are now ready to repeat this sequence for the next
2028 comparison in the chain.
2029
2030 For the last we generate:
2031
2032 b <code to load c>
2033 b, c COMPARE_OP
2034 0-or-1
2035
2036 If there were any jumps to L1 (i.e., there was more than one
2037 comparison), we generate:
2038
2039 0-or-1 JUMP_FORWARD L2
2040 L1: b, 0 ROT_TWO
2041 0, b POP_TOP
2042 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002043 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002044 ****************************************************************/
2045
2046 anchor = 0;
2047
2048 for (i = 2; i < NCH(n); i += 2) {
2049 com_expr(c, CHILD(n, i));
2050 if (i+2 < NCH(n)) {
2051 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002052 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002053 com_addbyte(c, ROT_THREE);
2054 }
2055 op = cmp_type(CHILD(n, i-1));
2056 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002057 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002058 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002059 }
2060 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002061 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002062 if (i+2 < NCH(n)) {
2063 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2064 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002065 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002066 }
2067 }
2068
2069 if (anchor) {
2070 int anchor2 = 0;
2071 com_addfwref(c, JUMP_FORWARD, &anchor2);
2072 com_backpatch(c, anchor);
2073 com_addbyte(c, ROT_TWO);
2074 com_addbyte(c, POP_TOP);
2075 com_backpatch(c, anchor2);
2076 }
2077}
2078
2079static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002080com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002081{
2082 REQ(n, not_test); /* 'not' not_test | comparison */
2083 if (NCH(n) == 1) {
2084 com_comparison(c, CHILD(n, 0));
2085 }
2086 else {
2087 com_not_test(c, CHILD(n, 1));
2088 com_addbyte(c, UNARY_NOT);
2089 }
2090}
2091
2092static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002093com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002094{
2095 int i;
2096 int anchor;
2097 REQ(n, and_test); /* not_test ('and' not_test)* */
2098 anchor = 0;
2099 i = 0;
2100 for (;;) {
2101 com_not_test(c, CHILD(n, i));
2102 if ((i += 2) >= NCH(n))
2103 break;
2104 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2105 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002106 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002107 }
2108 if (anchor)
2109 com_backpatch(c, anchor);
2110}
2111
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002112static int
2113com_make_closure(struct compiling *c, PyCodeObject *co)
2114{
2115 int i, free = PyTuple_GET_SIZE(co->co_freevars);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002116 /* If the code is compiled with st->st_nested_scopes == 0,
2117 then no variable will ever be added to co_freevars.
2118 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002119 if (free == 0)
2120 return 0;
2121 for (i = 0; i < free; ++i) {
2122 /* Bypass com_addop_varname because it will generate
2123 LOAD_DEREF but LOAD_CLOSURE is needed.
2124 */
2125 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2126 int arg, reftype;
2127
2128 /* Special case: If a class contains a method with a
2129 free variable that has the same name as a method,
2130 the name will be considered free *and* local in the
2131 class. It should be handled by the closure, as
2132 well as by the normal name loookup logic.
2133 */
2134 reftype = get_ref_type(c, PyString_AS_STRING(name));
2135 if (reftype == CELL)
2136 arg = com_lookup_arg(c->c_cellvars, name);
2137 else /* (reftype == FREE) */
2138 arg = com_lookup_arg(c->c_freevars, name);
2139 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002140 fprintf(stderr, "lookup %s in %s %d %d\n"
2141 "freevars of %s: %s\n",
2142 PyObject_REPR(name),
2143 c->c_name,
2144 reftype, arg,
2145 PyString_AS_STRING(co->co_name),
2146 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002147 Py_FatalError("com_make_closure()");
2148 }
2149 com_addoparg(c, LOAD_CLOSURE, arg);
2150
2151 }
2152 com_push(c, free);
2153 return 1;
2154}
2155
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002156static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002157com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002158{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002159 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002160 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002161 PyObject *co;
2162 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002163 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002164 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2165 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002166 co = (PyObject *) icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002167 if (co == NULL) {
2168 c->c_errors++;
2169 return;
2170 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002171 symtable_exit_scope(c->c_symtable);
Tim Peters1e542112001-02-23 22:23:53 +00002172 i = com_addconst(c, co);
2173 closure = com_make_closure(c, (PyCodeObject *)co);
2174 Py_DECREF(co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002175 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002176 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002177 if (closure)
2178 com_addoparg(c, MAKE_CLOSURE, ndefs);
2179 else
2180 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002181 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002182 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002183 else {
2184 int anchor = 0;
2185 int i = 0;
2186 for (;;) {
2187 com_and_test(c, CHILD(n, i));
2188 if ((i += 2) >= NCH(n))
2189 break;
2190 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2191 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002192 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002193 }
2194 if (anchor)
2195 com_backpatch(c, anchor);
2196 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002197}
2198
2199static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002200com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002201{
2202 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002203 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002204 com_node(c, CHILD(n, 0));
2205 }
2206 else {
2207 int i;
2208 int len;
2209 len = (NCH(n) + 1) / 2;
2210 for (i = 0; i < NCH(n); i += 2)
2211 com_node(c, CHILD(n, i));
2212 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002213 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002214 }
2215}
2216
2217
2218/* Begin of assignment compilation */
2219
Thomas Wouters434d0822000-08-24 20:11:32 +00002220
2221static void
2222com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2223{
2224 com_addbyte(c, DUP_TOP);
2225 com_push(c, 1);
2226 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002227 com_node(c, augn);
2228 com_addbyte(c, opcode);
2229 com_pop(c, 1);
2230 com_addbyte(c, ROT_TWO);
2231 com_addopname(c, STORE_ATTR, n);
2232 com_pop(c, 2);
2233}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002234
2235static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002236com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002237{
2238 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002239 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002240}
2241
2242static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002243com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002244{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002245 REQ(n, trailer);
2246 switch (TYPE(CHILD(n, 0))) {
2247 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002248 com_error(c, PyExc_SyntaxError,
2249 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002250 break;
2251 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002252 if (assigning > OP_APPLY)
2253 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2254 else
2255 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002256 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002257 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002258 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002259 break;
2260 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002261 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002262 }
2263}
2264
2265static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002266com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002267{
2268 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002269 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002270 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002271 if (assigning) {
2272 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002273 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002274 com_push(c, i-1);
2275 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002276 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002277 com_assign(c, CHILD(n, i), assigning, NULL);
2278}
2279
2280static void
2281com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2282{
2283 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002284 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002285 com_push(c, 1);
2286 com_node(c, augn);
2287 com_addbyte(c, opcode);
2288 com_pop(c, 1);
2289 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002290}
2291
2292static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002293com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002294{
2295 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002296 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002297 if (assigning)
2298 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002299}
2300
2301static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002302com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002303{
2304 /* Loop to avoid trivial recursion */
2305 for (;;) {
2306 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002307
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002308 case exprlist:
2309 case testlist:
2310 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002311 if (assigning > OP_APPLY) {
2312 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002313 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002314 return;
2315 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002316 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002317 return;
2318 }
2319 n = CHILD(n, 0);
2320 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002321
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002322 case test:
2323 case and_test:
2324 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002325 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002326 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002327 case xor_expr:
2328 case and_expr:
2329 case shift_expr:
2330 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002331 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002332 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002333 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002334 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002335 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002336 return;
2337 }
2338 n = CHILD(n, 0);
2339 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002340
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002341 case power: /* atom trailer* ('**' power)*
2342 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002343 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002344 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002345 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002346 return;
2347 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002348 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002349 int i;
2350 com_node(c, CHILD(n, 0));
2351 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002352 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002353 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002354 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002355 return;
2356 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002357 com_apply_trailer(c, CHILD(n, i));
2358 } /* NB i is still alive */
2359 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002360 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002361 return;
2362 }
2363 n = CHILD(n, 0);
2364 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002365
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002366 case atom:
2367 switch (TYPE(CHILD(n, 0))) {
2368 case LPAR:
2369 n = CHILD(n, 1);
2370 if (TYPE(n) == RPAR) {
2371 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002372 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002373 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002374 return;
2375 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002376 if (assigning > OP_APPLY) {
2377 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002378 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002379 return;
2380 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002381 break;
2382 case LSQB:
2383 n = CHILD(n, 1);
2384 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002385 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002386 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002387 return;
2388 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002389 if (assigning > OP_APPLY) {
2390 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002391 "augmented assign to list not possible");
2392 return;
2393 }
2394 if (NCH(n) > 1
2395 && TYPE(CHILD(n, 1)) == list_for) {
2396 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002397 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002398 return;
2399 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002400 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002401 return;
2402 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002403 if (assigning > OP_APPLY)
2404 com_augassign_name(c, CHILD(n, 0),
2405 assigning, augn);
2406 else
2407 com_assign_name(c, CHILD(n, 0),
2408 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002409 return;
2410 default:
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 literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002413 return;
2414 }
2415 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002416
2417 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002418 com_error(c, PyExc_SyntaxError,
2419 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002420 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002421
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002422 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002423 com_error(c, PyExc_SystemError,
2424 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002425 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002426
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002427 }
2428 }
2429}
Guido van Rossum7c531111997-03-11 18:42:21 +00002430
Thomas Wouters434d0822000-08-24 20:11:32 +00002431static void
2432com_augassign(struct compiling *c, node *n)
2433{
2434 int opcode;
2435
2436 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2437 case '+': opcode = INPLACE_ADD; break;
2438 case '-': opcode = INPLACE_SUBTRACT; break;
2439 case '/': opcode = INPLACE_DIVIDE; break;
2440 case '%': opcode = INPLACE_MODULO; break;
2441 case '<': opcode = INPLACE_LSHIFT; break;
2442 case '>': opcode = INPLACE_RSHIFT; break;
2443 case '&': opcode = INPLACE_AND; break;
2444 case '^': opcode = INPLACE_XOR; break;
2445 case '|': opcode = INPLACE_OR; break;
2446 case '*':
2447 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2448 opcode = INPLACE_POWER;
2449 else
2450 opcode = INPLACE_MULTIPLY;
2451 break;
2452 default:
2453 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2454 return;
2455 }
2456 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2457}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002458
2459static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002460com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002461{
Thomas Wouters434d0822000-08-24 20:11:32 +00002462 REQ(n, expr_stmt);
2463 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002464 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002465 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002466 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002467 if (NCH(n) == 1) {
2468 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002469 if (c->c_interactive)
2470 com_addbyte(c, PRINT_EXPR);
2471 else
2472 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002473 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002474 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002475 else if (TYPE(CHILD(n,1)) == augassign)
2476 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002477 else {
2478 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002479 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002480 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002481 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002482 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002483 com_push(c, 1);
2484 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002485 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002486 }
2487 }
2488}
2489
2490static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002491com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002492{
2493 int a = 0, b = 0;
2494 int i;
2495 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2496 /* Generate code like for
2497
2498 if __debug__:
2499 if not <test>:
2500 raise AssertionError [, <message>]
2501
2502 where <message> is the second test, if present.
2503 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002504
Guido van Rossum228d7f31997-04-02 05:24:36 +00002505 if (Py_OptimizeFlag)
2506 return;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002507 com_addop_name(c, LOAD_GLOBAL, "__debug__");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002508 com_push(c, 1);
2509 com_addfwref(c, JUMP_IF_FALSE, &a);
2510 com_addbyte(c, POP_TOP);
2511 com_pop(c, 1);
2512 com_node(c, CHILD(n, 1));
2513 com_addfwref(c, JUMP_IF_TRUE, &b);
2514 com_addbyte(c, POP_TOP);
2515 com_pop(c, 1);
2516 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002517 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002518 com_push(c, 1);
2519 i = NCH(n)/2; /* Either 2 or 4 */
2520 if (i > 1)
2521 com_node(c, CHILD(n, 3));
2522 com_addoparg(c, RAISE_VARARGS, i);
2523 com_pop(c, i);
2524 /* The interpreter does not fall through */
2525 /* All jumps converge here */
2526 com_backpatch(c, a);
2527 com_backpatch(c, b);
2528 com_addbyte(c, POP_TOP);
2529}
2530
2531static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002532com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002533{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002534 int i = 1;
2535 node* stream = NULL;
2536
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002537 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002538
2539 /* are we using the extended print form? */
2540 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2541 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002542 com_node(c, stream);
2543 /* stack: [...] => [... stream] */
2544 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002545 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2546 i = 4;
2547 else
2548 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002549 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002550 for (; i < NCH(n); i += 2) {
2551 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002552 com_addbyte(c, DUP_TOP);
2553 /* stack: [stream] => [stream stream] */
2554 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002555 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002556 /* stack: [stream stream] => [stream stream obj] */
2557 com_addbyte(c, ROT_TWO);
2558 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002559 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002560 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002561 com_pop(c, 2);
2562 }
2563 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002564 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002565 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002566 com_addbyte(c, PRINT_ITEM);
2567 com_pop(c, 1);
2568 }
2569 }
2570 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002571 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002572 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002573 /* must pop the extra stream object off the stack */
2574 com_addbyte(c, POP_TOP);
2575 /* stack: [... stream] => [...] */
2576 com_pop(c, 1);
2577 }
2578 }
2579 else {
2580 if (stream != NULL) {
2581 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002582 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002583 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002584 com_pop(c, 1);
2585 }
2586 else
2587 com_addbyte(c, PRINT_NEWLINE);
2588 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002589}
2590
2591static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002592com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002593{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002594 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002595 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002596 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002597 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002598 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002599 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002600 com_push(c, 1);
2601 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002602 else
2603 com_node(c, CHILD(n, 1));
2604 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002605 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002606}
2607
2608static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002609com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002610{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002611 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002612 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2613 if (NCH(n) > 1) {
2614 com_node(c, CHILD(n, 1));
2615 if (NCH(n) > 3) {
2616 com_node(c, CHILD(n, 3));
2617 if (NCH(n) > 5)
2618 com_node(c, CHILD(n, 5));
2619 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002620 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002621 i = NCH(n)/2;
2622 com_addoparg(c, RAISE_VARARGS, i);
2623 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002624}
2625
2626static void
Thomas Wouters52152252000-08-17 22:55:00 +00002627com_from_import(struct compiling *c, node *n)
2628{
2629 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2630 com_push(c, 1);
2631 if (NCH(n) > 1) {
2632 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2633 com_error(c, PyExc_SyntaxError, "invalid syntax");
2634 return;
2635 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002636 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002637 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002638 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00002639 com_pop(c, 1);
2640}
2641
2642static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002643com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002644{
2645 int i;
2646 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002647 /* 'import' dotted_name (',' dotted_name)* |
2648 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002649 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00002650 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002651 /* 'from' dotted_name 'import' ... */
2652 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002653
2654 if (TYPE(CHILD(n, 3)) == STAR) {
2655 tup = Py_BuildValue("(s)", "*");
2656 } else {
2657 tup = PyTuple_New((NCH(n) - 2)/2);
2658 for (i = 3; i < NCH(n); i += 2) {
2659 PyTuple_SET_ITEM(tup, (i-3)/2,
2660 PyString_FromString(STR(
Jeremy Hylton4419ac12001-02-28 22:54:51 +00002661 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002662 }
2663 }
2664 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00002665 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002666 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002667 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00002668 if (TYPE(CHILD(n, 3)) == STAR)
2669 com_addbyte(c, IMPORT_STAR);
2670 else {
2671 for (i = 3; i < NCH(n); i += 2)
2672 com_from_import(c, CHILD(n, i));
2673 com_addbyte(c, POP_TOP);
2674 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002675 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002676 }
2677 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002678 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002679 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00002680 node *subn = CHILD(n, i);
2681 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002682 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002683 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002684 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00002685 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00002686 int j;
2687 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00002688 com_error(c, PyExc_SyntaxError,
2689 "invalid syntax");
2690 return;
2691 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00002692 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
2693 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002694 CHILD(CHILD(subn, 0),
2695 j));
2696 com_addop_varname(c, VAR_STORE,
2697 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002698 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002699 com_addop_varname(c, VAR_STORE,
2700 STR(CHILD(CHILD(subn, 0),
2701 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002702 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002703 }
2704 }
2705}
2706
2707static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002708com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002709{
2710 REQ(n, exec_stmt);
2711 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2712 com_node(c, CHILD(n, 1));
2713 if (NCH(n) >= 4)
2714 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002715 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002716 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002717 com_push(c, 1);
2718 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002719 if (NCH(n) >= 6)
2720 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002721 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002722 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002723 com_push(c, 1);
2724 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002725 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002726 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002727}
2728
Guido van Rossum7c531111997-03-11 18:42:21 +00002729static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002730is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002731{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002732 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002733 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002734 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00002735
2736 /* Label to avoid tail recursion */
2737 next:
2738 switch (TYPE(n)) {
2739
2740 case suite:
2741 if (NCH(n) == 1) {
2742 n = CHILD(n, 0);
2743 goto next;
2744 }
2745 /* Fall through */
2746 case file_input:
2747 for (i = 0; i < NCH(n); i++) {
2748 node *ch = CHILD(n, i);
2749 if (TYPE(ch) == stmt) {
2750 n = ch;
2751 goto next;
2752 }
2753 }
2754 break;
2755
2756 case stmt:
2757 case simple_stmt:
2758 case small_stmt:
2759 n = CHILD(n, 0);
2760 goto next;
2761
2762 case expr_stmt:
2763 case testlist:
2764 case test:
2765 case and_test:
2766 case not_test:
2767 case comparison:
2768 case expr:
2769 case xor_expr:
2770 case and_expr:
2771 case shift_expr:
2772 case arith_expr:
2773 case term:
2774 case factor:
2775 case power:
2776 case atom:
2777 if (NCH(n) == 1) {
2778 n = CHILD(n, 0);
2779 goto next;
2780 }
2781 break;
2782
2783 case NAME:
2784 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2785 return 1;
2786 break;
2787
2788 case NUMBER:
2789 v = parsenumber(c, STR(n));
2790 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002791 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002792 break;
2793 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002794 i = PyObject_IsTrue(v);
2795 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002796 return i == 0;
2797
2798 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002799 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002800 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002801 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002802 break;
2803 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002804 i = PyObject_IsTrue(v);
2805 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002806 return i == 0;
2807
2808 }
2809 return 0;
2810}
2811
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002812static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002813com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002814{
2815 int i;
2816 int anchor = 0;
2817 REQ(n, if_stmt);
2818 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2819 for (i = 0; i+3 < NCH(n); i+=4) {
2820 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002821 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002822 if (is_constant_false(c, ch))
2823 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002824 if (i > 0)
2825 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002826 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002827 com_addfwref(c, JUMP_IF_FALSE, &a);
2828 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002829 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002830 com_node(c, CHILD(n, i+3));
2831 com_addfwref(c, JUMP_FORWARD, &anchor);
2832 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002833 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002834 com_addbyte(c, POP_TOP);
2835 }
2836 if (i+2 < NCH(n))
2837 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002838 if (anchor)
2839 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002840}
2841
2842static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002843com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002844{
2845 int break_anchor = 0;
2846 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002847 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002848 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2849 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002850 block_push(c, SETUP_LOOP);
2851 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002852 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002853 com_node(c, CHILD(n, 1));
2854 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2855 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002856 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002857 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002858 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002859 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002860 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2861 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002862 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002863 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002864 com_addbyte(c, POP_TOP);
2865 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002866 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002867 if (NCH(n) > 4)
2868 com_node(c, CHILD(n, 6));
2869 com_backpatch(c, break_anchor);
2870}
2871
2872static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002873com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002874{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002875 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002876 int break_anchor = 0;
2877 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002878 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002879 REQ(n, for_stmt);
2880 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2881 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002882 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002883 com_node(c, CHILD(n, 3));
Guido van Rossum79f25d91997-04-29 20:08:16 +00002884 v = PyInt_FromLong(0L);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002885 if (v == NULL)
2886 c->c_errors++;
2887 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002888 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002889 Py_XDECREF(v);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002890 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002891 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002892 com_addfwref(c, FOR_LOOP, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002893 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00002894 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002895 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002896 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002897 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002898 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2899 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002900 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002901 com_pop(c, 2); /* FOR_LOOP has popped these */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002902 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002903 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002904 if (NCH(n) > 8)
2905 com_node(c, CHILD(n, 8));
2906 com_backpatch(c, break_anchor);
2907}
2908
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002909/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002910
2911 SETUP_FINALLY L
2912 <code for S>
2913 POP_BLOCK
2914 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002915 L: <code for Sf>
2916 END_FINALLY
2917
2918 The special instructions use the block stack. Each block
2919 stack entry contains the instruction that created it (here
2920 SETUP_FINALLY), the level of the value stack at the time the
2921 block stack entry was created, and a label (here L).
2922
2923 SETUP_FINALLY:
2924 Pushes the current value stack level and the label
2925 onto the block stack.
2926 POP_BLOCK:
2927 Pops en entry from the block stack, and pops the value
2928 stack until its level is the same as indicated on the
2929 block stack. (The label is ignored.)
2930 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002931 Pops a variable number of entries from the *value* stack
2932 and re-raises the exception they specify. The number of
2933 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002934
2935 The block stack is unwound when an exception is raised:
2936 when a SETUP_FINALLY entry is found, the exception is pushed
2937 onto the value stack (and the exception condition is cleared),
2938 and the interpreter jumps to the label gotten from the block
2939 stack.
2940
2941 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002942 (The contents of the value stack is shown in [], with the top
2943 at the right; 'tb' is trace-back info, 'val' the exception's
2944 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002945
2946 Value stack Label Instruction Argument
2947 [] SETUP_EXCEPT L1
2948 [] <code for S>
2949 [] POP_BLOCK
2950 [] JUMP_FORWARD L0
2951
Guido van Rossum3f5da241990-12-20 15:06:42 +00002952 [tb, val, exc] L1: DUP )
2953 [tb, val, exc, exc] <evaluate E1> )
2954 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2955 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2956 [tb, val, exc, 1] POP )
2957 [tb, val, exc] POP
2958 [tb, val] <assign to V1> (or POP if no V1)
2959 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002960 [] <code for S1>
2961 JUMP_FORWARD L0
2962
Guido van Rossum3f5da241990-12-20 15:06:42 +00002963 [tb, val, exc, 0] L2: POP
2964 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002965 .............................etc.......................
2966
Guido van Rossum3f5da241990-12-20 15:06:42 +00002967 [tb, val, exc, 0] Ln+1: POP
2968 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002969
2970 [] L0: <next statement>
2971
2972 Of course, parts are not generated if Vi or Ei is not present.
2973*/
2974
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002975static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002976com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002977{
2978 int except_anchor = 0;
2979 int end_anchor = 0;
2980 int else_anchor = 0;
2981 int i;
2982 node *ch;
2983
2984 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
2985 block_push(c, SETUP_EXCEPT);
2986 com_node(c, CHILD(n, 2));
2987 com_addbyte(c, POP_BLOCK);
2988 block_pop(c, SETUP_EXCEPT);
2989 com_addfwref(c, JUMP_FORWARD, &else_anchor);
2990 com_backpatch(c, except_anchor);
2991 for (i = 3;
2992 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
2993 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002994 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002995 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002996 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002997 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002998 break;
2999 }
3000 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003001 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003002 com_addoparg(c, SET_LINENO, ch->n_lineno);
3003 if (NCH(ch) > 1) {
3004 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003005 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003006 com_node(c, CHILD(ch, 1));
3007 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003008 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003009 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3010 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003011 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003012 }
3013 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003014 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003015 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003016 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003017 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003018 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003019 com_pop(c, 1);
3020 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003021 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003022 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003023 com_node(c, CHILD(n, i+2));
3024 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3025 if (except_anchor) {
3026 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003027 /* We come in with [tb, val, exc, 0] on the
3028 stack; one pop and it's the same as
3029 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003030 com_addbyte(c, POP_TOP);
3031 }
3032 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003033 /* We actually come in here with [tb, val, exc] but the
3034 END_FINALLY will zap those and jump around.
3035 The c_stacklevel does not reflect them so we need not pop
3036 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003037 com_addbyte(c, END_FINALLY);
3038 com_backpatch(c, else_anchor);
3039 if (i < NCH(n))
3040 com_node(c, CHILD(n, i+2));
3041 com_backpatch(c, end_anchor);
3042}
3043
3044static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003045com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003046{
3047 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003048 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003049
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003050 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3051 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003052 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003053 com_addbyte(c, POP_BLOCK);
3054 block_pop(c, SETUP_FINALLY);
3055 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003056 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003057 /* While the generated code pushes only one item,
3058 the try-finally handling can enter here with
3059 up to three items. OK, here are the details:
3060 3 for an exception, 2 for RETURN, 1 for BREAK. */
3061 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003062 com_backpatch(c, finally_anchor);
3063 ch = CHILD(n, NCH(n)-1);
3064 com_addoparg(c, SET_LINENO, ch->n_lineno);
3065 com_node(c, ch);
3066 com_addbyte(c, END_FINALLY);
3067 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003068 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003069}
3070
3071static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003072com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003073{
3074 REQ(n, try_stmt);
3075 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3076 | 'try' ':' suite 'finally' ':' suite */
3077 if (TYPE(CHILD(n, 3)) != except_clause)
3078 com_try_finally(c, n);
3079 else
3080 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003081}
3082
Guido van Rossum8b993a91997-01-17 21:04:03 +00003083static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003084get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003085{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003086 int i;
3087
Guido van Rossum8b993a91997-01-17 21:04:03 +00003088 /* Label to avoid tail recursion */
3089 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003090 switch (TYPE(n)) {
3091
3092 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003093 if (NCH(n) == 1) {
3094 n = CHILD(n, 0);
3095 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003096 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003097 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003098 case file_input:
3099 for (i = 0; i < NCH(n); i++) {
3100 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003101 if (TYPE(ch) == stmt) {
3102 n = ch;
3103 goto next;
3104 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003105 }
3106 break;
3107
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003108 case stmt:
3109 case simple_stmt:
3110 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003111 n = CHILD(n, 0);
3112 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003113
3114 case expr_stmt:
3115 case testlist:
3116 case test:
3117 case and_test:
3118 case not_test:
3119 case comparison:
3120 case expr:
3121 case xor_expr:
3122 case and_expr:
3123 case shift_expr:
3124 case arith_expr:
3125 case term:
3126 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003127 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003128 if (NCH(n) == 1) {
3129 n = CHILD(n, 0);
3130 goto next;
3131 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003132 break;
3133
3134 case atom:
3135 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003136 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003137 break;
3138
3139 }
3140 return NULL;
3141}
3142
Guido van Rossum79f25d91997-04-29 20:08:16 +00003143static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003144get_docstring(node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003145{
Guido van Rossum541563e1999-01-28 15:08:09 +00003146 /* Don't generate doc-strings if run with -OO */
3147 if (Py_OptimizeFlag > 1)
3148 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003149 n = get_rawdocstring(n);
3150 if (n == NULL)
3151 return NULL;
3152 return parsestrplus(n);
3153}
3154
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003155static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003156com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003157{
3158 REQ(n, suite);
3159 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3160 if (NCH(n) == 1) {
3161 com_node(c, CHILD(n, 0));
3162 }
3163 else {
3164 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003165 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003166 node *ch = CHILD(n, i);
3167 if (TYPE(ch) == stmt)
3168 com_node(c, ch);
3169 }
3170 }
3171}
3172
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003173/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003174static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003175com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003176{
3177 int i = c->c_nblocks;
3178 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3179 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3180 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003181 else if (i <= 0) {
3182 /* at the outer level */
3183 com_error(c, PyExc_SyntaxError,
3184 "'continue' not properly in loop");
3185 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003186 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003187 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003188 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003189 if (c->c_block[j] == SETUP_LOOP)
3190 break;
3191 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003192 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003193 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003194 for (; i > j; --i) {
3195 if (c->c_block[i] == SETUP_EXCEPT ||
3196 c->c_block[i] == SETUP_FINALLY) {
3197 com_addoparg(c, CONTINUE_LOOP,
3198 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003199 return;
3200 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003201 if (c->c_block[i] == END_FINALLY) {
3202 com_error(c, PyExc_SyntaxError,
3203 "'continue' not supported inside 'finally' clause");
3204 return;
3205 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003206 }
3207 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003208 com_error(c, PyExc_SyntaxError,
3209 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003210 }
3211 /* XXX Could allow it inside a 'finally' clause
3212 XXX if we could pop the exception still on the stack */
3213}
3214
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003215static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003216com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003217{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003218 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003219 if (TYPE(n) == lambdef) {
3220 /* lambdef: 'lambda' [varargslist] ':' test */
3221 n = CHILD(n, 1);
3222 }
3223 else {
3224 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3225 n = CHILD(n, 2);
3226 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3227 n = CHILD(n, 1);
3228 }
3229 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003230 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003231 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003232 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003233 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3234 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003235 nargs = 0;
3236 ndefs = 0;
3237 for (i = 0; i < nch; i++) {
3238 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003239 if (TYPE(CHILD(n, i)) == STAR ||
3240 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003241 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003242 nargs++;
3243 i++;
3244 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003245 t = RPAR; /* Anything except EQUAL or COMMA */
3246 else
3247 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003248 if (t == EQUAL) {
3249 i++;
3250 ndefs++;
3251 com_node(c, CHILD(n, i));
3252 i++;
3253 if (i >= nch)
3254 break;
3255 t = TYPE(CHILD(n, i));
3256 }
3257 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003258 /* Treat "(a=1, b)" as an error */
3259 if (ndefs)
3260 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003261 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003262 }
3263 if (t != COMMA)
3264 break;
3265 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003266 return ndefs;
3267}
3268
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003269static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003270com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003271{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003272 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003273 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003274 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003275 ndefs = com_argdefs(c, n);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003276 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3277 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003278 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003279 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003280 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003281 c->c_errors++;
3282 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003283 int closure = com_make_closure(c, (PyCodeObject *)co);
3284 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003285 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003286 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003287 if (closure)
3288 com_addoparg(c, MAKE_CLOSURE, ndefs);
3289 else
3290 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003291 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003292 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003293 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003294 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003295 }
3296}
3297
3298static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003299com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003300{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003301 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003302 REQ(n, testlist);
3303 /* testlist: test (',' test)* [','] */
3304 for (i = 0; i < NCH(n); i += 2)
3305 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003306 i = (NCH(n)+1) / 2;
3307 com_addoparg(c, BUILD_TUPLE, i);
3308 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003309}
3310
3311static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003312com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003313{
Guido van Rossum25831651993-05-19 14:50:45 +00003314 int i;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003315 PyObject *co, *v;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003316 char *name;
3317
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003318 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003319 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003320 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003321 c->c_errors++;
3322 return;
3323 }
3324 /* Push the class name on the stack */
3325 i = com_addconst(c, v);
3326 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003327 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003328 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003329 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003330 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003331 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003332 com_push(c, 1);
3333 }
Guido van Rossum25831651993-05-19 14:50:45 +00003334 else
3335 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003336 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003337 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003338 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003339 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003340 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003341 c->c_errors++;
3342 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003343 int closure = com_make_closure(c, (PyCodeObject *)co);
3344 i = com_addconst(c, co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003345 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003346 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003347 if (closure)
3348 com_addoparg(c, MAKE_CLOSURE, 0);
3349 else
3350 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003351 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003352 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003353 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003354 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003355 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003356 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003357}
3358
3359static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003360com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003361{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003362 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003363 if (c->c_errors)
3364 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003365 switch (TYPE(n)) {
3366
3367 /* Definition nodes */
3368
3369 case funcdef:
3370 com_funcdef(c, n);
3371 break;
3372 case classdef:
3373 com_classdef(c, n);
3374 break;
3375
3376 /* Trivial parse tree nodes */
3377
3378 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003379 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003380 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003381 n = CHILD(n, 0);
3382 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003383
3384 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003385 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
3386 com_addoparg(c, SET_LINENO, n->n_lineno);
3387 {
3388 int i;
3389 for (i = 0; i < NCH(n)-1; i += 2)
3390 com_node(c, CHILD(n, i));
3391 }
3392 break;
3393
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003394 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003395 com_addoparg(c, SET_LINENO, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003396 n = CHILD(n, 0);
3397 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003398
3399 /* Statement nodes */
3400
3401 case expr_stmt:
3402 com_expr_stmt(c, n);
3403 break;
3404 case print_stmt:
3405 com_print_stmt(c, n);
3406 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003407 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003408 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003409 break;
3410 case pass_stmt:
3411 break;
3412 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003413 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003414 com_error(c, PyExc_SyntaxError,
3415 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003416 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003417 com_addbyte(c, BREAK_LOOP);
3418 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003419 case continue_stmt:
3420 com_continue_stmt(c, n);
3421 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003422 case return_stmt:
3423 com_return_stmt(c, n);
3424 break;
3425 case raise_stmt:
3426 com_raise_stmt(c, n);
3427 break;
3428 case import_stmt:
3429 com_import_stmt(c, n);
3430 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003431 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003432 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003433 case exec_stmt:
3434 com_exec_stmt(c, n);
3435 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003436 case assert_stmt:
3437 com_assert_stmt(c, n);
3438 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003439 case if_stmt:
3440 com_if_stmt(c, n);
3441 break;
3442 case while_stmt:
3443 com_while_stmt(c, n);
3444 break;
3445 case for_stmt:
3446 com_for_stmt(c, n);
3447 break;
3448 case try_stmt:
3449 com_try_stmt(c, n);
3450 break;
3451 case suite:
3452 com_suite(c, n);
3453 break;
3454
3455 /* Expression nodes */
3456
3457 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003458 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003459 break;
3460 case test:
3461 com_test(c, n);
3462 break;
3463 case and_test:
3464 com_and_test(c, n);
3465 break;
3466 case not_test:
3467 com_not_test(c, n);
3468 break;
3469 case comparison:
3470 com_comparison(c, n);
3471 break;
3472 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003473 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003474 break;
3475 case expr:
3476 com_expr(c, n);
3477 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003478 case xor_expr:
3479 com_xor_expr(c, n);
3480 break;
3481 case and_expr:
3482 com_and_expr(c, n);
3483 break;
3484 case shift_expr:
3485 com_shift_expr(c, n);
3486 break;
3487 case arith_expr:
3488 com_arith_expr(c, n);
3489 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003490 case term:
3491 com_term(c, n);
3492 break;
3493 case factor:
3494 com_factor(c, n);
3495 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003496 case power:
3497 com_power(c, n);
3498 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003499 case atom:
3500 com_atom(c, n);
3501 break;
3502
3503 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003504 com_error(c, PyExc_SystemError,
3505 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003506 }
3507}
3508
Tim Petersdbd9ba62000-07-09 03:09:57 +00003509static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003510
3511static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003512com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003513{
3514 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3515 if (TYPE(CHILD(n, 0)) == LPAR)
3516 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003517 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003518 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003519 com_pop(c, 1);
3520 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003521}
3522
3523static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003524com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003525{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003526 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003527 if (NCH(n) == 1) {
3528 com_fpdef(c, CHILD(n, 0));
3529 }
3530 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003531 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003532 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003533 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003534 for (i = 0; i < NCH(n); i += 2)
3535 com_fpdef(c, CHILD(n, i));
3536 }
3537}
3538
3539static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003540com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003541{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003542 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003543 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003544 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003545 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003546 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003547 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003548 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003549 /* Enter all arguments in table of locals */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003550 for (i = 0, narg = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003551 node *ch = CHILD(n, i);
3552 node *fp;
3553 char *name;
Guido van Rossum50564e81996-01-12 01:13:16 +00003554 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003555 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003556 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3557 fp = CHILD(ch, 0);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00003558 if (TYPE(fp) != NAME) {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003559 name = nbuf;
3560 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003561 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003562 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003563 narg++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003564 /* all name updates handled by symtable */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003565 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003566 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003567 ch = CHILD(n, i);
3568 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003569 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003570 else
3571 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003572 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003573 if (complex) {
3574 /* Generate code for complex arguments only after
3575 having counted the simple arguments */
3576 int ilocal = 0;
3577 for (i = 0; i < nch; i++) {
3578 node *ch = CHILD(n, i);
3579 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003580 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003581 break;
3582 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3583 fp = CHILD(ch, 0);
3584 if (TYPE(fp) != NAME) {
3585 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003586 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003587 com_fpdef(c, ch);
3588 }
3589 ilocal++;
3590 if (++i >= nch)
3591 break;
3592 ch = CHILD(n, i);
3593 if (TYPE(ch) == EQUAL)
3594 i += 2;
3595 else
3596 REQ(ch, COMMA);
3597 }
3598 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003599}
3600
3601static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003602com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003603{
3604 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003605 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003606 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003607 doc = get_docstring(n);
3608 if (doc != NULL) {
3609 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003610 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003611 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003612 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003613 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003614 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003615 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003616 for (i = 0; i < NCH(n); i++) {
3617 node *ch = CHILD(n, i);
3618 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3619 com_node(c, ch);
3620 }
3621}
3622
3623/* Top-level compile-node interface */
3624
3625static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003626compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003627{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003628 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003629 node *ch;
3630 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003631 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003632 doc = get_docstring(CHILD(n, 4));
3633 if (doc != NULL) {
3634 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003635 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003636 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003637 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003638 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003639 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3640 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003641 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003642 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003643 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003644 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003645 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003646 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003647 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003648 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003649 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003650}
3651
3652static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003653compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003654{
Guido van Rossum590baa41993-11-30 13:40:46 +00003655 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003656 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003657 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003658
3659 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003660 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003661 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003662 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003663 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003664 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003665 else
3666 ch = CHILD(n, 2);
3667 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003668 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003669 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003670}
3671
3672static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003673compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003674{
3675 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003676 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003677 REQ(n, classdef);
3678 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3679 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003680 c->c_private = c->c_name;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003681 ch = CHILD(n, NCH(n)-1); /* The suite */
3682 doc = get_docstring(ch);
3683 if (doc != NULL) {
3684 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003685 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003686 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003687 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003688 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003689 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003690 }
3691 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003692 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003693 com_node(c, ch);
3694 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003695 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003696 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003697 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003698}
3699
3700static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003701compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003702{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003703 com_addoparg(c, SET_LINENO, n->n_lineno);
3704
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003705 switch (TYPE(n)) {
3706
Guido van Rossum4c417781991-01-21 16:09:22 +00003707 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003708 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003709 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003710 n = CHILD(n, 0);
3711 if (TYPE(n) != NEWLINE)
3712 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003713 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003714 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003715 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003716 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003717 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003718 break;
3719
Guido van Rossum4c417781991-01-21 16:09:22 +00003720 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003721 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003722 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003723 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003724 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003725 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003726 break;
3727
Guido van Rossum590baa41993-11-30 13:40:46 +00003728 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003729 com_node(c, CHILD(n, 0));
3730 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003731 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003732 break;
3733
Guido van Rossum590baa41993-11-30 13:40:46 +00003734 case lambdef: /* anonymous function definition */
3735 compile_lambdef(c, n);
3736 break;
3737
Guido van Rossum4c417781991-01-21 16:09:22 +00003738 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003739 compile_funcdef(c, n);
3740 break;
3741
Guido van Rossum4c417781991-01-21 16:09:22 +00003742 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003743 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003744 break;
3745
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003746 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003747 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003748 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003749 }
3750}
3751
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003752static PyObject *
3753dict_keys_inorder(PyObject *dict, int offset)
3754{
3755 PyObject *tuple, *k, *v;
3756 int i, pos = 0, size = PyDict_Size(dict);
3757
3758 tuple = PyTuple_New(size);
3759 if (tuple == NULL)
3760 return NULL;
3761 while (PyDict_Next(dict, &pos, &k, &v)) {
3762 i = PyInt_AS_LONG(v);
3763 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00003764 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003765 PyTuple_SET_ITEM(tuple, i - offset, k);
3766 }
3767 return tuple;
3768}
3769
Guido van Rossum79f25d91997-04-29 20:08:16 +00003770PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003771PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003772{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003773 return PyNode_CompileFlags(n, filename, NULL);
3774}
3775
3776PyCodeObject *
3777PyNode_CompileFlags(node *n, char *filename, PyCompilerFlags *flags)
3778{
3779 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003780}
3781
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003782struct symtable *
3783PyNode_CompileSymtable(node *n, char *filename)
3784{
3785 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003786 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003787
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003788 ff = PyNode_Future(n, filename);
3789 if (ff == NULL)
3790 return NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003791 st = symtable_init();
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003792 if (st == NULL)
3793 return NULL;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003794 st->st_future = ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003795 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003796 if (st->st_errors > 0)
3797 goto fail;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003798 symtable_node(st, n);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003799 if (st->st_errors > 0)
3800 goto fail;
3801
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003802 return st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003803 fail:
3804 PyMem_Free((void *)ff);
3805 st->st_future = NULL;
3806 PySymtable_Free(st);
3807 return NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003808}
3809
Guido van Rossum79f25d91997-04-29 20:08:16 +00003810static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003811icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003812{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003813 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003814}
3815
Guido van Rossum79f25d91997-04-29 20:08:16 +00003816static PyCodeObject *
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003817jcompile(node *n, char *filename, struct compiling *base,
3818 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003819{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003820 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003821 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003822 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003823 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003824 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003825 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003826 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003827 /* c_symtable still points to parent's symbols */
3828 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003829 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003830 sc.c_nested = 1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003831 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003832 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00003833 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003834 if (sc.c_future == NULL) {
3835 com_free(&sc);
3836 return NULL;
3837 }
3838 if (flags) {
3839 if (flags->cf_nested_scopes)
3840 sc.c_future->ff_nested_scopes = 1;
3841 else if (sc.c_future->ff_nested_scopes)
3842 flags->cf_nested_scopes = 1;
3843 }
3844 if (symtable_build(&sc, n) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003845 com_free(&sc);
3846 return NULL;
3847 }
3848 }
3849 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003850 if (symtable_load_symbols(&sc) < 0) {
3851 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003852 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003853 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003854 compile_node(&sc, n);
3855 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00003856 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003857 PyObject *consts, *names, *varnames, *filename, *name,
3858 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003859 consts = PyList_AsTuple(sc.c_consts);
3860 names = PyList_AsTuple(sc.c_names);
3861 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003862 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
3863 freevars = dict_keys_inorder(sc.c_freevars,
3864 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003865 filename = PyString_InternFromString(sc.c_filename);
3866 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003867 if (!PyErr_Occurred())
3868 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003869 sc.c_nlocals,
3870 sc.c_maxstacklevel,
3871 sc.c_flags,
3872 sc.c_code,
3873 consts,
3874 names,
3875 varnames,
3876 freevars,
3877 cellvars,
3878 filename,
3879 name,
3880 sc.c_firstlineno,
3881 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003882 Py_XDECREF(consts);
3883 Py_XDECREF(names);
3884 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003885 Py_XDECREF(freevars);
3886 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003887 Py_XDECREF(filename);
3888 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003889 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00003890 else if (!PyErr_Occurred()) {
3891 /* This could happen if someone called PyErr_Clear() after an
3892 error was reported above. That's not supposed to happen,
3893 but I just plugged one case and I'm not sure there can't be
3894 others. In that case, raise SystemError so that at least
3895 it gets reported instead dumping core. */
3896 PyErr_SetString(PyExc_SystemError, "lost syntax error");
3897 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003898 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00003899 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003900 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00003901 sc.c_symtable = NULL;
3902 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003903 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003904 return co;
3905}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003906
3907int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003908PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003909{
3910 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003911 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003912 int line = co->co_firstlineno;
3913 int addr = 0;
3914 while (--size >= 0) {
3915 addr += *p++;
3916 if (addr > addrq)
3917 break;
3918 line += *p++;
3919 }
3920 return line;
3921}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003922
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003923/* The test for LOCAL must come before the test for FREE in order to
3924 handle classes where name is both local and free. The local var is
3925 a method and the free var is a free var referenced within a method.
3926*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003927
3928static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003929get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003930{
3931 PyObject *v;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00003932 if (c->c_symtable->st_nested_scopes) {
3933 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
3934 return CELL;
3935 if (PyDict_GetItemString(c->c_locals, name) != NULL)
3936 return LOCAL;
3937 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
3938 return FREE;
3939 v = PyDict_GetItemString(c->c_globals, name);
3940 if (v) {
3941 if (v == Py_None)
3942 return GLOBAL_EXPLICIT;
3943 else {
3944 return GLOBAL_IMPLICIT;
3945 }
3946 }
3947 } else {
3948 if (PyDict_GetItemString(c->c_locals, name) != NULL)
3949 return LOCAL;
3950 v = PyDict_GetItemString(c->c_globals, name);
3951 if (v) {
3952 if (v == Py_None)
3953 return GLOBAL_EXPLICIT;
3954 else {
3955 return GLOBAL_IMPLICIT;
3956 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003957 }
3958 }
3959 {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003960 char buf[350];
3961 sprintf(buf,
Jeremy Hylton51257732001-03-01 00:42:55 +00003962 "unknown scope for %.100s in %.100s(%s) "
3963 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
Jeremy Hylton483638c2001-02-01 20:20:45 +00003964 name, c->c_name,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003965 PyObject_REPR(c->c_symtable->st_cur->ste_id),
Jeremy Hylton51257732001-03-01 00:42:55 +00003966 c->c_filename,
3967 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
3968 PyObject_REPR(c->c_locals),
3969 PyObject_REPR(c->c_globals)
3970 );
3971
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003972 Py_FatalError(buf);
3973 }
3974 return -1; /* can't get here */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003975}
3976
Guido van Rossum207fda62001-03-02 03:30:41 +00003977/* Helper functions to issue warnings */
3978
3979static int
3980issue_warning(char *msg, char *filename, int lineno)
3981{
3982 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
3983 lineno, NULL, NULL) < 0) {
3984 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
3985 PyErr_SetString(PyExc_SyntaxError, msg);
3986 PyErr_SyntaxLocation(filename, lineno);
3987 }
3988 return -1;
3989 }
3990 return 0;
3991}
Guido van Rossumee34ac12001-02-28 22:08:12 +00003992
Jeremy Hylton4419ac12001-02-28 22:54:51 +00003993static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00003994symtable_warn(struct symtable *st, char *msg)
3995{
Guido van Rossum207fda62001-03-02 03:30:41 +00003996 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00003997 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00003998 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00003999 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004000 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004001}
4002
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004003/* Helper function for setting lineno and filename */
4004
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004005static int
4006symtable_build(struct compiling *c, node *n)
4007{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004008 if ((c->c_symtable = symtable_init()) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004009 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004010 c->c_symtable->st_future = c->c_future;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004011 if (c->c_future->ff_nested_scopes)
4012 c->c_symtable->st_nested_scopes = 1;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004013 c->c_symtable->st_filename = c->c_filename;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004014 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
4015 if (c->c_symtable->st_errors > 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004016 return -1;
4017 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004018 if (c->c_symtable->st_errors > 0)
4019 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004020 /* reset for second pass */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004021 c->c_symtable->st_nscopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004022 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004023 return 0;
4024}
4025
4026static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004027symtable_init_compiling_symbols(struct compiling *c)
4028{
4029 PyObject *varnames;
4030
4031 varnames = c->c_symtable->st_cur->ste_varnames;
4032 if (varnames == NULL) {
4033 varnames = PyList_New(0);
4034 if (varnames == NULL)
4035 return -1;
4036 c->c_symtable->st_cur->ste_varnames = varnames;
4037 Py_INCREF(varnames);
4038 } else
4039 Py_INCREF(varnames);
4040 c->c_varnames = varnames;
4041
4042 c->c_globals = PyDict_New();
4043 if (c->c_globals == NULL)
4044 return -1;
4045 c->c_freevars = PyDict_New();
4046 if (c->c_freevars == NULL)
4047 return -1;
4048 c->c_cellvars = PyDict_New();
4049 if (c->c_cellvars == NULL)
4050 return -1;
4051 return 0;
4052}
4053
4054struct symbol_info {
4055 int si_nlocals;
4056 int si_ncells;
4057 int si_nfrees;
4058 int si_nimplicit;
4059};
4060
4061static void
4062symtable_init_info(struct symbol_info *si)
4063{
4064 si->si_nlocals = 0;
4065 si->si_ncells = 0;
4066 si->si_nfrees = 0;
4067 si->si_nimplicit = 0;
4068}
4069
4070static int
4071symtable_resolve_free(struct compiling *c, PyObject *name,
4072 struct symbol_info *si)
4073{
4074 PyObject *dict, *v;
4075
4076 /* Seperate logic for DEF_FREE. If it occurs in a function,
4077 it indicates a local that we must allocate storage for (a
4078 cell var). If it occurs in a class, then the class has a
4079 method and a free variable with the same name.
4080 */
4081
4082 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
4083 v = PyInt_FromLong(si->si_ncells++);
4084 dict = c->c_cellvars;
4085 } else {
4086 v = PyInt_FromLong(si->si_nfrees++);
4087 dict = c->c_freevars;
4088 }
4089 if (v == NULL)
4090 return -1;
4091 if (PyDict_SetItem(dict, name, v) < 0) {
4092 Py_DECREF(v);
4093 return -1;
4094 }
4095 Py_DECREF(v);
4096 return 0;
4097}
4098
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004099/* If a variable is a cell and an argument, make sure that appears in
4100 co_cellvars before any variable to its right in varnames.
4101*/
4102
4103
4104static int
4105symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4106 PyObject *varnames, int flags)
4107{
4108 PyObject *v, *w, *d, *list = NULL;
4109 int i, pos;
4110
4111 if (flags & CO_VARARGS)
4112 argcount++;
4113 if (flags & CO_VARKEYWORDS)
4114 argcount++;
4115 for (i = argcount; --i >= 0; ) {
4116 v = PyList_GET_ITEM(varnames, i);
4117 if (PyDict_GetItem(*cellvars, v)) {
4118 if (list == NULL) {
4119 list = PyList_New(1);
4120 if (list == NULL)
4121 return -1;
4122 PyList_SET_ITEM(list, 0, v);
4123 Py_INCREF(v);
4124 } else
4125 PyList_Insert(list, 0, v);
4126 }
4127 }
4128 if (list == NULL || PyList_GET_SIZE(list) == 0)
4129 return 0;
4130 /* There are cellvars that are also arguments. Create a dict
4131 to replace cellvars and put the args at the front.
4132 */
4133 d = PyDict_New();
4134 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
4135 v = PyInt_FromLong(i);
4136 if (v == NULL)
4137 goto fail;
4138 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
4139 goto fail;
4140 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
4141 goto fail;
4142 }
4143 pos = 0;
4144 i = PyList_GET_SIZE(list);
4145 Py_DECREF(list);
4146 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
4147 w = PyInt_FromLong(i++); /* don't care about the old key */
4148 if (PyDict_SetItem(d, v, w) < 0) {
4149 Py_DECREF(w);
4150 goto fail;
4151 }
4152 Py_DECREF(w);
4153 }
4154 Py_DECREF(*cellvars);
4155 *cellvars = d;
4156 return 1;
4157 fail:
4158 Py_DECREF(d);
4159 return -1;
4160}
4161
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004162static int
4163symtable_freevar_offsets(PyObject *freevars, int offset)
4164{
4165 PyObject *name, *v;
4166 int pos;
4167
4168 /* The cell vars are the first elements of the closure,
4169 followed by the free vars. Update the offsets in
4170 c_freevars to account for number of cellvars. */
4171 pos = 0;
4172 while (PyDict_Next(freevars, &pos, &name, &v)) {
4173 int i = PyInt_AS_LONG(v) + offset;
4174 PyObject *o = PyInt_FromLong(i);
4175 if (o == NULL)
4176 return -1;
4177 if (PyDict_SetItem(freevars, name, o) < 0) {
4178 Py_DECREF(o);
4179 return -1;
4180 }
4181 Py_DECREF(o);
4182 }
4183 return 0;
4184}
4185
4186static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004187symtable_check_unoptimized(struct compiling *c,
4188 PySymtableEntryObject *ste,
4189 struct symbol_info *si)
4190{
4191 char buf[300];
4192
4193 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4194 || (ste->ste_nested && si->si_nimplicit)))
4195 return 0;
4196
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004197#define ILLEGAL_CONTAINS "contains a nested function with free variables"
4198
4199#define ILLEGAL_IS "is a nested function"
4200
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004201#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004202"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004203
4204#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004205"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004206
4207#define ILLEGAL_EXEC_AND_IMPORT_STAR \
4208"function '%.100s' uses import * and bare exec, which are illegal" \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004209"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004210
4211 /* XXX perhaps the linenos for these opt-breaking statements
4212 should be stored so the exception can point to them. */
4213
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004214 if (ste->ste_child_free) {
4215 if (ste->ste_optimized == OPT_IMPORT_STAR)
4216 sprintf(buf, ILLEGAL_IMPORT_STAR,
4217 PyString_AS_STRING(ste->ste_name),
4218 ILLEGAL_CONTAINS);
4219 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
4220 sprintf(buf, ILLEGAL_BARE_EXEC,
4221 PyString_AS_STRING(ste->ste_name),
4222 ILLEGAL_CONTAINS);
4223 else {
4224 sprintf(buf, ILLEGAL_EXEC_AND_IMPORT_STAR,
4225 PyString_AS_STRING(ste->ste_name),
4226 ILLEGAL_CONTAINS);
4227 }
4228 } else {
4229 if (ste->ste_optimized == OPT_IMPORT_STAR)
4230 sprintf(buf, ILLEGAL_IMPORT_STAR,
4231 PyString_AS_STRING(ste->ste_name),
4232 ILLEGAL_IS);
4233 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
4234 sprintf(buf, ILLEGAL_BARE_EXEC,
4235 PyString_AS_STRING(ste->ste_name),
4236 ILLEGAL_IS);
4237 else {
4238 sprintf(buf, ILLEGAL_EXEC_AND_IMPORT_STAR,
4239 PyString_AS_STRING(ste->ste_name),
4240 ILLEGAL_IS);
4241 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004242 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004243
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004244 if (c->c_symtable->st_nested_scopes) {
4245 PyErr_SetString(PyExc_SyntaxError, buf);
4246 PyErr_SyntaxLocation(c->c_symtable->st_filename,
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00004247 ste->ste_opt_lineno);
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004248 return -1;
Guido van Rossum207fda62001-03-02 03:30:41 +00004249 }
4250 else {
4251 return issue_warning(buf, c->c_filename, ste->ste_lineno);
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004252 }
4253 return 0;
4254}
4255
4256static int
4257symtable_check_shadow(struct symtable *st, PyObject *name, int flags)
4258{
4259 char buf[500];
4260 PyObject *children, *v;
Jeremy Hyltonc1761322001-02-28 23:44:45 +00004261 PySymtableEntryObject *child = NULL;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004262 int i;
4263
4264 if (!(flags & DEF_BOUND))
4265 return 0;
4266 /* The semantics of this code will change with nested scopes.
4267 It is defined in the current scope and referenced in a
4268 child scope. Under the old rules, the child will see a
4269 global. Under the new rules, the child will see the
4270 binding in the current scope.
4271 */
4272
4273 /* Find name of child function that has free variable */
4274 children = st->st_cur->ste_children;
4275 for (i = 0; i < PyList_GET_SIZE(children); i++) {
4276 int cflags;
4277 child = (PySymtableEntryObject *)PyList_GET_ITEM(children, i);
4278 v = PyDict_GetItem(child->ste_symbols, name);
4279 if (v == NULL)
4280 continue;
4281 cflags = PyInt_AS_LONG(v);
4282 if (!(cflags & DEF_BOUND))
4283 break;
4284 }
Jeremy Hyltonc1761322001-02-28 23:44:45 +00004285
4286 assert(child != NULL);
4287
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004288 sprintf(buf, "local name '%.100s' in '%.100s' shadows "
4289 "use of '%.100s' as global in nested scope '%.100s'",
4290 PyString_AS_STRING(name),
4291 PyString_AS_STRING(st->st_cur->ste_name),
4292 PyString_AS_STRING(name),
4293 PyString_AS_STRING(child->ste_name)
4294 );
4295
4296 return symtable_warn(st, buf);
4297}
4298
4299static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004300symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4301 struct symbol_info *si)
4302{
Jeremy Hylton061d1062001-03-22 02:32:48 +00004303 if (c->c_future && c->c_future->ff_nested_scopes)
4304 c->c_flags |= CO_NESTED;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004305 if (ste->ste_type != TYPE_MODULE)
4306 c->c_flags |= CO_NEWLOCALS;
4307 if (ste->ste_type == TYPE_FUNCTION) {
4308 c->c_nlocals = si->si_nlocals;
4309 if (ste->ste_optimized == 0)
4310 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004311 else if (ste->ste_optimized != OPT_EXEC)
4312 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004313 }
4314 return 0;
4315}
4316
4317static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004318symtable_load_symbols(struct compiling *c)
4319{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004320 static PyObject *implicit = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004321 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004322 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004323 PyObject *name, *varnames, *v;
4324 int i, flags, pos;
4325 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004326
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004327 if (implicit == NULL) {
4328 implicit = PyInt_FromLong(1);
4329 if (implicit == NULL)
4330 return -1;
4331 }
4332 v = NULL;
4333
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004334 if (symtable_init_compiling_symbols(c) < 0)
4335 goto fail;
4336 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004337 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004338 si.si_nlocals = PyList_GET_SIZE(varnames);
4339 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004340
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004341 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004342 v = PyInt_FromLong(i);
4343 if (PyDict_SetItem(c->c_locals,
4344 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004345 goto fail;
4346 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004347 }
4348
4349 /* XXX The cases below define the rules for whether a name is
4350 local or global. The logic could probably be clearer. */
4351 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004352 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4353 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004354
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004355 if (st->st_nested_scopes == 0
4356 && (flags & (DEF_FREE | DEF_FREE_CLASS))) {
4357 if (symtable_check_shadow(st, name, flags) < 0)
4358 goto fail;
4359 }
4360
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004361 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004362 /* undo the original DEF_FREE */
4363 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004364
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004365 /* Deal with names that need two actions:
4366 1. Cell variables, which are also locals.
4367 2. Free variables in methods that are also class
4368 variables or declared global.
4369 */
4370 if (flags & (DEF_FREE | DEF_FREE_CLASS)) {
4371 if ((ste->ste_type == TYPE_CLASS
4372 && flags != DEF_FREE_CLASS)
4373 || (flags & (DEF_LOCAL | DEF_PARAM)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004374 symtable_resolve_free(c, name, &si);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004375 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004376
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004377 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004378 c->c_argcount--;
4379 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004380 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004381 c->c_argcount--;
4382 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004383 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004384 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004385 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004386 if (flags & DEF_PARAM) {
4387 PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004388 PyString_AS_STRING(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004389 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004390 ste->ste_lineno);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004391 st->st_errors++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004392 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004393 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004394 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4395 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004396 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004397 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004398 if (PyDict_SetItem(c->c_globals, name, implicit) < 0)
4399 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004400 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004401 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004402 if (v == NULL)
4403 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004404 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004405 goto fail;
4406 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004407 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004408 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004409 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004410 } else if (is_free(flags)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004411 if (ste->ste_nested && st->st_nested_scopes) {
4412 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004413 if (v == NULL)
4414 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004415 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004416 goto fail;
4417 Py_DECREF(v);
4418 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004419 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004420 if (PyDict_SetItem(c->c_globals, name,
4421 implicit) < 0)
4422 goto fail;
Jeremy Hylton51257732001-03-01 00:42:55 +00004423 if (st->st_nscopes != 1) {
4424 v = PyInt_FromLong(flags);
4425 if (PyDict_SetItem(st->st_global,
4426 name, v))
4427 goto fail;
4428 Py_DECREF(v);
4429 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004430 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004431 }
4432 }
4433
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004434 if (si.si_ncells > 1) { /* one cell is always in order */
4435 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
4436 c->c_varnames, c->c_flags) < 0)
4437 return -1;
4438 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004439 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4440 return -1;
4441 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004442 fail:
4443 /* is this always the right thing to do? */
4444 Py_XDECREF(v);
4445 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004446}
4447
4448static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004449symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004450{
4451 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004452
4453 st = (struct symtable *)PyMem_Malloc(sizeof(struct symtable));
4454 if (st == NULL)
4455 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004456 st->st_pass = 1;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004457 st->st_nested_scopes = NESTED_SCOPES_DEFAULT;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004458 st->st_filename = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004459 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004460 goto fail;
4461 if ((st->st_symbols = PyDict_New()) == NULL)
4462 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004463 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004464 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004465 st->st_errors = 0;
4466 st->st_tmpname = 0;
4467 st->st_private = NULL;
4468 return st;
4469 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004470 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004471 return NULL;
4472}
4473
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004474void
4475PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004476{
4477 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004478 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004479 Py_XDECREF(st->st_cur);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004480 PyMem_Free((void *)st);
4481}
4482
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004483/* When the compiler exits a scope, it must should update the scope's
4484 free variable information with the list of free variables in its
4485 children.
4486
4487 Variables that are free in children and defined in the current
4488 scope are cellvars.
4489
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004490 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004491 false), free variables in children that are not defined here are
4492 implicit globals.
4493
4494*/
4495
4496static int
4497symtable_update_free_vars(struct symtable *st)
4498{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004499 int i, j, def;
4500 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004501 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004502
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004503 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004504 def = DEF_FREE_CLASS;
4505 else
4506 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004507 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004508 int pos = 0;
4509
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004510 if (list)
4511 PyList_SetSlice(list, 0,
4512 ((PyVarObject*)list)->ob_size, 0);
Barry Warsaw0372af72001-02-23 18:22:59 +00004513 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004514 PyList_GET_ITEM(ste->ste_children, i);
4515 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004516 int flags = PyInt_AS_LONG(o);
4517 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004518 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004519 if (list == NULL) {
4520 list = PyList_New(0);
4521 if (list == NULL)
4522 return -1;
4523 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004524 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004525 if (PyList_Append(list, name) < 0) {
4526 Py_DECREF(list);
4527 return -1;
4528 }
4529 }
4530 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004531 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004532 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00004533 v = PyDict_GetItem(ste->ste_symbols, name);
4534 /* If a name N is declared global in scope A and
4535 referenced in scope B contained (perhaps
4536 indirectly) in A and there are no scopes
4537 with bindings for N between B and A, then N
4538 is global in B.
4539 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004540 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004541 int flags = PyInt_AS_LONG(v);
4542 if (flags & DEF_GLOBAL) {
4543 symtable_undo_free(st, child->ste_id,
4544 name);
4545 continue;
4546 }
4547 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004548 if (ste->ste_nested) {
4549 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004550 name, def) < 0) {
4551 Py_DECREF(list);
4552 return -1;
4553 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004554 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004555 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004556 name) < 0) {
4557 Py_DECREF(list);
4558 return -1;
4559 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004560 }
4561 }
4562 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004563
4564 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004565 return 0;
4566}
4567
4568/* If the current scope is a non-nested class or if name is not
4569 defined in the current, non-nested scope, then it is an implicit
4570 global in all nested scopes.
4571*/
4572
4573static int
4574symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
4575{
4576 PyObject *o;
4577 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004578 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00004579
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004580 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004581 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004582 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004583 if (o == NULL)
4584 return symtable_undo_free(st, child, name);
4585 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00004586
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004587 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004588 return symtable_undo_free(st, child, name);
4589 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004590 return symtable_add_def_o(st, ste->ste_symbols,
4591 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004592}
4593
4594static int
4595symtable_undo_free(struct symtable *st, PyObject *id,
4596 PyObject *name)
4597{
4598 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004599 PyObject *info;
4600 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004601
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004602 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
4603 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004604 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00004605
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004606 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004607 if (info == NULL)
4608 return 0;
4609 v = PyInt_AS_LONG(info);
4610 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004611 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004612 DEF_FREE_GLOBAL) < 0)
4613 return -1;
4614 } else
4615 /* If the name is defined here or declared global,
4616 then the recursion stops. */
4617 return 0;
4618
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004619 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
4620 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00004621 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004622 PyList_GET_ITEM(ste->ste_children, i);
4623 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004624 if (x < 0)
4625 return x;
4626 }
4627 return 0;
4628}
4629
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004630/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
4631 This reference is released when the scope is exited, via the DECREF
4632 in symtable_exit_scope().
4633*/
4634
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004635static int
4636symtable_exit_scope(struct symtable *st)
4637{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004638 int end;
4639
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004640 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004641 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004642 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004643 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004644 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
4645 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004646 if (PySequence_DelItem(st->st_stack, end) < 0)
4647 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004648 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004649}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004650
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004651static void
4652symtable_enter_scope(struct symtable *st, char *name, int type,
4653 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004654{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004655 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004656
4657 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004658 prev = st->st_cur;
4659 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
4660 Py_DECREF(st->st_cur);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004661 st->st_errors++;
4662 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004663 }
4664 }
Barry Warsaw0372af72001-02-23 18:22:59 +00004665 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004666 PySymtableEntry_New(st, name, type, lineno);
4667 if (strcmp(name, TOP) == 0)
4668 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004669 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004670 if (PyList_Append(prev->ste_children,
4671 (PyObject *)st->st_cur) < 0)
4672 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004673 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004674}
4675
4676static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004677symtable_lookup(struct symtable *st, char *name)
4678{
4679 char buffer[MANGLE_LEN];
4680 PyObject *v;
4681 int flags;
4682
4683 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
4684 name = buffer;
4685 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
4686 if (v == NULL) {
4687 if (PyErr_Occurred())
4688 return -1;
4689 else
4690 return 0;
4691 }
4692
4693 flags = PyInt_AS_LONG(v);
4694 return flags;
4695}
4696
4697static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004698symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004699{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004700 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004701 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004702 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004703
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004704 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004705 name = buffer;
4706 if ((s = PyString_InternFromString(name)) == NULL)
4707 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004708 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
4709 Py_DECREF(s);
4710 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004711}
4712
4713/* Must only be called with mangled names */
4714
4715static int
4716symtable_add_def_o(struct symtable *st, PyObject *dict,
4717 PyObject *name, int flag)
4718{
4719 PyObject *o;
4720 int val;
4721
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004722 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004723 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004724 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004725 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00004726 PyString_AsString(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004727 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004728 st->st_cur->ste_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004729 return -1;
4730 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004731 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004732 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004733 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004734 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004735 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004736 Py_DECREF(o);
4737 return -1;
4738 }
4739 Py_DECREF(o);
4740
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004741 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004742 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004743 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004744 } else if (flag & DEF_GLOBAL) {
4745 /* XXX need to update DEF_GLOBAL for other flags too;
4746 perhaps only DEF_FREE_GLOBAL */
4747 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004748 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004749 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004750 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004751 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004752 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004753 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004754 Py_DECREF(o);
4755 return -1;
4756 }
4757 Py_DECREF(o);
4758 }
4759 return 0;
4760}
4761
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004762#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004763
4764static void
4765symtable_node(struct symtable *st, node *n)
4766{
4767 int i, start = 0;
4768
4769 loop:
4770 switch (TYPE(n)) {
4771 case funcdef: {
4772 char *func_name = STR(CHILD(n, 1));
4773 symtable_add_def(st, func_name, DEF_LOCAL);
4774 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004775 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004776 symtable_funcdef(st, n);
4777 symtable_exit_scope(st);
4778 break;
4779 }
4780 case lambdef:
4781 if (NCH(n) == 4)
4782 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004783 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004784 symtable_funcdef(st, n);
4785 symtable_exit_scope(st);
4786 break;
4787 case classdef: {
4788 char *tmp, *class_name = STR(CHILD(n, 1));
4789 symtable_add_def(st, class_name, DEF_LOCAL);
4790 if (TYPE(CHILD(n, 2)) == LPAR) {
4791 node *bases = CHILD(n, 3);
4792 int i;
4793 for (i = 0; i < NCH(bases); i += 2) {
4794 symtable_node(st, CHILD(bases, i));
4795 }
4796 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004797 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004798 tmp = st->st_private;
4799 st->st_private = class_name;
4800 symtable_node(st, CHILD(n, NCH(n) - 1));
4801 st->st_private = tmp;
4802 symtable_exit_scope(st);
4803 break;
4804 }
4805 case if_stmt:
4806 for (i = 0; i + 3 < NCH(n); i += 4) {
4807 if (is_constant_false(NULL, (CHILD(n, i + 1))))
4808 continue;
4809 symtable_node(st, CHILD(n, i + 1));
4810 symtable_node(st, CHILD(n, i + 3));
4811 }
4812 if (i + 2 < NCH(n))
4813 symtable_node(st, CHILD(n, i + 2));
4814 break;
4815 case global_stmt:
4816 symtable_global(st, n);
4817 break;
4818 case import_stmt:
4819 symtable_import(st, n);
4820 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004821 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004822 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004823 symtable_node(st, CHILD(n, 1));
4824 if (NCH(n) > 2)
4825 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00004826 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004827 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00004828 st->st_cur->ste_opt_lineno = n->n_lineno;
4829 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004830 if (NCH(n) > 4)
4831 symtable_node(st, CHILD(n, 5));
4832 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004833
4834 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00004835 case assert_stmt:
4836 if (Py_OptimizeFlag)
4837 return;
4838 if (NCH(n) == 2) {
4839 n = CHILD(n, 1);
4840 goto loop;
4841 } else {
4842 symtable_node(st, CHILD(n, 1));
4843 n = CHILD(n, 3);
4844 goto loop;
4845 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004846 case except_clause:
4847 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004848 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004849 if (NCH(n) > 1) {
4850 n = CHILD(n, 1);
4851 goto loop;
4852 }
4853 break;
4854 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004855 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004856 break;
4857 case expr_stmt:
4858 if (NCH(n) == 1)
4859 n = CHILD(n, 0);
4860 else {
4861 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004862 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004863 symtable_node(st, CHILD(n, 2));
4864 break;
4865 } else {
4866 int i;
4867 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004868 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004869 n = CHILD(n, NCH(n) - 1);
4870 }
4871 }
4872 goto loop;
4873 /* watchout for fall-through logic below */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004874 case argument:
4875 if (NCH(n) == 3) {
4876 n = CHILD(n, 2);
4877 goto loop;
4878 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004879 case listmaker:
4880 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton23b42272001-03-19 20:38:06 +00004881 st->st_tmpname++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004882 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton23b42272001-03-19 20:38:06 +00004883 symtable_node(st, CHILD(n, 0));
4884 st->st_tmpname--;
4885 return;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004886 }
4887 case atom:
4888 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
4889 symtable_add_use(st, STR(CHILD(n, 0)));
4890 break;
4891 }
4892 case for_stmt:
4893 if (TYPE(n) == for_stmt) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004894 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004895 start = 3;
4896 }
4897 default:
4898 if (NCH(n) == 1) {
4899 n = CHILD(n, 0);
4900 goto loop;
4901 }
4902 for (i = start; i < NCH(n); ++i)
4903 if (TYPE(CHILD(n, i)) >= single_input)
4904 symtable_node(st, CHILD(n, i));
4905 }
4906}
4907
4908static void
4909symtable_funcdef(struct symtable *st, node *n)
4910{
4911 node *body;
4912
4913 if (TYPE(n) == lambdef) {
4914 if (NCH(n) == 4)
4915 symtable_params(st, CHILD(n, 1));
4916 } else
4917 symtable_params(st, CHILD(n, 2));
4918 body = CHILD(n, NCH(n) - 1);
4919 symtable_node(st, body);
4920}
4921
4922/* The next two functions parse the argument tuple.
4923 symtable_default_arg() checks for names in the default arguments,
4924 which are references in the defining scope. symtable_params()
4925 parses the parameter names, which are defined in the function's
4926 body.
4927
4928 varargslist:
4929 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
4930 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
4931*/
4932
4933static void
4934symtable_default_args(struct symtable *st, node *n)
4935{
4936 node *c;
4937 int i;
4938
4939 if (TYPE(n) == parameters) {
4940 n = CHILD(n, 1);
4941 if (TYPE(n) == RPAR)
4942 return;
4943 }
4944 REQ(n, varargslist);
4945 for (i = 0; i < NCH(n); i += 2) {
4946 c = CHILD(n, i);
4947 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
4948 break;
4949 }
4950 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
4951 symtable_node(st, CHILD(n, i));
4952 }
4953}
4954
4955static void
4956symtable_params(struct symtable *st, node *n)
4957{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004958 int i, complex = -1, ext = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004959 node *c = NULL;
4960
4961 if (TYPE(n) == parameters) {
4962 n = CHILD(n, 1);
4963 if (TYPE(n) == RPAR)
4964 return;
4965 }
4966 REQ(n, varargslist);
4967 for (i = 0; i < NCH(n); i += 2) {
4968 c = CHILD(n, i);
4969 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
4970 ext = 1;
4971 break;
4972 }
4973 if (TYPE(c) == test) {
4974 continue;
4975 }
4976 if (TYPE(CHILD(c, 0)) == NAME)
4977 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
4978 else {
4979 char nbuf[10];
4980 sprintf(nbuf, ".%d", i);
4981 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004982 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004983 }
4984 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004985 if (ext) {
4986 c = CHILD(n, i);
4987 if (TYPE(c) == STAR) {
4988 i++;
4989 symtable_add_def(st, STR(CHILD(n, i)),
4990 DEF_PARAM | DEF_STAR);
4991 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00004992 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004993 c = NULL;
4994 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004995 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004996 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00004997 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004998 i++;
4999 symtable_add_def(st, STR(CHILD(n, i)),
5000 DEF_PARAM | DEF_DOUBLESTAR);
5001 }
5002 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005003 if (complex >= 0) {
5004 int j;
5005 for (j = 0; j <= complex; j++) {
5006 c = CHILD(n, j);
5007 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005008 c = CHILD(n, ++j);
5009 else if (TYPE(c) == EQUAL)
5010 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005011 if (TYPE(CHILD(c, 0)) == LPAR)
5012 symtable_params_fplist(st, CHILD(c, 1));
5013 }
5014 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005015}
5016
5017static void
5018symtable_params_fplist(struct symtable *st, node *n)
5019{
5020 int i;
5021 node *c;
5022
5023 REQ(n, fplist);
5024 for (i = 0; i < NCH(n); i += 2) {
5025 c = CHILD(n, i);
5026 REQ(c, fpdef);
5027 if (NCH(c) == 1)
5028 symtable_add_def(st, STR(CHILD(c, 0)),
5029 DEF_PARAM | DEF_INTUPLE);
5030 else
5031 symtable_params_fplist(st, CHILD(c, 1));
5032 }
5033
5034}
5035
5036static void
5037symtable_global(struct symtable *st, node *n)
5038{
5039 int i;
5040
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005041 /* XXX It might be helpful to warn about module-level global
5042 statements, but it's hard to tell the difference between
5043 module-level and a string passed to exec.
5044 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00005045
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005046 for (i = 1; i < NCH(n); i += 2) {
5047 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005048 int flags;
5049
5050 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005051 if (flags < 0)
5052 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005053 if (flags && flags != DEF_GLOBAL) {
5054 char buf[500];
5055 if (flags & DEF_PARAM) {
5056 PyErr_Format(PyExc_SyntaxError,
5057 "name '%.400s' is local and global",
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005058 name);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005059 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005060 st->st_cur->ste_lineno);
5061 st->st_errors++;
5062 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005063 }
5064 else {
5065 if (flags & DEF_LOCAL)
5066 sprintf(buf, GLOBAL_AFTER_ASSIGN,
5067 name);
5068 else
5069 sprintf(buf, GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005070 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005071 }
5072 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005073 symtable_add_def(st, name, DEF_GLOBAL);
5074 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005075}
5076
5077static void
5078symtable_list_comprehension(struct symtable *st, node *n)
5079{
5080 char tmpname[12];
5081
Jeremy Hylton23b42272001-03-19 20:38:06 +00005082 sprintf(tmpname, "_[%d]", st->st_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005083 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005084 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005085 symtable_node(st, CHILD(n, 3));
5086 if (NCH(n) == 5)
5087 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005088}
5089
5090static void
5091symtable_import(struct symtable *st, node *n)
5092{
5093 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005094 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005095 | 'from' dotted_name 'import'
5096 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00005097 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005098 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005099 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005100 node *dotname = CHILD(n, 1);
5101 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
5102 /* check for bogus imports */
5103 if (n->n_lineno >= st->st_future->ff_last_lineno) {
5104 PyErr_SetString(PyExc_SyntaxError,
5105 LATE_FUTURE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005106 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005107 n->n_lineno);
5108 st->st_errors++;
5109 return;
5110 }
5111 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005112 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005113 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005114 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005115 } else {
5116 for (i = 3; i < NCH(n); i += 2) {
5117 node *c = CHILD(n, i);
5118 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005119 symtable_assign(st, CHILD(c, 2),
5120 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005121 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005122 symtable_assign(st, CHILD(c, 0),
5123 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005124 }
5125 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005126 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005127 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005128 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005129 }
5130 }
5131}
5132
5133static void
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005134symtable_assign(struct symtable *st, node *n, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005135{
5136 node *tmp;
5137 int i;
5138
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005139 loop:
5140 switch (TYPE(n)) {
5141 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005142 /* invalid assignment, e.g. lambda x:x=2. The next
5143 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005144 return;
5145 case power:
5146 if (NCH(n) > 2) {
5147 for (i = 2; i < NCH(n); ++i)
5148 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
5149 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005150 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005151 if (NCH(n) > 1) {
5152 symtable_node(st, CHILD(n, 0));
5153 symtable_node(st, CHILD(n, 1));
5154 } else {
5155 n = CHILD(n, 0);
5156 goto loop;
5157 }
5158 return;
5159 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00005160 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
5161 /* XXX This is an error, but the next pass
5162 will catch it. */
5163 return;
5164 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005165 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005166 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005167 }
5168 return;
5169 case exprlist:
5170 case testlist:
5171 if (NCH(n) == 1) {
5172 n = CHILD(n, 0);
5173 goto loop;
5174 }
5175 else {
5176 int i;
5177 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005178 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005179 return;
5180 }
5181 goto loop;
5182 case atom:
5183 tmp = CHILD(n, 0);
5184 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
5185 n = CHILD(n, 1);
5186 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00005187 } else if (TYPE(tmp) == NAME) {
Jeremy Hyltona830b382001-04-09 16:07:59 +00005188 if (strcmp(STR(tmp), "__debug__") == 0)
5189 symtable_warn(st, ASSIGN_DEBUG);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005190 symtable_add_def(st, STR(tmp), DEF_LOCAL | flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00005191 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005192 return;
5193 case dotted_as_name:
5194 if (NCH(n) == 3)
5195 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005196 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005197 else
5198 symtable_add_def(st,
5199 STR(CHILD(CHILD(n,
5200 0), 0)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005201 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005202 return;
5203 case dotted_name:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005204 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005205 return;
5206 case NAME:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005207 symtable_add_def(st, STR(n), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005208 return;
5209 default:
5210 if (NCH(n) == 0)
5211 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00005212 if (NCH(n) == 1) {
5213 n = CHILD(n, 0);
5214 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005215 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00005216 /* Should only occur for errors like x + 1 = 1,
5217 which will be caught in the next pass. */
5218 for (i = 0; i < NCH(n); ++i)
5219 if (TYPE(CHILD(n, i)) >= single_input)
5220 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005221 }
5222}