blob: b9ba0fc72644cbae8c87b00fac2798ae24a23451 [file] [log] [blame]
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001/* Compile an expression node to intermediate code */
2
Guido van Rossum3f5da241990-12-20 15:06:42 +00003/* XXX TO DO:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004 XXX add __doc__ attribute == co_doc to code object attributes?
5 XXX (it's currently the first item of the co_const tuple)
Guido van Rossum3f5da241990-12-20 15:06:42 +00006 XXX Generate simple jump for break/return outside 'try...finally'
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00007 XXX Allow 'continue' inside finally clause of try-finally
Guido van Rossum8b993a91997-01-17 21:04:03 +00008 XXX New opcode for loading the initial index for a for loop
Guido van Rossum681d79a1995-07-18 14:51:37 +00009 XXX other JAR tricks?
Guido van Rossum3f5da241990-12-20 15:06:42 +000010*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +000011
Guido van Rossum79f25d91997-04-29 20:08:16 +000012#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000013
Guido van Rossum10dc2e81990-11-18 17:27:39 +000014#include "node.h"
15#include "token.h"
16#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000017#include "compile.h"
Jeremy Hylton4b38da62001-02-02 18:19:15 +000018#include "symtable.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000019#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000020#include "structmember.h"
21
22#include <ctype.h>
Guido van Rossum282914b1991-04-04 10:42:56 +000023
Guido van Rossumb05a5c71997-05-07 17:46:13 +000024/* Three symbols from graminit.h are also defined in Python.h, with
25 Py_ prefixes to their names. Python.h can't include graminit.h
26 (which defines too many confusing symbols), but we can check here
27 that they haven't changed (which is very unlikely, but possible). */
28#if Py_single_input != single_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000029 #error "single_input has changed -- update Py_single_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000030#endif
31#if Py_file_input != file_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000032 #error "file_input has changed -- update Py_file_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000033#endif
34#if Py_eval_input != eval_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000035 #error "eval_input has changed -- update Py_eval_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000036#endif
37
Guido van Rossum8e793d91997-03-03 19:13:14 +000038int Py_OptimizeFlag = 0;
39
Guido van Rossum8861b741996-07-30 16:49:37 +000040#define OP_DELETE 0
41#define OP_ASSIGN 1
42#define OP_APPLY 2
43
Jeremy Hyltone36f7782001-01-19 03:21:30 +000044#define VAR_LOAD 0
45#define VAR_STORE 1
46#define VAR_DELETE 2
47
Jeremy Hylton64949cb2001-01-25 20:06:59 +000048#define DEL_CLOSURE_ERROR \
Jeremy Hyltoneab156f2001-01-30 01:24:43 +000049"can not delete variable '%.400s' referenced in nested scope"
50
51#define DUPLICATE_ARGUMENT \
52"duplicate argument '%s' in function definition"
53
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000054#define ILLEGAL_DYNAMIC_SCOPE \
55"%.100s: exec or 'import *' makes names ambiguous in nested scope"
Jeremy Hyltoneab156f2001-01-30 01:24:43 +000056
Jeremy Hylton29906ee2001-02-27 04:23:34 +000057#define GLOBAL_AFTER_ASSIGN \
58"name '%.400s' is assigned to before global declaration"
59
60#define GLOBAL_AFTER_USE \
61"name '%.400s' is used prior to global declaration"
62
63#define LOCAL_GLOBAL \
64"name '%.400s' is a function paramter and declared global"
65
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +000066#define LATE_FUTURE \
67"from __future__ imports must occur at the beginning of the file"
68
Jeremy Hylton897b8212001-03-23 14:08:38 +000069#define ASSIGN_DEBUG \
70"can not assign to __debug__"
71
Jeremy Hyltone36f7782001-01-19 03:21:30 +000072#define MANGLE_LEN 256
73
Guido van Rossum79f25d91997-04-29 20:08:16 +000074#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000075
76static struct memberlist code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000077 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
78 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000079 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000080 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000081 {"co_code", T_OBJECT, OFF(co_code), READONLY},
82 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
83 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000084 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Jeremy Hylton64949cb2001-01-25 20:06:59 +000085 {"co_freevars", T_OBJECT, OFF(co_freevars), READONLY},
86 {"co_cellvars", T_OBJECT, OFF(co_cellvars), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000087 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000088 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000089 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
90 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000091 {NULL} /* Sentinel */
92};
93
Guido van Rossum79f25d91997-04-29 20:08:16 +000094static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000095code_getattr(PyCodeObject *co, char *name)
Guido van Rossum3f5da241990-12-20 15:06:42 +000096{
Guido van Rossum79f25d91997-04-29 20:08:16 +000097 return PyMember_Get((char *)co, code_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +000098}
Guido van Rossum10dc2e81990-11-18 17:27:39 +000099
100static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000101code_dealloc(PyCodeObject *co)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000102{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000103 Py_XDECREF(co->co_code);
104 Py_XDECREF(co->co_consts);
105 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +0000106 Py_XDECREF(co->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000107 Py_XDECREF(co->co_freevars);
108 Py_XDECREF(co->co_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000109 Py_XDECREF(co->co_filename);
110 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +0000111 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000112 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000113}
114
Guido van Rossum79f25d91997-04-29 20:08:16 +0000115static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000116code_repr(PyCodeObject *co)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000117{
118 char buf[500];
119 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000120 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000121 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000122
Guido van Rossuma396a882000-04-07 01:21:36 +0000123 if (co->co_firstlineno != 0)
124 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000125 if (co->co_filename && PyString_Check(co->co_filename))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000126 filename = PyString_AS_STRING(co->co_filename);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000127 if (co->co_name && PyString_Check(co->co_name))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000128 name = PyString_AS_STRING(co->co_name);
Fred Drake615ae552000-06-30 16:20:13 +0000129 sprintf(buf, "<code object %.100s at %p, file \"%.300s\", line %d>",
130 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000131 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000132}
133
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000134static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000135code_compare(PyCodeObject *co, PyCodeObject *cp)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000136{
137 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000138 cmp = PyObject_Compare(co->co_name, cp->co_name);
139 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000140 cmp = co->co_argcount - cp->co_argcount;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000141 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000142 cmp = co->co_nlocals - cp->co_nlocals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000143 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000144 cmp = co->co_flags - cp->co_flags;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000145 if (cmp) return cmp;
Guido van Rossumd076c731998-10-07 19:42:25 +0000146 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000147 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000148 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000149 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000150 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000151 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000152 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000153 if (cmp) return cmp;
154 cmp = PyObject_Compare(co->co_freevars, cp->co_freevars);
155 if (cmp) return cmp;
156 cmp = PyObject_Compare(co->co_cellvars, cp->co_cellvars);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000157 return cmp;
158}
159
160static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000161code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000162{
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000163 long h, h0, h1, h2, h3, h4, h5, h6;
Guido van Rossum44679592000-04-10 16:20:31 +0000164 h0 = PyObject_Hash(co->co_name);
165 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000166 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000167 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000168 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000169 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000170 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000171 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000172 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000173 if (h4 == -1) return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000174 h5 = PyObject_Hash(co->co_freevars);
175 if (h5 == -1) return -1;
176 h6 = PyObject_Hash(co->co_cellvars);
177 if (h6 == -1) return -1;
178 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^ h5 ^ h6 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000179 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000180 if (h == -1) h = -2;
181 return h;
182}
183
Jeremy Hylton78891072001-03-01 06:09:34 +0000184/* XXX code objects need to participate in GC? */
185
Guido van Rossum79f25d91997-04-29 20:08:16 +0000186PyTypeObject PyCode_Type = {
187 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000188 0,
189 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000190 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000191 0,
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000192 (destructor)code_dealloc, /*tp_dealloc*/
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000193 0, /*tp_print*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000194 (getattrfunc)code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000195 0, /*tp_setattr*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000196 (cmpfunc)code_compare, /*tp_compare*/
197 (reprfunc)code_repr, /*tp_repr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000198 0, /*tp_as_number*/
199 0, /*tp_as_sequence*/
200 0, /*tp_as_mapping*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000201 (hashfunc)code_hash, /*tp_hash*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000202};
203
Guido van Rossum644a12b1997-04-09 19:24:53 +0000204#define NAME_CHARS \
205 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
206
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000207/* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
208
209static int
210all_name_chars(unsigned char *s)
211{
Guido van Rossumcd90c202001-02-09 15:06:42 +0000212 static char ok_name_char[256];
213 static unsigned char *name_chars = (unsigned char *)NAME_CHARS;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000214
Guido van Rossumcd90c202001-02-09 15:06:42 +0000215 if (ok_name_char[*name_chars] == 0) {
216 unsigned char *p;
217 for (p = name_chars; *p; p++)
218 ok_name_char[*p] = 1;
219 }
220 while (*s) {
221 if (ok_name_char[*s++] == 0)
222 return 0;
223 }
224 return 1;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000225}
226
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000227static int
228intern_strings(PyObject *tuple)
229{
230 int i;
231
232 for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) {
233 PyObject *v = PyTuple_GET_ITEM(tuple, i);
234 if (v == NULL || !PyString_Check(v)) {
235 Py_FatalError("non-string found in code slot");
236 PyErr_BadInternalCall();
237 return -1;
238 }
239 PyString_InternInPlace(&PyTuple_GET_ITEM(tuple, i));
240 }
241 return 0;
242}
243
Guido van Rossum79f25d91997-04-29 20:08:16 +0000244PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000245PyCode_New(int argcount, int nlocals, int stacksize, int flags,
246 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000247 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
248 PyObject *filename, PyObject *name, int firstlineno,
249 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000250{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000251 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000252 int i;
Guido van Rossumd076c731998-10-07 19:42:25 +0000253 PyBufferProcs *pb;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000254 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000255 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000256 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000257 consts == NULL || !PyTuple_Check(consts) ||
258 names == NULL || !PyTuple_Check(names) ||
259 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000260 freevars == NULL || !PyTuple_Check(freevars) ||
261 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000262 name == NULL || !PyString_Check(name) ||
263 filename == NULL || !PyString_Check(filename) ||
264 lnotab == NULL || !PyString_Check(lnotab)) {
265 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000266 return NULL;
267 }
Guido van Rossumd076c731998-10-07 19:42:25 +0000268 pb = code->ob_type->tp_as_buffer;
269 if (pb == NULL ||
270 pb->bf_getreadbuffer == NULL ||
271 pb->bf_getsegcount == NULL ||
272 (*pb->bf_getsegcount)(code, NULL) != 1)
273 {
274 PyErr_BadInternalCall();
275 return NULL;
276 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000277 intern_strings(names);
278 intern_strings(varnames);
279 if (freevars == NULL)
280 freevars = PyTuple_New(0);
281 intern_strings(freevars);
282 if (cellvars == NULL)
283 cellvars = PyTuple_New(0);
284 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000285 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000286 for (i = PyTuple_Size(consts); --i >= 0; ) {
287 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000288 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000289 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000290 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000291 continue;
292 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000293 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000294 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000295 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000296 co->co_argcount = argcount;
297 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000298 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000299 co->co_flags = flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000300 Py_INCREF(code);
Guido van Rossumd076c731998-10-07 19:42:25 +0000301 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000302 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000303 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000304 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000305 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000306 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000307 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000308 Py_INCREF(freevars);
309 co->co_freevars = freevars;
310 Py_INCREF(cellvars);
311 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000312 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000313 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000314 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000315 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000316 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000317 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000318 co->co_lnotab = lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000319 }
320 return co;
321}
322
323
324/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000325
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000326/* The compiler uses two passes to generate bytecodes. The first pass
327 builds the symbol table. The second pass generates the bytecode.
328
329 The first pass uses a single symtable struct. The second pass uses
330 a compiling struct for each code block. The compiling structs
331 share a reference to the symtable.
332
333 The two passes communicate via symtable_load_symbols() and via
334 is_local() and is_global(). The former initializes several slots
335 in the compiling struct: c_varnames, c_locals, c_nlocals,
336 c_argcount, c_globals, and c_flags.
337*/
338
Tim Peters2a7f3842001-06-09 09:26:21 +0000339/* All about c_lnotab.
340
341c_lnotab is an array of unsigned bytes disguised as a Python string. In -O
342mode, SET_LINENO opcodes aren't generated, and bytecode offsets are mapped
343to source code line #s (when needed for tracebacks) via c_lnotab instead.
344The array is conceptually a list of
345 (bytecode offset increment, line number increment)
346pairs. The details are important and delicate, best illustrated by example:
347
348 byte code offset source code line number
349 0 1
350 6 2
351 50 7
352 350 307
353 361 308
354
355The first trick is that these numbers aren't stored, only the increments
356from one row to the next (this doesn't really work, but it's a start):
357
358 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
359
360The second trick is that an unsigned byte can't hold negative values, or
361values larger than 255, so (a) there's a deep assumption that byte code
362offsets and their corresponding line #s both increase monotonically, and (b)
363if at least one column jumps by more than 255 from one row to the next, more
364than one pair is written to the table. In case #b, there's no way to know
365from looking at the table later how many were written. That's the delicate
366part. A user of c_lnotab desiring to find the source line number
367corresponding to a bytecode address A should do something like this
368
369 lineno = addr = 0
370 for addr_incr, line_incr in c_lnotab:
371 addr += addr_incr
372 if addr > A:
373 return lineno
374 lineno += line_incr
375
376In order for this to work, when the addr field increments by more than 255,
377the line # increment in each pair generated must be 0 until the remaining addr
378increment is < 256. So, in the example above, com_set_lineno should not (as
379was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
380255, 0, 45, 255, 0, 45.
381*/
382
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000383struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000384 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000385 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000386 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000387 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000388 PyObject *c_name_dict; /* inverse of c_names */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000389 PyObject *c_globals; /* dictionary (value=None) */
390 PyObject *c_locals; /* dictionary (value=localID) */
391 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000392 PyObject *c_freevars; /* dictionary (value=None) */
393 PyObject *c_cellvars; /* list */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000394 int c_nlocals; /* index of next local */
395 int c_argcount; /* number of top-level arguments */
396 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000397 int c_nexti; /* index into c_code */
398 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000399 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000400 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000401 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000402 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000403 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000404 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000405 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000406 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000407 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000408 int c_stacklevel; /* Current stack level */
409 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000410 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000411 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000412 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000413 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000414 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000415 int c_nested; /* Is block nested funcdef or lamdef? */
416 int c_closure; /* Is nested w/freevars? */
417 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000418 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000419};
420
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000421static int
422is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000423{
424 if ((v & (USE | DEF_FREE))
425 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
426 return 1;
427 if (v & DEF_FREE_CLASS)
428 return 1;
429 return 0;
430}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000431
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000432static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000433com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000434{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000435 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
436
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000437 if (c == NULL) {
438 /* Error occurred via symtable call to
439 is_constant_false */
440 PyErr_SetString(exc, msg);
441 return;
442 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000443 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000444 if (c->c_lineno < 1 || c->c_interactive) {
445 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000446 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000447 return;
448 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000449 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000450 if (v == NULL)
451 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000452
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000453 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000454 if (line == NULL) {
455 Py_INCREF(Py_None);
456 line = Py_None;
457 }
458 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
459 Py_None, line);
460 if (t == NULL)
461 goto exit;
462 w = Py_BuildValue("(OO)", v, t);
463 if (w == NULL)
464 goto exit;
465 PyErr_SetObject(exc, w);
466 exit:
467 Py_XDECREF(t);
468 Py_XDECREF(v);
469 Py_XDECREF(w);
470 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000471}
472
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000473/* Interface to the block stack */
474
475static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000476block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000477{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000478 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000479 com_error(c, PyExc_SystemError,
480 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000481 }
482 else {
483 c->c_block[c->c_nblocks++] = type;
484 }
485}
486
487static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000488block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000489{
490 if (c->c_nblocks > 0)
491 c->c_nblocks--;
492 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000493 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000494 }
495}
496
Guido van Rossum681d79a1995-07-18 14:51:37 +0000497/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000498
Tim Petersdbd9ba62000-07-09 03:09:57 +0000499static int com_init(struct compiling *, char *);
500static void com_free(struct compiling *);
501static void com_push(struct compiling *, int);
502static void com_pop(struct compiling *, int);
503static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000504static void com_node(struct compiling *, node *);
505static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000506static void com_addbyte(struct compiling *, int);
507static void com_addint(struct compiling *, int);
508static void com_addoparg(struct compiling *, int, int);
509static void com_addfwref(struct compiling *, int, int *);
510static void com_backpatch(struct compiling *, int);
511static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
512static int com_addconst(struct compiling *, PyObject *);
513static int com_addname(struct compiling *, PyObject *);
514static void com_addopname(struct compiling *, int, node *);
515static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000516static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000517static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000518static void com_assign(struct compiling *, node *, int, node *);
519static void com_assign_name(struct compiling *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000520static PyCodeObject *icompile(node *, struct compiling *);
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000521static PyCodeObject *jcompile(node *, char *, struct compiling *,
522 PyCompilerFlags *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000523static PyObject *parsestrplus(node *);
524static PyObject *parsestr(char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000525static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000526
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000527static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000528
529/* symtable operations */
530static int symtable_build(struct compiling *, node *);
531static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000532static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000533static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000534static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000535static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000536static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000537
538static void symtable_node(struct symtable *, node *);
539static void symtable_funcdef(struct symtable *, node *);
540static void symtable_default_args(struct symtable *, node *);
541static void symtable_params(struct symtable *, node *);
542static void symtable_params_fplist(struct symtable *, node *n);
543static void symtable_global(struct symtable *, node *);
544static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000545static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000546static void symtable_list_comprehension(struct symtable *, node *);
547
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000548static int symtable_update_free_vars(struct symtable *);
549static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
550static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
551
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000552/* helper */
553static void
554do_pad(int pad)
555{
556 int i;
557 for (i = 0; i < pad; ++i)
558 fprintf(stderr, " ");
559}
560
561static void
562dump(node *n, int pad, int depth)
563{
564 int i;
565 if (depth == 0)
566 return;
567 do_pad(pad);
568 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
569 if (depth > 0)
570 depth--;
571 for (i = 0; i < NCH(n); ++i)
572 dump(CHILD(n, i), pad + 1, depth);
573}
574
575#define DUMP(N) dump(N, 0, -1)
576
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000577static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000578com_init(struct compiling *c, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000579{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000580 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000581 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
582 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000583 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000584 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000585 goto fail;
586 if ((c->c_const_dict = PyDict_New()) == NULL)
587 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000588 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000589 goto fail;
590 if ((c->c_name_dict = PyDict_New()) == NULL)
591 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000592 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000593 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000594 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
595 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000596 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000597 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000598 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000599 c->c_freevars = NULL;
600 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000601 c->c_nlocals = 0;
602 c->c_argcount = 0;
603 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000604 c->c_nexti = 0;
605 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000606 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000607 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000608 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000609 c->c_begin = 0;
610 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000611 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000612 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000613 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000614 c->c_stacklevel = 0;
615 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000616 c->c_firstlineno = 0;
617 c->c_last_addr = 0;
618 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000619 c->c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000620 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000621 c->c_nested = 0;
622 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000623 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000624 return 1;
625
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000626 fail:
627 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000628 return 0;
629}
630
631static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000632com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000633{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000634 Py_XDECREF(c->c_code);
635 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000636 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000637 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000638 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000639 Py_XDECREF(c->c_globals);
640 Py_XDECREF(c->c_locals);
641 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000642 Py_XDECREF(c->c_freevars);
643 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000644 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +0000645 if (c->c_future)
646 PyMem_Free((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000647}
648
649static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000650com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000651{
652 c->c_stacklevel += n;
653 if (c->c_stacklevel > c->c_maxstacklevel)
654 c->c_maxstacklevel = c->c_stacklevel;
655}
656
657static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000658com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000659{
660 if (c->c_stacklevel < n) {
Guido van Rossum90f827c1998-08-25 18:22:17 +0000661 /* fprintf(stderr,
Guido van Rossum8b993a91997-01-17 21:04:03 +0000662 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
663 c->c_filename, c->c_lineno,
Guido van Rossum90f827c1998-08-25 18:22:17 +0000664 c->c_nexti, c->c_stacklevel, n); */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000665 c->c_stacklevel = 0;
666 }
667 else
668 c->c_stacklevel -= n;
669}
670
671static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000672com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000673{
674 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000675 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000676 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000677 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000678}
679
680static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000681com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000682{
683 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000684 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000685 assert(byte >= 0 && byte <= 255);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000686 if (byte < 0 || byte > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000687 com_error(c, PyExc_SystemError,
688 "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000689 }
690 if (c->c_code == NULL)
691 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000692 len = PyString_Size(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000693 if (c->c_nexti >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000694 if (_PyString_Resize(&c->c_code, len+1000) != 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000695 c->c_errors++;
696 return;
697 }
698 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000699 PyString_AsString(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000700}
701
702static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000703com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000704{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000705 com_addbyte(c, x & 0xff);
706 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000707}
708
709static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000710com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000711{
712 int size;
713 char *p;
714 if (c->c_lnotab == NULL)
715 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000716 size = PyString_Size(c->c_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000717 if (c->c_lnotab_next+2 > size) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000718 if (_PyString_Resize(&c->c_lnotab, size + 1000) < 0) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000719 c->c_errors++;
720 return;
721 }
722 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000723 p = PyString_AsString(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000724 *p++ = addr;
725 *p++ = line;
726 c->c_lnotab_next += 2;
727}
728
729static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000730com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000731{
732 c->c_lineno = lineno;
733 if (c->c_firstlineno == 0) {
734 c->c_firstlineno = c->c_last_line = lineno;
735 }
736 else {
737 int incr_addr = c->c_nexti - c->c_last_addr;
738 int incr_line = lineno - c->c_last_line;
Tim Peters2a7f3842001-06-09 09:26:21 +0000739 while (incr_addr > 255) {
740 com_add_lnotab(c, 255, 0);
741 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000742 }
Tim Peters2a7f3842001-06-09 09:26:21 +0000743 while (incr_line > 255) {
744 com_add_lnotab(c, incr_addr, 255);
745 incr_line -=255;
746 incr_addr = 0;
747 }
748 if (incr_addr > 0 || incr_line > 0)
749 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000750 c->c_last_addr = c->c_nexti;
751 c->c_last_line = lineno;
752 }
753}
754
755static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000756com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000757{
Fred Drakeef8ace32000-08-24 00:32:09 +0000758 int extended_arg = arg >> 16;
Guido van Rossum8e793d91997-03-03 19:13:14 +0000759 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000760 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000761 if (Py_OptimizeFlag)
762 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000763 }
Fred Drakeef8ace32000-08-24 00:32:09 +0000764 if (extended_arg){
765 com_addbyte(c, EXTENDED_ARG);
766 com_addint(c, extended_arg);
767 arg &= 0xffff;
768 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000769 com_addbyte(c, op);
770 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000771}
772
773static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000774com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000775{
776 /* Compile a forward reference for backpatching */
777 int here;
778 int anchor;
779 com_addbyte(c, op);
780 here = c->c_nexti;
781 anchor = *p_anchor;
782 *p_anchor = here;
783 com_addint(c, anchor == 0 ? 0 : here - anchor);
784}
785
786static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000787com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000788{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000789 unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000790 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000791 int dist;
792 int prev;
793 for (;;) {
794 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000795 prev = code[anchor] + (code[anchor+1] << 8);
796 dist = target - (anchor+2);
797 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +0000798 dist >>= 8;
799 code[anchor+1] = dist;
800 dist >>= 8;
801 if (dist) {
802 com_error(c, PyExc_SystemError,
803 "com_backpatch: offset too large");
804 break;
805 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000806 if (!prev)
807 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000808 anchor -= prev;
809 }
810}
811
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000812/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000813
814static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000815com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000816{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000817 PyObject *w, *t, *np=NULL;
818 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000819
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000820 t = Py_BuildValue("(OO)", v, v->ob_type);
821 if (t == NULL)
822 goto fail;
823 w = PyDict_GetItem(dict, t);
824 if (w != NULL) {
825 n = PyInt_AsLong(w);
826 } else {
827 n = PyList_Size(list);
828 np = PyInt_FromLong(n);
829 if (np == NULL)
830 goto fail;
831 if (PyList_Append(list, v) != 0)
832 goto fail;
833 if (PyDict_SetItem(dict, t, np) != 0)
834 goto fail;
835 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000836 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000837 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000838 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000839 fail:
840 Py_XDECREF(np);
841 Py_XDECREF(t);
842 c->c_errors++;
843 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000844}
845
846static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000847com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000848{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000849 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000850}
851
852static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000853com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000854{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000855 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000856}
857
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000858static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000859mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000860{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000861 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000862 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +0000863 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000864 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
865 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000866 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000867 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000868 return 0; /* Don't mangle __extremely_long_names */
869 if (name[nlen-1] == '_' && name[nlen-2] == '_')
870 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000871 /* Strip leading underscores from class name */
872 while (*p == '_')
873 p++;
874 if (*p == '\0')
875 return 0; /* Don't mangle if class is just underscores */
876 plen = strlen(p);
877 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000878 plen = maxlen-nlen-2; /* Truncate class name if too long */
879 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000880 buffer[0] = '_';
881 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000882 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000883 return 1;
884}
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000885
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000886static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000887com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000888{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000889 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000890 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000891 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000892
893 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000894 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000895 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000896 c->c_errors++;
897 i = 255;
898 }
899 else {
900 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000901 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000902 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000903 com_addoparg(c, op, i);
904}
905
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000906#define NAME_LOCAL 0
907#define NAME_GLOBAL 1
908#define NAME_DEFAULT 2
909#define NAME_CLOSURE 3
910
911static int
912com_lookup_arg(PyObject *dict, PyObject *name)
913{
914 PyObject *v = PyDict_GetItem(dict, name);
915 if (v == NULL)
916 return -1;
917 else
918 return PyInt_AS_LONG(v);
919}
920
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000921static void
922com_addop_varname(struct compiling *c, int kind, char *name)
923{
924 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000925 int i, reftype;
926 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000927 int op = STOP_CODE;
928 char buffer[MANGLE_LEN];
929
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000930 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000931 name = buffer;
932 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
933 c->c_errors++;
934 i = 255;
935 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000936 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000937
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000938 reftype = get_ref_type(c, name);
939 switch (reftype) {
940 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000941 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000942 scope = NAME_LOCAL;
943 break;
944 case GLOBAL_EXPLICIT:
945 scope = NAME_GLOBAL;
946 break;
947 case GLOBAL_IMPLICIT:
948 if (c->c_flags & CO_OPTIMIZED)
949 scope = NAME_GLOBAL;
950 break;
951 case FREE:
952 case CELL:
953 scope = NAME_CLOSURE;
954 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000955 }
956
957 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000958 if (scope == NAME_LOCAL)
959 i = com_lookup_arg(c->c_locals, v);
960 else if (reftype == FREE)
961 i = com_lookup_arg(c->c_freevars, v);
962 else if (reftype == CELL)
963 i = com_lookup_arg(c->c_cellvars, v);
964 if (i == -1) {
965 c->c_errors++; /* XXX no exception set */
966 i = 255;
967 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000968 }
969 Py_DECREF(v);
970
971 switch (kind) {
972 case VAR_LOAD:
973 switch (scope) {
974 case NAME_LOCAL:
975 op = LOAD_FAST;
976 break;
977 case NAME_GLOBAL:
978 op = LOAD_GLOBAL;
979 break;
980 case NAME_DEFAULT:
981 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000982 break;
983 case NAME_CLOSURE:
984 op = LOAD_DEREF;
985 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000986 }
987 break;
988 case VAR_STORE:
989 switch (scope) {
990 case NAME_LOCAL:
991 op = STORE_FAST;
992 break;
993 case NAME_GLOBAL:
994 op = STORE_GLOBAL;
995 break;
996 case NAME_DEFAULT:
997 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000998 break;
999 case NAME_CLOSURE:
1000 op = STORE_DEREF;
1001 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001002 }
1003 break;
1004 case VAR_DELETE:
1005 switch (scope) {
1006 case NAME_LOCAL:
1007 op = DELETE_FAST;
1008 break;
1009 case NAME_GLOBAL:
1010 op = DELETE_GLOBAL;
1011 break;
1012 case NAME_DEFAULT:
1013 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001014 break;
1015 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001016 char buf[500];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001017 sprintf(buf, DEL_CLOSURE_ERROR, name);
1018 com_error(c, PyExc_SyntaxError, buf);
1019 i = 255;
1020 break;
1021 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001022 }
1023 break;
1024 }
1025done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001026 com_addoparg(c, op, i);
1027}
1028
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001029static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001030com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001031{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001032 char *name;
1033 char buffer[1000];
1034 /* XXX it is possible to write this code without the 1000
1035 chars on the total length of dotted names, I just can't be
1036 bothered right now */
1037 if (TYPE(n) == STAR)
1038 name = "*";
1039 else if (TYPE(n) == dotted_name) {
1040 char *p = buffer;
1041 int i;
1042 name = buffer;
1043 for (i = 0; i < NCH(n); i += 2) {
1044 char *s = STR(CHILD(n, i));
1045 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001046 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001047 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001048 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001049 break;
1050 }
1051 if (p != buffer)
1052 *p++ = '.';
1053 strcpy(p, s);
1054 p = strchr(p, '\0');
1055 }
1056 }
1057 else {
1058 REQ(n, NAME);
1059 name = STR(n);
1060 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001061 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001062}
1063
Guido van Rossum79f25d91997-04-29 20:08:16 +00001064static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001065parsenumber(struct compiling *co, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001066{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001067 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001068 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001069 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001070#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +00001071 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +00001072 int imflag;
1073#endif
1074
Guido van Rossum282914b1991-04-04 10:42:56 +00001075 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001076 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001077#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001078 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001079#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001080 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001081 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001082 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001083 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001084 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001085 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001086 if (*end == '\0') {
1087 if (errno != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001088 com_error(co, PyExc_OverflowError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001089 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +00001090 return NULL;
1091 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001092 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001093 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001094 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001095#ifndef WITHOUT_COMPLEX
1096 if (imflag) {
1097 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001098 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +00001099 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001100 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001101 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +00001102 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001103 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001104#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001105 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001106 PyFPE_START_PROTECT("atof", return 0)
1107 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001108 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001109 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001110 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001111}
1112
Guido van Rossum79f25d91997-04-29 20:08:16 +00001113static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001114parsestr(char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001115{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001116 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001117 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001118 char *buf;
1119 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001120 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001121 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001122 int first = *s;
1123 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001124 int rawmode = 0;
1125 int unicode = 0;
1126 if (isalpha(quote) || quote == '_') {
1127 if (quote == 'u' || quote == 'U') {
1128 quote = *++s;
1129 unicode = 1;
1130 }
1131 if (quote == 'r' || quote == 'R') {
1132 quote = *++s;
1133 rawmode = 1;
1134 }
1135 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001136 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001137 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001138 return NULL;
1139 }
1140 s++;
1141 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001142 if (len > INT_MAX) {
1143 PyErr_SetString(PyExc_OverflowError, "string to parse is too long");
1144 return NULL;
1145 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001146 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001147 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001148 return NULL;
1149 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001150 if (len >= 4 && s[0] == quote && s[1] == quote) {
1151 s += 2;
1152 len -= 2;
1153 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001154 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001155 return NULL;
1156 }
1157 }
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001158 if (unicode || Py_UnicodeFlag) {
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001159 if (rawmode)
1160 return PyUnicode_DecodeRawUnicodeEscape(
1161 s, len, NULL);
1162 else
1163 return PyUnicode_DecodeUnicodeEscape(
1164 s, len, NULL);
1165 }
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001166 if (rawmode || strchr(s, '\\') == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001167 return PyString_FromStringAndSize(s, len);
1168 v = PyString_FromStringAndSize((char *)NULL, len);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001169 if (v == NULL)
1170 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001171 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001172 end = s + len;
1173 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001174 if (*s != '\\') {
1175 *p++ = *s++;
1176 continue;
1177 }
1178 s++;
1179 switch (*s++) {
1180 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001181 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001182 case '\\': *p++ = '\\'; break;
1183 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +00001184 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001185 case 'b': *p++ = '\b'; break;
1186 case 'f': *p++ = '\014'; break; /* FF */
1187 case 't': *p++ = '\t'; break;
1188 case 'n': *p++ = '\n'; break;
1189 case 'r': *p++ = '\r'; break;
1190 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001191 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
1192 case '0': case '1': case '2': case '3':
1193 case '4': case '5': case '6': case '7':
1194 c = s[-1] - '0';
1195 if ('0' <= *s && *s <= '7') {
1196 c = (c<<3) + *s++ - '0';
1197 if ('0' <= *s && *s <= '7')
1198 c = (c<<3) + *s++ - '0';
1199 }
1200 *p++ = c;
1201 break;
1202 case 'x':
Jeremy Hylton4419ac12001-02-28 22:54:51 +00001203 if (isxdigit(Py_CHARMASK(s[0]))
1204 && isxdigit(Py_CHARMASK(s[1]))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +00001205 unsigned int x = 0;
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001206 c = Py_CHARMASK(*s);
1207 s++;
1208 if (isdigit(c))
1209 x = c - '0';
1210 else if (islower(c))
1211 x = 10 + c - 'a';
1212 else
1213 x = 10 + c - 'A';
1214 x = x << 4;
1215 c = Py_CHARMASK(*s);
1216 s++;
1217 if (isdigit(c))
1218 x += c - '0';
1219 else if (islower(c))
1220 x += 10 + c - 'a';
1221 else
1222 x += 10 + c - 'A';
Guido van Rossumed1100f1997-10-20 23:24:07 +00001223 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001224 break;
1225 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00001226 PyErr_SetString(PyExc_ValueError,
1227 "invalid \\x escape");
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001228 Py_DECREF(v);
1229 return NULL;
1230 default:
1231 *p++ = '\\';
1232 *p++ = s[-1];
1233 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001234 }
1235 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001236 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001237 return v;
1238}
1239
Guido van Rossum79f25d91997-04-29 20:08:16 +00001240static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001241parsestrplus(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001242{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001243 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001244 int i;
1245 REQ(CHILD(n, 0), STRING);
1246 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
1247 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001248 for (i = 1; i < NCH(n); i++) {
1249 PyObject *s;
1250 s = parsestr(STR(CHILD(n, i)));
1251 if (s == NULL)
1252 goto onError;
1253 if (PyString_Check(v) && PyString_Check(s)) {
1254 PyString_ConcatAndDel(&v, s);
1255 if (v == NULL)
1256 goto onError;
1257 }
1258 else {
1259 PyObject *temp;
1260 temp = PyUnicode_Concat(v, s);
1261 Py_DECREF(s);
1262 if (temp == NULL)
1263 goto onError;
1264 Py_DECREF(v);
1265 v = temp;
1266 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001267 }
1268 }
1269 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001270
1271 onError:
1272 Py_XDECREF(v);
1273 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001274}
1275
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001276static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001277com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001278{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001279 int anchor = 0;
1280 int save_begin = c->c_begin;
1281
1282 /* list_iter: for v in expr [list_iter] */
1283 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001284 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001285 c->c_begin = c->c_nexti;
1286 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001287 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001288 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001289 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001290 c->c_loops++;
1291 com_list_iter(c, n, e, t);
1292 c->c_loops--;
1293 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1294 c->c_begin = save_begin;
1295 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001296 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001297}
1298
1299static void
1300com_list_if(struct compiling *c, node *n, node *e, char *t)
1301{
1302 int anchor = 0;
1303 int a = 0;
1304 /* list_iter: 'if' test [list_iter] */
1305 com_addoparg(c, SET_LINENO, n->n_lineno);
1306 com_node(c, CHILD(n, 1));
1307 com_addfwref(c, JUMP_IF_FALSE, &a);
1308 com_addbyte(c, POP_TOP);
1309 com_pop(c, 1);
1310 com_list_iter(c, n, e, t);
1311 com_addfwref(c, JUMP_FORWARD, &anchor);
1312 com_backpatch(c, a);
1313 /* We jump here with an extra entry which we now pop */
1314 com_addbyte(c, POP_TOP);
1315 com_backpatch(c, anchor);
1316}
1317
1318static void
1319com_list_iter(struct compiling *c,
1320 node *p, /* parent of list_iter node */
1321 node *e, /* element expression node */
1322 char *t /* name of result list temp local */)
1323{
1324 /* list_iter is the last child in a listmaker, list_for, or list_if */
1325 node *n = CHILD(p, NCH(p)-1);
1326 if (TYPE(n) == list_iter) {
1327 n = CHILD(n, 0);
1328 switch (TYPE(n)) {
1329 case list_for:
1330 com_list_for(c, n, e, t);
1331 break;
1332 case list_if:
1333 com_list_if(c, n, e, t);
1334 break;
1335 default:
1336 com_error(c, PyExc_SystemError,
1337 "invalid list_iter node type");
1338 }
1339 }
1340 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001341 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001342 com_push(c, 1);
1343 com_node(c, e);
1344 com_addoparg(c, CALL_FUNCTION, 1);
1345 com_addbyte(c, POP_TOP);
1346 com_pop(c, 2);
1347 }
1348}
1349
1350static void
1351com_list_comprehension(struct compiling *c, node *n)
1352{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001353 /* listmaker: test list_for */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001354 char tmpname[12];
Tim Peters30814212001-02-17 05:30:26 +00001355 sprintf(tmpname, "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001356 com_addoparg(c, BUILD_LIST, 0);
1357 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1358 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001359 com_addop_name(c, LOAD_ATTR, "append");
1360 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001361 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001362 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001363 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001364 --c->c_tmpname;
1365}
1366
1367static void
1368com_listmaker(struct compiling *c, node *n)
1369{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001370 /* listmaker: test ( list_for | (',' test)* [','] ) */
1371 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001372 com_list_comprehension(c, n);
1373 else {
1374 int len = 0;
1375 int i;
1376 for (i = 0; i < NCH(n); i += 2, len++)
1377 com_node(c, CHILD(n, i));
1378 com_addoparg(c, BUILD_LIST, len);
1379 com_pop(c, len-1);
1380 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001381}
1382
1383static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001384com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001385{
1386 int i;
1387 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1388 for (i = 0; i+2 < NCH(n); i += 4) {
1389 /* We must arrange things just right for STORE_SUBSCR.
1390 It wants the stack to look like (value) (dict) (key) */
1391 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001392 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001393 com_node(c, CHILD(n, i+2)); /* value */
1394 com_addbyte(c, ROT_TWO);
1395 com_node(c, CHILD(n, i)); /* key */
1396 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001397 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001398 }
1399}
1400
1401static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001402com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001403{
1404 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001405 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001406 int i;
1407 REQ(n, atom);
1408 ch = CHILD(n, 0);
1409 switch (TYPE(ch)) {
1410 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001411 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001412 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001413 com_push(c, 1);
1414 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001415 else
1416 com_node(c, CHILD(n, 1));
1417 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001418 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001419 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001420 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001421 com_push(c, 1);
1422 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001423 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001424 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001425 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001426 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001427 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001428 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001429 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001430 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001431 break;
1432 case BACKQUOTE:
1433 com_node(c, CHILD(n, 1));
1434 com_addbyte(c, UNARY_CONVERT);
1435 break;
1436 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001437 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001438 i = 255;
1439 }
1440 else {
1441 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001442 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001443 }
1444 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001445 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001446 break;
1447 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001448 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001449 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001450 c->c_errors++;
1451 i = 255;
1452 }
1453 else {
1454 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001455 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001456 }
1457 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001458 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001459 break;
1460 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001461 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001462 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001463 break;
1464 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001465 com_error(c, PyExc_SystemError,
1466 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001467 }
1468}
1469
1470static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001471com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001472{
1473 if (NCH(n) == 1) {
1474 com_addbyte(c, op);
1475 }
1476 else if (NCH(n) == 2) {
1477 if (TYPE(CHILD(n, 0)) != COLON) {
1478 com_node(c, CHILD(n, 0));
1479 com_addbyte(c, op+1);
1480 }
1481 else {
1482 com_node(c, CHILD(n, 1));
1483 com_addbyte(c, op+2);
1484 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001485 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001486 }
1487 else {
1488 com_node(c, CHILD(n, 0));
1489 com_node(c, CHILD(n, 2));
1490 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001491 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001492 }
1493}
1494
Guido van Rossum635abd21997-01-06 22:56:52 +00001495static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001496com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1497{
1498 if (NCH(n) == 1) {
1499 com_addbyte(c, DUP_TOP);
1500 com_push(c, 1);
1501 com_addbyte(c, SLICE);
1502 com_node(c, augn);
1503 com_addbyte(c, opcode);
1504 com_pop(c, 1);
1505 com_addbyte(c, ROT_TWO);
1506 com_addbyte(c, STORE_SLICE);
1507 com_pop(c, 2);
1508 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1509 com_node(c, CHILD(n, 0));
1510 com_addoparg(c, DUP_TOPX, 2);
1511 com_push(c, 2);
1512 com_addbyte(c, SLICE+1);
1513 com_pop(c, 1);
1514 com_node(c, augn);
1515 com_addbyte(c, opcode);
1516 com_pop(c, 1);
1517 com_addbyte(c, ROT_THREE);
1518 com_addbyte(c, STORE_SLICE+1);
1519 com_pop(c, 3);
1520 } else if (NCH(n) == 2) {
1521 com_node(c, CHILD(n, 1));
1522 com_addoparg(c, DUP_TOPX, 2);
1523 com_push(c, 2);
1524 com_addbyte(c, SLICE+2);
1525 com_pop(c, 1);
1526 com_node(c, augn);
1527 com_addbyte(c, opcode);
1528 com_pop(c, 1);
1529 com_addbyte(c, ROT_THREE);
1530 com_addbyte(c, STORE_SLICE+2);
1531 com_pop(c, 3);
1532 } else {
1533 com_node(c, CHILD(n, 0));
1534 com_node(c, CHILD(n, 2));
1535 com_addoparg(c, DUP_TOPX, 3);
1536 com_push(c, 3);
1537 com_addbyte(c, SLICE+3);
1538 com_pop(c, 2);
1539 com_node(c, augn);
1540 com_addbyte(c, opcode);
1541 com_pop(c, 1);
1542 com_addbyte(c, ROT_FOUR);
1543 com_addbyte(c, STORE_SLICE+3);
1544 com_pop(c, 4);
1545 }
1546}
1547
1548static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001549com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001550{
1551 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001552 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001553 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001554 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001555 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001556 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001557 }
1558 else {
1559 com_node(c, CHILD(n, 0));
1560 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001561 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001562 }
1563 m = n;
1564 do {
1565 m = CHILD(m, 0);
1566 } while (NCH(m) == 1);
1567 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00001568 /* f(lambda x: x[0] = 3) ends up getting parsed with
1569 * LHS test = lambda x: x[0], and RHS test = 3.
1570 * SF bug 132313 points out that complaining about a keyword
1571 * then is very confusing.
1572 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001573 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00001574 TYPE(m) == lambdef ?
1575 "lambda cannot contain assignment" :
1576 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001577 }
1578 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001579 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001580 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001581 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001582 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001583 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001584 else if (*pkeywords == NULL) {
1585 c->c_errors++;
1586 Py_DECREF(v);
1587 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001588 if (PyDict_GetItem(*pkeywords, v) != NULL)
1589 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001590 "duplicate keyword argument");
1591 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001592 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001593 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001594 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001595 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001596 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001597 }
1598 }
1599 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001600}
1601
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001602static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001603com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001604{
1605 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001606 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001607 }
1608 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001609 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001610 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001611 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001612 int star_flag = 0;
1613 int starstar_flag = 0;
1614 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001615 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001616 na = 0;
1617 nk = 0;
1618 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001619 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001620 if (TYPE(ch) == STAR ||
1621 TYPE(ch) == DOUBLESTAR)
1622 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001623 if (ch->n_lineno != lineno) {
1624 lineno = ch->n_lineno;
1625 com_addoparg(c, SET_LINENO, lineno);
1626 }
1627 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001628 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001629 na++;
1630 else
1631 nk++;
1632 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001633 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001634 while (i < NCH(n)) {
1635 node *tok = CHILD(n, i);
1636 node *ch = CHILD(n, i+1);
1637 i += 3;
1638 switch (TYPE(tok)) {
1639 case STAR: star_flag = 1; break;
1640 case DOUBLESTAR: starstar_flag = 1; break;
1641 }
1642 com_node(c, ch);
1643 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001644 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001645 com_error(c, PyExc_SyntaxError,
1646 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001647 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001648 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001649 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001650 star_flag + (starstar_flag << 1);
1651 else
1652 opcode = CALL_FUNCTION;
1653 com_addoparg(c, opcode, na | (nk << 8));
1654 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001655 }
1656}
1657
1658static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001659com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001660{
1661 com_addopname(c, LOAD_ATTR, n);
1662}
1663
1664static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001665com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001666{
1667 int i=0;
1668 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001669 node *ch;
1670
1671 /* first argument */
1672 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001673 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001674 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001675 i++;
1676 }
1677 else {
1678 com_node(c, CHILD(n,i));
1679 i++;
1680 REQ(CHILD(n,i),COLON);
1681 i++;
1682 }
1683 /* second argument */
1684 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1685 com_node(c, CHILD(n,i));
1686 i++;
1687 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001688 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001689 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001690 com_push(c, 1);
1691 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001692 /* remaining arguments */
1693 for (; i < NCH(n); i++) {
1694 ns++;
1695 ch=CHILD(n,i);
1696 REQ(ch, sliceop);
1697 if (NCH(ch) == 1) {
1698 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001699 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001700 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001701 }
1702 else
1703 com_node(c, CHILD(ch,1));
1704 }
1705 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001706 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001707}
1708
1709static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001710com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001711{
1712 node *ch;
1713 REQ(n, subscript);
1714 ch = CHILD(n,0);
1715 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001716 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001717 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001718 com_push(c, 1);
1719 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001720 else {
1721 /* check for slice */
1722 if ((TYPE(ch) == COLON || NCH(n) > 1))
1723 com_sliceobj(c, n);
1724 else {
1725 REQ(ch, test);
1726 com_node(c, ch);
1727 }
1728 }
1729}
1730
1731static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001732com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001733{
1734 int i, op;
1735 REQ(n, subscriptlist);
1736 /* Check to make backward compatible slice behavior for '[i:j]' */
1737 if (NCH(n) == 1) {
1738 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001739 /* 'Basic' slice, should have exactly one colon. */
1740 if ((TYPE(CHILD(sub, 0)) == COLON
1741 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1742 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1743 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001744 switch (assigning) {
1745 case OP_DELETE:
1746 op = DELETE_SLICE;
1747 break;
1748 case OP_ASSIGN:
1749 op = STORE_SLICE;
1750 break;
1751 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001752 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001753 break;
1754 default:
1755 com_augassign_slice(c, sub, assigning, augn);
1756 return;
1757 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001758 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001759 if (op == STORE_SLICE)
1760 com_pop(c, 2);
1761 else if (op == DELETE_SLICE)
1762 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001763 return;
1764 }
1765 }
1766 /* Else normal subscriptlist. Compile each subscript. */
1767 for (i = 0; i < NCH(n); i += 2)
1768 com_subscript(c, CHILD(n, i));
1769 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001770 if (NCH(n) > 1) {
1771 i = (NCH(n)+1) / 2;
1772 com_addoparg(c, BUILD_TUPLE, i);
1773 com_pop(c, i-1);
1774 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001775 switch (assigning) {
1776 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001777 op = DELETE_SUBSCR;
1778 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00001779 break;
1780 default:
1781 case OP_ASSIGN:
1782 op = STORE_SUBSCR;
1783 i = 3;
1784 break;
1785 case OP_APPLY:
1786 op = BINARY_SUBSCR;
1787 i = 1;
1788 break;
1789 }
1790 if (assigning > OP_APPLY) {
1791 com_addoparg(c, DUP_TOPX, 2);
1792 com_push(c, 2);
1793 com_addbyte(c, BINARY_SUBSCR);
1794 com_pop(c, 1);
1795 com_node(c, augn);
1796 com_addbyte(c, assigning);
1797 com_pop(c, 1);
1798 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001799 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001800 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001801 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001802}
1803
1804static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001805com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001806{
1807 REQ(n, trailer);
1808 switch (TYPE(CHILD(n, 0))) {
1809 case LPAR:
1810 com_call_function(c, CHILD(n, 1));
1811 break;
1812 case DOT:
1813 com_select_member(c, CHILD(n, 1));
1814 break;
1815 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00001816 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001817 break;
1818 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001819 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001820 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001821 }
1822}
1823
1824static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001825com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001826{
1827 int i;
1828 REQ(n, power);
1829 com_atom(c, CHILD(n, 0));
1830 for (i = 1; i < NCH(n); i++) {
1831 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1832 com_factor(c, CHILD(n, i+1));
1833 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001834 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001835 break;
1836 }
1837 else
1838 com_apply_trailer(c, CHILD(n, i));
1839 }
1840}
1841
1842static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001843com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001844{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001845 REQ(n, factor);
1846 if (TYPE(CHILD(n, 0)) == PLUS) {
1847 com_factor(c, CHILD(n, 1));
1848 com_addbyte(c, UNARY_POSITIVE);
1849 }
1850 else if (TYPE(CHILD(n, 0)) == MINUS) {
1851 com_factor(c, CHILD(n, 1));
1852 com_addbyte(c, UNARY_NEGATIVE);
1853 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001854 else if (TYPE(CHILD(n, 0)) == TILDE) {
1855 com_factor(c, CHILD(n, 1));
1856 com_addbyte(c, UNARY_INVERT);
1857 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001858 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001859 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001860 }
1861}
1862
1863static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001864com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001865{
1866 int i;
1867 int op;
1868 REQ(n, term);
1869 com_factor(c, CHILD(n, 0));
1870 for (i = 2; i < NCH(n); i += 2) {
1871 com_factor(c, CHILD(n, i));
1872 switch (TYPE(CHILD(n, i-1))) {
1873 case STAR:
1874 op = BINARY_MULTIPLY;
1875 break;
1876 case SLASH:
1877 op = BINARY_DIVIDE;
1878 break;
1879 case PERCENT:
1880 op = BINARY_MODULO;
1881 break;
1882 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001883 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001884 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001885 op = 255;
1886 }
1887 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001888 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001889 }
1890}
1891
1892static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001893com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001894{
1895 int i;
1896 int op;
1897 REQ(n, arith_expr);
1898 com_term(c, CHILD(n, 0));
1899 for (i = 2; i < NCH(n); i += 2) {
1900 com_term(c, CHILD(n, i));
1901 switch (TYPE(CHILD(n, i-1))) {
1902 case PLUS:
1903 op = BINARY_ADD;
1904 break;
1905 case MINUS:
1906 op = BINARY_SUBTRACT;
1907 break;
1908 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001909 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001910 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001911 op = 255;
1912 }
1913 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001914 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001915 }
1916}
1917
1918static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001919com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001920{
1921 int i;
1922 int op;
1923 REQ(n, shift_expr);
1924 com_arith_expr(c, CHILD(n, 0));
1925 for (i = 2; i < NCH(n); i += 2) {
1926 com_arith_expr(c, CHILD(n, i));
1927 switch (TYPE(CHILD(n, i-1))) {
1928 case LEFTSHIFT:
1929 op = BINARY_LSHIFT;
1930 break;
1931 case RIGHTSHIFT:
1932 op = BINARY_RSHIFT;
1933 break;
1934 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001935 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001936 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001937 op = 255;
1938 }
1939 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001940 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001941 }
1942}
1943
1944static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001945com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001946{
1947 int i;
1948 int op;
1949 REQ(n, and_expr);
1950 com_shift_expr(c, CHILD(n, 0));
1951 for (i = 2; i < NCH(n); i += 2) {
1952 com_shift_expr(c, CHILD(n, i));
1953 if (TYPE(CHILD(n, i-1)) == AMPER) {
1954 op = BINARY_AND;
1955 }
1956 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001957 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001958 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001959 op = 255;
1960 }
1961 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001962 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001963 }
1964}
1965
1966static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001967com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001968{
1969 int i;
1970 int op;
1971 REQ(n, xor_expr);
1972 com_and_expr(c, CHILD(n, 0));
1973 for (i = 2; i < NCH(n); i += 2) {
1974 com_and_expr(c, CHILD(n, i));
1975 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1976 op = BINARY_XOR;
1977 }
1978 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001979 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001980 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001981 op = 255;
1982 }
1983 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001984 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001985 }
1986}
1987
1988static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001989com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001990{
1991 int i;
1992 int op;
1993 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001994 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001995 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001996 com_xor_expr(c, CHILD(n, i));
1997 if (TYPE(CHILD(n, i-1)) == VBAR) {
1998 op = BINARY_OR;
1999 }
2000 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002001 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002002 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002003 op = 255;
2004 }
2005 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002006 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002007 }
2008}
2009
2010static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002011cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002012{
2013 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00002014 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002015 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2016 if (NCH(n) == 1) {
2017 n = CHILD(n, 0);
2018 switch (TYPE(n)) {
2019 case LESS: return LT;
2020 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00002021 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002022 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00002023 case LESSEQUAL: return LE;
2024 case GREATEREQUAL: return GE;
2025 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002026 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
2027 if (strcmp(STR(n), "is") == 0) return IS;
2028 }
2029 }
2030 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002031 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002032 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
2033 return NOT_IN;
2034 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
2035 return IS_NOT;
2036 }
2037 }
2038 return BAD;
2039}
2040
2041static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002042com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002043{
2044 int i;
2045 enum cmp_op op;
2046 int anchor;
2047 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2048 com_expr(c, CHILD(n, 0));
2049 if (NCH(n) == 1)
2050 return;
2051
2052 /****************************************************************
2053 The following code is generated for all but the last
2054 comparison in a chain:
2055
2056 label: on stack: opcode: jump to:
2057
2058 a <code to load b>
2059 a, b DUP_TOP
2060 a, b, b ROT_THREE
2061 b, a, b COMPARE_OP
2062 b, 0-or-1 JUMP_IF_FALSE L1
2063 b, 1 POP_TOP
2064 b
2065
2066 We are now ready to repeat this sequence for the next
2067 comparison in the chain.
2068
2069 For the last we generate:
2070
2071 b <code to load c>
2072 b, c COMPARE_OP
2073 0-or-1
2074
2075 If there were any jumps to L1 (i.e., there was more than one
2076 comparison), we generate:
2077
2078 0-or-1 JUMP_FORWARD L2
2079 L1: b, 0 ROT_TWO
2080 0, b POP_TOP
2081 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002082 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002083 ****************************************************************/
2084
2085 anchor = 0;
2086
2087 for (i = 2; i < NCH(n); i += 2) {
2088 com_expr(c, CHILD(n, i));
2089 if (i+2 < NCH(n)) {
2090 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002091 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002092 com_addbyte(c, ROT_THREE);
2093 }
2094 op = cmp_type(CHILD(n, i-1));
2095 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002096 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002097 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002098 }
2099 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002100 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002101 if (i+2 < NCH(n)) {
2102 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2103 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002104 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002105 }
2106 }
2107
2108 if (anchor) {
2109 int anchor2 = 0;
2110 com_addfwref(c, JUMP_FORWARD, &anchor2);
2111 com_backpatch(c, anchor);
2112 com_addbyte(c, ROT_TWO);
2113 com_addbyte(c, POP_TOP);
2114 com_backpatch(c, anchor2);
2115 }
2116}
2117
2118static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002119com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002120{
2121 REQ(n, not_test); /* 'not' not_test | comparison */
2122 if (NCH(n) == 1) {
2123 com_comparison(c, CHILD(n, 0));
2124 }
2125 else {
2126 com_not_test(c, CHILD(n, 1));
2127 com_addbyte(c, UNARY_NOT);
2128 }
2129}
2130
2131static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002132com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002133{
2134 int i;
2135 int anchor;
2136 REQ(n, and_test); /* not_test ('and' not_test)* */
2137 anchor = 0;
2138 i = 0;
2139 for (;;) {
2140 com_not_test(c, CHILD(n, i));
2141 if ((i += 2) >= NCH(n))
2142 break;
2143 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2144 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002145 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002146 }
2147 if (anchor)
2148 com_backpatch(c, anchor);
2149}
2150
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002151static int
2152com_make_closure(struct compiling *c, PyCodeObject *co)
2153{
2154 int i, free = PyTuple_GET_SIZE(co->co_freevars);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002155 /* If the code is compiled with st->st_nested_scopes == 0,
2156 then no variable will ever be added to co_freevars.
2157 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002158 if (free == 0)
2159 return 0;
2160 for (i = 0; i < free; ++i) {
2161 /* Bypass com_addop_varname because it will generate
2162 LOAD_DEREF but LOAD_CLOSURE is needed.
2163 */
2164 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2165 int arg, reftype;
2166
2167 /* Special case: If a class contains a method with a
2168 free variable that has the same name as a method,
2169 the name will be considered free *and* local in the
2170 class. It should be handled by the closure, as
2171 well as by the normal name loookup logic.
2172 */
2173 reftype = get_ref_type(c, PyString_AS_STRING(name));
2174 if (reftype == CELL)
2175 arg = com_lookup_arg(c->c_cellvars, name);
2176 else /* (reftype == FREE) */
2177 arg = com_lookup_arg(c->c_freevars, name);
2178 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002179 fprintf(stderr, "lookup %s in %s %d %d\n"
2180 "freevars of %s: %s\n",
2181 PyObject_REPR(name),
2182 c->c_name,
2183 reftype, arg,
2184 PyString_AS_STRING(co->co_name),
2185 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002186 Py_FatalError("com_make_closure()");
2187 }
2188 com_addoparg(c, LOAD_CLOSURE, arg);
2189
2190 }
2191 com_push(c, free);
2192 return 1;
2193}
2194
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002195static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002196com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002197{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002198 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002199 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002200 PyObject *co;
2201 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002202 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002203 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2204 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002205 co = (PyObject *) icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002206 if (co == NULL) {
2207 c->c_errors++;
2208 return;
2209 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002210 symtable_exit_scope(c->c_symtable);
Tim Peters1e542112001-02-23 22:23:53 +00002211 i = com_addconst(c, co);
2212 closure = com_make_closure(c, (PyCodeObject *)co);
2213 Py_DECREF(co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002214 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002215 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002216 if (closure)
2217 com_addoparg(c, MAKE_CLOSURE, ndefs);
2218 else
2219 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002220 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002221 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002222 else {
2223 int anchor = 0;
2224 int i = 0;
2225 for (;;) {
2226 com_and_test(c, CHILD(n, i));
2227 if ((i += 2) >= NCH(n))
2228 break;
2229 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2230 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002231 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002232 }
2233 if (anchor)
2234 com_backpatch(c, anchor);
2235 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002236}
2237
2238static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002239com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002240{
2241 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002242 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002243 com_node(c, CHILD(n, 0));
2244 }
2245 else {
2246 int i;
2247 int len;
2248 len = (NCH(n) + 1) / 2;
2249 for (i = 0; i < NCH(n); i += 2)
2250 com_node(c, CHILD(n, i));
2251 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002252 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002253 }
2254}
2255
2256
2257/* Begin of assignment compilation */
2258
Thomas Wouters434d0822000-08-24 20:11:32 +00002259
2260static void
2261com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2262{
2263 com_addbyte(c, DUP_TOP);
2264 com_push(c, 1);
2265 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002266 com_node(c, augn);
2267 com_addbyte(c, opcode);
2268 com_pop(c, 1);
2269 com_addbyte(c, ROT_TWO);
2270 com_addopname(c, STORE_ATTR, n);
2271 com_pop(c, 2);
2272}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002273
2274static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002275com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002276{
2277 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002278 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002279}
2280
2281static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002282com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002283{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002284 REQ(n, trailer);
2285 switch (TYPE(CHILD(n, 0))) {
2286 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002287 com_error(c, PyExc_SyntaxError,
2288 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002289 break;
2290 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002291 if (assigning > OP_APPLY)
2292 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2293 else
2294 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002295 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002296 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002297 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002298 break;
2299 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002300 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002301 }
2302}
2303
2304static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002305com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002306{
2307 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002308 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002309 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002310 if (assigning) {
2311 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002312 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002313 com_push(c, i-1);
2314 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002315 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002316 com_assign(c, CHILD(n, i), assigning, NULL);
2317}
2318
2319static void
2320com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2321{
2322 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002323 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002324 com_push(c, 1);
2325 com_node(c, augn);
2326 com_addbyte(c, opcode);
2327 com_pop(c, 1);
2328 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002329}
2330
2331static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002332com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002333{
2334 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002335 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002336 if (assigning)
2337 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002338}
2339
2340static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002341com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002342{
2343 /* Loop to avoid trivial recursion */
2344 for (;;) {
2345 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002346
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002347 case exprlist:
2348 case testlist:
2349 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002350 if (assigning > OP_APPLY) {
2351 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002352 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002353 return;
2354 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002355 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002356 return;
2357 }
2358 n = CHILD(n, 0);
2359 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002360
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002361 case test:
2362 case and_test:
2363 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002364 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002365 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002366 case xor_expr:
2367 case and_expr:
2368 case shift_expr:
2369 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002370 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002371 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002372 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002373 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002374 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002375 return;
2376 }
2377 n = CHILD(n, 0);
2378 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002379
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002380 case power: /* atom trailer* ('**' power)*
2381 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002382 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002383 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002384 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002385 return;
2386 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002387 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002388 int i;
2389 com_node(c, CHILD(n, 0));
2390 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002391 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002392 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002393 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002394 return;
2395 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002396 com_apply_trailer(c, CHILD(n, i));
2397 } /* NB i is still alive */
2398 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002399 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002400 return;
2401 }
2402 n = CHILD(n, 0);
2403 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002404
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002405 case atom:
2406 switch (TYPE(CHILD(n, 0))) {
2407 case LPAR:
2408 n = CHILD(n, 1);
2409 if (TYPE(n) == RPAR) {
2410 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002411 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002412 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002413 return;
2414 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002415 if (assigning > OP_APPLY) {
2416 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002417 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002418 return;
2419 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002420 break;
2421 case LSQB:
2422 n = CHILD(n, 1);
2423 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002424 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002425 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002426 return;
2427 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002428 if (assigning > OP_APPLY) {
2429 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002430 "augmented assign to list not possible");
2431 return;
2432 }
2433 if (NCH(n) > 1
2434 && TYPE(CHILD(n, 1)) == list_for) {
2435 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002436 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002437 return;
2438 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002439 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002440 return;
2441 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002442 if (assigning > OP_APPLY)
2443 com_augassign_name(c, CHILD(n, 0),
2444 assigning, augn);
2445 else
2446 com_assign_name(c, CHILD(n, 0),
2447 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002448 return;
2449 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002450 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002451 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002452 return;
2453 }
2454 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002455
2456 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002457 com_error(c, PyExc_SyntaxError,
2458 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002459 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002460
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002461 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002462 com_error(c, PyExc_SystemError,
2463 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002464 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002465
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002466 }
2467 }
2468}
Guido van Rossum7c531111997-03-11 18:42:21 +00002469
Thomas Wouters434d0822000-08-24 20:11:32 +00002470static void
2471com_augassign(struct compiling *c, node *n)
2472{
2473 int opcode;
2474
2475 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2476 case '+': opcode = INPLACE_ADD; break;
2477 case '-': opcode = INPLACE_SUBTRACT; break;
2478 case '/': opcode = INPLACE_DIVIDE; break;
2479 case '%': opcode = INPLACE_MODULO; break;
2480 case '<': opcode = INPLACE_LSHIFT; break;
2481 case '>': opcode = INPLACE_RSHIFT; break;
2482 case '&': opcode = INPLACE_AND; break;
2483 case '^': opcode = INPLACE_XOR; break;
2484 case '|': opcode = INPLACE_OR; break;
2485 case '*':
2486 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2487 opcode = INPLACE_POWER;
2488 else
2489 opcode = INPLACE_MULTIPLY;
2490 break;
2491 default:
2492 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2493 return;
2494 }
2495 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2496}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002497
2498static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002499com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002500{
Thomas Wouters434d0822000-08-24 20:11:32 +00002501 REQ(n, expr_stmt);
2502 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002503 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002504 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002505 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002506 if (NCH(n) == 1) {
2507 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002508 if (c->c_interactive)
2509 com_addbyte(c, PRINT_EXPR);
2510 else
2511 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002512 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002513 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002514 else if (TYPE(CHILD(n,1)) == augassign)
2515 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002516 else {
2517 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002518 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002519 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002520 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002521 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002522 com_push(c, 1);
2523 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002524 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002525 }
2526 }
2527}
2528
2529static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002530com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002531{
2532 int a = 0, b = 0;
2533 int i;
2534 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2535 /* Generate code like for
2536
2537 if __debug__:
2538 if not <test>:
2539 raise AssertionError [, <message>]
2540
2541 where <message> is the second test, if present.
2542 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002543
Guido van Rossum228d7f31997-04-02 05:24:36 +00002544 if (Py_OptimizeFlag)
2545 return;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002546 com_addop_name(c, LOAD_GLOBAL, "__debug__");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002547 com_push(c, 1);
2548 com_addfwref(c, JUMP_IF_FALSE, &a);
2549 com_addbyte(c, POP_TOP);
2550 com_pop(c, 1);
2551 com_node(c, CHILD(n, 1));
2552 com_addfwref(c, JUMP_IF_TRUE, &b);
2553 com_addbyte(c, POP_TOP);
2554 com_pop(c, 1);
2555 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002556 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002557 com_push(c, 1);
2558 i = NCH(n)/2; /* Either 2 or 4 */
2559 if (i > 1)
2560 com_node(c, CHILD(n, 3));
2561 com_addoparg(c, RAISE_VARARGS, i);
2562 com_pop(c, i);
2563 /* The interpreter does not fall through */
2564 /* All jumps converge here */
2565 com_backpatch(c, a);
2566 com_backpatch(c, b);
2567 com_addbyte(c, POP_TOP);
2568}
2569
2570static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002571com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002572{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002573 int i = 1;
2574 node* stream = NULL;
2575
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002576 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002577
2578 /* are we using the extended print form? */
2579 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2580 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002581 com_node(c, stream);
2582 /* stack: [...] => [... stream] */
2583 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002584 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2585 i = 4;
2586 else
2587 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002588 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002589 for (; i < NCH(n); i += 2) {
2590 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002591 com_addbyte(c, DUP_TOP);
2592 /* stack: [stream] => [stream stream] */
2593 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002594 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002595 /* stack: [stream stream] => [stream stream obj] */
2596 com_addbyte(c, ROT_TWO);
2597 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002598 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002599 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002600 com_pop(c, 2);
2601 }
2602 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002603 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002604 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002605 com_addbyte(c, PRINT_ITEM);
2606 com_pop(c, 1);
2607 }
2608 }
2609 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002610 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002611 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002612 /* must pop the extra stream object off the stack */
2613 com_addbyte(c, POP_TOP);
2614 /* stack: [... stream] => [...] */
2615 com_pop(c, 1);
2616 }
2617 }
2618 else {
2619 if (stream != NULL) {
2620 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002621 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002622 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002623 com_pop(c, 1);
2624 }
2625 else
2626 com_addbyte(c, PRINT_NEWLINE);
2627 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002628}
2629
2630static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002631com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002632{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002633 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002634 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002635 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002636 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002637 if (NCH(n) < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002638 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002639 com_push(c, 1);
2640 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002641 else
2642 com_node(c, CHILD(n, 1));
2643 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002644 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002645}
2646
2647static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002648com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002649{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002650 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002651 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2652 if (NCH(n) > 1) {
2653 com_node(c, CHILD(n, 1));
2654 if (NCH(n) > 3) {
2655 com_node(c, CHILD(n, 3));
2656 if (NCH(n) > 5)
2657 com_node(c, CHILD(n, 5));
2658 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002659 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002660 i = NCH(n)/2;
2661 com_addoparg(c, RAISE_VARARGS, i);
2662 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002663}
2664
2665static void
Thomas Wouters52152252000-08-17 22:55:00 +00002666com_from_import(struct compiling *c, node *n)
2667{
2668 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2669 com_push(c, 1);
2670 if (NCH(n) > 1) {
2671 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2672 com_error(c, PyExc_SyntaxError, "invalid syntax");
2673 return;
2674 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002675 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002676 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002677 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00002678 com_pop(c, 1);
2679}
2680
2681static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002682com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002683{
2684 int i;
2685 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002686 /* 'import' dotted_name (',' dotted_name)* |
2687 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002688 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00002689 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002690 /* 'from' dotted_name 'import' ... */
2691 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002692
2693 if (TYPE(CHILD(n, 3)) == STAR) {
2694 tup = Py_BuildValue("(s)", "*");
2695 } else {
2696 tup = PyTuple_New((NCH(n) - 2)/2);
2697 for (i = 3; i < NCH(n); i += 2) {
2698 PyTuple_SET_ITEM(tup, (i-3)/2,
2699 PyString_FromString(STR(
Jeremy Hylton4419ac12001-02-28 22:54:51 +00002700 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002701 }
2702 }
2703 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00002704 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002705 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002706 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00002707 if (TYPE(CHILD(n, 3)) == STAR)
2708 com_addbyte(c, IMPORT_STAR);
2709 else {
2710 for (i = 3; i < NCH(n); i += 2)
2711 com_from_import(c, CHILD(n, i));
2712 com_addbyte(c, POP_TOP);
2713 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002714 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002715 }
2716 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002717 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002718 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00002719 node *subn = CHILD(n, i);
2720 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002721 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002722 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002723 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00002724 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00002725 int j;
2726 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00002727 com_error(c, PyExc_SyntaxError,
2728 "invalid syntax");
2729 return;
2730 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00002731 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
2732 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002733 CHILD(CHILD(subn, 0),
2734 j));
2735 com_addop_varname(c, VAR_STORE,
2736 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002737 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002738 com_addop_varname(c, VAR_STORE,
2739 STR(CHILD(CHILD(subn, 0),
2740 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002741 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002742 }
2743 }
2744}
2745
2746static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002747com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002748{
2749 REQ(n, exec_stmt);
2750 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2751 com_node(c, CHILD(n, 1));
2752 if (NCH(n) >= 4)
2753 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002754 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002755 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002756 com_push(c, 1);
2757 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002758 if (NCH(n) >= 6)
2759 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002760 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002761 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002762 com_push(c, 1);
2763 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002764 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002765 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002766}
2767
Guido van Rossum7c531111997-03-11 18:42:21 +00002768static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002769is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002770{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002771 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002772 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002773 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00002774
2775 /* Label to avoid tail recursion */
2776 next:
2777 switch (TYPE(n)) {
2778
2779 case suite:
2780 if (NCH(n) == 1) {
2781 n = CHILD(n, 0);
2782 goto next;
2783 }
2784 /* Fall through */
2785 case file_input:
2786 for (i = 0; i < NCH(n); i++) {
2787 node *ch = CHILD(n, i);
2788 if (TYPE(ch) == stmt) {
2789 n = ch;
2790 goto next;
2791 }
2792 }
2793 break;
2794
2795 case stmt:
2796 case simple_stmt:
2797 case small_stmt:
2798 n = CHILD(n, 0);
2799 goto next;
2800
2801 case expr_stmt:
2802 case testlist:
2803 case test:
2804 case and_test:
2805 case not_test:
2806 case comparison:
2807 case expr:
2808 case xor_expr:
2809 case and_expr:
2810 case shift_expr:
2811 case arith_expr:
2812 case term:
2813 case factor:
2814 case power:
2815 case atom:
2816 if (NCH(n) == 1) {
2817 n = CHILD(n, 0);
2818 goto next;
2819 }
2820 break;
2821
2822 case NAME:
2823 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2824 return 1;
2825 break;
2826
2827 case NUMBER:
2828 v = parsenumber(c, STR(n));
2829 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002830 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002831 break;
2832 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002833 i = PyObject_IsTrue(v);
2834 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002835 return i == 0;
2836
2837 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002838 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002839 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002840 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002841 break;
2842 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002843 i = PyObject_IsTrue(v);
2844 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002845 return i == 0;
2846
2847 }
2848 return 0;
2849}
2850
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002851static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002852com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002853{
2854 int i;
2855 int anchor = 0;
2856 REQ(n, if_stmt);
2857 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2858 for (i = 0; i+3 < NCH(n); i+=4) {
2859 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002860 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002861 if (is_constant_false(c, ch))
2862 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002863 if (i > 0)
2864 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002865 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002866 com_addfwref(c, JUMP_IF_FALSE, &a);
2867 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002868 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002869 com_node(c, CHILD(n, i+3));
2870 com_addfwref(c, JUMP_FORWARD, &anchor);
2871 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002872 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002873 com_addbyte(c, POP_TOP);
2874 }
2875 if (i+2 < NCH(n))
2876 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002877 if (anchor)
2878 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002879}
2880
2881static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002882com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002883{
2884 int break_anchor = 0;
2885 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002886 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002887 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2888 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002889 block_push(c, SETUP_LOOP);
2890 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_node(c, CHILD(n, 1));
2893 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2894 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002895 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002896 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002897 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002898 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002899 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2900 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002901 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002902 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002903 com_addbyte(c, POP_TOP);
2904 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002905 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002906 if (NCH(n) > 4)
2907 com_node(c, CHILD(n, 6));
2908 com_backpatch(c, break_anchor);
2909}
2910
2911static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002912com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002913{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002914 int break_anchor = 0;
2915 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002916 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002917 REQ(n, for_stmt);
2918 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2919 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002920 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002921 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002922 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002923 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002924 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002925 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002926 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00002927 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002928 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002929 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002930 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002931 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2932 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002933 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002934 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002935 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002936 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002937 if (NCH(n) > 8)
2938 com_node(c, CHILD(n, 8));
2939 com_backpatch(c, break_anchor);
2940}
2941
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002942/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002943
2944 SETUP_FINALLY L
2945 <code for S>
2946 POP_BLOCK
2947 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002948 L: <code for Sf>
2949 END_FINALLY
2950
2951 The special instructions use the block stack. Each block
2952 stack entry contains the instruction that created it (here
2953 SETUP_FINALLY), the level of the value stack at the time the
2954 block stack entry was created, and a label (here L).
2955
2956 SETUP_FINALLY:
2957 Pushes the current value stack level and the label
2958 onto the block stack.
2959 POP_BLOCK:
2960 Pops en entry from the block stack, and pops the value
2961 stack until its level is the same as indicated on the
2962 block stack. (The label is ignored.)
2963 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002964 Pops a variable number of entries from the *value* stack
2965 and re-raises the exception they specify. The number of
2966 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002967
2968 The block stack is unwound when an exception is raised:
2969 when a SETUP_FINALLY entry is found, the exception is pushed
2970 onto the value stack (and the exception condition is cleared),
2971 and the interpreter jumps to the label gotten from the block
2972 stack.
2973
2974 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002975 (The contents of the value stack is shown in [], with the top
2976 at the right; 'tb' is trace-back info, 'val' the exception's
2977 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002978
2979 Value stack Label Instruction Argument
2980 [] SETUP_EXCEPT L1
2981 [] <code for S>
2982 [] POP_BLOCK
2983 [] JUMP_FORWARD L0
2984
Guido van Rossum3f5da241990-12-20 15:06:42 +00002985 [tb, val, exc] L1: DUP )
2986 [tb, val, exc, exc] <evaluate E1> )
2987 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2988 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
2989 [tb, val, exc, 1] POP )
2990 [tb, val, exc] POP
2991 [tb, val] <assign to V1> (or POP if no V1)
2992 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002993 [] <code for S1>
2994 JUMP_FORWARD L0
2995
Guido van Rossum3f5da241990-12-20 15:06:42 +00002996 [tb, val, exc, 0] L2: POP
2997 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002998 .............................etc.......................
2999
Guido van Rossum3f5da241990-12-20 15:06:42 +00003000 [tb, val, exc, 0] Ln+1: POP
3001 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003002
3003 [] L0: <next statement>
3004
3005 Of course, parts are not generated if Vi or Ei is not present.
3006*/
3007
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003008static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003009com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003010{
3011 int except_anchor = 0;
3012 int end_anchor = 0;
3013 int else_anchor = 0;
3014 int i;
3015 node *ch;
3016
3017 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3018 block_push(c, SETUP_EXCEPT);
3019 com_node(c, CHILD(n, 2));
3020 com_addbyte(c, POP_BLOCK);
3021 block_pop(c, SETUP_EXCEPT);
3022 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3023 com_backpatch(c, except_anchor);
3024 for (i = 3;
3025 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3026 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003027 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003028 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003029 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003030 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003031 break;
3032 }
3033 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003034 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003035 com_addoparg(c, SET_LINENO, ch->n_lineno);
3036 if (NCH(ch) > 1) {
3037 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003038 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003039 com_node(c, CHILD(ch, 1));
3040 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003041 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003042 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3043 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003044 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003045 }
3046 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003047 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003048 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003049 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003050 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003051 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003052 com_pop(c, 1);
3053 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003054 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003055 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003056 com_node(c, CHILD(n, i+2));
3057 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3058 if (except_anchor) {
3059 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003060 /* We come in with [tb, val, exc, 0] on the
3061 stack; one pop and it's the same as
3062 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003063 com_addbyte(c, POP_TOP);
3064 }
3065 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003066 /* We actually come in here with [tb, val, exc] but the
3067 END_FINALLY will zap those and jump around.
3068 The c_stacklevel does not reflect them so we need not pop
3069 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003070 com_addbyte(c, END_FINALLY);
3071 com_backpatch(c, else_anchor);
3072 if (i < NCH(n))
3073 com_node(c, CHILD(n, i+2));
3074 com_backpatch(c, end_anchor);
3075}
3076
3077static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003078com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003079{
3080 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003081 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003082
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003083 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3084 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003085 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003086 com_addbyte(c, POP_BLOCK);
3087 block_pop(c, SETUP_FINALLY);
3088 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003089 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003090 /* While the generated code pushes only one item,
3091 the try-finally handling can enter here with
3092 up to three items. OK, here are the details:
3093 3 for an exception, 2 for RETURN, 1 for BREAK. */
3094 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003095 com_backpatch(c, finally_anchor);
3096 ch = CHILD(n, NCH(n)-1);
3097 com_addoparg(c, SET_LINENO, ch->n_lineno);
3098 com_node(c, ch);
3099 com_addbyte(c, END_FINALLY);
3100 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003101 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003102}
3103
3104static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003105com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003106{
3107 REQ(n, try_stmt);
3108 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3109 | 'try' ':' suite 'finally' ':' suite */
3110 if (TYPE(CHILD(n, 3)) != except_clause)
3111 com_try_finally(c, n);
3112 else
3113 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003114}
3115
Guido van Rossum8b993a91997-01-17 21:04:03 +00003116static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003117get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003118{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003119 int i;
3120
Guido van Rossum8b993a91997-01-17 21:04:03 +00003121 /* Label to avoid tail recursion */
3122 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003123 switch (TYPE(n)) {
3124
3125 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003126 if (NCH(n) == 1) {
3127 n = CHILD(n, 0);
3128 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003129 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003130 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003131 case file_input:
3132 for (i = 0; i < NCH(n); i++) {
3133 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003134 if (TYPE(ch) == stmt) {
3135 n = ch;
3136 goto next;
3137 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003138 }
3139 break;
3140
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003141 case stmt:
3142 case simple_stmt:
3143 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003144 n = CHILD(n, 0);
3145 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003146
3147 case expr_stmt:
3148 case testlist:
3149 case test:
3150 case and_test:
3151 case not_test:
3152 case comparison:
3153 case expr:
3154 case xor_expr:
3155 case and_expr:
3156 case shift_expr:
3157 case arith_expr:
3158 case term:
3159 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003160 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003161 if (NCH(n) == 1) {
3162 n = CHILD(n, 0);
3163 goto next;
3164 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003165 break;
3166
3167 case atom:
3168 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003169 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003170 break;
3171
3172 }
3173 return NULL;
3174}
3175
Guido van Rossum79f25d91997-04-29 20:08:16 +00003176static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003177get_docstring(node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003178{
Guido van Rossum541563e1999-01-28 15:08:09 +00003179 /* Don't generate doc-strings if run with -OO */
3180 if (Py_OptimizeFlag > 1)
3181 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003182 n = get_rawdocstring(n);
3183 if (n == NULL)
3184 return NULL;
3185 return parsestrplus(n);
3186}
3187
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003188static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003189com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003190{
3191 REQ(n, suite);
3192 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3193 if (NCH(n) == 1) {
3194 com_node(c, CHILD(n, 0));
3195 }
3196 else {
3197 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003198 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003199 node *ch = CHILD(n, i);
3200 if (TYPE(ch) == stmt)
3201 com_node(c, ch);
3202 }
3203 }
3204}
3205
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003206/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003207static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003208com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003209{
3210 int i = c->c_nblocks;
3211 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3212 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3213 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003214 else if (i <= 0) {
3215 /* at the outer level */
3216 com_error(c, PyExc_SyntaxError,
3217 "'continue' not properly in loop");
3218 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003219 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003220 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003221 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003222 if (c->c_block[j] == SETUP_LOOP)
3223 break;
3224 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003225 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003226 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003227 for (; i > j; --i) {
3228 if (c->c_block[i] == SETUP_EXCEPT ||
3229 c->c_block[i] == SETUP_FINALLY) {
3230 com_addoparg(c, CONTINUE_LOOP,
3231 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003232 return;
3233 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003234 if (c->c_block[i] == END_FINALLY) {
3235 com_error(c, PyExc_SyntaxError,
3236 "'continue' not supported inside 'finally' clause");
3237 return;
3238 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003239 }
3240 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003241 com_error(c, PyExc_SyntaxError,
3242 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003243 }
3244 /* XXX Could allow it inside a 'finally' clause
3245 XXX if we could pop the exception still on the stack */
3246}
3247
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003248static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003249com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003250{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003251 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003252 if (TYPE(n) == lambdef) {
3253 /* lambdef: 'lambda' [varargslist] ':' test */
3254 n = CHILD(n, 1);
3255 }
3256 else {
3257 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3258 n = CHILD(n, 2);
3259 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3260 n = CHILD(n, 1);
3261 }
3262 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003263 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003264 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003265 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003266 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3267 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003268 nargs = 0;
3269 ndefs = 0;
3270 for (i = 0; i < nch; i++) {
3271 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003272 if (TYPE(CHILD(n, i)) == STAR ||
3273 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003274 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003275 nargs++;
3276 i++;
3277 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003278 t = RPAR; /* Anything except EQUAL or COMMA */
3279 else
3280 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003281 if (t == EQUAL) {
3282 i++;
3283 ndefs++;
3284 com_node(c, CHILD(n, i));
3285 i++;
3286 if (i >= nch)
3287 break;
3288 t = TYPE(CHILD(n, i));
3289 }
3290 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003291 /* Treat "(a=1, b)" as an error */
3292 if (ndefs)
3293 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003294 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003295 }
3296 if (t != COMMA)
3297 break;
3298 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003299 return ndefs;
3300}
3301
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003302static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003303com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003304{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003305 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003306 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003307 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003308 ndefs = com_argdefs(c, n);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003309 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3310 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003311 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003312 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003313 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003314 c->c_errors++;
3315 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003316 int closure = com_make_closure(c, (PyCodeObject *)co);
3317 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003318 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003319 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003320 if (closure)
3321 com_addoparg(c, MAKE_CLOSURE, ndefs);
3322 else
3323 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003324 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003325 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003326 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003327 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003328 }
3329}
3330
3331static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003332com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003333{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003334 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003335 REQ(n, testlist);
3336 /* testlist: test (',' test)* [','] */
3337 for (i = 0; i < NCH(n); i += 2)
3338 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003339 i = (NCH(n)+1) / 2;
3340 com_addoparg(c, BUILD_TUPLE, i);
3341 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003342}
3343
3344static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003345com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003346{
Guido van Rossum25831651993-05-19 14:50:45 +00003347 int i;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003348 PyObject *co, *v;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003349 char *name;
3350
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003351 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003352 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003353 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003354 c->c_errors++;
3355 return;
3356 }
3357 /* Push the class name on the stack */
3358 i = com_addconst(c, v);
3359 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003360 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003361 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003362 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003363 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003364 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003365 com_push(c, 1);
3366 }
Guido van Rossum25831651993-05-19 14:50:45 +00003367 else
3368 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003369 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003370 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003371 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003372 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003373 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003374 c->c_errors++;
3375 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003376 int closure = com_make_closure(c, (PyCodeObject *)co);
3377 i = com_addconst(c, co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003378 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003379 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003380 if (closure)
3381 com_addoparg(c, MAKE_CLOSURE, 0);
3382 else
3383 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003384 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003385 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003386 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003387 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003388 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003389 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003390}
3391
3392static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003393com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003394{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003395 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003396 if (c->c_errors)
3397 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003398 switch (TYPE(n)) {
3399
3400 /* Definition nodes */
3401
3402 case funcdef:
3403 com_funcdef(c, n);
3404 break;
3405 case classdef:
3406 com_classdef(c, n);
3407 break;
3408
3409 /* Trivial parse tree nodes */
3410
3411 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003412 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003413 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003414 n = CHILD(n, 0);
3415 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003416
3417 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003418 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
3419 com_addoparg(c, SET_LINENO, n->n_lineno);
3420 {
3421 int i;
3422 for (i = 0; i < NCH(n)-1; i += 2)
3423 com_node(c, CHILD(n, i));
3424 }
3425 break;
3426
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003427 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003428 com_addoparg(c, SET_LINENO, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003429 n = CHILD(n, 0);
3430 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003431
3432 /* Statement nodes */
3433
3434 case expr_stmt:
3435 com_expr_stmt(c, n);
3436 break;
3437 case print_stmt:
3438 com_print_stmt(c, n);
3439 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003440 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003441 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003442 break;
3443 case pass_stmt:
3444 break;
3445 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003446 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003447 com_error(c, PyExc_SyntaxError,
3448 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003449 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003450 com_addbyte(c, BREAK_LOOP);
3451 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003452 case continue_stmt:
3453 com_continue_stmt(c, n);
3454 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003455 case return_stmt:
3456 com_return_stmt(c, n);
3457 break;
3458 case raise_stmt:
3459 com_raise_stmt(c, n);
3460 break;
3461 case import_stmt:
3462 com_import_stmt(c, n);
3463 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003464 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003465 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003466 case exec_stmt:
3467 com_exec_stmt(c, n);
3468 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003469 case assert_stmt:
3470 com_assert_stmt(c, n);
3471 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003472 case if_stmt:
3473 com_if_stmt(c, n);
3474 break;
3475 case while_stmt:
3476 com_while_stmt(c, n);
3477 break;
3478 case for_stmt:
3479 com_for_stmt(c, n);
3480 break;
3481 case try_stmt:
3482 com_try_stmt(c, n);
3483 break;
3484 case suite:
3485 com_suite(c, n);
3486 break;
3487
3488 /* Expression nodes */
3489
3490 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003491 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003492 break;
3493 case test:
3494 com_test(c, n);
3495 break;
3496 case and_test:
3497 com_and_test(c, n);
3498 break;
3499 case not_test:
3500 com_not_test(c, n);
3501 break;
3502 case comparison:
3503 com_comparison(c, n);
3504 break;
3505 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003506 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003507 break;
3508 case expr:
3509 com_expr(c, n);
3510 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003511 case xor_expr:
3512 com_xor_expr(c, n);
3513 break;
3514 case and_expr:
3515 com_and_expr(c, n);
3516 break;
3517 case shift_expr:
3518 com_shift_expr(c, n);
3519 break;
3520 case arith_expr:
3521 com_arith_expr(c, n);
3522 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003523 case term:
3524 com_term(c, n);
3525 break;
3526 case factor:
3527 com_factor(c, n);
3528 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003529 case power:
3530 com_power(c, n);
3531 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003532 case atom:
3533 com_atom(c, n);
3534 break;
3535
3536 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003537 com_error(c, PyExc_SystemError,
3538 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003539 }
3540}
3541
Tim Petersdbd9ba62000-07-09 03:09:57 +00003542static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003543
3544static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003545com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003546{
3547 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3548 if (TYPE(CHILD(n, 0)) == LPAR)
3549 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003550 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003551 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003552 com_pop(c, 1);
3553 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003554}
3555
3556static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003557com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003558{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003559 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003560 if (NCH(n) == 1) {
3561 com_fpdef(c, CHILD(n, 0));
3562 }
3563 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003564 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003565 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003566 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003567 for (i = 0; i < NCH(n); i += 2)
3568 com_fpdef(c, CHILD(n, i));
3569 }
3570}
3571
3572static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003573com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003574{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003575 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003576 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003577 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003578 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003579 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003580 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003581 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003582 /* Enter all arguments in table of locals */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003583 for (i = 0, narg = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003584 node *ch = CHILD(n, i);
3585 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003586 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003587 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003588 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3589 fp = CHILD(ch, 0);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00003590 if (TYPE(fp) != NAME) {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003591 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003592 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003593 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003594 narg++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003595 /* all name updates handled by symtable */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003596 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003597 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003598 ch = CHILD(n, i);
3599 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003600 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003601 else
3602 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003603 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003604 if (complex) {
3605 /* Generate code for complex arguments only after
3606 having counted the simple arguments */
3607 int ilocal = 0;
3608 for (i = 0; i < nch; i++) {
3609 node *ch = CHILD(n, i);
3610 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003611 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003612 break;
3613 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3614 fp = CHILD(ch, 0);
3615 if (TYPE(fp) != NAME) {
3616 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003617 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003618 com_fpdef(c, ch);
3619 }
3620 ilocal++;
3621 if (++i >= nch)
3622 break;
3623 ch = CHILD(n, i);
3624 if (TYPE(ch) == EQUAL)
3625 i += 2;
3626 else
3627 REQ(ch, COMMA);
3628 }
3629 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003630}
3631
3632static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003633com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003634{
3635 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003636 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003637 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003638 doc = get_docstring(n);
3639 if (doc != NULL) {
3640 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003641 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003642 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003643 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003644 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003645 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003646 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003647 for (i = 0; i < NCH(n); i++) {
3648 node *ch = CHILD(n, i);
3649 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3650 com_node(c, ch);
3651 }
3652}
3653
3654/* Top-level compile-node interface */
3655
3656static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003657compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003658{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003659 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003660 node *ch;
3661 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003662 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003663 doc = get_docstring(CHILD(n, 4));
3664 if (doc != NULL) {
3665 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003666 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003667 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003668 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003669 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003670 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3671 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003672 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003673 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003674 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003675 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003676 c->c_infunction = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003677 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003678 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003679 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003680 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003681}
3682
3683static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003684compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003685{
Guido van Rossum590baa41993-11-30 13:40:46 +00003686 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003687 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003688 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003689
3690 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003691 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003692 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003693 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003694 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003695 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003696 else
3697 ch = CHILD(n, 2);
3698 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003699 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003700 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003701}
3702
3703static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003704compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003705{
3706 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003707 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003708 REQ(n, classdef);
3709 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3710 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003711 c->c_private = c->c_name;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003712 ch = CHILD(n, NCH(n)-1); /* The suite */
3713 doc = get_docstring(ch);
3714 if (doc != NULL) {
3715 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003716 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003717 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003718 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003719 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003720 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003721 }
3722 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003723 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003724 com_node(c, ch);
3725 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003726 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003727 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003728 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003729}
3730
3731static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003732compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003733{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003734 com_addoparg(c, SET_LINENO, n->n_lineno);
3735
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003736 switch (TYPE(n)) {
3737
Guido van Rossum4c417781991-01-21 16:09:22 +00003738 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003739 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003740 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003741 n = CHILD(n, 0);
3742 if (TYPE(n) != NEWLINE)
3743 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003744 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003745 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003746 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003747 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003748 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003749 break;
3750
Guido van Rossum4c417781991-01-21 16:09:22 +00003751 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003752 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003753 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003754 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003755 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003756 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003757 break;
3758
Guido van Rossum590baa41993-11-30 13:40:46 +00003759 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003760 com_node(c, CHILD(n, 0));
3761 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003762 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003763 break;
3764
Guido van Rossum590baa41993-11-30 13:40:46 +00003765 case lambdef: /* anonymous function definition */
3766 compile_lambdef(c, n);
3767 break;
3768
Guido van Rossum4c417781991-01-21 16:09:22 +00003769 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003770 compile_funcdef(c, n);
3771 break;
3772
Guido van Rossum4c417781991-01-21 16:09:22 +00003773 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003774 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003775 break;
3776
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003777 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003778 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003779 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003780 }
3781}
3782
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003783static PyObject *
3784dict_keys_inorder(PyObject *dict, int offset)
3785{
3786 PyObject *tuple, *k, *v;
3787 int i, pos = 0, size = PyDict_Size(dict);
3788
3789 tuple = PyTuple_New(size);
3790 if (tuple == NULL)
3791 return NULL;
3792 while (PyDict_Next(dict, &pos, &k, &v)) {
3793 i = PyInt_AS_LONG(v);
3794 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00003795 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003796 PyTuple_SET_ITEM(tuple, i - offset, k);
3797 }
3798 return tuple;
3799}
3800
Guido van Rossum79f25d91997-04-29 20:08:16 +00003801PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003802PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003803{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003804 return PyNode_CompileFlags(n, filename, NULL);
3805}
3806
3807PyCodeObject *
3808PyNode_CompileFlags(node *n, char *filename, PyCompilerFlags *flags)
3809{
3810 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003811}
3812
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003813struct symtable *
3814PyNode_CompileSymtable(node *n, char *filename)
3815{
3816 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003817 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003818
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003819 ff = PyNode_Future(n, filename);
3820 if (ff == NULL)
3821 return NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003822 st = symtable_init();
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003823 if (st == NULL)
3824 return NULL;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003825 st->st_future = ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003826 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003827 if (st->st_errors > 0)
3828 goto fail;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003829 symtable_node(st, n);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003830 if (st->st_errors > 0)
3831 goto fail;
3832
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003833 return st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003834 fail:
3835 PyMem_Free((void *)ff);
3836 st->st_future = NULL;
3837 PySymtable_Free(st);
3838 return NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003839}
3840
Guido van Rossum79f25d91997-04-29 20:08:16 +00003841static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003842icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003843{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003844 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003845}
3846
Guido van Rossum79f25d91997-04-29 20:08:16 +00003847static PyCodeObject *
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003848jcompile(node *n, char *filename, struct compiling *base,
3849 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003850{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003851 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003852 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003853 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003854 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003855 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003856 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003857 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003858 /* c_symtable still points to parent's symbols */
3859 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003860 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003861 sc.c_nested = 1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003862 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003863 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00003864 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003865 if (sc.c_future == NULL) {
3866 com_free(&sc);
3867 return NULL;
3868 }
3869 if (flags) {
3870 if (flags->cf_nested_scopes)
3871 sc.c_future->ff_nested_scopes = 1;
3872 else if (sc.c_future->ff_nested_scopes)
3873 flags->cf_nested_scopes = 1;
3874 }
3875 if (symtable_build(&sc, n) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003876 com_free(&sc);
3877 return NULL;
3878 }
3879 }
3880 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003881 if (symtable_load_symbols(&sc) < 0) {
3882 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003883 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003884 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003885 compile_node(&sc, n);
3886 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00003887 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003888 PyObject *consts, *names, *varnames, *filename, *name,
3889 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003890 consts = PyList_AsTuple(sc.c_consts);
3891 names = PyList_AsTuple(sc.c_names);
3892 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003893 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
3894 freevars = dict_keys_inorder(sc.c_freevars,
3895 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003896 filename = PyString_InternFromString(sc.c_filename);
3897 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003898 if (!PyErr_Occurred())
3899 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003900 sc.c_nlocals,
3901 sc.c_maxstacklevel,
3902 sc.c_flags,
3903 sc.c_code,
3904 consts,
3905 names,
3906 varnames,
3907 freevars,
3908 cellvars,
3909 filename,
3910 name,
3911 sc.c_firstlineno,
3912 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003913 Py_XDECREF(consts);
3914 Py_XDECREF(names);
3915 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003916 Py_XDECREF(freevars);
3917 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003918 Py_XDECREF(filename);
3919 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003920 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00003921 else if (!PyErr_Occurred()) {
3922 /* This could happen if someone called PyErr_Clear() after an
3923 error was reported above. That's not supposed to happen,
3924 but I just plugged one case and I'm not sure there can't be
3925 others. In that case, raise SystemError so that at least
3926 it gets reported instead dumping core. */
3927 PyErr_SetString(PyExc_SystemError, "lost syntax error");
3928 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003929 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00003930 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003931 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00003932 sc.c_symtable = NULL;
3933 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003934 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003935 return co;
3936}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003937
3938int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003939PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003940{
3941 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003942 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003943 int line = co->co_firstlineno;
3944 int addr = 0;
3945 while (--size >= 0) {
3946 addr += *p++;
3947 if (addr > addrq)
3948 break;
3949 line += *p++;
3950 }
3951 return line;
3952}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003953
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003954/* The test for LOCAL must come before the test for FREE in order to
3955 handle classes where name is both local and free. The local var is
3956 a method and the free var is a free var referenced within a method.
3957*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003958
3959static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003960get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003961{
3962 PyObject *v;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00003963 if (c->c_symtable->st_nested_scopes) {
3964 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
3965 return CELL;
3966 if (PyDict_GetItemString(c->c_locals, name) != NULL)
3967 return LOCAL;
3968 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
3969 return FREE;
3970 v = PyDict_GetItemString(c->c_globals, name);
3971 if (v) {
3972 if (v == Py_None)
3973 return GLOBAL_EXPLICIT;
3974 else {
3975 return GLOBAL_IMPLICIT;
3976 }
3977 }
3978 } else {
3979 if (PyDict_GetItemString(c->c_locals, name) != NULL)
3980 return LOCAL;
3981 v = PyDict_GetItemString(c->c_globals, name);
3982 if (v) {
3983 if (v == Py_None)
3984 return GLOBAL_EXPLICIT;
3985 else {
3986 return GLOBAL_IMPLICIT;
3987 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003988 }
3989 }
3990 {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003991 char buf[350];
3992 sprintf(buf,
Jeremy Hylton51257732001-03-01 00:42:55 +00003993 "unknown scope for %.100s in %.100s(%s) "
3994 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
Jeremy Hylton483638c2001-02-01 20:20:45 +00003995 name, c->c_name,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003996 PyObject_REPR(c->c_symtable->st_cur->ste_id),
Jeremy Hylton51257732001-03-01 00:42:55 +00003997 c->c_filename,
3998 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
3999 PyObject_REPR(c->c_locals),
4000 PyObject_REPR(c->c_globals)
4001 );
4002
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004003 Py_FatalError(buf);
4004 }
4005 return -1; /* can't get here */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004006}
4007
Guido van Rossum207fda62001-03-02 03:30:41 +00004008/* Helper functions to issue warnings */
4009
4010static int
4011issue_warning(char *msg, char *filename, int lineno)
4012{
4013 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4014 lineno, NULL, NULL) < 0) {
4015 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4016 PyErr_SetString(PyExc_SyntaxError, msg);
4017 PyErr_SyntaxLocation(filename, lineno);
4018 }
4019 return -1;
4020 }
4021 return 0;
4022}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004023
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004024static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004025symtable_warn(struct symtable *st, char *msg)
4026{
Guido van Rossum207fda62001-03-02 03:30:41 +00004027 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004028 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004029 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004030 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004031 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004032}
4033
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004034/* Helper function for setting lineno and filename */
4035
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004036static int
4037symtable_build(struct compiling *c, node *n)
4038{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004039 if ((c->c_symtable = symtable_init()) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004040 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004041 c->c_symtable->st_future = c->c_future;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004042 if (c->c_future->ff_nested_scopes)
4043 c->c_symtable->st_nested_scopes = 1;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004044 c->c_symtable->st_filename = c->c_filename;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004045 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
4046 if (c->c_symtable->st_errors > 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004047 return -1;
4048 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004049 if (c->c_symtable->st_errors > 0)
4050 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004051 /* reset for second pass */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004052 c->c_symtable->st_nscopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004053 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004054 return 0;
4055}
4056
4057static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004058symtable_init_compiling_symbols(struct compiling *c)
4059{
4060 PyObject *varnames;
4061
4062 varnames = c->c_symtable->st_cur->ste_varnames;
4063 if (varnames == NULL) {
4064 varnames = PyList_New(0);
4065 if (varnames == NULL)
4066 return -1;
4067 c->c_symtable->st_cur->ste_varnames = varnames;
4068 Py_INCREF(varnames);
4069 } else
4070 Py_INCREF(varnames);
4071 c->c_varnames = varnames;
4072
4073 c->c_globals = PyDict_New();
4074 if (c->c_globals == NULL)
4075 return -1;
4076 c->c_freevars = PyDict_New();
4077 if (c->c_freevars == NULL)
4078 return -1;
4079 c->c_cellvars = PyDict_New();
4080 if (c->c_cellvars == NULL)
4081 return -1;
4082 return 0;
4083}
4084
4085struct symbol_info {
4086 int si_nlocals;
4087 int si_ncells;
4088 int si_nfrees;
4089 int si_nimplicit;
4090};
4091
4092static void
4093symtable_init_info(struct symbol_info *si)
4094{
4095 si->si_nlocals = 0;
4096 si->si_ncells = 0;
4097 si->si_nfrees = 0;
4098 si->si_nimplicit = 0;
4099}
4100
4101static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004102symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004103 struct symbol_info *si)
4104{
4105 PyObject *dict, *v;
4106
4107 /* Seperate logic for DEF_FREE. If it occurs in a function,
4108 it indicates a local that we must allocate storage for (a
4109 cell var). If it occurs in a class, then the class has a
4110 method and a free variable with the same name.
4111 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004112 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004113 /* If it isn't declared locally, it can't be a cell. */
4114 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4115 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004116 v = PyInt_FromLong(si->si_ncells++);
4117 dict = c->c_cellvars;
4118 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004119 /* If it is free anyway, then there is no need to do
4120 anything here.
4121 */
4122 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00004123 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004124 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004125 v = PyInt_FromLong(si->si_nfrees++);
4126 dict = c->c_freevars;
4127 }
4128 if (v == NULL)
4129 return -1;
4130 if (PyDict_SetItem(dict, name, v) < 0) {
4131 Py_DECREF(v);
4132 return -1;
4133 }
4134 Py_DECREF(v);
4135 return 0;
4136}
4137
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004138/* If a variable is a cell and an argument, make sure that appears in
4139 co_cellvars before any variable to its right in varnames.
4140*/
4141
4142
4143static int
4144symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4145 PyObject *varnames, int flags)
4146{
4147 PyObject *v, *w, *d, *list = NULL;
4148 int i, pos;
4149
4150 if (flags & CO_VARARGS)
4151 argcount++;
4152 if (flags & CO_VARKEYWORDS)
4153 argcount++;
4154 for (i = argcount; --i >= 0; ) {
4155 v = PyList_GET_ITEM(varnames, i);
4156 if (PyDict_GetItem(*cellvars, v)) {
4157 if (list == NULL) {
4158 list = PyList_New(1);
4159 if (list == NULL)
4160 return -1;
4161 PyList_SET_ITEM(list, 0, v);
4162 Py_INCREF(v);
4163 } else
4164 PyList_Insert(list, 0, v);
4165 }
4166 }
4167 if (list == NULL || PyList_GET_SIZE(list) == 0)
4168 return 0;
4169 /* There are cellvars that are also arguments. Create a dict
4170 to replace cellvars and put the args at the front.
4171 */
4172 d = PyDict_New();
4173 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
4174 v = PyInt_FromLong(i);
4175 if (v == NULL)
4176 goto fail;
4177 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
4178 goto fail;
4179 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
4180 goto fail;
4181 }
4182 pos = 0;
4183 i = PyList_GET_SIZE(list);
4184 Py_DECREF(list);
4185 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
4186 w = PyInt_FromLong(i++); /* don't care about the old key */
4187 if (PyDict_SetItem(d, v, w) < 0) {
4188 Py_DECREF(w);
4189 goto fail;
4190 }
4191 Py_DECREF(w);
4192 }
4193 Py_DECREF(*cellvars);
4194 *cellvars = d;
4195 return 1;
4196 fail:
4197 Py_DECREF(d);
4198 return -1;
4199}
4200
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004201static int
4202symtable_freevar_offsets(PyObject *freevars, int offset)
4203{
4204 PyObject *name, *v;
4205 int pos;
4206
4207 /* The cell vars are the first elements of the closure,
4208 followed by the free vars. Update the offsets in
4209 c_freevars to account for number of cellvars. */
4210 pos = 0;
4211 while (PyDict_Next(freevars, &pos, &name, &v)) {
4212 int i = PyInt_AS_LONG(v) + offset;
4213 PyObject *o = PyInt_FromLong(i);
4214 if (o == NULL)
4215 return -1;
4216 if (PyDict_SetItem(freevars, name, o) < 0) {
4217 Py_DECREF(o);
4218 return -1;
4219 }
4220 Py_DECREF(o);
4221 }
4222 return 0;
4223}
4224
4225static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004226symtable_check_unoptimized(struct compiling *c,
4227 PySymtableEntryObject *ste,
4228 struct symbol_info *si)
4229{
4230 char buf[300];
4231
4232 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4233 || (ste->ste_nested && si->si_nimplicit)))
4234 return 0;
4235
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004236#define ILLEGAL_CONTAINS "contains a nested function with free variables"
4237
4238#define ILLEGAL_IS "is a nested function"
4239
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004240#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004241"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004242
4243#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004244"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004245
4246#define ILLEGAL_EXEC_AND_IMPORT_STAR \
4247"function '%.100s' uses import * and bare exec, which are illegal" \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004248"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004249
4250 /* XXX perhaps the linenos for these opt-breaking statements
4251 should be stored so the exception can point to them. */
4252
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004253 if (ste->ste_child_free) {
4254 if (ste->ste_optimized == OPT_IMPORT_STAR)
4255 sprintf(buf, ILLEGAL_IMPORT_STAR,
4256 PyString_AS_STRING(ste->ste_name),
4257 ILLEGAL_CONTAINS);
4258 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
4259 sprintf(buf, ILLEGAL_BARE_EXEC,
4260 PyString_AS_STRING(ste->ste_name),
4261 ILLEGAL_CONTAINS);
4262 else {
4263 sprintf(buf, ILLEGAL_EXEC_AND_IMPORT_STAR,
4264 PyString_AS_STRING(ste->ste_name),
4265 ILLEGAL_CONTAINS);
4266 }
4267 } else {
4268 if (ste->ste_optimized == OPT_IMPORT_STAR)
4269 sprintf(buf, ILLEGAL_IMPORT_STAR,
4270 PyString_AS_STRING(ste->ste_name),
4271 ILLEGAL_IS);
4272 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
4273 sprintf(buf, ILLEGAL_BARE_EXEC,
4274 PyString_AS_STRING(ste->ste_name),
4275 ILLEGAL_IS);
4276 else {
4277 sprintf(buf, ILLEGAL_EXEC_AND_IMPORT_STAR,
4278 PyString_AS_STRING(ste->ste_name),
4279 ILLEGAL_IS);
4280 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004281 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004282
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004283 if (c->c_symtable->st_nested_scopes) {
4284 PyErr_SetString(PyExc_SyntaxError, buf);
4285 PyErr_SyntaxLocation(c->c_symtable->st_filename,
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00004286 ste->ste_opt_lineno);
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004287 return -1;
Guido van Rossum207fda62001-03-02 03:30:41 +00004288 }
4289 else {
4290 return issue_warning(buf, c->c_filename, ste->ste_lineno);
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004291 }
4292 return 0;
4293}
4294
4295static int
4296symtable_check_shadow(struct symtable *st, PyObject *name, int flags)
4297{
4298 char buf[500];
4299 PyObject *children, *v;
Jeremy Hyltonc1761322001-02-28 23:44:45 +00004300 PySymtableEntryObject *child = NULL;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004301 int i;
4302
4303 if (!(flags & DEF_BOUND))
4304 return 0;
Jeremy Hylton9c901052001-05-08 04:12:34 +00004305
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004306 /* The semantics of this code will change with nested scopes.
4307 It is defined in the current scope and referenced in a
4308 child scope. Under the old rules, the child will see a
4309 global. Under the new rules, the child will see the
4310 binding in the current scope.
4311 */
4312
4313 /* Find name of child function that has free variable */
4314 children = st->st_cur->ste_children;
4315 for (i = 0; i < PyList_GET_SIZE(children); i++) {
4316 int cflags;
4317 child = (PySymtableEntryObject *)PyList_GET_ITEM(children, i);
4318 v = PyDict_GetItem(child->ste_symbols, name);
4319 if (v == NULL)
4320 continue;
4321 cflags = PyInt_AS_LONG(v);
4322 if (!(cflags & DEF_BOUND))
4323 break;
4324 }
Jeremy Hyltonc1761322001-02-28 23:44:45 +00004325
4326 assert(child != NULL);
4327
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004328 sprintf(buf, "local name '%.100s' in '%.100s' shadows "
4329 "use of '%.100s' as global in nested scope '%.100s'",
4330 PyString_AS_STRING(name),
4331 PyString_AS_STRING(st->st_cur->ste_name),
4332 PyString_AS_STRING(name),
4333 PyString_AS_STRING(child->ste_name)
4334 );
4335
4336 return symtable_warn(st, buf);
4337}
4338
4339static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004340symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4341 struct symbol_info *si)
4342{
Jeremy Hylton061d1062001-03-22 02:32:48 +00004343 if (c->c_future && c->c_future->ff_nested_scopes)
4344 c->c_flags |= CO_NESTED;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004345 if (ste->ste_type != TYPE_MODULE)
4346 c->c_flags |= CO_NEWLOCALS;
4347 if (ste->ste_type == TYPE_FUNCTION) {
4348 c->c_nlocals = si->si_nlocals;
4349 if (ste->ste_optimized == 0)
4350 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004351 else if (ste->ste_optimized != OPT_EXEC)
4352 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004353 }
4354 return 0;
4355}
4356
4357static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004358symtable_load_symbols(struct compiling *c)
4359{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004360 static PyObject *implicit = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004361 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004362 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004363 PyObject *name, *varnames, *v;
4364 int i, flags, pos;
4365 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004366
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004367 if (implicit == NULL) {
4368 implicit = PyInt_FromLong(1);
4369 if (implicit == NULL)
4370 return -1;
4371 }
4372 v = NULL;
4373
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004374 if (symtable_init_compiling_symbols(c) < 0)
4375 goto fail;
4376 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004377 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004378 si.si_nlocals = PyList_GET_SIZE(varnames);
4379 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004380
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004381 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004382 v = PyInt_FromLong(i);
4383 if (PyDict_SetItem(c->c_locals,
4384 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004385 goto fail;
4386 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004387 }
4388
4389 /* XXX The cases below define the rules for whether a name is
4390 local or global. The logic could probably be clearer. */
4391 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004392 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4393 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004394
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004395 if (st->st_nested_scopes == 0
4396 && (flags & (DEF_FREE | DEF_FREE_CLASS))) {
4397 if (symtable_check_shadow(st, name, flags) < 0)
4398 goto fail;
4399 }
4400
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004401 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004402 /* undo the original DEF_FREE */
4403 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004404
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004405 /* Deal with names that need two actions:
4406 1. Cell variables, which are also locals.
4407 2. Free variables in methods that are also class
4408 variables or declared global.
4409 */
Jeremy Hylton9c901052001-05-08 04:12:34 +00004410 if (st->st_nested_scopes) {
4411 if (flags & (DEF_FREE | DEF_FREE_CLASS)) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004412 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton9c901052001-05-08 04:12:34 +00004413 }
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004414 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004415
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004416 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004417 c->c_argcount--;
4418 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004419 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004420 c->c_argcount--;
4421 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004422 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004423 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004424 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004425 if (flags & DEF_PARAM) {
4426 PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004427 PyString_AS_STRING(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004428 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004429 ste->ste_lineno);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004430 st->st_errors++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004431 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004432 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004433 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4434 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004435 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004436 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004437 if (PyDict_SetItem(c->c_globals, name, implicit) < 0)
4438 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004439 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004440 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004441 if (v == NULL)
4442 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004443 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004444 goto fail;
4445 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004446 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004447 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004448 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004449 } else if (is_free(flags)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004450 if (ste->ste_nested && st->st_nested_scopes) {
4451 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004452 if (v == NULL)
4453 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004454 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004455 goto fail;
4456 Py_DECREF(v);
4457 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004458 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004459 if (PyDict_SetItem(c->c_globals, name,
4460 implicit) < 0)
4461 goto fail;
Jeremy Hylton51257732001-03-01 00:42:55 +00004462 if (st->st_nscopes != 1) {
4463 v = PyInt_FromLong(flags);
4464 if (PyDict_SetItem(st->st_global,
4465 name, v))
4466 goto fail;
4467 Py_DECREF(v);
4468 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004469 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004470 }
4471 }
4472
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004473 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
4474
Jeremy Hylton9c901052001-05-08 04:12:34 +00004475 if (st->st_nested_scopes == 0)
4476 assert(si.si_nfrees == 0);
4477
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004478 if (si.si_ncells > 1) { /* one cell is always in order */
4479 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
4480 c->c_varnames, c->c_flags) < 0)
4481 return -1;
4482 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004483 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4484 return -1;
4485 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004486 fail:
4487 /* is this always the right thing to do? */
4488 Py_XDECREF(v);
4489 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004490}
4491
4492static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004493symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004494{
4495 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004496
4497 st = (struct symtable *)PyMem_Malloc(sizeof(struct symtable));
4498 if (st == NULL)
4499 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004500 st->st_pass = 1;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004501 st->st_nested_scopes = NESTED_SCOPES_DEFAULT;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004502 st->st_filename = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004503 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004504 goto fail;
4505 if ((st->st_symbols = PyDict_New()) == NULL)
4506 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004507 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004508 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004509 st->st_errors = 0;
4510 st->st_tmpname = 0;
4511 st->st_private = NULL;
4512 return st;
4513 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004514 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004515 return NULL;
4516}
4517
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004518void
4519PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004520{
4521 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004522 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004523 Py_XDECREF(st->st_cur);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004524 PyMem_Free((void *)st);
4525}
4526
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004527/* When the compiler exits a scope, it must should update the scope's
4528 free variable information with the list of free variables in its
4529 children.
4530
4531 Variables that are free in children and defined in the current
4532 scope are cellvars.
4533
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004534 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004535 false), free variables in children that are not defined here are
4536 implicit globals.
4537
4538*/
4539
4540static int
4541symtable_update_free_vars(struct symtable *st)
4542{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004543 int i, j, def;
4544 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004545 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004546
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004547 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004548 def = DEF_FREE_CLASS;
4549 else
4550 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004551 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004552 int pos = 0;
4553
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004554 if (list)
4555 PyList_SetSlice(list, 0,
4556 ((PyVarObject*)list)->ob_size, 0);
Barry Warsaw0372af72001-02-23 18:22:59 +00004557 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004558 PyList_GET_ITEM(ste->ste_children, i);
4559 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004560 int flags = PyInt_AS_LONG(o);
4561 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004562 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004563 if (list == NULL) {
4564 list = PyList_New(0);
4565 if (list == NULL)
4566 return -1;
4567 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004568 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004569 if (PyList_Append(list, name) < 0) {
4570 Py_DECREF(list);
4571 return -1;
4572 }
4573 }
4574 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004575 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004576 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00004577 v = PyDict_GetItem(ste->ste_symbols, name);
4578 /* If a name N is declared global in scope A and
4579 referenced in scope B contained (perhaps
4580 indirectly) in A and there are no scopes
4581 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00004582 is global in B. Unless A is a class scope,
4583 because class scopes are not considered for
4584 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00004585 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004586 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004587 int flags = PyInt_AS_LONG(v);
4588 if (flags & DEF_GLOBAL) {
4589 symtable_undo_free(st, child->ste_id,
4590 name);
4591 continue;
4592 }
4593 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004594 if (ste->ste_nested) {
4595 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004596 name, def) < 0) {
4597 Py_DECREF(list);
4598 return -1;
4599 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004600 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004601 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004602 name) < 0) {
4603 Py_DECREF(list);
4604 return -1;
4605 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004606 }
4607 }
4608 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004609
4610 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004611 return 0;
4612}
4613
4614/* If the current scope is a non-nested class or if name is not
4615 defined in the current, non-nested scope, then it is an implicit
4616 global in all nested scopes.
4617*/
4618
4619static int
4620symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
4621{
4622 PyObject *o;
4623 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004624 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00004625
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004626 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004627 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004628 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004629 if (o == NULL)
4630 return symtable_undo_free(st, child, name);
4631 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00004632
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004633 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004634 return symtable_undo_free(st, child, name);
4635 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004636 return symtable_add_def_o(st, ste->ste_symbols,
4637 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004638}
4639
4640static int
4641symtable_undo_free(struct symtable *st, PyObject *id,
4642 PyObject *name)
4643{
4644 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004645 PyObject *info;
4646 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004647
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004648 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
4649 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004650 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00004651
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004652 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004653 if (info == NULL)
4654 return 0;
4655 v = PyInt_AS_LONG(info);
4656 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004657 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004658 DEF_FREE_GLOBAL) < 0)
4659 return -1;
4660 } else
4661 /* If the name is defined here or declared global,
4662 then the recursion stops. */
4663 return 0;
4664
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004665 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
4666 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00004667 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004668 PyList_GET_ITEM(ste->ste_children, i);
4669 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004670 if (x < 0)
4671 return x;
4672 }
4673 return 0;
4674}
4675
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004676/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
4677 This reference is released when the scope is exited, via the DECREF
4678 in symtable_exit_scope().
4679*/
4680
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004681static int
4682symtable_exit_scope(struct symtable *st)
4683{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004684 int end;
4685
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004686 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004687 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004688 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004689 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004690 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
4691 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004692 if (PySequence_DelItem(st->st_stack, end) < 0)
4693 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004694 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004695}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004696
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004697static void
4698symtable_enter_scope(struct symtable *st, char *name, int type,
4699 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004700{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004701 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004702
4703 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004704 prev = st->st_cur;
4705 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
4706 Py_DECREF(st->st_cur);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004707 st->st_errors++;
4708 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004709 }
4710 }
Barry Warsaw0372af72001-02-23 18:22:59 +00004711 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004712 PySymtableEntry_New(st, name, type, lineno);
4713 if (strcmp(name, TOP) == 0)
4714 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004715 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004716 if (PyList_Append(prev->ste_children,
4717 (PyObject *)st->st_cur) < 0)
4718 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004719 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004720}
4721
4722static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004723symtable_lookup(struct symtable *st, char *name)
4724{
4725 char buffer[MANGLE_LEN];
4726 PyObject *v;
4727 int flags;
4728
4729 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
4730 name = buffer;
4731 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
4732 if (v == NULL) {
4733 if (PyErr_Occurred())
4734 return -1;
4735 else
4736 return 0;
4737 }
4738
4739 flags = PyInt_AS_LONG(v);
4740 return flags;
4741}
4742
4743static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004744symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004745{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004746 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004747 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004748 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004749
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004750 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004751 name = buffer;
4752 if ((s = PyString_InternFromString(name)) == NULL)
4753 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004754 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
4755 Py_DECREF(s);
4756 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004757}
4758
4759/* Must only be called with mangled names */
4760
4761static int
4762symtable_add_def_o(struct symtable *st, PyObject *dict,
4763 PyObject *name, int flag)
4764{
4765 PyObject *o;
4766 int val;
4767
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004768 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004769 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004770 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004771 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00004772 PyString_AsString(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004773 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004774 st->st_cur->ste_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004775 return -1;
4776 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004777 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004778 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004779 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004780 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004781 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004782 Py_DECREF(o);
4783 return -1;
4784 }
4785 Py_DECREF(o);
4786
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004787 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004788 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004789 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004790 } else if (flag & DEF_GLOBAL) {
4791 /* XXX need to update DEF_GLOBAL for other flags too;
4792 perhaps only DEF_FREE_GLOBAL */
4793 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004794 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004795 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004796 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004797 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004798 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004799 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004800 Py_DECREF(o);
4801 return -1;
4802 }
4803 Py_DECREF(o);
4804 }
4805 return 0;
4806}
4807
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004808#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004809
4810static void
4811symtable_node(struct symtable *st, node *n)
4812{
4813 int i, start = 0;
4814
4815 loop:
4816 switch (TYPE(n)) {
4817 case funcdef: {
4818 char *func_name = STR(CHILD(n, 1));
4819 symtable_add_def(st, func_name, DEF_LOCAL);
4820 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004821 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004822 symtable_funcdef(st, n);
4823 symtable_exit_scope(st);
4824 break;
4825 }
4826 case lambdef:
4827 if (NCH(n) == 4)
4828 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004829 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004830 symtable_funcdef(st, n);
4831 symtable_exit_scope(st);
4832 break;
4833 case classdef: {
4834 char *tmp, *class_name = STR(CHILD(n, 1));
4835 symtable_add_def(st, class_name, DEF_LOCAL);
4836 if (TYPE(CHILD(n, 2)) == LPAR) {
4837 node *bases = CHILD(n, 3);
4838 int i;
4839 for (i = 0; i < NCH(bases); i += 2) {
4840 symtable_node(st, CHILD(bases, i));
4841 }
4842 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004843 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004844 tmp = st->st_private;
4845 st->st_private = class_name;
4846 symtable_node(st, CHILD(n, NCH(n) - 1));
4847 st->st_private = tmp;
4848 symtable_exit_scope(st);
4849 break;
4850 }
4851 case if_stmt:
4852 for (i = 0; i + 3 < NCH(n); i += 4) {
4853 if (is_constant_false(NULL, (CHILD(n, i + 1))))
4854 continue;
4855 symtable_node(st, CHILD(n, i + 1));
4856 symtable_node(st, CHILD(n, i + 3));
4857 }
4858 if (i + 2 < NCH(n))
4859 symtable_node(st, CHILD(n, i + 2));
4860 break;
4861 case global_stmt:
4862 symtable_global(st, n);
4863 break;
4864 case import_stmt:
4865 symtable_import(st, n);
4866 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004867 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004868 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004869 symtable_node(st, CHILD(n, 1));
4870 if (NCH(n) > 2)
4871 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00004872 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004873 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00004874 st->st_cur->ste_opt_lineno = n->n_lineno;
4875 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004876 if (NCH(n) > 4)
4877 symtable_node(st, CHILD(n, 5));
4878 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004879
4880 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00004881 case assert_stmt:
4882 if (Py_OptimizeFlag)
4883 return;
4884 if (NCH(n) == 2) {
4885 n = CHILD(n, 1);
4886 goto loop;
4887 } else {
4888 symtable_node(st, CHILD(n, 1));
4889 n = CHILD(n, 3);
4890 goto loop;
4891 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004892 case except_clause:
4893 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004894 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004895 if (NCH(n) > 1) {
4896 n = CHILD(n, 1);
4897 goto loop;
4898 }
4899 break;
4900 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004901 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004902 break;
4903 case expr_stmt:
4904 if (NCH(n) == 1)
4905 n = CHILD(n, 0);
4906 else {
4907 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004908 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004909 symtable_node(st, CHILD(n, 2));
4910 break;
4911 } else {
4912 int i;
4913 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004914 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004915 n = CHILD(n, NCH(n) - 1);
4916 }
4917 }
4918 goto loop;
4919 /* watchout for fall-through logic below */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004920 case argument:
4921 if (NCH(n) == 3) {
4922 n = CHILD(n, 2);
4923 goto loop;
4924 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004925 case listmaker:
4926 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton23b42272001-03-19 20:38:06 +00004927 st->st_tmpname++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004928 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton23b42272001-03-19 20:38:06 +00004929 symtable_node(st, CHILD(n, 0));
4930 st->st_tmpname--;
4931 return;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004932 }
4933 case atom:
4934 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
4935 symtable_add_use(st, STR(CHILD(n, 0)));
4936 break;
4937 }
4938 case for_stmt:
4939 if (TYPE(n) == for_stmt) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004940 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004941 start = 3;
4942 }
4943 default:
4944 if (NCH(n) == 1) {
4945 n = CHILD(n, 0);
4946 goto loop;
4947 }
4948 for (i = start; i < NCH(n); ++i)
4949 if (TYPE(CHILD(n, i)) >= single_input)
4950 symtable_node(st, CHILD(n, i));
4951 }
4952}
4953
4954static void
4955symtable_funcdef(struct symtable *st, node *n)
4956{
4957 node *body;
4958
4959 if (TYPE(n) == lambdef) {
4960 if (NCH(n) == 4)
4961 symtable_params(st, CHILD(n, 1));
4962 } else
4963 symtable_params(st, CHILD(n, 2));
4964 body = CHILD(n, NCH(n) - 1);
4965 symtable_node(st, body);
4966}
4967
4968/* The next two functions parse the argument tuple.
4969 symtable_default_arg() checks for names in the default arguments,
4970 which are references in the defining scope. symtable_params()
4971 parses the parameter names, which are defined in the function's
4972 body.
4973
4974 varargslist:
4975 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
4976 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
4977*/
4978
4979static void
4980symtable_default_args(struct symtable *st, node *n)
4981{
4982 node *c;
4983 int i;
4984
4985 if (TYPE(n) == parameters) {
4986 n = CHILD(n, 1);
4987 if (TYPE(n) == RPAR)
4988 return;
4989 }
4990 REQ(n, varargslist);
4991 for (i = 0; i < NCH(n); i += 2) {
4992 c = CHILD(n, i);
4993 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
4994 break;
4995 }
4996 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
4997 symtable_node(st, CHILD(n, i));
4998 }
4999}
5000
5001static void
5002symtable_params(struct symtable *st, node *n)
5003{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005004 int i, complex = -1, ext = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005005 node *c = NULL;
5006
5007 if (TYPE(n) == parameters) {
5008 n = CHILD(n, 1);
5009 if (TYPE(n) == RPAR)
5010 return;
5011 }
5012 REQ(n, varargslist);
5013 for (i = 0; i < NCH(n); i += 2) {
5014 c = CHILD(n, i);
5015 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5016 ext = 1;
5017 break;
5018 }
5019 if (TYPE(c) == test) {
5020 continue;
5021 }
5022 if (TYPE(CHILD(c, 0)) == NAME)
5023 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
5024 else {
5025 char nbuf[10];
5026 sprintf(nbuf, ".%d", i);
5027 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005028 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005029 }
5030 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005031 if (ext) {
5032 c = CHILD(n, i);
5033 if (TYPE(c) == STAR) {
5034 i++;
5035 symtable_add_def(st, STR(CHILD(n, i)),
5036 DEF_PARAM | DEF_STAR);
5037 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00005038 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005039 c = NULL;
5040 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005041 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005042 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005043 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005044 i++;
5045 symtable_add_def(st, STR(CHILD(n, i)),
5046 DEF_PARAM | DEF_DOUBLESTAR);
5047 }
5048 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005049 if (complex >= 0) {
5050 int j;
5051 for (j = 0; j <= complex; j++) {
5052 c = CHILD(n, j);
5053 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005054 c = CHILD(n, ++j);
5055 else if (TYPE(c) == EQUAL)
5056 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005057 if (TYPE(CHILD(c, 0)) == LPAR)
5058 symtable_params_fplist(st, CHILD(c, 1));
5059 }
5060 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005061}
5062
5063static void
5064symtable_params_fplist(struct symtable *st, node *n)
5065{
5066 int i;
5067 node *c;
5068
5069 REQ(n, fplist);
5070 for (i = 0; i < NCH(n); i += 2) {
5071 c = CHILD(n, i);
5072 REQ(c, fpdef);
5073 if (NCH(c) == 1)
5074 symtable_add_def(st, STR(CHILD(c, 0)),
5075 DEF_PARAM | DEF_INTUPLE);
5076 else
5077 symtable_params_fplist(st, CHILD(c, 1));
5078 }
5079
5080}
5081
5082static void
5083symtable_global(struct symtable *st, node *n)
5084{
5085 int i;
5086
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005087 /* XXX It might be helpful to warn about module-level global
5088 statements, but it's hard to tell the difference between
5089 module-level and a string passed to exec.
5090 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00005091
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005092 for (i = 1; i < NCH(n); i += 2) {
5093 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005094 int flags;
5095
5096 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005097 if (flags < 0)
5098 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005099 if (flags && flags != DEF_GLOBAL) {
5100 char buf[500];
5101 if (flags & DEF_PARAM) {
5102 PyErr_Format(PyExc_SyntaxError,
5103 "name '%.400s' is local and global",
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005104 name);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005105 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005106 st->st_cur->ste_lineno);
5107 st->st_errors++;
5108 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005109 }
5110 else {
5111 if (flags & DEF_LOCAL)
5112 sprintf(buf, GLOBAL_AFTER_ASSIGN,
5113 name);
5114 else
5115 sprintf(buf, GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005116 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005117 }
5118 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005119 symtable_add_def(st, name, DEF_GLOBAL);
5120 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005121}
5122
5123static void
5124symtable_list_comprehension(struct symtable *st, node *n)
5125{
5126 char tmpname[12];
5127
Jeremy Hylton23b42272001-03-19 20:38:06 +00005128 sprintf(tmpname, "_[%d]", st->st_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005129 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005130 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005131 symtable_node(st, CHILD(n, 3));
5132 if (NCH(n) == 5)
5133 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005134}
5135
5136static void
5137symtable_import(struct symtable *st, node *n)
5138{
5139 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005140 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005141 | 'from' dotted_name 'import'
5142 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00005143 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005144 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005145 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005146 node *dotname = CHILD(n, 1);
5147 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
5148 /* check for bogus imports */
5149 if (n->n_lineno >= st->st_future->ff_last_lineno) {
5150 PyErr_SetString(PyExc_SyntaxError,
5151 LATE_FUTURE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005152 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005153 n->n_lineno);
5154 st->st_errors++;
5155 return;
5156 }
5157 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005158 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005159 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005160 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005161 } else {
5162 for (i = 3; i < NCH(n); i += 2) {
5163 node *c = CHILD(n, i);
5164 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005165 symtable_assign(st, CHILD(c, 2),
5166 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005167 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005168 symtable_assign(st, CHILD(c, 0),
5169 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005170 }
5171 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005172 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005173 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005174 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005175 }
5176 }
5177}
5178
5179static void
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005180symtable_assign(struct symtable *st, node *n, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005181{
5182 node *tmp;
5183 int i;
5184
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005185 loop:
5186 switch (TYPE(n)) {
5187 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005188 /* invalid assignment, e.g. lambda x:x=2. The next
5189 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005190 return;
5191 case power:
5192 if (NCH(n) > 2) {
5193 for (i = 2; i < NCH(n); ++i)
5194 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
5195 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005196 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005197 if (NCH(n) > 1) {
5198 symtable_node(st, CHILD(n, 0));
5199 symtable_node(st, CHILD(n, 1));
5200 } else {
5201 n = CHILD(n, 0);
5202 goto loop;
5203 }
5204 return;
5205 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00005206 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
5207 /* XXX This is an error, but the next pass
5208 will catch it. */
5209 return;
5210 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005211 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005212 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005213 }
5214 return;
5215 case exprlist:
5216 case testlist:
5217 if (NCH(n) == 1) {
5218 n = CHILD(n, 0);
5219 goto loop;
5220 }
5221 else {
5222 int i;
5223 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005224 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005225 return;
5226 }
5227 goto loop;
5228 case atom:
5229 tmp = CHILD(n, 0);
5230 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
5231 n = CHILD(n, 1);
5232 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00005233 } else if (TYPE(tmp) == NAME) {
Jeremy Hyltona830b382001-04-09 16:07:59 +00005234 if (strcmp(STR(tmp), "__debug__") == 0)
5235 symtable_warn(st, ASSIGN_DEBUG);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005236 symtable_add_def(st, STR(tmp), DEF_LOCAL | flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00005237 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005238 return;
5239 case dotted_as_name:
5240 if (NCH(n) == 3)
5241 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005242 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005243 else
5244 symtable_add_def(st,
5245 STR(CHILD(CHILD(n,
5246 0), 0)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005247 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005248 return;
5249 case dotted_name:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005250 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005251 return;
5252 case NAME:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005253 symtable_add_def(st, STR(n), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005254 return;
5255 default:
5256 if (NCH(n) == 0)
5257 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00005258 if (NCH(n) == 1) {
5259 n = CHILD(n, 0);
5260 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005261 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00005262 /* Should only occur for errors like x + 1 = 1,
5263 which will be caught in the next pass. */
5264 for (i = 0; i < NCH(n); ++i)
5265 if (TYPE(CHILD(n, i)) >= single_input)
5266 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005267 }
5268}